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.
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.