TCP/IP参考模型的通信原理如下图所示,其中,第一层至第二层为串联的,而第三至四层则是端到端(End to End)的。
由上图可知,网际互联层与网络接口层实现了计算机网络中处于不同位置的主机之间的数据通信,但是数据通信不是计算机网络的最终目的,计算机网络最本质的活动是实现分布在不同地理位置的主机之间的通信进程,以实现各种网络服务功能。而设置传输层的主要目的就是要实现上述这种分布式进程之间的通信功能。
在单机系统中,由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间即互不干扰又协调一致工作,LINUX操作系统为进程之间的通信提供了相应的设施,如管道(Pipe)、命名管道(Named Pipe)、软中断信号(Signal)和信号量(Semaphore)等,但上述这些设施都仅限于用在本机进程之间的通信。而网间分布式进程通信要解决的是不同主机进程间的互相通信问题(同机进程通信只是其中的一个特例)。
在网络环境中分布式进程通信所需要解决的两个问题
1、进程命名与寻址
在同一台计算机中,每一个进程均被分配了一个唯一的端口(Port)与端口号(Port Number,也成为进程标识),其中,端口是一个信息缓存区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0~65535,以区别主机上的每一个应用程序进程。
如将端口类比为房间,则端口号就是房间号。端口号一般有以下两种基本的分配方式:
(1)全局分配
这是一种集中分配方式,由一个公认权威的中央机构根据用户的需要进行统一分配,并将结果公布与众,通过这种方式分配的端口号也成为熟知端口号
(2)本地分配(动态连接)
当进程需要访问传输层服务时,向本地操作系统提出申请,再由操作系统返回本地唯一的端口号。
由于同一台机器上的不同进程所分配到的端口号不同,因此,同一台机器上的不同进程就可以用端口号来唯一标识;但在网络环境中,显然,若要标识一个进程,除了端口号之外,还需要使用到本地主机的IP 地址(本地地址)来唯一标识进程所在的本地主机(这是由于不同机器上的进程可以拥有相同的端口号)。
2、多重协议的识别
由于Linux操作系统支持的网络协议众多,不同协议的工作方式与地址格式均不相同。因此在网络环境中,一个应用程序进程最终需要使用一个三元组<协议,本地地址,本地端口号>来唯一的标识;另外,在TCP/IP网络环境中,一个完整的网间通信需要由两个进程组成,并且这两个进程之间只能使用相同的传输层协议才能进行通信,也就是说,不可能通信的一端使用TCP协议,而另一端使用UDP协议。因此,一个完整的网间通信需要一个五元组<协议,本地地址,本地端口号,远程地址,远程端口号>才能唯一地标识。
其中,二元组<本地地址,本地端口号>称为网间进程通信中的本地端点地址(End-point Address);
二元组<远程地址,远程端口号>称为网间进程通信中的远程端点地址;
三元组<协议,本地地址,本地端口号>成为一个半相关(Half-Association);
五元组<协议,本地地址,本地端口号,远程地址,远程端口号>则称为一个相关(Association)。