1

私の Linux C++ プログラムで、パケットの受信シーケンスが予期せず順不同であることがわかりました。受信ソケットの数を制限した後、再びパケットを順番に受信しました。さらに、boost::asio または epoll を明示的に使用して問題をテストしましたが、どちらも同じ結果になります。一方、同じプログラムは Window 環境 (boost.asio を使用) では問題なく動作します。

私はかなり奇妙だと思います.udpプロトコルはパケットが順番に受信されることを保証していないことを知っています. ただし、ブロードキャスト送信側と受信側の間のスイッチは 1 つだけです。したがって、順不同は物理的に不可能だと思います。さらに、同じプログラムが Window OS (同じネットワーク) の下で正常に動作します。

パケットがトランスポート層に順番に到着することが保証されていると仮定します。追加のシーケンス番号チェックはオプションではなく、プロトコルの変更もオプションではありません。

4

1 に答える 1

6

localhost から localhost への通信でさえ、順不同で配信される可能性があり、そのすべては実装に依存します。順序どおりの配信が必要ないため、スタックは UDP を使用してどこかに LIFO キューを自由に実装できます。OS ごとに動作が異なります。UDP を使用する必要がある場合は、OOO パケットを予測して処理する必要があります。

于 2013-02-06T01:54:17.250 に答える