IPv4 首部检验和的计算与原理解析

IPv4(Internet Protocol Version 4)是目前最常用的网络协议之一,IPv4 协议定义了一种 检验和(Checksum) 机制,用于检测数据是否在传输中发生了错误。

IPv4 首部检验和是一种 错误检测 技术,专门用于检测IP数据报头部(即IPv4数据包的头部)的完整性。它能够检查在传输过程中,头部数据是否由于硬件故障或网络噪声等原因出现了损坏。

IPv4首部的结构

在深入讨论检验和的计算之前,首先需要了解一下IPv4数据包的头部结构。IPv4头部是每个IPv4数据包的起始部分,包含了许多关键信息,如版本号、源地址、目的地址、协议类型等。

一个典型的IPv4头部结构如下:

0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
| Version| IHL    | Type of Service |
+--------+--------+--------+--------+
| Total Length               |
+----------------------------+
| Identification              |
+----------------------------+
| Flags  | Fragment Offset     |
+--------+--------------------+
| Time to Live | Protocol | Header Checksum |
+--------------+----------+-----------------+
| Source Address                   |
+----------------------------------+
| Destination Address              |
+----------------------------------+
| Options and Padding (可选)       |
+----------------------------------+

Header Checksum 字段位于IPv4头部的第11和第12个字节,大小为16位(2字节)。该字段用于存储检验和的值,它在数据包的传输过程中可以被计算和验证。其他字段如源地址、目的地址、协议类型等信息,则不参与检验和的计算。

检验和计算的步骤

IPv4首部的检验和计算采用的是 反码求和(One’s Complement Sum) 方法。下面是计算检验和的详细步骤:

1. 构建IPv4头部

首先,构建一个完整的IPv4头部。需要注意的是,在计算检验和时,Header Checksum 字段的值应该设置为0,因为检验和的计算需要依赖于这个字段的值。

2. 将头部分割成16位块

IPv4头部数据通常是32位(4字节)的倍数。因此,我们将IPv4头部按16位(2字节)为一个单位进行分割。假设IPv4头部的长度是20字节(即标准的IPv4头部长度),那么我们会将这20字节分成10个16位的块。

3. 对所有16位块进行反码求和

接下来,将所有16位的块进行加法运算。需要注意的是,在加法过程中,如果发生溢出(即结果超过16位),则要将溢出部分加到和中。例如,如果两数相加的结果为18位,那么超出的部分会加到结果的低16位中。

4. 结果再次反码

加法完成后,得到的结果需要进行 反码。这意味着将和的每一位进行反转——0变成1,1变成0。反码求和是为了保证计算结果的错误检测效果。

5. 填写检验和字段

最后,将反码求和得到的16位值填入IPv4头部的 Header Checksum 字段,完成检验和的计算。

一个简单的例子

假设我们有一个简单的IPv4头部,如下所示(以16进制表示):

45 00 00 54 00 00 40 00 40 06 B1 E6 C0 A8 00 68 C0 A8 00 01

这个IPv4头部的大小为20字节(即标准IPv4头部的大小),我们将按照上面的步骤来计算它的检验和。

步骤1:将数据分割成16位块

45 00  -> 01000101 00000000
00 54  -> 00000000 01010100
00 00  -> 00000000 00000000
40 00  -> 01000000 00000000
40 06  -> 01000000 00000110
B1 E6  -> 10110001 11100110
C0 A8  -> 11000000 10101000
00 68  -> 00000000 01101000
C0 A8  -> 11000000 10101000
00 01  -> 00000000 00000001

步骤2:逐个块相加

我们将每个16位块进行加和(采用反码求和):

01000101 00000000
+ 00000000 01010100
-------------------
= 01000101 01010100

01000101 01010100
+ 00000000 00000000
-------------------
= 01000101 01010100

...

如果发生溢出,就将溢出部分加到和中。

步骤3:反码求和

在求和完成后,我们对最终结果进行反码操作。

步骤4:填入检验和

将计算得到的16位反码结果填入 Header Checksum 字段。

检验和的校验过程

当接收方接收到IP数据包时,首先会计算数据包头部的检验和,校验接收到的数据包是否在传输过程中发生了损坏。接收方会将数据包头部的 Header Checksum 字段值和计算出的检验和进行对比。如果两者一致,说明数据包头部未发生错误;如果不一致,则表示头部数据出现了问题,数据包可能已损坏。

拓展知识

IPv4检验和只能检测头部数据的完整性,无法检测IP数据包中传输的数据是否发生了错误。有效负载的完整性通常由传输层协议(如TCP、UDP)来负责,因此 IPv4 并不对数据正确负责。检验和的主要目的是在传输过程中检测头部的损坏,对于路由设备(如路由器)来说是至关重要的,因此需要保证这些信息在传输中不被篡改。若出现错误则直接丢弃,认为这是一个损坏的包(也不会发送差错报文)。

IPv6(Internet Protocol Version 6)在设计上做出了许多优化和改进,其中之一就是取消了IPv6头部的检验和功能。这简化了 ipv6 的协议,数据安全完全由其他层协议提供错误检测。考虑到未来更高效的传输方式。随着网络环境和硬件设备的进步,网络设备的处理能力和带宽得到了显著提升,这样做是合理的。

总结

IPv4首部的检验和是网络协议中重要的错误检测工具,它能够帮助判断数据包的头部是否在传输中遭遇了损坏。通过上述反码求和的方法,IPv4确保了数据传输的基本可靠性。在实际应用中,尽管IPv4检验和能有效检测数据包头部的错误,但它并不涵盖数据部分的错误检测,后续的层协议(如TCP)会进一步处理数据部分的完整性。

希望这篇博客能帮助你更好地理解IPv4首部检验和的计算过程及其原理。如果你有任何问题,或者想了解更多网络协议的细节,欢迎随时留言!

posted @ 2024-12-11 19:59  Ofnoname  阅读(223)  评论(0编辑  收藏  举报