《计算机网络——自顶向下方法》运输层——多路复用与多路分解

多路复用与多路分解

运输层的多路复用和多路分解,就是将由网络提供的主机到主机的交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。
在目的主机,运输层从紧邻其下的网络层接收报文段。运输层负责将这些报文段中的数据交付给在主机上运行的适当应用程序进程。
一个进程有一个或多个套接字(socket),它相当于从网络向进程传递数据和从进程向网络传递数据的门户。因此,在接收主机中的运输层实际上并没有直接将数据交付给进程,而是将进程交给了一个中间套接字。由于在任意时刻,在接收主机上可能有不止一个套接字,所以每个套接字都有唯一的标识符。标识符的具体格式取决于它是UDP还是TCP。
每个运输层报文段中具有几个字段。在接收端,运输层检查这些字段,标识出接收套接字,进而将报文段定向到该套接字。将运输层报文段中的数据交付到正确的套接字的工作称为多路分解。在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息(在以后用于分解)从而生成报文段,然后将报文段传递到网络层,所有这些工作称为多路复用
理解了多路复用和多路分解的作用后,我们将看它们在主机中实际是怎样工作的。运输层多路复用要求:1. 套接字有唯一标识符;2. 每个报文段有特殊字段来知识该报文段所要交付到的套接字。这些特使的字段是源端口号目的端口号。端口号是一个十六比特的数,范围在065535之间,01023为周知端口号,是受限制的。
现在我们清楚了运输层是怎样实现分解服务的呢:在主机上,每个套接字能够分配一个端口号,当报文段到达该主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。然后报文段中的数据通过套接字进入其所连接的进程。

无连接的多路复用与多路分解

主机上运行的Python程序通过clientSocket = socket(socket.AF_INEF, socket.SOCK_DGRAM)创建了一个UDP套接字,运输层自动的为该套接字分配一个端口号,另外一种方法是我们通过bind()方法为套接字关联一个特定的端口号(如19157),`clientSocket.bind(' ' , 19157)。通常,应用程序的客户让运输层自动地分配端口号,而服务器则分配一个特定的端口号。
一个UDP套接字是由一个二元组来表示的,该二元组包含一个目的IP和一个目的端口号。

面向连接的多路复用与多路分解

TCP套接字和UDP套接字之间一个细微的差别就是TCP套接字是由一个四元组来标识的。这样,当一个TCP报文段从网络到达一台主机时,该主机使用全部4个值来将报文段定向分解到相应的套接字。特别与UDP不同的是,两个具有不同源IP或端口号的到达TCP报文段将被定向到两个不同的套接字,除非TCP报文段携带了初始创建连接的请求。
考虑之前的编程实例:

  • TCP服务器应用程序有一个“welcome socket”,它在13000端口上等待来自TCP客户的连接建立请求;
  • TCP客户创建一个套接字,并发送一个连接建立请求报文段
    clientSocket = socket(AF_INET, SOCKET_STREAM)
    clientSocket.connect((serverName, 13000))
  • 一条连接建立请求只不过是一个目的端口号为13000,TCP首部的特定“连接建立位” 置位的TCP报文段。这个报文段也包含一个客户选择的端口号;
  • 当运行服务器主机的计算机的主机操作系统接收到具有目的端口号13000的入连接请求报文后,它就定位服务器进程,该进程正在端口号13000等待接受连接。该服务器进程则创建一个新的套接字:
    connectionSocket, addr = serverSocket.accept( )
  • 该服务器的运输层还注意到连接请求报文段重点的下列4个值:1. 报文段中的源端口号; 2. 源主机IP地址; 3. 该报文段中的目的端口号; 4. 自身IP地址。随着TCP连接完成,客户和服务器边可相互发送数据了。

服务器主机可以支持很多并行的TCP套接字,每个套接字与一个进程相联系,并由其四元组来标识每个套接字。当一个TCP报文段到达主机时,所有4个字段被用来将报文段定向到相应的套接字。

你可能感兴趣的:(《计算机网络——自顶向下方法》运输层——多路复用与多路分解)