繁体   English   中英

通过单个套接字发送的UDP数据包是否保证按顺序发送?

[英]Are UDP packets sent over a single socket guaranteed to be sent in order?

我意识到依靠UDP协议提供任何种类的顺序保证是一个坏主意,而应该使用TCP。 请不要回答暗示我使用TCP的答案。

我正在调试一些旧的网络代码,并且想知道套接字接口提供的排序保证是什么。 我所进行的设置包括一个运行Debian的Linux机器,该机器通过直接以太网电缆与嵌入式设备通信。 嵌入式设备无法容纳整个TCP堆栈,即使兼容,旧堆栈也太旧而无法重构。

具体来说,如果我的NIC配置了默认的单个pfifo_fast ,并且正在使用单个线程通过单个套接字在一个套接字上发送数据包,并且它们都具有相同的ToS ,那么在这种情况下,我是否保证我的所有数据包都是通过电线按我发送的顺序发送?

这是我在实践中观察到的行为,但是我没有找到任何保证该行为的标准(POSIX或其他方式),并且我想确保在上面列出的环境和假设下,这实际上是受支持的行为。

相反,如果我通过两个单独的套接字发送数据包,则会发现它们不是按照从应用程序代码发送数据包的顺序通过NIC发送的。 显然,内核保留对通过单独的套接字发送的数据包进行重新排序的权利,但在使用单个套接字的情况下却拒绝这样做。

据我了解,在套接字上调用send()会将数据包同步放入NIC的适当队列中。 队列的存在向我提出了顺序的概念(否则, 列表将是数据结构的更合适的名称)。 不管是否存在这样的订购保证,我对某种说明文档或规范的内容都很感兴趣。

无法保证这种行为,因为在一般情况下,这是不相关的,如user207421所述。 POSIX甚至是Linux都无法保证这种行为,因为在极其罕见的情况下,它必然会限制实现。 出于各种原因对数据包进行重新排序是很常见的,并且出于性能或其他原因(例如,数据包过滤或QoS)而允许Linux这样做可以提高吞吐量。

即使发送方确实保证了这种行为,接收方仍然可能会遇到缓冲区溢出或临时网络硬件问题,这将阻止正确接收数据包,因此,发送方的任何保证仍然没有意义。 无论如何,如果没有顶层高层协议,就无法依靠UDP数据包的有序传递。

如果您需要按顺序进行检索和重试,但不能使用TCP,请查看QUIC以获得有关如何执行此操作的示例。 您可能(或可能不想)实现加密部分,但是协议分层可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM