230

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

多くのサービスでは、最大の UDP パケットが 512 バイトに制限されています (DNS など)。

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

パケットのフラグメント化なしで最大 548 のサイズのパケットを使用できますか? それとも、DNS の作成者が知っていた何かがあり、それがなぜ DNS を 512 バイトに制限したのか.

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

4

13 に答える 13

149

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

于 2009-07-08T17:07:49.743 に答える
63

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

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

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

于 2009-07-08T15:47:59.390 に答える
47

576 は最小の最大再構成バッファ サイズです。つまり、各実装は、少なくともそのサイズのパケットを再構成できなければなりません。詳細については、 IETF RFC 1122を参照してください。

于 2011-02-08T08:51:32.573 に答える
15

この記事では、最大転送単位 (MTU) http://en.wikipedia.org/wiki/Maximum_transmission_unitについて説明します。IP ホストは IP パケットに対して 576 バイトを処理できなければならないと述べています。ただし、最小値は 68 であることに注意してください。 ."

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

user607811 が述べたように、他のネットワーク層による断片化は再構築する必要があります。 https://www.rfc-editor.org/rfc/rfc1122#page-56 3.3.2 再組み立て IP 層は、IP データグラムの再組み立てを実装しなければなりません。EMTU_R ("Effective MTU to receive") によって再構築できる最大のデータグラム サイズを指定します。これは、「再構築バッファ サイズ」と呼ばれることがあります。EMTU_R は 576 以上でなければなりません

于 2014-05-28T15:05:46.580 に答える
12

IPv4の最小再構成バッファー サイズは 576 で、IPv6 は 1500 です。ここからヘッダー サイズを引きます。W. Richard Stevens による UNIX Network Programmingを参照してください:)

于 2009-07-08T18:39:39.560 に答える
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 バイトです。

于 2016-08-03T11:34:55.707 に答える
7

IPV6のサイズが1500であることを考えると、キャリアはIPV4とIPV6に別々のパスを提供せず(どちらも異なるタイプのIPです)、古い、冗長で、保守にコストがかかるipv4の機器に強制します。信頼性が低くなります。それは意味がありません。さらに、そうすることは、一部のトラフィックに優遇措置を提供することと簡単に見なされる可能性があります。ルールの下では、おそらくあまり気にしないでしょう(捕まらない限り)。

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

****アップデート****

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

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

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

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

于 2012-04-20T02:47:37.547 に答える
7

512が最善の策です。他の場所でも使用されており、適切な偶数 (1024 の半分) です。

于 2009-07-08T15:45:52.403 に答える