什么是套接字编程?

Socket介绍Socket是进程通信的一种方式,即调用这个网络库的一些API函数,实现分布在不同主机的相关进程之间的数据交换。

几个定义:

(1)IP地址:即根据TCP/IP协议分配给本地主机的网络地址。两个进程需要通信。任何一个进程都必须首先知道通信方的位置,也就是对方的IP。

(2)端口号:用于标识本地通信进程。一个本地进程在通信时会占用一个端口号,不同的进程有不同的端口号。因此,在通信之前必须分配一个未访问的端口号。

(3)连接:指两个进程之间的通信链接。

(4)半相关:网络中的三元组可以全局唯一标记一个进程:(协议,本地地址,本地端口号)。这样的三元组称为半相关,指定了连接的每一半。

(5)全相关:一个完整的网间进程通信需要由两个进程组成,只能使用同一个高层协议。也就是说,不能通信的一端使用TCP协议,另一端使用UDP协议。所以一个完整的网间通信需要五元组来识别:(协议,本地地址,本地端口号,远程地址,远程端口号)。这样的五元组称为关联,即两个协议相同的半关联可以组合成适当的关联,或者完全指定形成连接。客户端/服务器模式在TCP/IP网络应用中,两个通信进程之间交互的主要模式是客户端/服务器(C/S)模式,即客户端向服务器发送服务请求,服务器收到请求后,提供相应的服务。

客户机/服务器模式的建立基于以下两点:

(1)首先,建立网络的原因是网络中的软硬件资源、计算能力和信息不对等,需要共享,从而造成了提供服务的资源多的主机和请求服务的资源少的客户的非对等角色。

(2)其次,网间进程通信是完全异步的,通信进程之间没有父子关系,也没有共享内存缓冲区。因此,需要一种机制来建立希望通信的进程之间的联系,并为它们之间的数据交换提供同步。这是基于客户机/服务器模式的TCP/IP。服务器端:流程是服务器端先启动,

并根据请求提供相应的服务:

(1)打开一个通信信道,通知本地主机它愿意在一个可识别的地址上的端口接收客户请求(例如,FTP的端口可能是21);

(2)等待客户要求到达港口;

(3)当接收到来自客户端的服务请求时,处理该请求并发送响应信号。当接收到并发服务请求时,应该激活一个新的进程来处理客户端请求(比如UNIX系统中的fork和exec)。新流程处理这个客户请求,不需要响应其他请求。服务完成后,关闭这个新流程与客户之间的通信链接,并终止它。

(4)返回步骤(2)并等待另一个客户请求。

(5)关闭服务器客户端:

(1)打开一个通信通道,连接到服务器所在主机的特定端口;

(2)向服务器发送服务请求消息,等待并接收响应;继续提要求。

(3)请求结束后,关闭通信通道并终止。

从上述过程可以看出:

(1)客户端和服务器进程的角色是不对称的,所以代码是不同的。

(2)服务器进程一般先启动。只要系统运行,服务进程就会存在,直到被正常终止或强制终止。Socket的编程涉及面很广。调用各种编程语言与网络上的TCP进行通信(TCP可靠通信的实现)和socket的UDP封装可以是监听外部链接,也可以是发起链接请求,发送特定协议并进行通信,如何制定协议规范,如何对协议进行编码和解码,如何将协议数据转换成二进制数据,发送到网络,以及从网络接收,并成功处理(涉及TCP粘包等问题),如何构建。