5. Host Processing of Old-Style Messages (旧式メッセージのホスト処理)
5. Host Processing of Old-Style Messages (旧式メッセージのホスト処理)
このセクションでは, 変更されていないルータ (つまり, Next-Hop MTU フィールドがゼロのルータ) から Datagram Too Big メッセージを受信した際にホストが従う可能性のあるいくつかの戦略の概要を説明します。このセクションはプロトコル仕様の一部ではありません。
ホストがこのようなメッセージに応答して行える最も簡単なことは, PMTU が現在仮定している PMTU と 576 の最小値であると仮定し, そのパスで送信されるデータグラムで DF ビットの設定を停止することです。したがって, ホストは現在の実践と同じ PMTU に戻ります ("Requirements for Internet Hosts -- Communication Layers" (インターネットホストの要件 -- 通信層) [1] のセクション 3.3.3 を参照)。この戦略の利点は, すぐに終了し, 既存の実践よりも悪くならないことです。ただし, 一部のケースでは断片化を回避できず, 他のケースではインターネットの最も効率的な利用ができません。
より洗練された戦略には, DF ビットを設定したデータグラムを送信し続けながらサイズを変化させることによって, 正確な PMTU 推定値を "検索" することが含まれます。優れた検索戦略とは, プロセス中に多くのパケットを失うことなく Path MTU の正確な推定値を取得するものです。
いくつかの可能な戦略は, 以前の PMTU 推定値にアルゴリズム関数を適用して新しい推定値を生成します。たとえば, 古い推定値に定数 (0.75 など) を掛けることができます。これはお勧めしません。収束が遅すぎるか, 真の PMTU を大幅に過小評価します。
より洗練されたアプローチは, パケットサイズに対してバイナリサーチを行うことです。これはやや速く収束しますが, FDDI MTU からイーサネット MTU に収束するにはまだ 4 または 5 ステップかかります。深刻な欠点は, データグラムが反対側に到達した時 (現在の推定値が低すぎることを示す) を認識するために複雑な実装が必要なことです。この戦略もお勧めしません。
非常にうまく機能すると思われる戦略の 1 つは, 実際にはインターネットで使用されている MTU 値は比較的少ないという観察から始まります。したがって, 任意に選択された値を盲目的に検索するのではなく, 現れる可能性のある値だけを検索できます。さらに, 設計者は同様の方法で MTU を選択する傾向があるため, 類似した MTU 値のグループを収集し, グループ内の最小値を検索 "plateau" (プラトー) として使用できます。(MTU を数パーセント過小評価することは, 1 オクテット過大評価するよりも明らかに優れています。)
セクション 7 では, PMTU 推定に使用する代表的な MTU プラトーのテーブルをどのように作成したかを説明します。このテーブルを使用すると, 最悪の場合でもバイナリサーチと同程度の収束が得られ, 一般的なケースではるかに優れています (たとえば, FDDI MTU からイーサネット MTU までは 2 回のラウンドトリップ時間しかかかりません)。プラトーは 2 の累乗に近いため, MTU がこのテーブルに表されていない場合, アルゴリズムはそれを 2 倍以上過小評価することはありません。
どの検索戦略も, 次の推定値を選択するために以前の推定値のある種の "記憶" を持っている必要があります。1 つのアプローチは, 現在キャッシュされている Path MTU の推定値を使用することですが, 実際には Datagram Too Big メッセージ自体により良い情報があります。すべての ICMP Destination Unreachable メッセージは, このメッセージを含めて, 元のデータグラムの IP ヘッダーを含んでおり, 断片化なしで転送するには大きすぎたデータグラムの Total Length (全長) が含まれています。この Total Length は現在の PMTU 推定値よりも小さい可能性がありますが, それでも実際の PMTU よりは大きいため, 次の PMTU 推定値を選択する方法への良い入力となる可能性があります。
注意: 4.2BSD Unix から派生した実装に基づくルータは, 元の IP データグラムの Total Length に対して誤った値を送信します。これらのルータによって送信される値は, 元の Total Length と元の Header Length (オクテットで表現) の合計です。このような Datagram Too Big メッセージを受信したホストは, それがこれらのルータの 1 つによって送信されたかどうかを知ることができないため, ホストは保守的であり, そうであると仮定しなければなりません。返された Total Length フィールドが現在の PMTU 推定値以上である場合, 返された Header Length フィールドの値の 4 倍だけ減らさなければなりません。
したがって, 推奨する戦略は, 返された Total Length フィールド (必要に応じて上記の注意に従って修正) より小さい最大のプラトー値を次の PMTU 推定値として使用することです。