计算机网络-ipv4首部校验原理

一、 核心目标:是什么与为什么

  • 是什么? IPv4 首部校验和是一个 16 比特(2 字节) 的字段,位于 IPv4 数据包的首部。

  • 为什么? 它的唯一目的是检测 IPv4 数据包首部在传输过程中是否发生了错误。这些错误可能由路由器、交换机等网络设备的物理链路问题、信号干扰、内存故障等原因引起。

重要特点:

  1. 只校验首部,不校验数据: 校验和的计算范围仅限于 IP 首部(通常 20 字节,不含选项)。传输层(如 TCP、UDP)有它们自己的校验和,用于保护数据。

  2. 逐跳计算: 由于 IP 首部中的 TTL(生存时间) 字段在每一跳路由器都会减 1,所以每一台处理该数据包的路由器都必须重新计算校验和

  3. 错误处理简单: 如果校验失败,接收方(通常是路由器或目的主机)会直接、静默地丢弃该数据包。它不会请求重传,因为 IP 协议本身是无连接、不可靠的。重传的责任由上层协议(如 TCP)负责。


二、 校验原理:核心思想

校验和的核心思想是 "反码算术和" 的冗余校验。

可以把它理解为一个 "一致性检查"

  • 发送方: 在发送数据包之前,它将整个 IP 首部视为一系列 16 位的字(word)。对这些字进行一种特殊的加法运算,得到一个 16 位的结果,这个结果就是校验和,并将其填入首部的校验和字段。

  • 接收方: 收到数据包后,它对整个 IP 首部(包括发送方填入的校验和字段本身 )进行完全相同的加法运算。

  • 结果判定:

    • 如果传输过程中没有发生任何错误 ,接收方计算出的结果应该是一个固定值:全 1(即 0xFFFF)

    • 如果结果不是全 1,则说明首部在传输中发生了比特错误,数据包被丢弃。

为什么结果是全 1 就代表正确? 这正是"反码算术"的精妙之处,我们将在计算步骤中详细解释。


三、 详细计算步骤

我们通过一个具体的例子来演示。假设有一个非常简单的 IP 首部(为了计算方便,我们使用极简的例子,实际首部为 20 字节)。

