3

我试图了解 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 补码 = 校验和!E7dd
4

2 回答 2

4

真正的原因是伪标头不是为 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 月(即一年多之后),这一事实证实了这一点。

于 2014-10-14T08:52:43.777 回答
3

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

于 2013-10-06T20:46:39.990 回答