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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UDP Socket.SendTo是否可以执行不完整的发送?相关的知识,希望对你有一定的参考价值。

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

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


这个老问题已经过彻底检查,以便对未来的搜索者更有帮助。

答案

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

在UDP进行处理之后,我们为底层协议提供了两个分支:

  • IPV4 IP协议保证到达的数据包没有错误,即“整体”(source): IPv4提供安全措施以确保IP数据包标头没有错误。路由节点计算数据包的校验和。如果校验和错误,则路由节点丢弃该数据包。 UDP(IP,Link等)下面的协议层可能会分割数据(fragmentation),但是它们会保证当它发送到UDP层时,数据包与发送方进入其协议层的数据包相同。
  • IPV6 IP协议不再保证数据包无错误地到达,但是在IPv6上使用的UDP伪报头包括checksum information,而不是保证这一点的IP层,UDP层确实如此。

因此,保证数据报被整体发送,并且(如果它们被接收)没有错误。这从this comparison between UDP and TCP总结如下:

数据包具有明确的边界,这些边界在接收时受到尊重,这意味着接收器插槽上的读取操作将产生最初发送的整个消息。

以上是关于UDP Socket.SendTo是否可以执行不完整的发送?的主要内容,如果未能解决你的问题,请参考以下文章

socket

Python_网络编程udp-飞秋自动攻击

python socket编程

(Socket.SendTo)如何响应/发送回我的服务器开始接收的客户端的数据? C#

chapter12.2socket编程的UDP编程

Python学习-udp