TCP和UDP的校验和计算均依赖于**伪头部(Pseudo-Header)**来确保端到端的数据完整性和协议一致性。以下是两者的计算方法及步骤详解:


一、校验和的核心规则

  1. 覆盖范围
    • 伪头部(包含IP层关键信息)。
    • 传输层头部(TCP/UDP头部)。
    • 传输层数据载荷。
  2. 计算方式
    • 将数据按16位(2字节)分组,进行反码求和,最后对结果取反码。
  3. 伪头部作用
    • 确保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. 组合数据块

将以下三部分拼接成连续的数据块:

  1. 伪头部(12字节)。
  2. TCP头部(20字节,不含校验和字段)。
  3. TCP数据载荷(可变长度,不足偶数字节则补0)。
3. 反码求和
  • 步骤
    1. 将数据块按16位分组(大端字节序)。
    2. 对每组进行二进制加法(累积和溢出时回卷,即进位加到低位)。
    3. 最终和取反码,得到校验和。
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)。

计算过程

  1. 分组
    • 伪头部:C0A8, 0164, C0A8, 01C8, 0006, 0028
    • TCP头部:0050, 0050, 0000, 0000, 0000, 0000, 5000, 0000
    • 数据:4865, 6C6C, 6F00
  2. 求和
    0xC0A8 + 0x0164 = 0xC20C
    0xC20C + 0xC0A8 = 0x182B4 → 溢出回卷 → 0x82B4 + 0x0001 = 0x82B5
    ...(依次累加所有分组)
    最终和:0x2D4C
    
  3. 取反码0xFFFF - 0x2D4C = 0xD2B3
  4. 写入校验和字段: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. 组合数据块
  1. 伪头部(12字节)。
  2. UDP头部(8字节,校验和字段置0)。
  3. UDP数据载荷(可变长度,不足偶数字节补0)。
3. 反码求和
  • 步骤与TCP相同,但注意:
    • UDP校验和可选:IPv4允许校验和为0x0000(表示不启用),但IPv6强制要求。
    • 若校验和为0x0000,需替换为0xFFFF(全1反码)。
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)。

计算过程

  1. 分组
    • 伪头部:C0A8, 0164, C0A8, 01C8, 0011, 001C
    • UDP头部:04D2, 04D2, 001C, 0000
    • 数据:5465, 7374
  2. 求和
    0xC0A8 + 0x0164 = 0xC20C
    0xC20C + 0xC0A8 = 0x182B4 → 溢出回卷 → 0x82B5
    ...(最终和:0x2A4D)
    
  3. 取反码0xFFFF - 0x2A4D = 0xD5B2
  4. 写入校验和字段:UDP头部的校验和字段填充为D5 B2

四、关键注意事项

  1. 字节序处理
    • 所有字段必须按**网络字节序(大端)**处理。
  2. 数据填充
    • 若数据长度为奇数,需补一个0x00字节(不修改实际数据)。
  3. 硬件卸载优化
    • STM32等芯片支持校验和卸载(通过ETH_MACCFFCR寄存器配置),硬件自动完成计算。
  4. IPv6伪头部差异
    • IPv6伪头部包含128位地址和更长的长度字段,计算逻辑类似但需适配结构。

五、常见错误场景

  1. NAT设备未更新校验和
    • NAT修改IP地址后需重新计算伪头部,否则校验失败。
  2. 协议类型不匹配
    • 若IP头部的协议字段与实际传输层协议不符,校验和将无效。
  3. 数据篡改
    • 任何对伪头部、传输层头部或数据的修改均会导致校验和不匹配。

六、总结

  • TCP校验和:必须包含伪头部,用于高可靠性通信(如HTTP、FTP)。
  • UDP校验和:IPv4中可选,但推荐启用以增强数据完整性(如DNS、VoIP)。
  • 硬件支持:现代网络芯片(如STM32 MAC控制器)可自动处理校验和,降低CPU负载。

通过上述步骤,可手动或借助硬件实现TCP/UDP校验和的高效计算,确保网络数据传输的可靠性。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