首页/计算机网络/05-transport/UDP校验 🔗 在 Obsidian 中打开
计算机网络 · 05-transport

UDP校验

难度 ★★★重要度 ★★★★★ 考查频率 低 计算机网络/传输层UDP校验和伪首部反码运算
速查
UDP 校验和覆盖 伪首部 + UDP 首部 + 数据 三部分;采用二进制反码求和(进位回卷),结果取反填入校验和字段。伪首部用于验证IP 地址与协议号是否正确,IPv4 中可选、IPv6 中强制。

核心概念

UDP 校验的作用

  • 检测 UDP 报文段在传输过程中是否出现差错。
  • 校验范围:伪首部 + UDP 首部 + 数据

UDP 首部结构(8 字节)

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│          Source Port          │       Destination Port         │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│            Length             │           Checksum             │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│                         Data                                   │
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

字段说明:
- 源端口(16bit):发送方端口号
- 目的端口(16bit):接收方端口号
- 长度(16bit):UDP 报文段总长度(首部+数据),最小 8 字节
- 校验和(16bit):校验 伪首部+首部+数据

伪首部

伪首部结构(12 字节)

伪首部不是 UDP 首部的一部分,只用于校验计算

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│                       Source IP Address                        │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│                    Destination IP Address                      │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│  Zero │Protocol│        UDP Length                             │
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

字段说明:
- 源 IP 地址(32bit):来自 IP 头
- 目的 IP 地址(32bit):来自 IP 头
- 全 0(8bit)
- 协议号(8bit):17(UDP)
- UDP 长度(16bit):来自 UDP 首部的长度字段

为什么需要伪首部

目的验证分组是否到达了正确的目的主机和正确的协议。若只校验 UDP 首部和数据,IP 地址或协议号错误时校验仍会通过;加入伪首部后,IP 地址变化或协议号错误都会导致校验失败。

校验和计算过程

计算步骤

  1. 将校验和字段置 0。
  2. 在数据部分末尾补 0(使总长度为 16 位的整数倍)。
  3. 将伪首部 + UDP 首部 + 数据每 16 位一组。
  4. 二进制反码求和
  5. 结果取反码,填入校验和字段。

二进制反码求和:两个 16 位数相加,若有进位则回卷到最低位,即 $(a + b) \bmod 2^{16} + (a + b) / 2^{16}$。

计算示例

伪首部: 0x C0A8 0164 0A00 0001 00 11 000C
UDP首部: 0x 0050 0035 000C 0000
数据:    0x 1234 5678

步骤1: 校验和字段置0
步骤2: 数据已是16位整数倍
步骤3-4: 反码求和
C0A8 + 0164 = C20C
C20C + 0A00 = CC0C
CC0C + 0001 = CC0D
CC0D + 0011 = CC1E
CC1E + 000C = CC2A
CC2A + 0050 = CC7A
CC7A + 0035 = CCAF
CCAF + 000C = CCB3
CCB3 + 0000 = CCB3
CCB3 + 1234 = DEE7
DEE7 + 5678 = 355F + 1 = 3560

步骤5: 取反码 = CA9F

校验和验证

接收方:
1. 将 伪首部 + UDP 首部 + 数据 每 16 位一组
2. 按二进制反码求和
3. 结果取反码
4. 如果结果为 0 → 校验通过
5. 如果结果非 0 → 校验失败,丢弃
原理发送方对「含置 0 校验和字段的全部内容」反码求和再取反;接收方把所有内容(含校验和)再反码求和,若无误则恰好全 1,取反后为 0。

与 IP 校验和的区别

特性IP 校验和UDP 校验和
校验范围只校验 IP 头伪首部 + UDP 头 + 数据
每跳计算是(TTL 变化)
伪首部
是否必须必须可选(IPv4),必须(IPv6)

常见考法

考点说明
伪首部的组成源 IP、目的 IP、0、协议号、UDP 长度
校验和计算反码求和(进位回卷)
为什么需要伪首部验证 IP 地址和协议
UDP 校验是否必须IPv4 可选,IPv6 必须

易错点

必记
  • 伪首部不是 UDP 首部的一部分,只用于校验计算。
  • 伪首部中的协议号是 17(UDP),不是 6(TCP)。
  • IPv4 中 UDP 校验是可选的(可设为 0 表示不校验)。
  • IPv6 中 UDP 校验是必须的(因为 IPv6 头没有校验和)。
  • 计算时校验和字段要先置 0

核心结论

  1. UDP 校验范围 = 伪首部 + UDP 首部 + 数据
  2. 伪首部用于验证 IP 地址和协议号。
  3. 使用二进制反码求和计算校验和。
  4. IPv4 中 UDP 校验可选,IPv6 中必须。

记忆卡片

UDP 校验的范围?
伪首部 + UDP 首部 + 数据。
伪首部包含什么?
源 IP、目的 IP、全 0、协议号(17)、UDP 长度。
为什么需要伪首部?
验证分组到达了正确的目的主机和正确的协议。
UDP 校验在 IPv4 中是必须的吗?
可选(设为 0 表示不校验),IPv6 中必须。

交互动画 · 校验和覆盖范围

UDP 报文段参与校验和的字段(橙色为参与计算) 伪首部 12 字节 IP+协议号 UDP 首部 8 字节 含校验和 数据 变长 补 0 对齐 二进制反码求和
选择一种覆盖范围,观察伪首部是否参与校验和计算
点击上方按钮开始
示意图:橙色块表示参与校验和的字段;含伪首部时,IP 地址或协议号被篡改会导致校验失败。
手动模式

16 位分组(反码求和)

伪首部·源IPC0A8 0164
伪首部·目的IP0A00 0001
伪首部·0+协议17+长度00 11 000C
首部·源端口/目的端口0050 0035
首部·长度/校验和(0)000C 0000
数据(补0对齐)1234 5678
当前校验和结果
点击「下一步」从伪首部开始逐组求和
反码求和:进位回卷(最后一位加 1),结果取反码即为校验和

相关知识点

udp-protocol tcp-segment-format transport-layer-and-ports

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。