UDPパケットサイズに関する多くの記事を読みましたが、何が正しいかについて結論を出すことができませんでした。
多くのサービスが最大のUDPパケットを512バイトに制限しています(dnsなど)
インターネットの最小 MTU が576で、IPv4ヘッダーのサイズが20バイト、UDPヘッダーが8バイトであると仮定します。これにより、ユーザーデータに548バイトが使用可能になります
パケットを断片化せずに最大548のサイズのパケットを使用できますか?または、DNSの作成者が知っていること、およびDNSを512バイトに制限した理由があります。
安全に548バイトを超えることもできますか?
typicalIPv4ヘッダーが20バイトで、UDPヘッダーが8バイトであることは事実です。ただし、IPヘッダーのサイズを60バイトまで増やすことができるIPオプションを含めることは可能です。さらに、パケットを宛先にルーティングするために、中間ノードが IPsec (VPNなどに使用)などの別のプロトコル内にデータグラムをカプセル化する必要がある場合があります。そのため、特定のネットワークパスで MTU がわからない場合は、予期しない他のヘッダー情報に妥当なマージンを残すことをお勧めします。 512バイトのUDPペイロードは一般にこれを行うと考えられていますが、それでも最大サイズのIPヘッダーに十分なスペースを残していません。
UDPパケットの最大サイズの理論上の制限(Windows)は65507バイトです。これは ここに文書化されています :
正しい最大UDPメッセージサイズは、次の式で決定される65507です。0xffff-(sizeof(IPヘッダー)+ sizeof(UDPヘッダー))= 65535-(20 + 8)= 65507
そうは言っても、ほとんどのプロトコルははるかに小さいサイズに制限されます-通常は512または時々8192です。信頼できるネットワーク上にいる場合は548を超えることができますが、インターネット全体でブロードキャストしている場合は、あなたが行くと、パケット伝送の問題と損失に遭遇する可能性が高くなります。
安全な最大UDPペイロードは508バイトです。これは、576のパケットサイズから、最大60バイトのIPヘッダーと8バイトのUDPヘッダーを引いたものです。このサイズ以下のUDPペイロードは、IPを介して配信可能であることが保証されています(配信は保証されていません)。それより大きいものは、何らかの理由でルーターによって完全にドロップされることが許可されます。最大ペイロードが1,212バイトのIPv6のみのルートを除きます。他の人が述べたように、状況によっては追加のプロトコルヘッダーを追加できます。代わりに、300〜400バイト程度のより保守的な値が推奨される場合があります。
任意のUDPパケットがフラグメント化される可能性があります。しかし、フラグメントを失うことは、フラグメント化されていないパケットを失うことと同じ効果があるため、これはあまり重要ではありません。 UDPでは、これはどちらの方法でも起こります。
興味深いことに、理論上の最大パケットサイズは約30 MB(1,500イーサネットMTU-60 IPヘッダーx最大フラグメント数65,536)ですが、通過する可能性はわずかです。
出典:RFC 791、RFC 2460
576は最小最大再構成バッファーサイズです。つまり、各実装は、少なくとものパケットを再構成できる必要がありますそのサイズ。詳細については、 IETF RFC 1122 を参照してください。
この記事では、最大伝送単位(MTU)について説明します http://en.wikipedia.org/wiki/Maximum_transmission_unit 。 IPホストはIPパケットの576バイトを処理できる必要があると述べています。ただし、最小値は68であることに注意してください。RFC791:「すべてのインターネットモジュールは、さらに断片化せずに68オクテットのデータグラムを転送できる必要があります。 」
したがって、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以上でなければなりません
IPv4 最小再構成バッファーサイズ 576、IPv6には1500があります。ここからヘッダーサイズを減算します。 W。Richard StevensによるUNIXネットワークプログラミング :)を参照してください
IPV6のサイズが1500であることを考えると、キャリアはIPV4とIPV6に別々のパスを提供せず(両方ともIPが異なるタイプである)、古い、冗長、維持するのによりコストのかかるipv4の機器にそれらを強制します信頼性が低い。意味がありません。その上、そうすることは簡単にいくつかのトラフィックに優遇措置を提供することを考慮されるかもしれません-彼らがたぶん捕まらない限り、彼らはおそらくあまり気にしないルールの下でノーです。
したがって、1472は外部使用に対して安全である必要があります(ただし、EDNSを知らないDNSのようなアプリがそれを受け入れることを意味しません)。また、内部ネットについて話している場合、ネットワークレイアウトを知っている可能性が高くなります。ジャンボパケットサイズは、フラグメント化されていないパケットに適用されるため、4096〜4068バイト、および9014バイトバッファーを備えたIntelのカードのパッケージサイズは... wait ... 8086バイトで、最大...一致でしょうか。 スニッカー
****更新****
さまざまな回答により、1つのSWベンダーが許可する最大値、またはカプセル化を想定したさまざまな回答が得られます。ユーザーは、可能な最小値(安全なUDPサイズの場合は「0」)を要求しませんでしたが、最大の安全なパケットサイズを要求しました。
さまざまなレイヤーのカプセル化値を複数回含めることができます。一度ストリームをカプセル化すると、たとえば、その下のVPNレイヤーとその上のカプセル化レイヤーの完全な複製を禁止するものはありません。
質問は最大安全値に関するものであったため、受信できるUDPパケットの最大安全値について話していると想定しています。 UDPパケットは保証されていないため、UDPパケットを受信した場合、安全な最大サイズはIPv4を介した1パケットまたは1472バイトになります。
注-IPv6を使用している場合、IPv6のヘッダーサイズは40バイト対IPv4の20バイトサイズであるため、最大サイズは1452バイトになります(どちらにしても、UDPヘッダーに8バイトを許可する必要があります)。
ここでいくつかの良い答えを読みました。ただし、いくつかの小さな間違いがあります。 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バイトです。
512が最善の策です。他の場所で使用され、ニースの偶数(1024の半分)です。