linux中tcp校验和是强制的端到端完整性验证机制,覆盖伪首部(含源/目的ip、协议号、tcp长度)、tcp首部(checksum置0)和数据,按16位反码求和后取反;接收端验证结果须为0xffff,内核支持硬件卸载与延迟校验优化。

Linux 中 TCP 数据包校验和的计算,本质是端到端完整性验证机制,核心目标是发现传输过程中 TCP 首部或数据任意字节的改动。它不是可选功能,而是 TCP 协议强制要求的可靠性保障手段。
校验范围包含伪首部、TCP 首部与数据
TCP 校验和不只覆盖自身首部和载荷,还必须包含一个 12 字节的“伪首部”(pseudo-header),该结构虽不实际传输,但参与计算,作用是增强检错能力——比如防止报文被错误投递到其他 IP 地址或协议类型上。
伪首部固定格式为:
- 4 字节源 IP 地址(网络字节序)
- 4 字节目的 IP 地址(网络字节序)
- 1 字节保留字段(置 0)
- 1 字节协议号(TCP 为 6)
- 2 字节 TCP 报文总长度(首部 + 数据,单位:字节)
计算时,将伪首部、TCP 首部(其中 checksum 字段先置 0)、TCP 数据三者按字节拼接,整体视为连续字节流处理。
按 16 位字反码求和并取反
算法分三步执行:
Python Linux版 为 Python.org 官方提供的 Python 3.14.6 Linux/Unix 源码包,适合在Linux/Unix环境中安装、运行 Python 代码并学习函数、模块和脚本开发。
- 将待校验字节流按 16 位(2 字节)为单位切分;若总字节数为奇数,则末尾补一个值为 0 的字节(仅用于计算,不发送)
- 以二进制反码方式累加所有 16 位字:先相加,若产生进位(即和 ≥ 0x10000),则将高位进位加回低 16 位,重复直至无进位
- 对最终 16 位和取反(即 1 的补码),结果填入 TCP 首部的 checksum 字段
例如:累加得 0x2A7F → 取反得 0xD580,即为校验和值。
接收端验证逻辑:结果应为全 1(0xFFFF)
接收方执行完全相同的计算流程(含伪首部、首部、数据,checksum 字段也参与累加),但不取反。若结果为 0xFFFF(即 -0 的反码表示),说明校验通过;否则丢弃该 TCP 段。
这一设计使验证只需一次累加+判断,无需额外取反操作,硬件和软件实现都更高效。
Linux 内核中的实际处理策略
为避免性能瓶颈,内核对校验和处理做了优化:
- 发送路径:支持硬件卸载(如网卡具备 NETIF_F_IP_CSUM 能力时,由驱动填充 csum_start/csum_offset,交由硬件计算)
- 接收路径:常延迟校验(如 UDP/TCP 报文先入 socket 队列,直到用户调用 recv() 时才真正计算),减少无效处理开销
- 关键函数包括 csum_tcpudp_nofold(快速算伪首部和)、__skb_checksum_complete(完整校验)、tcp_v4_checksum_init(入口校验初始化)
即使启用硬件卸载,内核仍保留软件 fallback 路径,确保协议栈行为一致可靠。










