フラグメンテーションが IP レベルで行われる理由を探していますが、TCP/UDP では行われない理由を探しています。
フレームが |MAC|IP|TCP|Payload|FCS のようになっているとします。たとえば、全体のサイズ: 1600。PathMTU はここで発生します。IP レベルで断片化が実装されている理由が私の質問であり、TCP/UDP レベル/コードで実装されていない理由です。
少し早いですがお礼を。
フラグメンテーションが IP レベルで行われる理由を探していますが、TCP/UDP では行われない理由を探しています。
フレームが |MAC|IP|TCP|Payload|FCS のようになっているとします。たとえば、全体のサイズ: 1600。PathMTU はここで発生します。IP レベルで断片化が実装されている理由が私の質問であり、TCP/UDP レベル/コードで実装されていない理由です。
少し早いですがお礼を。
それこそが、TCP/IP スタックと ISO/OSI モデルの複数のレイヤーが必要とするものです。TCP/UDP はトランスポート プロトコルであり、フラグメンテーションを気にする必要はありません。それは彼らの問題ではありません。IP レベルはネットワークを扱い、フラグメントのサイズはネットワーク プロパティに依存するため、フラグメント化を扱います。問題を解決するための最良の条件を持つ層は、問題を解決します。
レイヤー4(TCP / UDP)は、エンドポイント(送信者/受信者)でのみ表示されます。レイヤー3(IP)は、ホップごとに表示されます。
MTUはリンクのプロパティですが、このリンクプロパティ(MTU)に基づくフラグメンテーションは、常にルーター(ホップ)のIP層で行われます。
これで、各ホップ間のリンクの帯域幅を変えることができるため、各ホップで、パケットを宛先に転送する方法を決定する必要があります。MTUはリンクにプッシュできるデータの最大量であり、送信するパケットのサイズよりも小さい場合は、リンクに対応するためにデータを小さなチャンクにフラグメント化する必要があります。
断片化と再構築には、1。CPUとメモリのオーバーヘッドのわずかな増加2.フラグメントヘッダーの追加によるパケットあたりのオーバーヘッドの増加3. 1つのフラグメントが失われた場合、送信者はパケット全体を送信する必要があるなど、多くの欠点があります。
上記の問題を解決するには、1。パスMTUディスカバリーを使用できます。2.レイヤー4では、TCPMSSクランプを使用できます。
フラグメンテーションが上位層(TCP、UDPなど)で実行された場合、これにより、フラグメンテーション/再アセンブリが冗長に実装されます(プロトコルごとに1回)。フラグメンテーションが下位層(イーサネット、ATMなど)で実行された場合、各ホップで断片化/再構築を実行し(かなりのコストがかかる可能性があります)、冗長に実装する必要があります(リンク層プロトコルごとに1回)。したがって、IP層はフラグメンテーションに最も効率的な層です。
UDP をフラグメント化するよりも、TCP をフラグメント化する方が意味がありません。TCP は信頼性の高いセグメンテーション/再構築/再送信メカニズムを提供するため、より小さな TCP セグメントを送信するだけで、断片化の必要性を完全に回避できます (これは d3jones が話していることです)。
ただし、UDP では、断片化は依然として理にかなっています。MTU よりも長い単一の UDP セグメントを送信できます。IP レイヤーは、それを正確かつ目に見えないように断片化します。アプリケーション開発者は、アプリケーション層プロトコルをコーディングするために、MTU やネットワークに関することを決定する必要はありません。