在linux中接收乱序udp数据包

时间:2013-02-06 01:46:29

标签: c++ network-programming udp boost-asio epoll

我在linux c ++程序中观察到意外乱序的数据包接收序列。在限制接收套接字的数量后,它再次按顺序接收数据包。另外,我还用boost :: asio或epoll明确地测试了这个问题,但它们都产生了相同的结果。另一方面,在Window环境下(使用boost.asio),同一程序可以正常工作。

我发现相当奇怪,我知道udp协议不保证数据包接收顺序。但是,广播发送方和接收方之间只有1个交换机。因此,我认为,实际上不可能出现故障。加上相同的程序在Window OS(在同一网络下)下工作正常。

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

1 个答案:

答案 0 :(得分:6)

即使localhost到localhost通信也可能无序传递,它的所有实现都依赖于它。堆栈可以使用UDP在某处实现LIFO队列,因为不需要按顺序传送。每个OS都可以并且将以不同的方式运行。如果必须使用UDP,必须预期OOO数据包并处理它们。