Appearance
题目
UDP 协议实现分用(demultiplexing)时所依据的头部字段是( )。
错因
A
源端口号是发送方进程的端口——它告诉接收方"你回包应该往哪个端口发",但不用于分用。分用是接收方做的"把上来的报文段交给本机哪个进程"的决策——这一步要看目的端口号(本机要交给哪个进程),与源端口无关。
C
UDP 首部的"长度"字段表示 UDP 报文(首部 + 数据)的总字节数——用于校验和计算和帧界定,不参与分用。错的根源:把"分用"和"读取报文长度"混淆。
D
校验和字段用于差错检测——接收方算一遍校验和与首部里的对比,若不等则丢弃;与"交给哪个进程"无关。错的根源:把"分用"和"差错检测"两个不同功能混淆。
总解析
第一步:区分"复用"与"分用"
| 操作 | 谁做 | 依据字段 | 含义 |
|---|---|---|---|
| 复用(multiplexing) | 发送方传输层 | 在传输层封装时把进程的源端口写入 | 多个进程共享一条传输层接口 |
| 分用(demultiplexing) | 接收方传输层 | 目的端口号 | 把上来的报文段交给本机正确进程 |
分用过程:
接收方主机收到一个 IP 数据报,剥掉 IP 头后得到 UDP 段。UDP 段的首部里有:
- 源端口(发送方进程端口)
- 目的端口(本机要交给哪个进程) ← 分用的依据
- 长度
- 校验和
操作系统通过查"目的端口号"找到本机正在监听该端口的进程,把数据交给它。例如 UDP 53 → DNS 服务器进程,UDP 67 → DHCP 服务器进程。
第二步:核对
题问"分用所依据的头部字段" → 接收方查表的依据 → 目的端口号。
最终答案是 B(目的端口号)。
编者注(生僻术语):UDP 与 TCP 的分用机制不同——
- UDP:仅按 (目的 IP, 目的端口) 分用,所有发到同一端口的报文都交给同一个进程
- TCP:按四元组 (源 IP, 源端口, 目的 IP, 目的端口) 分用,可同时支持多个客户端连接同一服务端口(一服务端口接受 N 个独立连接)
这就是为什么一台服务器的 80 端口能同时服务千万个 HTTP 连接——TCP 分用看的是四元组,每个连接是独立的。题面问的是 UDP,所以答案是单字段(目的端口号)。