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

Math 为什么UDP校验和包含UDP长度两次?,math,networking,udp,checksum,tcp-ip,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 h

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

    • 因为这就是它在书中所说的。没有其他答案。

      真正的原因是伪头不是为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月(即——一年多之后)。

      @us2012确实如此。一次在伪报头中,一次在UDP报头中。@EJP My bad。我现在明白你的意思了!但是为什么会这样建造呢?@lindhe你问这个问题已经晚了35年。我想这是有原因的。这似乎是一个明显的错误,但35年前设计标准的人并不是一群傻瓜。