1

我在我的 linux c++ 程序中观察到意外的乱序数据包接收序列。在我限制了接收套接字的数量后,它再次按顺序接收数据包。此外,我还使用 boost::asio 或 epoll 显式测试了该问题,但它们都产生了相同的结果。另一方面,相同的程序在 Window 环境下运行良好(使用 boost.asio)。

我觉得这很奇怪,我知道 udp 协议不保证数据包按顺序接收。但是,广播发送方和接收方之间只有 1 次切换。因此,我相信在物理上是不可能的。再加上相同的程序在 Window OS 下(在同一网络下)工作正常。

假设数据包保证按顺序到达传输层。额外的序列号检查不是一个选项,更改协议也不是。

4

1 回答 1

6

甚至 localhost 到 localhost 的通信也可以无序传递,这完全取决于实现。堆栈可以自由地在某个地方使用 UDP 实现 LIFO 队列,因为不需要按顺序交付。每个操作系统都可以并且将表现不同。如果必须使用 UDP,则必须预测 OOO 数据包并处理它们。

于 2013-02-06T01:54:17.250 回答