web-dev-qa-db-ja.com

断片化せずに送信できる最大のUDPパケットを見つける方法

別のコンピューターに送信できる最大のUDPパケットが断片化されていないことを知る必要があります。

このサイズは、一般にMTU(Maximum Transmission Unit)として知られています。おそらく、2台のコンピューターの間に、異なるMTUを持つ多くのルーターとモデムがあります。

WindowsでのTCP実装は、パス内の最大MTUを自動的に検出します。

私も実験していましたが、コンピューターからサーバーへの最大MTUは57712バイト+ヘッダーであることがわかりました。それより上のものはすべて破棄されました。私のコンピューターはLAN上にありますが、MTUは約1500バイトであるはずではありませんか?

54
Unknown

以下はあなたの質問に直接答えるものではありませんが、あなたはそれが面白いと思うかもしれません。 IPパケットは逆アセンブル/再アセンブルできるため、基になるメディアの制限(1500バイトイーサネットなど)を超えることができます: GREおよびIPSEC


このトピックの詳細:

  • Re:UDPフラグメンテーション は、MTUを検出するためにUDPの代わりにICMPを使用する必要があることを示しています
  • Path MTU Discovery は、TCP接続にはICMPを介した暗黙的なMTUネゴシエーションが含まれる可能性があると述べています

WindowsでAPIを介してICMPを生成することについては知りません:かつてはそのようなAPIが提案され、論争を呼んでいました。 ICMPメッセージ。

いいえ、見た目はis実装されています:例 Winsock Programmer's FAQ例:Ping :Raw Sockets Method

そのため、MTUを検出するには、「フラグメント化しない」フラグを使用してpingパケットを生成します。

これよりも簡単なAPIがあるかもしれませんが、わかりません。しかし、基礎となるプロトコルを理解していただければ幸いです。

23
ChrisW

以前のすべての回答に加えて、 classic を引用します:

最小再構成バッファーサイズ


これは、パブリックインターネット上で作業し、交換の片側のみを制御する場合、データグラムサイズを576未満に制限することを意味します。これが、ほとんどの標準UDPベースのプロトコルの機能です。

また、PMTUはパスの動的プロパティであることに注意してください。これは、1つですTCP対処します。多くのシーケンス、タイミング、および再送信ロジックを再実装する準備ができていない限り、TCP重要なネットワークの場合。ベンチマーク、テスト、プロファイル、 証明する つまり、TCP=がボトルネックです。UDPを検討してください。

13

これは私にとって興味深いトピックです。 UDPを介してチャンクUDPデータを実世界のインターネット上に配信する場合、おそらくいくつかの実際的な結果は興味深いかもしれません。1秒間に1パケットの伝送速度で、最大約2Kの最小限のパケット損失でデータが増え続けます。これで問題が発生し始めますが、定期的に1600バイト以上のパケットを問題なく配信しました。これはGPRSモバイルネットワークとWANワールドワイドです。信号が安定していると仮定して〜1K (そうではありません!)パケット損失が少なくなります。

興味深いことに、これは奇妙なパケットではなく、数秒間のパケットのスコールです。これが、おそらくVoIPコールがときどき崩壊する理由です。

3
Alexp

独自のMTUは レジストリ で利用できますが、実際のMTUは、マシンと宛先の間のパスで最小のMTUになります。両方の変数と経験的にのみ決定することができます。多くの RFCs があり、それを決定する方法を示しています。

通常、ネットワークハードウェアは同種であるか、少なくとも集中管理されているため、LANは内部的に非常に大きなMTU値を持つことができます。

2
Jherico

UDPアプリケーションの場合、IPフラグメンテーションまたはパケットのドロップを回避するには、エンドツーエンドMTUを自分で処理する必要があります。あらゆるアプリケーションに推奨されるアプローチは、PMTUを使用して最大データグラムを選択するか、データグラムを送信して<PMTUを最小にするように最善を尽くすことです。

https://tools.ietf.org/html/rfc5405#section-3.2

アプリケーション設計者向けのユニキャストUDP使用ガイドライン

Windowsは、基本的なソケットオプションインターフェイスを介してPMTU情報に設定およびアクセスするように見えます。

IP_MTU_DISCOVERを介してPMTU discoverがオンになっていることを確認でき、IP_MTUを介してMTUを読み取ることができます。

https://docs.Microsoft.com/en-us/windows/desktop/winsock/ipproto-ip-socket-options

0
bockmabe