3.5.2 网间进程通信需要解决的问题
在第2章中已经了解了单机间并发进程间的通信,对于单机而言,每个进程都在自己的地址空间内运行,操作系统为进程间的通信提供了管道(Pipe)、软中断信号(Signal)、消息(Message)、共享存储区(Shared Memory)以及信号量(Semaphore)等手段,以确保单机进程间的通信相互不干扰而又能协调一致。
网间进程通信不同于单机进程间通信,它是网络中不同主机中的应用进程之间的通信,需要解决以下的问题。
1.网间进程的标识问题
在同一主机中,不同的进程可以用进程号来唯一标识,如用进程号2和3分别标识两个不同的进程。但是在网络环境下,分布在不同主机上的进程号已经不能唯一地标识一个进程了。例如,主机A中某进程号是3,主机B中也可能存在进程号为3的进程。在这种情况下,进程号3就不能唯一地标识位于不同主机上的两个进程了。
2.与网络协议栈的链接问题
从第3章网络协议部分了解到,网间进程的通信是需要借助网络协议栈来实现的。源主机上的应用进程向目的主机上的应用进程发送数据时,需要将数据交给下一层的传输层协议实体,调用传输层提供的传输服务,传输层及其下层协议将数据层层向下递交,最后由物理层将数据变成信号,发送到网络上,经过各种网络设备的寻径和转发,才能到达目的主机,目的主机的网络协议栈再将数据层层上传,最终将数据递交给接收端的应用进程,这个过程是非常复杂的。
而对于网络应用程序开发者来说,在进行程序开发时,希望用一种简单的方式来与下层网络协议栈连接,而无须考虑其具体的工作过程,仅仅需要考虑应用层涉及的问题即可。解决这个问题的办法有不少,其中最基础的是基于套接字的网络编程方法。
3.多重协议的识别问题
操作系统支持的网络协议种类繁多,如常见的TCP/IP、IPX/SPX等。不同协议的工作方式不同,地址格式也不同,位于同一层上的不同类协议间是不能通信的。因此网间进程通信需要解决多重协议的识别问题。
4.不同的通信服务质量问题
不同类的网络应用所需要的通信服务质量等级不同。例如,使用文件传输服务传输大容量文件时,要求传输可靠、无差错、无乱序、无丢失,否则接收到的文件将不能使用。但是对于像网络聊天一类的应用来说,对可靠性的要求就不如前者那么高了。在TCP/IP协议族中,传输层有TCP和UDP这两种协议,TCP协议可以提供可靠的数据传输服务,而UDP提供不可靠的数据传输服务,但是后者的工作效率比前者要高。因此,开发网络应用程序时应该针对不同类别的应用有选择地使用合适的网络协议。
下面着重解决以上4个问题中的第1和第2个问题。