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首部检验和的计算过程及其原理。如果你有任何问题,或者想了解更多网络协议的细节,欢迎随时留言!
标签:00,16,首部,检验,IPv4,头部,解析,数据包 From: https://www.cnblogs.com/ofnoname/p/18600608