【问题标题】:Why UDP checksum contains the UDP length twice?为什么 UDP 校验和包含两次 UDP 长度?
【发布时间】:2013-10-06 20:40:01
【问题描述】:

我试图了解 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

【问题讨论】:

  • @us2012 确实如此。一次在伪标头中,一次在 UDP 标头中。
  • @EJP 我的错。我现在明白你的意思了!

标签: math networking udp checksum tcp-ip


【解决方案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 月(即 - 一年多之后),这一事实证实了这一点。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 但是为什么要这样构造呢?
    • @lindhe 这个问题你迟到了 35 年。
    • 我认为这是有充分理由的。这似乎是一个明显的错误,但 35 年前设计标准的人并不是一群傻瓜。
    猜你喜欢
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2014-06-15
    • 1970-01-01
    • 2014-08-16
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多