【问题标题】:Is the UDP checksum allowed to be calculated from a truncated payload?是否允许从截断的有效负载计算 UDP 校验和?
【发布时间】:2025-11-26 11:05:02
【问题描述】:

UDP 套接字只接受具有正确校验和的传入数据报。但我听说有时 UDP 数据包会因为 最大传输单元 (MTU) 而被截断。

(1) 如何处理故意截断的数据报?是否允许在截断的有效负载上计算校验和?还是要求始终在应用程序打算在一个数据报中发送的整个数据上计算校验和?

(2) 另外,是否允许对数据报进行分段,然后以另一个或不完整的顺序重新分段?这会破坏校验和吗?

主要问题是: 是否保证当接收到带有正确校验和的 UDP 数据报并传递给应用程序时,有效负载正是发送方应用程序传递给操作系统的数据?

【问题讨论】:

    标签: c sockets networking udp protocols


    【解决方案1】:

    我听说有时 UDP 数据包会因为最大传输单元 (MTU) 而被截断。

    你听错了。由于这个原因,它们可能会被碎片化

    (1) 如何处理故意截断的数据报?

    它们没有被截断,它们是碎片化的。如果所有片段都到达,则可以重构数据报并验证其校验和。否则什么都不会发生。

    是否允许在截断的有效负载上计算校验和?

    不可能,见上文。

    或者是否要求始终在应用程序打算在一个数据报中发送的整个数据上计算校验和?

    是的。

    (2) 另外,是否允许对数据报进行分段,然后以另一个或不完整的顺序重新分段?

    没有。

    这会破坏校验和吗?

    它甚至不会发生。

    主要问题是:当接收到带有正确校验和的 UDP 数据报并将其传递给应用程序时,是否保证有效负载正是发送方应用程序传递给操作系统的数据?

    是的。

    【讨论】:

    • 非常感谢 :) 终于明白了 UDP 的概念。
    • @MinecraftShamrock 但是,不能保证 UDP 数据包会被完全接收,因此它们用于无关紧要的应用程序。
    • @WeatherVane 是的。我早就知道了。但我不确定 UDP 有多不可靠。
    • 正如@EJP 所写,如果校验和是正确的,则数据包是好的——除了那些罕见的事件...有十分之一(包括 X)的机会是错误正确的。