网间进程通信
网间进程通信面临的问题
1)网间进程的标识问题。在同一主机中,不同的进程可以用进程号唯一标识,但在网络环境下,各主机独立分配进程号,此时进程号的唯一性失去意义。
2)多重协议的识别问题。现行的网络体系结构有很多,如TCP/IP、IPX/SPX等,操作系统往往支持众多的网络协议,不同协议的工作方式不同,地址格式也不同,因此网络间进程通信还要解决多重协议的识别问题。
3)多种通信服务的选择问题。随着网络应用的不同,网络间进程通信所要求的通信服务会有不同的要求,有的要求传输效率高,有的要求传输可靠性高,还有的要求数据构造灵活,因此,要求网络应用程序能够有选择地使用网络协议栈提供的网络通信服务功能。
为此,在继承一般I/O操作的基础上,协议软件接口的设计扩展了以下若干环节:
● 扩展了文件描述符集。使应用程序可以创建能被网络通信所使用的描述符(称之为“套接字”);
● 扩展了读和写这两个系统调用,使其支持网络数据的接收和发送(增加了新的数据收发函数);
● 增加了对通信双方的标识(用IP地址和端口号标识唯一的网络地址上的唯一的应用程序);
● 指明通信所采用的协议(用协议簇和服务类型对不同协议簇下的特定协议进行统一命名);
● 确定通信方的角色(客户端或服务器);
● 增加了对网络数据格式的识别和处理;
● 增加了对网络操作的控制等。
问题的解决
在TCP/IP网络环境中,可以使用套接字来建立网络连接,实现主机之间的数据传输。
套接字(Socket),在网络通信中是支持TCP/IP网络通信的基本操作单元,可以看作是一个接口,该接口在操作系统控制下帮助本地主机建立或拥有的应用程序与其他(远程)应用进程相互发送和接收数据。这意味着Socket用来让一个进程和其他进程互通信息,就像用电话和其他人交流一样,通过Socket为客户和服务器建立了一个双向的连接管道。
作为连接应用程序和协议实现的桥梁,Socket在应用程序中创建,通过绑定应用程序所在的IP地址和端口号,与系统的协议实现建立关系。此后,应用程序送给Socket的数据,由Socket交给协议实现向网络上发送出去,计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由系统协议实现交给Socket,应用程序便可从该Socket中提取接收到的数据,网络应用程序就是这样通过Socket进行数据的发送与接收的。
套接字接口并没有直接使用协议类型来标识通信时的协议,而是采用一种更灵活的方式——协议簇+套接字类型,以方便网络应用程序在多协议簇的同类套接字程序中移植。
在Socket通信中,常用的协议簇有:
● PF_INET:IPv4协议簇。
● PF_INET6:IPv6协议簇。
● PF_IPX:IPX/SPX协议簇。
● PF_NETBIOS:NetBIOS协议簇。
在Socket通信中,常用套接字类型包括三类:
●流式套接字(SOCK_STREAM)。流式套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收,数据传输可以是双向的字节流。
● 数据报套接字(SOCK_DGRAM)。数据报套接字用于提供无连接的数据传输服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或重复,且无法保证顺序地接收到数据。由于数据报套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。
● 原始套接字(SOCK_RAW)。当使用前两种套接字无法完成数据收发任务时,原始套接字提供了更加灵活的数据访问接口,使用它可以在网络层上对Socket进行编程,发送和接收网络层上的原始数据包。