我试图了解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
答案 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月的日期(即 - 超过一年后)。