インターネットで最大の安全なUDPパケットサイズ


201

UDPパケットサイズに関する多くの記事を読みましたが、何が正しいかについて結論を出すことができませんでした。

多くのサービスは、最大のUDPパケットを512バイト(dnsなど)に制限します

インターネット上の最小MTUが576で、IPv4ヘッダーのサイズが20バイト、UDPヘッダーが8バイトであるとします。これにより、ユーザーデータ用に548バイトが使用可能になります

パケットを断片化せずに548サイズまでのパケットを使用できますか?または、DNSの作成者が知っていた何かがあり、それが彼らが512バイトに制限した理由です。

安全に548バイトを超えることもできますか?



10
そのちょっと違う質問です。私は、フラグメント化されないインターネットを介して送信できる最大のパケット(他のネットワークの知識やプローブなしで)を尋ねます。基本的に最大の安全なサイズであり、接続のプローブを心配する必要なく、あらゆる状況で機能します。
KM

2
断片化の可能性を排除することはできませんが、これによって物事の安全性が低下することはありません。フラグメントがドロップされた場合、それはパケット全体がドロップされた場合と同じであり、UDPで発生します。安全でないのは、ルーターがサポートするために必要な最小サイズをパケットが超えたために、配信可能であることが保証されていなかった場合です(その代わり、配信が保証されていました)。512バイトの数字が入ってくる場所です。
Beejor

回答:


129

典型的な IPv4ヘッダーが20バイトであり、UDPヘッダーが8バイトであることは事実です。ただし、IPヘッダーのサイズを60バイトまで増やすことができるIPオプションを含めることは可能です。さらに、パケットを宛先にルーティングするために、中間ノードがIPsec(VPNなどに使用される)などの別のプロトコルの内部でデータグラムをカプセル化する必要がある場合があります。そのため、特定のネットワークパスのMTUがわからない場合は、予想外の可能性がある他のヘッダー情報に妥当なマージンを残すことをお勧めします。512バイトのUDPペイロードは、それを行うと一般的に考えられていますが、それでも最大サイズのIPヘッダーに十分なスペースは残されません。


36
明確にするために:フラグメンテーションを回避するために小さいサイズを使用しても、パケットは「安全」に配信されません。犬がネットワークケーブルを食べてしまうなど、配信の信頼性が低下する可能性は無限にあります。それは言った; フラグメントが少ないほど、配信が「安全」になります。これは、複数あり、いずれか1つでも作成されなかった場合、パケット全体(データグラム)がUDPによってドロップされるためです。
markmnl 2013年

3
質問のために、「安全」のポスターの定義を使用することを想定します。これは、彼らが見たことのない一部の標準書でのいくつかの定義ではありません。
Astara 2018

実際のルーターは、UDPパケットをフラグメント化する代わりにドロップすることが知られていますか?
user253751

60

UDPパケットの最大サイズの理論上の制限(Windowsの場合)は65507バイトです。これはここに文書化されています

正しい最大UDPメッセージサイズは65507で、次の式で決定されます。0xffff-(sizeof(IPヘッダー)+ sizeof(UDPヘッダー))= 65535-(20 + 8)= 65507

そうは言っても、ほとんどのプロトコルははるかに小さいサイズ(通常512または時々8192)に制限されます。信頼できるネットワーク上にある場合は、安全に548を超えることができますが、インターネット全体でブロードキャストしている場合、大きい行くほど、パケット伝送の問題と損失に遭遇する可能性が高くなります。


39
Microsoftリンクは、規範的な参照ではありません。RFCは規範的なリファレンスです。引用した内容はIPv4にのみ適用されます。
ローン侯爵2013

2
MSが許可しているからといって、中間ルーターなどがより大きなパケットサイズをフラグメント化するように強制される可能性があるため、それが常に良いアイデアであるとは限りません(前述のとおり)。
rogerdpack 2013年

1
@EJP彼らはMicrosoftリンクでそれを明確に説明していませんが、それはIPv4の必要な結果であると思われます:IPv4の全長フィールドは16ビットであり、その値はIPヘッダーの長さとUDPヘッダー。
jtpereyda 2016年

@jtpereyda私はそのすべてを完全に認識しています。私の要点はまさに私がすでに述べたものです:それらが存在する場所で規範的な参照を引用するべきです。
ローン侯爵

私のwifiカード(IEEE 802.3)は1500 MTUしか実行できず、ジャンボフレームは9kバイトしかないため、最大UDPパケットサイズは65,507バイトになるとは思わない。
クリスチャンスチュワート

52

