3.5.3 网间进程标识及通信过程的建立
两个网间进程要进行通信,面对的首要问题是上一小节中提到的第1个问题——网间进程的标识问题。不同协议族的进程标识方法有一定的区别,本节主要讨论TCP/IP协议族下的网间进程标识方法。
1.网间进程的标识
网间进程通信,不能仅仅依靠进程号来进行标识。在Internet中的两个应用进程在通信时,需要通过3点来确定对方:对方主机的标识、对方应用进程在其主机上的标识、与对方通信使用的传输层协议。
(1)主机标识
3.2.5节已经介绍,在Internet中,IP地址可以唯一地标识一台主机。因此,IP地址是网间进程标识的第1个要素。
(2)端口
IP地址确定了主机在Internet中的网络位置,但是最终进行通信的不是整个主机,而是主机中的某个应用进程。每个主机中都有很多应用进程,仅有IP地址是无法区分一台主机中多个应用进程的。从这个意义上讲,网络通信的最终地址就不仅仅是主机的IP地址,还应该包括描述应用进程的某种标识,这个标识就是端口。端口是网间进程标识的第2个要素。
端口实际是TCP/IP协议族中应用层与传输层协议实体间的服务访问点(SAP)。应用进程通过系统调用与某个端口进行绑定,就可以通过该端口收发数据。应用进程在通信时,必须用到一个端口,它们之间有着一一对应的关系,所以可以用端口来标识同一主机上不同的网络应用进程。
端口标识符是一个16位的整数,是操作系统可分配的一种资源,是一种抽象的软件机制。当它被操作系统分配给某个网络应用进程并建立绑定关系后,传输层传给该端口的数据都被该应用进程接收,而该进程发给传输层的数据都通过该端口输出。在TCP/IP的实现中,对端口的操作类似于一般的I/O操作,应用进程获取一个端口相当于获取了本地唯一的I/O文件,可以用一般的读写原语访问它。
由于端口是用来标识同一主机上不同的网络应用进程的,因此两个网间进程进行通信时,需要事先知道对方的端口号。例如,WWW服务器的默认端口号是80,因此浏览器在访问网站时,默认会去访问网站WWW服务器的80端口;FTP服务器的默认端口号是21端口,所以FTP客户端在访问FTP服务器时默认会去访问服务器的21端口。这类Internet上著名的服务器进程所约定俗成的端口也称为周知端口或保留端口,范围是0~1 023,采用全局分配或集中控制的方式,由一个权威机构根据需要进行统一分配,并将结果公之于众。常见的保留端口如表3-9所示。除了保留端口外,其余的端口,如1 024~65 535,称为自由端口,由每台计算机在进行网络通信时动态、自由地分配给应用进程。具体来说,端口的分配规则如下。
表3-9 一些典型的保留端口
·端口0:不使用,或者作为特殊的用途。
·端口1~255:保留给特定的服务,如WWW、FTP、POP3等众所周知的服务。
·端口256~1 023:保留给其他服务,如路由。
·端口1 024~4 999:可以用作任意客户的端口。
·端口5 000~65 535:可以用作用户的服务器端口。
需要指出的是,网络应用程序在提供服务时,除了按照权威机构全局分配的方法,也可以按照需要自行分配。例如,常见的WWW服务器Tomcat就默认采用8080端口,而不是大多数WWW服务器通常采用的80端口,但由于端口是自行分配的,因此在向外提供服务时,需要让服务使用者知道其实际使用的端口号。
(3)传输层协议
网络应用进程要与对端进程通信时,除了对端的IP地址、端口号以外,还要确定与对方通信所使用的传输层协议。在TCP/IP协议族中,传输层协议有TCP和UDP,它们是完全独立的,因此各自的端口号也相互独立,如TCP有一个80端口,UDP也可以有一个80端口,二者并不冲突。
传输层协议是网间进程标识的第3个要素。
(4)半相关和全相关
主机的IP地址、端口号和传输层协议这3个要素组成的三元组称为半相关(Halfassociation),它标识了Internet中进程通信的一个端点,也把它称为进程的网络地址。
在Internet中,完整的网间进程通信需要由两个进程组成,两个进程是通信的两个端点,并且它们必须使用同样的传输协议,也就是说不能一端使用TCP协议,而另一端使用UDP协议,因此描述一个完整的网间进程需要5个要素:
(传输层协议,本机IP地址,本机传输层端口,远端机IP地址,远端机传输层端口)
这个五元组称为全相关(Association),即两个协议相同的半相关才能组合成一个全相关,或完全指定一对网间通信的进程。这个五元组就是网间进程的标识,它唯一地确定了一对网间进程。
2.网间进程通信过程的建立
当两个网间进程要通信时,一定是由其中的某一个进程首先发起的。对于采用客户机/服务器模式的两台主机来说,首先发起的一方总是客户机,而对端是服务器;对于采用P2P模式的两台主机来说,可以互为客户机和服务器。首先发起通信的一方(以下称为A端)需要事先知道对端主机(以下称为B端)的IP地址、端口号和传输层协议。当这3个要素确定下来以后,通信的对端就完全确定下来,可以进行通信了。
A端进程在确定了B端进程的网络地址后,会向本机的操作系统申请一个本地端口号,并且A端进程是知道本机的IP地址的,因此当其第一次和B端进程通信时,会向B端进程报告自己的IP地址和端口号。所以在第一次通信以后,B端进程也就获知了A端进程的IP地址和端口号。至此,通信的两端互相获得了对方进程的IP地址,可以进行后续的通信了。第一次通信的过程如图3-27所示。
3.网间进程数据解析示例
为了说明网间进程建立时涉及的数据结构,以下以浏览器访问网站时发送和接收到的数据为例子,说明网间进程涉及的几个要素。该数据结构是由对网络封包分析软件Wireshark抓取到的网络包进行解析得到。操作过程如下:
①打开Wireshark,设置抓取协议为HTTP及端口为80的网络包;
②打开浏览器,访问百度网站http://www.baidu.com。
Wireshark抓取到的数据如图3-28所示。
图3-27 客户机与服务器的第一次通信
图3-28 网络包结构
从图3-28中可以看出以下几点。
①浏览器和服务器进行了两次通信,第一次通信是浏览器所在的主机(192.168.0.114)向服务器(61.135.169.121)发送数据,数据包的长度为996字节;第二次通信是服务器向浏览器发送数据,数据包的长度为559字节。
②网络层通信协议采用TCP/IP。
③应用层协议采用HTTP。
④通信过程中浏览器使用了3834端口,服务器使用了80端口,因此该网间进程的五元组为(TCP/IP,192.168.0.114,3834,61.135.169.121,80)。
进一步分析该网络包的应用层数据,可以看出以下几点。
①在第一次通信中,浏览器向WWW服务器请求访问网站的首页内容,请求的数据如图3-29所示,其中画粗框的部分是请求的内容,这部分内容是按照应用层协议HTTP组织的。几个基础内容描述如下:
·GET/HTTP/1.1表示访问网站首页,使用HTTP协议1.1版本;
·User-Agent表示浏览器的类型;
·Host:www.baidu.com表示访问的主机是www.baidu.com。
图3-29 HTTP请求包内容
②在第二次通信中,WWW服务器向浏览器返回主页的内容,数据如图3-30所示。
图3-30 HTTP响应包内容
其中画粗框的部分为HTTP协议规定的协议头部分的内容。而网站的内容如图3-31画粗框的部分所示。
图3-31 HTTP响应网站内容
这部分内容是使用HTML语言编写的网站内容,HTML语言将在下一章进行介绍。