IPv4、TCP和UDP的校验和计算

66 篇文章 0 订阅

分组头的校验和(checksum)算法是16累加和后的反码,TCPUDP数据报头也使用相同的校验算法,但参与运算的数据与IP分组头不一样。

IPv4分组头的结构如下所示:

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 01
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type ofService| TotalLength |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | HeaderChecksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SourceAddress |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DestinationAddress |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

其中的"Header Checksum"域即为头校验和部分。当要计算IPv4分组头校验和时,发送方先将其置为0,然后按16位逐一累加至IPv4分组头结束,累加和保存于一个32位的数值中。如果总的字节数为奇数,则最后一个字节单独相加。累加完毕将结果中高16位再加到低16位上,重复这一过程直到高16位为全0。下面用实际截获的IPv4分组(数据连路层DLC的包)来演示整个计算过程:

0x0000: 00 60 47 41 11 c900 09 6b 7a 5b 3b 0800 45 00
0x0010: 00 1c 74 68 0000 80 11 59 8f c0 a8 64 01 ab 46
0x0020: 9c e9 0f 3a04 05 00 08 7f c5 00 0000 00 00 00
0x0030: 00 00 00 00 00 00 00 00 00 00 00 00

在上面的16进制采样中,起始为Ethernet(DLC)的开头。IPv4分组头从地址偏移量0x000e开始,第一个字节为0x45,最后一个字节为0xe9,即IPv4分组头到目标IP地址为止。根据以上的算法描述,我们可以作如下计算:

(1) 0x4500 + 0x001c + 0x7468 + 0x0000 + 0x8011 + 0x0000(累加和位置先置0) + 0xc0a8 + 0x6401 + 0xab46 + 0x9ce9 = 0x3a66d

(2) 0xa66d + 0x3 = 0xa670

(3) 0xffff - 0xa670 = 0x598f

注意在第一步我们用0x0000设置头校验和部分。可以看出这一分组头的校验和与收到的值完全一致。以上的过程仅用于发送方计算初始的校验和,实际中对于中间转发的路由器和最终接收方,可将收到的IPv4分组头校验和部分直接按同样算法相加,如果结果为0xffff,则校验正确。

对于TCPUDP的数据报,其头部也包含16位的校验和,校验算法与IPv4分组头完全一致,但参与校验的数据不同。这时校验和不仅包含整个TCP/UDP数据报,还覆盖了一个虚头部。虚头部的定义如下:

0 7 8 1516 23 24 31
+--------+--------+--------+--------+
| sourceaddress |
+--------+--------+--------+--------+
| destinationaddress |
+--------+--------+--------+--------+
| zero |protocol| TCP/UDP length |
+--------+--------+--------+--------+

其中有IP源地址,IP目的地址,协议号(TCP:6/UDP:17)TCPUDP数据报的总长度(头部+数据)。将虚头部加入校验的目的,是为了再次核对数据报是否到达正确的目的地,并防止IP欺骗攻击(spoofing)。上述报文在0x0018处的协议类型=十六进制11,即该报文是一个UDP报文,其长度存放在0x0027开始的两个字节(含源目端口地址4字节+UDP长度2字节+校验和2字节=8字节,以及UDP数据的长度:故本数据包UDP数据的长度实际为0字节)IP源目地址存放在0x0x1a0x0x21共八个字节中,先将校验和0x002a处的两个字节置0,计算UDP的校验和如下:

(1) 0xc0a8+0x6401(前为源IP)+0xab46+0x9ce9(前为目IP)+0x0011(ZeroProtocol)+ 0x0008(UDP长度)+ 0x0f3a(源端口)+0x0405(目端口)+0x0008(UDP长度)+0x0000(校验和预置为0+…(这里没有任何数据了:UDP数据的长度实际为0字节)=0x28038

(2) 0x28038=>0x8038+0x0002=0x803A

(3) 0xFFFF-0x803A=0x7FC5

计算结果和0x0028处的结果相同,注意UDP长度出现了两次。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要开启Wireshark的IP、TCPUDP校验和功能,可以按照以下步骤操作: 1. 打开Wireshark并开始捕获网络数据包。 2. 在捕获过程中,选中任意一个数据包并右键单击它,然后选择“Protocol Preferences”(协议首选项)。 3. 在弹出的窗口中,选择“IPv4”、“TCP”或“UDP”选项卡,具体取决于您要开启哪个校验和。例如,如果要开启TCP校验和,则选择“TCP”选项卡。 4. 在选项卡中找到“Validate the TCP checksum if possible”(如果可能,验证TCP校验和)或“Validate the UDP checksum if possible”(如果可能,验证UDP校验和)选项,然后选中它。 5. 如果要开启IP校验和验证,可以在“IPv4”选项卡中找到“Validate the IPv4 checksum if possible”(如果可能,验证IPv4校验和)选项,然后选中它。 6. 点击“OK”按钮保存更改,然后继续捕获数据包。现在,Wireshark将验证所选协议的校验和,并在出现问题时显示警告。 请注意,启用IP、TCPUDP校验和验证可能会对性能产生一定的影响,因此在需要验证校验和时才开启它们。 ### 回答2: 在WireShark中开启IP、TCPUDP校验和的方法相对简单。首先,打开WireShark并选择所需的网络接口。在捕获选项对话框中,可以看到各个协议的选项。 要开启IP校验和,可以勾选IP选项卡下的"设置校验和计算"复选框。这将使WireShark校验IP头部中"校验和"字段的正确性。 要开启TCP校验和,可以勾选TCP选项卡下的"设置校验和计算"复选框。这将使WireShark校验TCP头部中"校验和"字段的正确性。 要开启UDP校验和,可以勾选UDP选项卡下的"设置校验和计算"复选框。这将使WireShark校验UDP头部中"校验和"字段的正确性。 开启这些校验和选项后,WireShark会自动计算并检查相应协议的校验和字段,以确保数据的完整性和准确性。如果任何一个校验和被发现不正确,WireShark将在分析结果中标记相关的数据包,并提供相应的错误信息。这对于识别数据包传输过程中是否出现损坏或错误等问题非常有帮助。 需要注意的是,在进行捕获之前,务必确保以上选项已正确开启,以便WireShark在捕获和分析网络流量时进行相应的校验和计算。 ### 回答3: 要在WireShark中开启IP、TCPUDP校验和,可以按照以下步骤进行操作: 1. 打开WireShark软件,并选择要进行监测或捕获数据包的网络接口。 2. 开始数据包捕获后,找到捕获的数据包列表,并选择要查看的特定数据包。 3. 在数据包详细信息窗口中,找到"Internet Protocol"标头部分,并展开它。 4. 在"Internet Protocol"标头部分中,可以找到"Header checksum"字段。这是IP校验和。确认该字段的值是正确计算的。 5. 接下来,找到"Transmission Control Protocol"标头部分,并展开它。 6. 在"Transmission Control Protocol"标头部分中,可以找到"Checksum"字段。这是TCP校验和。确认该字段的值是正确计算的。 7. 再进一步,找到"User Datagram Protocol"标头部分,并展开它。 8. 在"User Datagram Protocol"标头部分中,可以找到"Checksum"字段。这是UDP校验和。确认该字段的值是正确计算的。 9. 如果发现任何校验和错误,WireShark会在相应的字段或数据包详细信息下方显示通知。可以使用此信息来识别和解决捕获的数据包中的校验和问题。 请注意,校验和是一种验证数据在传输过程中是否完整和无损的方法。在WireShark中,开启了IP、TCPUDP校验和后,可以确保捕获的数据包在网络中传输过程中没有发生数据损坏。这对于数据包分析和故障排除非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值