一、前置知识

  • 多路复用与多路分解:也就是将由网络层提供的主机到主机交付服务延伸到为运行在主机上的应用程序提供进程到进程的交付服务。多路复用与多路分解服务是所有计算机网络都需要的

    1、进程如何取得来自网络的数据

    首先我们了解进程从网络中接收数据的过程:


在目的主机,运输层需要从其下层的网络层接收报文段。
而运输层则负责将这些报文段中的数据交付给目标进程的指定套接字(而一个进程可能有多个套接字)
因此套接字(Socket)充当从进程向网络传递数据和从进程向网络传递数据的门户。
如下图
image.png

2、运输层报文结构

image.png
如上我们可见 每个运输层报文中都有两个首部字段-源端口号和目的端口号


而在主机上,每个套接字都对应着一个进程,而每个套接字都能够分配一个端口号
所以当报文段到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字 (多路分解),然后报文段中的数据通过套接字进入其所连接的进程。
端口号是一个16比特的数,其大小在0-65535之间。0-1023范围的端口称为周知端口号,是受限制的,这是指它们保留给诸如HTTP和FTP之类的周知应用层协议来使用

二、概述

1、多路分解

  • 将运输层报文段中的数据交付到正确的套接字的工作称为多路分解

    2、多路复用

  • 在源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息(封装源端口号和目的端口号,这将在以后用于分解)从而生成报文段,然后将报文段传递到网络层 ,所有这些工作称为多路复用

    三、UDP和TCP中的多路复用和多路分解有何不同

  • 主要是socket的不同

    1、UDP套接字-无连接的多路分解与多路复用

  • 当我们创建一个UDP套接字时,运输层会自动或者我们人为为套接字绑定一个1024 - 65535之间的端口(其余端口是周知端口,留给一些周知应用层协议)。

  • UDP套接字由二元组来进行全面标识
    • 该二元组包含一个目的IP地址和一个目的端口号
    • 因此,如果两个UDP报文段有不同的源IP地址或源端口号,但具有相同的目的IP地址和目的端口号,那么这两个报文段将通过相同的目的套接字被定向到相同的目的进程。(多路分解)
    • 源端口号用作“返回地址”的一部分填充到回复报文的目的端口,这很明显

image.png

2、TCP套接字-面向连接的多路复用与多路分解

  • 而TCP套接字接字和UDP套接字之间有一个细微差别TCP套接字由一个四元组(源IP地址,源端口号,目的IP地址,目的端口号)来进行标识
  • 因此因为使用了四个值来进行套接字的定位,所以来自不同IP但源端口相同的两个TCP报文段将被定向到两个不同的套接字,反之亦然。(多路分解)
  • 服务器主机可以支持很多并行的TCP套接字,每个套接字与一个进程相联系,并由其四元组来标识每个套接字。当一个TCP报文段到达主机时,所有4个字段(源P地址,源端口,目的P地址,目的端口)被用来报文段定向(分解)到相应的套接字

image.png