安全な最大UDPペイロードは508バイトです。これは576のパケットサイズから、最大60バイトのIPヘッダーと8バイトのUDPヘッダーを差し引いたものです。このサイズ以下のUDPペイロードは、IP経由での配信が保証されています(配信は保証されていません)。それより大きなものは、何らかの理由でルーターによって完全にドロップされることが許可されます。IPv6のみのルートを除き、最大ペイロードは1,212バイトです。他の人が述べたように、状況によっては追加のプロトコルヘッダーを追加できます。代わりに、約300〜400バイトのより保守的な値が推奨されます。

UDPパケットはフラグメント化される可能性があります。ただし、フラグメントを失うことは、フラグメント化されていないパケットを失うことと同じ効果があるため、これはそれほど重要ではありません。パケット全体がドロップされます。UDPでは、これはどちらの方法でも発生します。

興味深いことに、理論上の最大パケットサイズは約30 MB(1,500イーサネットMTU-60 IPヘッダーx 65,536フラグメントの最大数)ですが、通過する可能性はごくわずかです。

出典:RFC 791、RFC 2460


2
デフォルトでは、UDPパケットは「_U_nreliable」と見なされます。受信すると予想される安全なUDPパケットサイズは、フラグメント化されていない1つのパケットだけです。「安全な」パケットが必要な場合は、TCPの上にパケットプロトコルを使用してください。
Astara

26
@Astara確かに、UDPは本質的に信頼できません。ただし、問題は、指定されたサイズのパケットの配信が保証されるかどうかであり、配信が保証されるかどうかです。特定のサイズを超えるパケットは可能(とされる)ことができます小さいものは一方で、何らかの理由で任意のルータによって落とさなければならないベストエフォートは、業界標準に準拠して、すべてのルータによって処理されます。したがって、この場合の「安全」とは、「車が橋の下に収まるか」という意味であり、「車が渋滞する」という意味ではありません。
Beejor

1
UDPは実際には非常に信頼性が高いので、ランダムな人が言ったことを繰り返すのをやめて、事実を確認することをお勧めします。ところで、TCPの不必要なオーバーヘッドなしで、UDPの上に安全なパケットがあります。 openmymind.net/How-Unreliable-Is-UDP
パブロアリエル

5
ドロップされたパケットのが原因で、UDPは「信頼できない」わけではありませんが、パケットドロップされる可能性がある(そしてドロップされる)ためです。特定のパケットの到着、注文、または確認に「依存」することはできません。データは壊れやすく、まるで99%の確率で車のステアリングが機能し、89%が正しい方向に向かっていると信頼できると言っているようなものです。UDPは多くの点で優れているわけではなく、基本的に独自のバージョンの「TCP」をその上に記述する必要があるだけです。これは、ゲーム開発の
Beejor

@Beejor正しい方向に進んでいましたが、「基本的に独自のバージョンの "TCP"を上に記述する必要があります」とは、明らかに間違っています。UDPはブロードキャストに最適であり、「重要でない」データの高速送信に最適です。(ゲームに関して)UDPを使用して(LAN)サーバー/サービスを検出し、UDPを使用してプレーヤーの場所をすばやく送信できます。1つのパケットがドロップされている場合。次のパケットには他のプレーヤーの最新の場所が含まれるため、気にする必要はありません。TCPは「順序が狂う」パケットを持つ可能性があり、オーバーヘッドがあり、1対多の接続を実行しません。UDPがより適切な場合もあります。
ポール

46

576は、最小再構成バッファーサイズの最小値です。つまり、各実装は、少なくともそのサイズのパケットを再構成できる必要があります。詳細については、IETF RFC 1122を参照してください。


2
もしIPv6をサポートしていないネットワークを持っている場合に限ります。IPv6を伝送する場合は、IPv6ヘッダーの最大パケットサイズを使用してから、IPv4 over IPv6を実行するためにカプセル化ヘッダーを差し引きます。;-)
Astara

@Astara IPv6では、フラグメンテーションは送信側によって行われるため、危険な非準拠の中間ルーターについては問題はありません。また、受信者がメモリに制約のある埋め込みサイズでない場合、少なくとも64kBまでのパケットを再構成できます。
user253751

@ user253751フラグメント化する可能性があるのは、非準拠ルーターだけではありません。Path MTU Discoveryがありますが、それでも断片化を完全に排除するには不十分です。
dstromberg

@dstromberg IPv6ルーターがデータグラムをフラグメント化できるのはどのような場合ですか?
user253751

@ user253751まだIPv6はあまりありませんが、1つの例を示します。ジャンボグラムをサポートする別のIPv6ネットワークにジャンボグラム(> 65536バイト)を送信するIPv6ネットワークを想像してください。さらに、Path MTU Discoveryがそれらのジャンボグラムを断片化せずにサポートする必要があると言っていると仮定します。ただし、ルーターの電源が再投入され、ネットワークパスの一部がジャンボグラム用に構成されていない機器に置き換えられます。
dstromberg