步骤 1:发送方计算校验和
  1. 将首部划分为 16 位字:

    将 IP 首部(不包括数据)从头开始,每 16 位(2 字节)作为一个单元。如果首部长度不是 16 位的整数倍(比如有选项字段),则在末尾补零到 16 位。在我们的例子中,假设首部有 4 个 16 位字(共 8 字节):

    • Word 1: 0x4500

    • Word 2: 0x0030

    • Word 3: 0x8a11

    • Word 4: 0x0000 <-- 注意:这个位置就是校验和字段,在计算前先置为 0。

  2. 计算反码算术和:

    这是一个特殊的加法过程,包含"回卷"。

    • 第一次加法: 0x4500 + 0x0030 = 0x4530

    • 第二次加法: 0x4530 + 0x8a11 = 0xCF41 (因为 0x4530 + 0x8A11 = 0xCF41)

    • 第三次加法: 0xCF41 + 0x0000 = 0xCF41 (因为校验和字段是 0,加和不变)

    • 检查回卷: 现在看结果 0xCF41,最高位没有产生进位(它是 16 位数),所以不需要回卷。如果相加过程中产生了超出 16 位的进位(比如结果是 0x1CF41),需要将这个进位(0x1加回到结果的低位,这步操作称为"回卷"。

      • 回卷示例: 假设某次加和结果是 0x1CF41

      • 将高 16 位(进位 0x1)与低 16 位(0xCF41)相加:0x0001 + 0xCF41 = 0xCF42

      • 这个 0xCF42 就是回卷后的新和。

  3. 取反码得到校验和:

    • 对上一步得到的最终和 0xCF41 进行按位取反操作(1 变 0,0 变 1)。

    • 0xCF41 的二进制是 1100 1111 0100 0001

    • 按位取反后是 0011 0000 1011 1110,即 0x30BE

    • 这个 0x30BE 就是最终的校验和。

  4. 填入首部:

    将计算出的校验和 0x30BE 填入 IP 首部的第 11-12 字节(校验和字段)。现在首部的第 4 个字不再是 0x0000,而是 0x30BE

步骤 2:接收方验证校验和

接收方进行几乎相同的操作,但关键区别是:它把发送方填好的整个首部(包括校验和字段)拿来进行计算。

  1. 将首部划分为 16 位字:

    • Word 1: 0x4500

    • Word 2: 0x0030

    • Word 3: 0x8a11

    • Word 4: 0x30BE <-- 这次,这个字段是发送方填好的校验和!

  2. 计算反码算术和:

    • 0x4500 + 0x0030 = 0x4530

    • 0x4530 + 0x8a11 = 0xCF41

    • 0xCF41 + 0x30BE = 0xFFFF (因为 0xCF41 + 0x30BE = 0xFFFF)

  3. 检查结果:

    • 最终结果是 0xFFFF(二进制全 1)。

    • 不需要回卷,也不需要取反。

    • 因为结果是全 1,所以接收方判定 IP 首部没有错误

原理揭秘:为什么结果是全 1?

发送方计算校验和的公式本质是:
校验和 = ~(Word1 + Word2 + Word3 + 0)

接收方验证时计算的公式是:
总和 = Word1 + Word2 + Word3 + 校验和

我们把发送方的公式代入接收方的公式:
总和 = Word1 + Word2 + Word3 + ~(Word1 + Word2 + Word3)

反码算术中,一个数加上它的反码,结果必然是全 1。

  • 例如:1010 + 0101 = 1111

因此,只要数据没有错误,接收方计算的总和就一定是全 1(0xFFFF)。


四、 特点与局限性

  1. 强度: 校验和能检测出所有奇数个比特错误大多数偶数个比特错误。它是一种轻量级的错误检测机制。

  2. 局限性:

    • 强度不如CRC: 它的错误检测能力不如循环冗余校验(CRC)强。例如,在特定位置发生两个比特交换的错误,可能检测不到。这就是为什么在更注重可靠性的链路层(如以太网)和数据链路层(如 PPP)普遍使用 CRC,而 IPv6 甚至直接取消了首部校验和(将可靠性完全交由数据链路层和传输层保证)。

    • 计算开销: 由于 TTL 字段变化,每一跳都需要重新计算,对路由器 CPU 有一定的开销。

总结

步骤 发送方 接收方
1. 准备 将校验和字段置零。 接收整个 IP 首部。
2. 划分 将首部按 16 位分组。 将首部按 16 位分组。
3. 求和 计算所有字的反码算术和(有进位则回卷)。 计算所有字(包括校验和字段)的反码算术和(有进位则回卷)。
4. 取反 对最终和进行按位取反,得到校验和。 不取反
5. 动作 将校验和填入首部,发送数据包。 检查最终结果:如果为 0xFFFF,通过;否则,丢弃
相关推荐
Net_Walke2 小时前
【网络协议】数字签名与证书
网络·网络协议
aramae3 小时前
Linux开发工具入门:零基础到熟练使用(二)
linux·运维·服务器·网络·笔记
Suckerbin4 小时前
burpsuite网络安全学院: JWT attacks靶场通关
网络·笔记·安全·web安全·网络安全
Suger9995 小时前
centos网络打流测试
linux·网络·centos
北京耐用通信8 小时前
一“网”跨协议,万“设”皆可通!耐达讯自动化Modbus TCP转Profibus ,让控制无界,让能源有道。
网络·人工智能·网络协议·自动化·信息与通信
网硕互联的小客服9 小时前
服务器密码错误被锁定如何解决?
运维·服务器·网络·安全
wanhengidc10 小时前
云手机远程控制的作用
网络·游戏·智能手机·架构·云计算
王道长服务器 | 亚马逊云13 小时前
AWS Route 53 详解:不只是 DNS,还能做智能流量调度
服务器·网络·微服务·云原生·架构·云计算·aws
就不爱吃大米饭13 小时前
Web3实操:2025年DePIN 挂机项目要点分享
网络