进程与套接字
一个进程有一个或多个套接字( socket),它相当于从网络向进程传递数据和从进程向网络传递数据的门户。在接收主机中的运输层实际上并没有直接将数据交付给进程,而是将数据交给了一个中间的套接字。在任一时刻,在接收主机上可能有不止一个套接字,所以每个套接字都有唯一的标识符。标识符的格式取决于它是UDP还是TCP套接字。
怎样将一个到达的运输层报文段定向到对应的套接字?
为了达到目的,每个运输层报文段中具有几个字段。在接收端,运输层检查这些字段,标识出接收套接字,进而将报文段定向到该套接字。将运输层报文段中的数据交付到正确的套接字的工作称为多路分解(demultiplexing)。在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用(multiplexing)。
运输层多路复用要求
- 套接字有唯一标识符;
- 每个报文段有特殊字段来指示该报文段所要交付到的套接字。字段是源端口号字段和目的端口号字段。
无连接的多路复用和多路分解
假定在主机A中的一个进程具有UDP端口19157,它要发送一个应用程序数据块给位于主机B中的另一进程,该进程具有UDP端口46428。主机A中的运输层创建一个运输层报文段,其中包括应用程序数据、源端口号(19157)、目的端口号****(46428)和两个其他值(对当前的讨论并不重要)。然后,运输层将得到的报文段传递到网络层。网络层将该报文段封装到一个IP数据报中,并尽力而为地将报文段交付给接收主机。如果该报文段到达接收主机B,接收主机运输层就检查该报文段中的目的端口号46428并将该报文段交付给端口号46428所标识的套接字。值得注意的是,主机B可能运行多个进程,每个进程都具有其自己的 UDP套接字和相联系的端口号。当从网络到达 UDP报文段时,主机B通过检查该报文段中的目的端口号,将每个报文段定向分解到相应的套接字。
面向连接的多路复用与多路分解
TCP套接字和UDP套接字之间的一个细微差别是,TCP套接字是由一个四元组(源IP地址,源端口号,目的P地址,目的端口号)来标识的。这样,当一个TCP报文段从网络到达一台主机时,该主机使用全部4个值来将报文段定向(分解)到相应的套接字。与UDP不同的是,两个具有不同源IP地址或源端口号的到达TCP报文段将被定向到两个不同的套接字。
TCP客户端创建一个套接字并发送一个连接建立请求报文段,假设报文段中目的端口号为12000,运行的服务器进程收到具有端口12000的连接请求后,将正在监听端口号为12000的进程创建一个套接字
所有后续到达的报文段,如果它们的源端口号、源主机IP地址、目的端口号和目的IP地址都与建立连接报文段中4个值匹配,则被分解到这个套接字。随着TCP连接完成,客户和服务器便可相互发送数据了。