14

この記事では、最大伝送ユニット(MTU)http://en.wikipedia.org/wiki/Maximum_transmission_unitについて説明します。IPホストはIPパケットに対して576バイトを処理できる必要があると述べています。ただし、最小値は68であると記載されています。RFC 791:「すべてのインターネットモジュールは、さらに断片化せずに68オクテットのデータグラムを転送できる必要があります。これは、インターネットヘッダーが最大60オクテットで、最小フラ​​グメントが8オクテットであるためです。 」

したがって、安全なパケットサイズ508 = 576-60(IPヘッダー)-8(udpヘッダー)が妥当です。

user607811で言及されているように、他のネットワーク層による断片化は再構成する必要があります。 https://tools.ietf.org/html/rfc1122#page-56 3.3.2再構成IP層は、IPデータグラムの再構成を実装する必要があります。EMTU_R(「受信する有効なMTU」)で再構成できる最大のデータグラムサイズを指定します。これは、「再構成バッファーサイズ」と呼ばれることもあります。EMTU_Rは576以上である必要があります


11

IPv4の最小再構成バッファーサイズは576、IPv6は1500です。ここからヘッダーサイズを差し引きます。参照してください。UNIXネットワークW.リチャードスティーヴンスによってプログラミング :)


1
もちろん、最低限です。見つけてくれてありがとう。何年にもわたって誰も間違いに気づいていないのか分かりません。
Nikolai Fetissov 2016年

1
IPv6の最小再構成バッファーは1500である可能性がありますが、IPv6パケットはフラグメント化できず、最小IPv6 MTUは1280です。エンドデバイスは、フラグメント化されたIPv6パケットを再構成する必要はありません。
Ron Maupin、2016年

1
@RonMaupin IPv6パケットは、エンドポイントによってフラグメント化できます。ちょうど間にあるルーターではありません。
Navin 2016

3
@Navin、いいえ、IPv6パケットはフラグメント化されません。IPv6パケットにパッケージ化される前にデータをフラグメント化する必要がありますが、パケット自体はフラグメント化されません。違いがあります。断片化を処理するフィールドを持つIPv4パケットヘッダーとは異なり、IPv6パケットヘッダーには断片化を処理するものはありません。IPv6パケットヘッダーは、IPv4パケットヘッダーよりもはるかに単純です。
Ron Maupin


6

IPV6のサイズが1500であることを考えると、キャリアはIPV4とIPV6(どちらも異なるタイプのIP)に個別のパスを提供せず、それらを古い、冗長で、維持するのにコストがかかるipv4の機器に強制することを主張します信頼性が低くなります。それは意味がありません。その上、そうすることは、一部のトラフィックに優先的な扱いを提供することと容易に見なされる可能性があります-ノーノールールの下では、彼らはおそらくあまり気にしません(キャッチされない限り)。

したがって、1472は外部使用に対して安全である必要があります(これは、DNSのようなアプリがEDNSを認識しないことを受け入れるという意味ではありません)。内部ネットについて話している場合は、ネットワークレイアウトを知っている可能性が高くなります。ジャンボパケットサイズは、断片化されていないパケットに適用されるため、4096〜4068バイト、および9014バイトバッファを備えたインテルのカードの場合、パッケージサイズは...待機... 8086バイトで、最大...一致しますか? スニッカー

****更新****

さまざまな回答は、1つのSWベンダーが許可する最大値、またはカプセル化を想定したさまざまな回答を提供します。ユーザーは、可能な最小値(安全なUDPサイズの「0」など)を要求するのではなく、最大の安全なパケットサイズを要求しました。

さまざまなレイヤーのカプセル化値を複数回含めることができます。いったんストリームをカプセル化したら-たとえば、その下のVPNレイヤーとその上のカプセル化レイヤーの完全な複製を禁止するものは何もありません。

質問は最大安全値に関するものだったので、受信可能なUDPパケットの最大安全値について話していると思います。UDPパケットは保証されていないため、UDPパケットを受信した場合、安全な最大サイズはIPv4上の1パケットまたは1472バイトになります。

注-IPv6を使用している場合、IPv6のヘッダーサイズは40バイトであるのに対し、IPv4の20バイトサイズと比較して、最大サイズは1452バイトです(UDPヘッダーには8バイトを許可する必要があります)。


1
どのように1472を計算していますか?イーサネットのMTUは1500ですが、それはあなたが言及しているものですか?
rogerdpack 2013年

