第三章运输层
3.2多路复用与多路分解
在接收端,运输层检查这些字段并标识出接收套接字,然后将报文段定向到该套接字。将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。从源主机的不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层的工作称为多路复用。
多路分解服务的实现:主机上的每个套接字被分配一个端口号,当报文段到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。然后报文段中的数据通过套接字进入其所连接的进程。
运输层多路复用的要求:套接字有唯一标识符;每个报文段有特殊字段来指示该报文段所要交付的套接字。这些特殊字段是源端口号字段和目的端口号字段。端口号是一个16比特的数字,其大小在0-65535之间。0-1023范围的端口号称为周知端口号,是受严格限制的。
在主机上运行的一个Java程序使用下面一行创建了一个UDP套接字:
DatagramSocketmySocket=newDatagramSocket();
当用这种方式创建一个UDP套接字时,运输层自动的为该套接字分配一个端口号。特别是,运输层从范围1024-65535内分配一个主机尚未使用的UDP端口号。Java程序也可以使用下面这行代码来创建套接字:
DatagramSocketmySocket=newDatagramSocket(19157);
在这种情况下,应用程序为UDP套接字指派了一个特定的端口号19157。如果应用程序开发者所编写的代码实现的是一个‘周知协议’的服务器端,那么他就必须为其分配一个相应的周知端口号。
通过为UDP套接字分配端口号,我们现在能够准确地描述UDP的多路复用与多路分解了。假定主机A中的一个进程具有的UDP端口号19157,它要发送一个应用程序数据块给主机B中的另一进程,该进程具有的UDP端口号为46428。主机A中的运输层创建一个运输层报文段,其中包括应用程序数据、源端口号(19157)、目的端口号(46428)和两个其它值。然后,运输层将生成的报文段传递到网络层。网络层将该报文封装到一个IP数据报中,并尽力而为地将报文段交付给接收主机。如果该报文段到达接收主机B,接收主机运输层检查该报文段中的目的端口号(46428)并将该报文段传递给端口号46428所标识的套接字。注意到主机B能够运行多个进程,每个进程有自己的UDP套接字及相应的端口号。当从网络到达UDP报文段时,主机B通过检查该报文段中的目的端口号,将报文定向到相应的套接字。
一个UDP套接字是由一个包含目的IP地址和目的端口号的二元组来全面标识的。因此,如果两个UDP报文段有不同的源IP地址/源端口号,但具有相同的目的IP地址和目的端口号,那么这两个报文将通过相同的目的套接字定向到相同的目的进程。
源端口号的用途:在A到B的报文段中,源端口号作为‘返回地址’的一部分,即当B需要发回一个报文段给A时,B到A的报文段中的目的端口号便从A到B的报文段的源端口号中取值。
TCP套接字和UDP套接字之间的一个细微差别是,TCP套接字是由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来标识的。这样,当一个TCP报文段从网络到达一台主机时,主机使用全部4个值来将报文段定向到相应的套接字。特别地,与UDP不同的是,两个具有不同源IP地址或源端口号的到达的TCP报文将被定向到两个不同的套接字,除非TCP携带了初始创建连接的请求。
我们来看一个例子:
TCP服务器应用程序有一个‘welcomesocket’,它在6789端口上等待TCP客户机的连接请求。
TCP客户机使用下面这行代码产生一条连接建立报文段:
SocketclientSocket=newSocket(“serverHostName”,6789);
一个连接建立请求只不过是一个目的端口号为6789、对TCP首部的特定连接建立位置位的TCP报文段。这个报文段也包含一个源端口号,它是由客户机选择的。上面的程序行还为客户机创建了一个TCP套接字,通过该套接字客户机进程可以发送和接收数据。
当运行服务器进程的计算机的主机操作系统接收到目的端口号为6789的入连接请求报文段后,它就定位服务器进程,该进程正在端口号6789等待接受连接。该服务器进程则创建一个连接套接字:
SocketconnectionSocket=welcomeSocket.accept();
该服务器还关注连接请求报文段中的下列4个值:该报文段中的源端口号;源主机IP地址;该报文段中的目的端口号;自身的IP地址。新创建的连接套接字通过这4个值来标识。所有后续到达的报文段,如果它们的源端口号、源主机IP地址、目的端口号和目的IP地址都与这4个值匹配,则被多路分解到这个套接字。TCP连接完成后,客户机和服务器便可以相互发送数据了。
服务器主机可同时支持很多TCP套接字,每个套接字与一个进程相联系,并由其四元组来标识每个套接字。当一个TCP报文段到达主机时,所有4个字段(源IP地址,源端口号,目的IP地址,目的端口号)用来定向报文段到相应的套接字。
|
|