为什么UDP校验和包含两次UDP长度?

时间:2013-10-06 20:40:02

标签: math networking udp checksum tcp-ip

我试图了解UDP校验和机制。我正在使用这个包。我看到一个例子,在所有字段的总和中,UDP长度包含两次。为什么我们需要在校验和中包含两次UDP长度?

这是我看到的例子

IP header: Source IP address c0a8
… 0291
IP header: Destination IP address c0a8
… 0101
IP header: Protocol number(zero padded on left) 0011
16 bit UDP Length 0032
UDP header: source port 0618
UDP header: destination port 0035
UDP header: length 0032
UDP Data 
0001
0100
0001
0000
0000
0000
0131
0131
0331
3638
0331
3932
0769
6e2d
6164
6472
0461
7270
6100
000c
0001
  • 求和所有十六进制值181e
  • 携带4
  • 添加随身携带1822
  • 1s complement = checksum! E7dd

2 个答案:

答案 0 :(得分:2)

因为这就是它在RFC 768中所说的内容。没有其他答案真的可能。

答案 1 :(得分:1)

真正的原因是没有为UDP编写伪标头。它是为TCP定义的,并通过包含用于UDP。

TCP在TCP标头中没有单独的长度字段。 TCP数据包的有效负载大小是IP数据包的大小减去标头的大小。为了防止某些类型的损坏,TCP设计者决定在伪报头中包含实际的有效载荷长度。

UDP决定不定义任何自己的东西。相反,它只是按原样合并了TCP伪标头。由于UDP的标头中确实有一个长度字段,因此现在使用两次相同的字段来计算UDP校验和。

可以认为UDP报头中的UDP长度本身是冗余的,原因与TCP不包含类似字段的原因相同。我理解其原因也是历史性的,并且与在IPv4最终确定之前定义的UDP有关。这是因为UDP RFC带有1980年8月的日期,而IP RFC带有1981年9月的日期(即 - 超过一年后)。