4
@rogerdpack彼は、IPv4とIPv6は多くのインフラストラクチャを共有する可能性が高く、IPv6が比較的人気が高まっているため、IPv6の制限(したがって1500)を想定しても安全であることを意味すると思います。しかし、この推論がどれほど有効であるかはわかりません。
トーマス

2
1500は、ネットワーク「チェーン」内のIPv6互換コンポーネントでサポートされる必要があります。IPv6をサポートするチェーンを介して移動できるIPv4を使用している場合(逆は当てはまりません)、IPv4のヘッダーサイズは20バイトであるため、 UDPのヘッダーサイズは8バイトです。これにより、最大安全サイズとして1500-20-8 = 1472が残されます(IPv6ではフラグメント化が許可されていないため)。注-十分な数のカプセル化レイヤーを追加すると、DATAのためのスペースがなくなる可能性があります。MAXを要求したので、カプセル化オーバーヘッドの複数のレイヤーが使用されていないと想定します。
Astara

1500はネットワークチェーンのIPv6互換コンポーネントでサポートされている必要があります。」いいえ、最小IPv6 MTUは1280です。イーサネットMTUは1500です。
ロンMaupinの

@RonMaupin-元のQは、MTUではなく、最大の安全なUDPパケットサイズでした。RFC2460を参照してください。1280オクテットのMTUに言及するだけでなく、ノードフラグメント化されたパケットを受け入れることができるがます。1500より大きいパケットの処理はオプションです。
Astara 2017年

6

ここでいくつかの良い答えを読みました。ただし、いくつかの小さな間違いがあります。UDPヘッダーのメッセージ長フィールドは最大65535(0xFFFF)であると回答した人もいます。これは技術的には真実です。実際の最大値は(65535-IPHL-UDPHL = 65507)であると回答した人もいます。間違いは、UDPヘッダーのメッセージ長フィールドに、すべてのペイロード(レイヤー5〜7)とUDPヘッダーの長さ(8バイト)が含まれていることです。つまり、メッセージ長フィールドが200バイト(0x00C8)の場合、ペイロードは実際には192バイト(0x00C0)になります。

難しくて速いのは、IPデータグラムの最大サイズが65535バイトであることです。この数は、L3およびL4ヘッダーとレイヤー5〜7ペイロードの合計に到達します。IPヘッダー+ UDPヘッダー+レイヤー5〜7 = 65535(最大)。

UDPデータグラムにはUDPヘッダーが含まれているため、UDPデータガムの最大サイズは65515バイト(0xFFEB)です。UDPペイロードにはUDPヘッダーが含まれていないため、UDPペイロードの最大サイズは65507バイトです。


1
あなたは質問に答えませんでした。質問者は、パケットの断片化を回避するために使用できる最大サイズを知りたがっていました。
Astara 2018

0

私は混乱した反応を招くのではないかと心配していますが、それでも、私が間違っているかどうか、この質問を見て答えに興味があるかどうかを明確にするために:

https://tools.ietf.org/html/rfc1122についての私の理解ステータスが「公式仕様」、この質問で使用されている用語のリファレンスであり、別のRFCに取って代わられておらず、エラッタにも矛盾していません。以下:

理論的には、すなわち。記述された仕様に基づいて、https://tools.ietf.org/html/rfc1122#section-4で指定されたUDP には「パケットサイズ」がありません。したがって、答えは「不明確」である可能性があります

実際には、これがこの質問で求められる可能性が高い(そして現在の技術に応じて更新できる)ので、これは異なる可能性があり、私にはわかりません。

私が動揺した場合、私は謝罪します。https://tools.ietf.org/html/rfc1122#page-8「インターネットプロトコルスイート」と「アーキテクチャの前提条件」では、聞いたことに基づいて、私が従った「前提条件」が明確にわかりません。層が分離されています。つまり。UDPが含まれているレイヤーは、IPが含まれているレイヤーに関係する必要はありません(IPレイヤーには、Reassembly、EMTU_R、Fragmentation、MMS_R(https://tools.ietf.org/html/rfc1122#page- 56))


1
UDPヘッダーには、16ビットのデータグラム長フィールドがあります。つまり、理論上の最大のUDPデータグラムは65,535ですが、UDPはIPパケット内にカプセル化されているため、理論的には全体の最大長が65,535です。同じ)ただし、理論上の最大データサイズを計算するには、そのサイズからIPヘッダーとUDPヘッダーを差し引く必要があります。
Ron Maupin

私はずっと前にこれを尋ねました、それはそれが仕様書でまたは理論で言うことよりむしろ実用的な答え(実際の生活で何がうまくいくか)を探していました。私はパケットを断片化せずにaからbにしたかったのですが、それはリアルタイムのゲームネットワーキングの問題でした-今は賢い人が開発した多くのソリューションがあると思います:)
KM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.