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是否可以执行不完整的发送?的主要内容,如果未能解决你的问题,请参考以下文章