为什么UDP校验和会将UDP长度计算两次?

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
  • 1的补数 = 校验和! E7dd

@us2012 当然是的。一次在伪头部,一次在UDP头部。 - user207421
@EJP 对不起,我现在明白你的意思了! - us2012
2个回答

4
真正的原因是伪头并非为UDP而写,而是为TCP定义的,并通过包含方式用于UDP。
TCP头部没有单独的长度字段。TCP数据包的负载大小是IP数据包大小减去头部大小。为了防止某些类型的损坏,TCP设计者决定在伪头中包括实际的负载长度。
UDP决定不定义任何自己的内容。相反,它只是将TCP伪头直接纳入其中。由于UDP头中有一个长度字段,因此同一字段现在被用于计算UDP校验和两次。
可以认为UDP头中的UDP长度本身是多余的,原因与TCP不包含类似字段的原因相同。我了解到这个原因也是历史性的,并与UDP在IPv4最终确定之前被定义有关。UDP RFC的日期为1980年8月,而IP RFC的日期为1981年9月(即超过一年之后)。

3
因为这是在RFC 768中所述的。其他答案真的不太可能。

但是为什么当时要构造成那样呢? - lindhe
@lindhe 你问得太晚了,已经晚了35年。 - user207421
我认为这一定有充分的理由。虽然看起来像是一个明显的错误,但是35年前设计标准的人并不是一群傻瓜。 - lindhe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接