web-dev-qa-db-ja.com

直接接続のパケットのUDP順序

LAN(イントラネット)で直接接続されている2つのシステム(AとB)がある場合。真ん中にルーターはありません。この場合、システムAが数ミリ秒ごとにいくつかのUDPパケットをシステムBに送信すると、次のようになります。

システムBが異なる順序でパケットを受信する可能性はありますか?

TCPまたはUDPのどちらを使用するかを尋ねているのではないことに注意してください。上記のシナリオでパケットが順不同になるかどうかに興味があります-UDPパケットは保証されないことに気づいています順番に到着します。

6
m4n07

はい、可能です。

これは、ハードウェアとドライバーに依存する可能性があり、回線上で同時に送信されている他のタイプのパケットに応じて非常に異なる場合があります。

内部パケットバッファーは着信送信要求をどのように処理しますか?わかりません。奇妙な方法でいっぱいになる並列バッファーを使用している可能性があります。仕様には保証がないので、実装者が物事を同期し続けることに煩わされる理由はありません(特に、オーバーヘッドのない速度の向上を考慮してください)。

Windowsボックスは、NTP時刻更新要求とネットワーク共有スキャンを送信することを決定し、その途中で、Dropboxがローカルフォルダーを要求できます。バッファー内のすべてのデータ疑わしいです。

何百万ものパケットを送信でき、この問題は発生しません。しかし、それは可能性です。それが起こる可能性は小さいかもしれませんが、それは起こります。

これらが問題を引き起こさないことを保証する唯一の実際の方法は、独自のOSを実行していて、ハードウェアの動作に関する明確な知識があり、ドライバーのソースコードとUDP apiのソースコードがある場合です。

6
Ape-inago

UDPパケットが順番に到着するとは限りません。これにはTCPを使用する必要があります。

12
Patrik Svensson

彼らはまったく到着したり、順番に到着したりする必要はありません。

これはセットアップの単純さのためにそうではないことを期待していると思いますが、根本的なバスシステムがまだあり、両方のコンピューターが同時に送信しようとするようなことが起こる可能性があります。

もちろん、スイッチドイーサネットでは機能しませんが、「たぶんできない」以外の方法で質問に回答するには、抽象化のいくつかの層を破棄する必要があります。

2
Sarien

可能です。 2つのマシン間の直接接続(ハブやスイッチなし)でこのような動作を確認しました。私の場合、アプリケーションがデータグラムを次々に送信し、それらの間に遅延がなかった場合にのみ発生しました。この場合、高い確率で発生します(1/30以上)。この動作はハードウェアに依存していたことに注意してください。これは、Kontronのコンピューターの特定の1行でのみ発生します。また、アプリケーションがデータグラムを可能な限り高速にした場合にのみ発生します。次のデータグラムを人為的に1ミリ秒遅延させた後、これを観察できなくなりました。

1
user305241

はい、システムB上のアプリケーションがシステムA上のアプリケーションによって送信されたのとは異なる順序でUDPパケットを受信して​​いる可能性があります。両方のシステムが同じネットワークセグメントに接続されている場合、発生する可能性は小さいですが、無視できません。

また、システムを接続しているスイッチまたはハブで2つのパケットが衝突したために、パケットが失われることもあります。

ソフトウェアの世界では、特定のソリューションの使用を決定する前に、確実性と統計的に不可能なシナリオに対処します。パケットが確実に到着できるかどうか、およびその偶然性を処理するために何を計画するかは、そのソリューションを使用する必要があるかどうかに関係します。

とにかく、それらは順番に到着しません(またはまったく到着しません)。それを使用する場合は、RTPのように、トランスポート層で処理する必要があります。またはその性質の何か。

0
Jonathan Henson

順序または到着は仕様によって保証されていませんが、コンテキストでは、パケットを並べ替えたり破棄したりできるデバイスはありません(他のネットワークトラフィックが存在しない場合)。

念のために、数時間実行し、本文に増加するシーケンス番号を付けてパケットを送信し、受信したパケットのシーケンス番号がパケットの数と一致しなくなるとすぐに失敗するテストを作成できます。これまでに受け取った。

0
mouviciel