网络安全编程基础 之 网络编程

套接字编程

套接字(Socket)是用来实现主机和主机之间通信的一个接口。通过它可以完成主机间的通信操作,它屏蔽了底层的协议,让用户能够实现各种类型的通信操作。

最常用的套接字有三种,分别为流(Stream)套接字,数据报(Datagram)套接字和原始(Raw)套接字。

流套接字提供了可靠的双向数据流,可保证数据不会在传输过程中丢失、破坏或重复出现。它时通过INET地址协议族的TCP协议实现的,它是面向连接的,可确保传输的数据的可靠和准确性。

数据报套接字也提供双向数据传输,不确保数据的准确性,有可能造成数据报的顺序不对、丢失或破坏。它时通过INET地址族的UDP协议实现。它是无连接的双向数据流。它的传输效率高。

原始套接字可以让进程直接访问底层协议。它可以构造和接收原始的IP数据报文,而之前两种则只能收到用户数据。可以利用它接收原始IP报文分析数据内容(嗅探器),还可以利用原始IP报文进行构造网络数据包发到网络中(网络端口扫描系统)。因此原始套接字在网络安全中用的比较广泛。

在套接字编程中,一般的网络应用都是基于客户和服务的,也就是C/S模式。

C/S模式是网络编程的程序模式,在TCP/IP网络应用程序中,通信的两个进程间是客户服务器模式。基本过程是客户端向服务器端发送服务请求,服务器接收到请求后,就根据请求的内容做出响应。这个过程中服务端要先启动,并根据请求提供相应的服务。它打开一通信通道并告知主机,它在某一端口上等待客户请求,当有一个新请求时,它将创建一个新进程去处理这个新的客户请求。服务完成后关闭该通信通道。

服务类型

面向连接的服务

面向连接服务是通过TCP协议与指定IP地址主机建立连接,实现主机间双向传输数据。在有连接的通信中必须有一方扮演服务器角色,等待客户端连接。面向连接的通信在数据的收发、收发数据的顺序上都是有保证的。


网络安全编程基础 之 网络编程_第1张图片
面向连接的执行方式

服务器端执行步骤:

1、使用socket()构造一个套接字。

2、调用bind()进行绑定。

3、调用listen()进行监听。

4、通过accept()接收客户端连接,此时服务器处于阻塞,直到客户端连接过来,并创建一个新的套接字,用于数据传输。

5、在新的套接字上使用recv()接收数据,使用send()发送数据。此时所有的操作都是在新建的套接字上进行。

6、使用完套接字后,调用closesocket()关闭套接字,释放对应的资源。

客户端执行步骤:

1、调用socket()构建套接字。

2、调用connect()连接服务器。

3、连接成功后,使用send()发送数据,recv()接收数据。

4、数据传输完后,调用closesocket()关闭套接字。


面向无连接服务

面向无连接服务使用UDP协议实现,在构造套接字时使用SOCK_DGRAM类型。无连接客户不需要调用套接字连接函数connect()。在发送数据之前,客户与服务器未建立完全相关,但各自通过socket()和bind()建立了半相关。UDP是面向无连接的,收发数据无顺序并且不可靠。


网络安全编程基础 之 网络编程_第2张图片
无连接套接字调用

服务器端执行方式:

1、调用socket()创建套接字。

2、调用bind()进行绑定。

3、使用recvfrom()接收数据,使用sendto()发送数据。调用recvfrom()会阻塞,等待客户端发送数据,然后才返回。

4、通信完成后,调用close()关闭套接字。

客户端执行方式:

1、调用socket()创建套接字。

2、调用bind()绑定。

3、调用sendto()发送数据,recvfrom()接收数据。

4、通信完后调用close()关闭套接字。

你可能感兴趣的:(网络安全编程基础 之 网络编程)