简述多路复用与多路分解
在计算机网络体系结构中,网络层与传输层承担着不同粒度的交付职责。网络层基于 IP 协议实现主机到主机的端到端通信,而传输层则在此基础上,进一步为运行在主机上的应用进程提供进程到进程的通信服务。在接收方主机中,传输层从网络层获取报文段后,需将其精准交付至对应的应用进程。
进程通过套接字(Socket)与外界进行网络通信,一个进程可拥有一个或多个套接字。因此,如何将到达运输层的报文段准确路由至目标套接字,成为传输层的核心任务之一。为此,每个传输层报文段都包含特定的标识字段(如 TCP/UDP 的源端口号、目标端口号),用于标记数据的发送端与接收端。
在接收端,传输层通过解析报文段的标识字段,识别目标套接字,并将报文段定向交付,这一过程称为多路分解(Demultiplexing)。而在发送端,传输层则负责从不同套接字收集数据,为每个数据块封装包含源 / 目标端口号等信息的首部,生成报文段后传递给网络层,此过程称为多路复用(Multiplexing)。通过多路复用与多路分解机制,传输层实现了多个应用进程在同一网络连接上的并发通信,确保数据既高效共享底层资源,又能准确无误地抵达目标进程。
端口号是一个 16 比特的无符号整数,取值范围为 0~65535。其中:
- 0~1023 端口称为周知端口号(Well-Known Ports),由互联网号码分配机构(IANA)统一管理,保留给 HTTP、FTP、SSH 等标准应用层协议使用。例如:80 端口用于 HTTP 协议,22 端口用于 SSH 服务。
- 1024~49151 端口称为注册端口号(Registered Ports),可供用户自定义的应用程序注册使用(需向 IANA 申请)。
- 49152~65535 端口称为动态 / 临时端口号(Dynamic/Private Ports),用于客户端程序临时申请,无需提前注册,由操作系统自动分配。
当我们开发一个新的应用程序的时候,必须给其分配一个端口。
无连接协议(如 UDP)和面向连接协议(如 TCP) 在实现多路复用与多路分解时,因协议特性不同而存在显著差异。
无连接协议(以 UDP 为例)的多路复用与多路分解
核心特点
- 无连接状态管理:通信前无需建立连接,每个报文段独立传输,不维护连接上下文。
- 基于端口号的轻量级标识:通过源端口号和目的端口号区分不同进程,无需跟踪连接状态。
1. 多路复用(发送端)
- 机制:
多个应用进程(套接字)的数据块被逐个封装成 UDP 报文段,每个报文段添加源端口号(标识发送进程)和目的端口号(标识接收进程),然后通过同一网络层接口(如 IP 层)发送到网络。 - 关键逻辑:
- 不同套接字的数据可混合传输,共享底层网络资源(如 IP 层的主机到主机通信)。
- 源端口号可选:客户端进程通常由操作系统动态分配临时端口号(如 49152~65535),服务器进程需绑定固定端口号(如 DNS 服务的 53 端口)。
- 示例:
一台主机上的实时聊天应用(端口 A)和视频流应用(端口 B)同时通过 UDP 发送数据,两者的报文段会交替进入 IP 层,由 IP 层负责路由转发。
2. 多路分解(接收端)
- 机制:
接收端 UDP 模块从 IP 层获取报文段后,根据报文段中的目的端口号查找对应的套接字,将数据交付给该套接字关联的进程。 - 关键逻辑:
- 若目的端口号未被任何套接字绑定,UDP 会丢弃该报文段并可能返回 ICMP 端口不可达消息。
- 同一主机上可能存在多个绑定相同目的端口号的套接字吗?通常不允许,因为端口号在单主机上需唯一标识进程(除非使用 IP 多播 / 广播,但需额外参数区分)。
- 标识要素:
UDP 套接字的唯一标识为 (源 IP 地址,源端口号,目的 IP 地址,目的端口号,协议类型),但多路分解时主要依赖目的端口号和协议类型(UDP),结合接收主机的 IP 地址完成匹配。
无连接依赖端口号实现轻量化的进程区分,适合无需状态维护的场景,但可能因报文段独立传输导致顺序错乱或丢失。
面向连接协议(以 TCP 为例)的多路复用与多路分解
核心特点
- 连接状态管理:通信前需通过 “三次握手” 建立连接,每个连接有唯一的状态(如序列号、窗口大小等),通信结束后通过 “四次挥手” 释放连接。
- 基于套接字对的唯一标识:每个 TCP 连接由四元组(源 IP 地址,源端口号,目的 IP 地址,目的端口号)唯一标识,确保跨网络的唯一性。
1. 多路复用(发送端)
- 机制:
多个 TCP 连接(如浏览器打开的多个网页标签)的数据流被分割成数据段,每个数据段封装源端口号和目的端口号,并携带连接对应的序列号、确认号等状态信息,通过 IP 层复用同一物理链路发送。 - 关键逻辑:
- 每个 TCP 套接字(连接)独立维护发送缓冲区、拥塞控制等状态,数据段按连接顺序编号,确保可靠传输。
- 源端口号由客户端动态分配(避免冲突),服务器端通过固定端口号(如 HTTP 的 80 端口)监听连接请求。
- 示例:
用户同时用浏览器访问两个不同网站(服务器 IP 不同,但均使用 80 端口),客户端会为每个网站创建独立的 TCP 连接,分别绑定不同的源端口号(如 1025 和 1026),通过多路复用共享 IP 层的网络资源。
2. 多路分解(接收端)
- 机制:
接收端 TCP 模块从 IP 层获取数据段后,通过解析四元组(源 IP、源端口、目的 IP、目的端口)识别唯一的目标连接,将数据段按顺序放入对应连接的接收缓冲区,最终交付给绑定该连接的套接字进程。 - 关键逻辑:
- 即使多个连接的目的端口号相同(如多个客户端连接到服务器的 80 端口),也可通过源 IP 地址和源端口号区分不同连接。
- 若数据段的四元组无法匹配任何已建立的连接,TCP 会丢弃该数据段并返回 RST(复位)报文。
- 标识要素:
TCP 套接字的唯一标识为 (源 IP 地址,源端口号,目的 IP 地址,目的端口号),多路分解时必须完全匹配这四个要素,确保将数据段准确交付到正确的连接。
面向连接通过四元组唯一标识连接,结合状态管理实现可靠数据交付,适合需要严格顺序和完整性的场景。
两者均通过端口号实现进程级通信,但 TCP 通过 “连接” 机制引入了额外的标识维度和状态管理,以牺牲资源为代价换取可靠性。
🍥🍥🍥.