UDP Socket.SendTo 是否可能执行不完整的发送?

Is it possible for UDP Socket.SendTo to perform an incomplete send?

Socket.SendTo 的 return 值是一个 int,表示实际从缓冲区发送的字节数。这是否意味着可以发送部分数据报,其中仅包含请求发送的部分数据?

如果是这样,程序员在收到数据报时是否需要做任何工作来重新组装数据报,还是透明地处理?


为了对未来的搜索者更有帮助,这个老问题已经过彻底修改以使其更加清晰。

UDP 是一种面向消息的协议,因此 guaranteed 发送的是完整的数据报,而不是部分数据报。然而,数据报可能太长而无法发送,这是程序员至少在 Linux 和 Windows.

上暴露的错误

UDP 完成处理后,底层协议有两个分支:

  • IPV4

    IP协议保证到达的数据包没有错误,即"whole"(source):

    IPv4 provides safeguards to ensure that the IP packet header is error-free. A routing node calculates a checksum for a packet. If the checksum is bad, the routing node discards the packet.

    UDP 以下的协议层(IP、Link 等)可能会拆分数据 (fragmentation),但它们会保证当它被交给 UDP 层时,数据包就是与在发送方进入其协议层的相同。

  • IPV6

    IP 协议不再保证数据包无差错到达,但是在 IPv6 上使用的 UDP 伪报头包括 checksum information 因此 UDP 层不保证这一点,而不是 IP 层保证这一点。

因此,保证数据报完整发送,并且(如果收到)没有错误。这是由 this comparison between UDP and TCP 中的以下内容总结的:

Packets have definite boundaries which are honored upon receipt, meaning a read operation at the receiver socket will yield an entire message as it was originally sent.