UDPはMTUについて何も知りません。UDPパケットのサイズは8〜65535バイトです。UDPの下のプロトコル層は、特定のサイズのパケットを送信できるか、大きすぎる場合はエラーでそのパケットの送信を拒否します。
UDPの下の層は通常、IPであり、IPv4またはIPv6です。また、IPパケットのサイズは、20(IPv4)/ 40(IPv6)から65535バイトまで、UDPと同じ最大サイズです。ただし、IPはフラグメンテーションと呼ばれるメカニズムをサポートしています。IPパケットのサイズが下の層が転送できるサイズより大きい場合、IPは単一のパケットをフラグメントと呼ばれる複数のパケットに分割できます。すべてのフラグメントは、実際には独自のIPパケットであり(独自のIPヘッダーがあります)、独自に宛先に送信されます。次に、すべてのフラグメントを収集し、次の上位層(UDPなど)で受信データを渡す前にそれらから完全なパケットを再構築することが宛先のタスクです。
イーサネットプロトコルは、46〜1500バイトのペイロードを持つフレームのみを転送できます(例外はありますが、この応答の範囲を超えています)。ペイロードデータが46バイト未満の場合は、46バイトになるようにパディングされます。ペイロードデータが1500バイトを超える場合、インターフェイスはそれを受け入れることを拒否します。この場合、パケットをフラグメント化するかどうかを決定するのはIPレイヤーです。そのため、1500バイトを超えるフラグメントはありません。また、この特定の接続でフラグメンテーションが無効化または禁止されている場合は、次の上位レイヤーにエラーを報告します。
断片化は一般に避けられるべきです、
- 送信側でリソースを浪費しています。
- 受信側でリソースを浪費します。
- 同じ量のペイロードデータに対してプロトコルのオーバーヘッドが増加します。
- 単一のフラグメントが失われると、パケット全体が失われます。
- 単一のフラグメントが破損している場合は、パケット全体が破損しています。
- 再送信の場合、すべてのフラグメントを再送信する必要があります。
そのため、TCPはインテリジェントにフレームサイズを採用しているため、パケットを断片化するためにIPが必要になることはありません。これは、IPを禁止してパケットをフラグメント化することで実行できます。IPでパケットが大きすぎて送信できないと報告された場合、TCPはフレームサイズを縮小し、エラーが報告されなくなるまで再試行します。
ただし、UDPの場合、これはアプリケーション自体のタスクです。UDPは「ダム」プロトコルであるため、独自の管理ロジックがないため、非常に柔軟、高速、かつ単純になります。
常に転送可能であると信頼できる唯一のUDPサイズは、576マイナス8バイトのUDPヘッダーとマイナス20(v4)/ 40(v6)バイトのIPヘッダーです。IP標準では、すべてのIPホストがIPパケットを受信できる必要があるためです合計サイズは576バイトです。プロトコルの実装は、少なくともそのサイズのパケットを受け入れることができない場合、標準に準拠しません。ただし、標準ではフラグメンテーションなしの576は規定されていないため、576バイトのIPパケットでも2つのホスト間でフラグメント化される可能性があります。
フラグメントの最小IPヘッダーは20/48バイト(v4 / v6)であり、フラグメントには少なくとも4/8が必要であるため、フラグメント化なしで転送可能であると信頼できる唯一のパケットサイズは、IPv4で24バイト、56バイトIPv6です。バイト(v4 / v6)ペイロードデータ。したがって、少なくともこれらのサイズのパケットを転送できないIP層の下の転送システムは、IPトラフィックの転送には使用できません。
そして、誰かがIPv6ヘッダーは40バイトしかないとコメントする前に:それは正しいですが、IPv4ヘッダーとは異なり、標準のIPv6ヘッダーにはフラグメンテーション用のヘッダーフィールドがありません。パケットをフラグメント化する必要がある場合は、IPv6ベースヘッダーの下にフラグメンテーション拡張ヘッダーを追加する必要があります。この拡張ヘッダーは8バイトの長さです。また、IPv4とは異なり、IPv6のフラグメンテーションオフセットは4バイト単位ではなく8バイトでカウントされるため、IPv6の場合、フラグメントは8バイトの倍数のペイロードしか運ぶことができません。