web-dev-qa-db-ja.com

UDPパケットを失う可能性は何ですか?

さて、ネットワーキングコースのプログラミングをしていて、Java UDPを使用してプロジェクトを実装する必要があります。パケットを破壊する「gremlin」関数とともにHTTPサーバーとクライアントを実装しています。指定された確率。HTTPサーバーは、UDPを介してクライアントに送信されるように、アプリケーションレイヤーで大きなファイルを複数のセグメントに分割する必要があります。クライアントは、アプリケーションレイヤーで受信したセグメントを再構成する必要があります。ただし、 UDPは本質的に信頼性が低く、なぜここで信頼性をシミュレートする必要があるのですか?

私の最初の考えは、おそらくインストラクターが私たちの場合を考えているためだと思います、クライアントとサーバーの両方が同じマシンで実行され、ファイルはUDPを介しても、あるプロセスから別のプロセスに100%確実に転送されます。同じコンピューター上の2つのプロセスの間にある。

これにより、サーバーとクライアントが同じマシン上の2つのプロセスであり、実際のネットワークに出向く必要がない場合に、UDPか、パケットを失うか、パケットを破損するか、または順不同で配信するかどうかを尋ねました。

また、実際にパケットを損失したり、破損したり、順不同で配信したりする可能性は、通常、地理的に離れた2つのホスト間でインターネット経由になるのではないかと考えています。

私にとってこれらの質問のいくつかに光を当てることができる人に多くの感謝をします。

17
Cory Gross

uDPが本質的に信頼できない場合、なぜここで信頼性をシミュレートする必要があるのですか?

最悪のシナリオをシミュレートし、クライアントとサーバーの両方がそれらにどのように応答できるかを制御するメカニズムを制御することは非常に役立ちます。インストラクターは、システムがいかに堅牢であるかを実証してほしいと思うでしょう。

ここでは、パケットの損失だけでなく、ペイロードの有効性についても触れています。

これにより、サーバーとクライアントが同じマシン上の2つのプロセスであり、実際のネットワークに出向く必要がない場合に、UDPか、パケットを失うか、パケットを破損するか、または順不同で配信するかどうかを尋ねました。

明らかにループバックアダプターよりも可能性は低くなりますが、これは不可能ではありません。

here および here に関するフォーラム投稿をいくつか見つけました。

また、実際にパケットを損失したり、破損したり、順不同で配信したりする可能性は、通常、地理的に離れた2つのホスト間でインターネット経由になるのではないかと考えています。

この質問は、おそらく少し絞り込む必要があります。パスに沿ったルーターとスイッチのアプリケーションレベル(パケットサイズと周波数)と制限/トラフィックの両方のいくつかの要因があります。

これに関する明確な数字は見つかりませんでしたが、かなり低いようです... 5%未満のようです。

あなたは The Internet Traffic Report と、おそらく this のようなページに興味があるかもしれません。

9
Matthew Sanders

パケット損失は複数の理由で発生します。主に、個々のリンクのエラーとネットワークの輻輳が原因です。

リンクが適切に機能している場合、リンクのエラーによるパケット損失は非常に少ないです。 0.01%未満は珍しいことではありません。

輻輳によるパケット損失は、明らかにリンクの混雑度に依存します。パス全体に予備の容量がある場合、この数は0%になります。ただし、ネットワークがビジーになると、この数は増加します。フロー制御が適切に行われると、この数はそれほど高くなりません。いくつかの失われたパケットは通常、誰かが彼らの送信速度を十分に遅くして、輻輳によりパケットが失われるのを止めるのに十分です。

パケット損失が1%に達する場合は、何か問題があります。これは、輻輳制御アルゴリズムがパケット損失にどのように応答するかに関するバグである可能性があります。同じ速度でパケットを送信し続けると、ネットワークが混雑してパケットを失ったときに、パケット損失を大幅に押し上げることができ、ソフトウェアの動作に問題がある場合は、99%のパケット損失が発生する可能性があります。しかし、これは関連するリンクのタイプによって異なります。ギガビットイーサネットはバックプレッシャーを使用してフローを制御するため、送信元から宛先へのパスが単一のギガビットイーサネットセグメントである場合、送信アプリケーションの速度が低下し、実際のパケット損失が見られない場合があります。

パケット損失が発生した場合のソフトウェアの動作をテストするために、2つの異なるシミュレーションを提案します。

  1. 各パケットで、10%の確率でドロップし、90%の確率で送信します。
  2. 1秒あたり最大100パケットまたは1秒あたり最大100KBを送信し、アプリケーションがさらに送信する場合は残りを破棄します。
8
Kasper