TCP和UDP帧校验和的计算方法
TCP和UDP的校验和计算均依赖于**伪头部(Pseudo-Header)**来确保端到端的数据完整性和协议一致性。通过上述步骤,可手动或借助硬件实现TCP/UDP校验和的高效计算,确保网络数据传输的可靠性。
·
TCP和UDP的校验和计算均依赖于**伪头部(Pseudo-Header)**来确保端到端的数据完整性和协议一致性。以下是两者的计算方法及步骤详解:
一、校验和的核心规则
- 覆盖范围:
- 伪头部(包含IP层关键信息)。
- 传输层头部(TCP/UDP头部)。
- 传输层数据载荷。
- 计算方式:
- 将数据按16位(2字节)分组,进行反码求和,最后对结果取反码。
- 伪头部作用:
- 确保IP层与传输层信息的一致性(如IP地址、协议类型)。
二、TCP校验和计算步骤
1. 构建伪头部(以IPv4为例)
伪头部包含以下字段(共12字节):
| 字段 | 长度(字节) | 示例值(十六进制) |
|---|---|---|
| 源IP地址 | 4 | C0 A8 01 64 |
| 目的IP地址 | 4 | C0 A8 01 C8 |
| 保留字段(全0) | 1 | 00 |
| 协议类型(TCP=6) | 1 | 06 |
| TCP报文总长度 | 2 | 00 28(40字节) |
2. 组合数据块
将以下三部分拼接成连续的数据块:
- 伪头部(12字节)。
- TCP头部(20字节,不含校验和字段)。
- TCP数据载荷(可变长度,不足偶数字节则补0)。
3. 反码求和
- 步骤:
- 将数据块按16位分组(大端字节序)。
- 对每组进行二进制加法(累积和溢出时回卷,即进位加到低位)。
- 最终和取反码,得到校验和。
4. 示例计算
假设以下简化的TCP报文:
- 伪头部:
C0 A8 01 64 C0 A8 01 C8 00 06 00 28 - TCP头部(校验和字段置0):
00 50 00 50 00 00 00 00 00 00 00 00 50 00 00 00 00 00 - 数据载荷:
"Hello"(5字节 → 填充为6字节:48 65 6C 6C 6F 00)。
计算过程:
- 分组:
- 伪头部:
C0A8, 0164, C0A8, 01C8, 0006, 0028 - TCP头部:
0050, 0050, 0000, 0000, 0000, 0000, 5000, 0000 - 数据:
4865, 6C6C, 6F00
- 伪头部:
- 求和:
0xC0A8 + 0x0164 = 0xC20C 0xC20C + 0xC0A8 = 0x182B4 → 溢出回卷 → 0x82B4 + 0x0001 = 0x82B5 ...(依次累加所有分组) 最终和:0x2D4C - 取反码:
0xFFFF - 0x2D4C = 0xD2B3 - 写入校验和字段:TCP头部的校验和字段填充为
D2 B3。
三、UDP校验和计算步骤
1. 构建伪头部(IPv4)
字段与TCP伪头部类似,协议类型为UDP(17):
| 字段 | 示例值(十六进制) |
|---|---|
| 源IP地址 | C0 A8 01 64 |
| 目的IP地址 | C0 A8 01 C8 |
| 保留字段 | 00 |
| 协议类型(UDP=17) | 11 |
| UDP报文总长度 | 00 1C(28字节) |
2. 组合数据块
- 伪头部(12字节)。
- UDP头部(8字节,校验和字段置0)。
- UDP数据载荷(可变长度,不足偶数字节补0)。
3. 反码求和
- 步骤与TCP相同,但注意:
- UDP校验和可选:IPv4允许校验和为
0x0000(表示不启用),但IPv6强制要求。 - 若校验和为
0x0000,需替换为0xFFFF(全1反码)。
- UDP校验和可选:IPv4允许校验和为
4. 示例计算
假设以下UDP报文:
- 伪头部:
C0 A8 01 64 C0 A8 01 C8 00 11 00 1C - UDP头部(校验和置0):
04 D2 04 D2 00 1C 00 00 - 数据载荷:
"Test"(4字节 → 填充为4字节:54 65 73 74)。
计算过程:
- 分组:
- 伪头部:
C0A8, 0164, C0A8, 01C8, 0011, 001C - UDP头部:
04D2, 04D2, 001C, 0000 - 数据:
5465, 7374
- 伪头部:
- 求和:
0xC0A8 + 0x0164 = 0xC20C 0xC20C + 0xC0A8 = 0x182B4 → 溢出回卷 → 0x82B5 ...(最终和:0x2A4D) - 取反码:
0xFFFF - 0x2A4D = 0xD5B2 - 写入校验和字段:UDP头部的校验和字段填充为
D5 B2。
四、关键注意事项
- 字节序处理:
- 所有字段必须按**网络字节序(大端)**处理。
- 数据填充:
- 若数据长度为奇数,需补一个
0x00字节(不修改实际数据)。
- 若数据长度为奇数,需补一个
- 硬件卸载优化:
- STM32等芯片支持校验和卸载(通过
ETH_MACCFFCR寄存器配置),硬件自动完成计算。
- STM32等芯片支持校验和卸载(通过
- IPv6伪头部差异:
- IPv6伪头部包含128位地址和更长的长度字段,计算逻辑类似但需适配结构。
五、常见错误场景
- NAT设备未更新校验和:
- NAT修改IP地址后需重新计算伪头部,否则校验失败。
- 协议类型不匹配:
- 若IP头部的协议字段与实际传输层协议不符,校验和将无效。
- 数据篡改:
- 任何对伪头部、传输层头部或数据的修改均会导致校验和不匹配。
六、总结
- TCP校验和:必须包含伪头部,用于高可靠性通信(如HTTP、FTP)。
- UDP校验和:IPv4中可选,但推荐启用以增强数据完整性(如DNS、VoIP)。
- 硬件支持:现代网络芯片(如STM32 MAC控制器)可自动处理校验和,降低CPU负载。
通过上述步骤,可手动或借助硬件实现TCP/UDP校验和的高效计算,确保网络数据传输的可靠性。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)