メインコンテンツまでスキップ

6.4 TCP Layer Actions (TCP レイヤアクション)

6.4 TCP Layer Actions (TCP レイヤアクション)

TCP 層は接続の宛先の PMTU を追跡する必要があります。これより大きいデータグラムを送信すべきではありません。単純な実装では, 新しいセグメントを作成するたびに IP 層にこの値を要求できます ([1] で説明されている GET_MAXSIZES インターフェースを使用)。しかし, これは非効率的である可能性があります。さらに, "slow-start" (スロースタート) 輻輳回避アルゴリズム [4] に従う TCP 実装は, 通常 PMTU から派生したいくつかの他の値を計算してキャッシュします。PMTU が変更されたときに非同期通知を受信する方が簡単かもしれません。そうすれば, これらの変数を更新できます。

TCP 実装は, そのピアから受信した MSS 値 (デフォルトは 536) も保存する必要があり, PMTU に関係なく, この MSS より大きいセグメントを送信してはなりません。4.xBSD 派生の実装では, これは TCP 状態レコードに追加のフィールドを追加する必要があります。

最後に, Datagram Too Big メッセージが受信された場合, それは ICMP メッセージを送信したルータによってデータグラムが破棄されたことを意味します。これを他の破棄されたセグメントとして扱い, 再送信タイマーが期限切れになるまで待ってセグメントの再送信を引き起こすだけで十分です。PMTU Discovery プロセスが正しい PMTU を推定するために複数のステップを必要とする場合, これは多くのラウンドトリップ時間だけ接続を遅延させる可能性があります。

あるいは, Path MTU が変更されたという通知に対する即座の応答として再送信を行うことができますが, Datagram Too Big メッセージによって指定された特定の接続に対してのみです。再送信で使用されるデータグラムサイズは, もちろん新しい PMTU より大きくすべきではありません。

注意: すべての Datagram Too Big メッセージに応答して再送信してはなりません (MUST not)。なぜなら, いくつかの大きすぎるセグメントのバーストは複数のそのようなメッセージを引き起こし, したがって同じデータの複数の再送信を引き起こすからです。新しく推定された PMTU がまだ間違っている場合, プロセスが繰り返され, 送信される余分なセグメントの数が指数関数的に増加します!

これは, TCP 層が Datagram Too Big 通知が実際に指定された接続でデータグラムを送信するために既に使用した PMTU を減少させたときを認識できる必要があり, 他の通知を無視すべきであることを意味します。

現代の TCP 実装は, パフォーマンスを向上させるために "congestion avoidance" (輻輳回避) と "slow-start" (スロースタート) アルゴリズムを組み込んでいます [4]。TCP 再送信タイムアウトによって引き起こされる再送信とは異なり, Datagram Too Big メッセージによって引き起こされる再送信は輻輳ウィンドウを変更すべきではありません。ただし, スロースタートメカニズムをトリガーすべきです (つまり, 確認応答が再び到着し始めるまで, 1 つのセグメントのみを再送信すべきです)。

送信者の最大ウィンドウサイズが使用されているセグメントサイズの正確な倍数でない場合, TCP のパフォーマンスが低下する可能性があります (これは輻輳ウィンドウサイズではなく, 常にセグメントサイズの倍数です)。多くのシステム (4.2BSD から派生したシステムなど) では, セグメントサイズは通常 1024 オクテットに設定され, 最大ウィンドウサイズ ("send space" (送信空間)) は通常 1024 オクテットの倍数であるため, デフォルトで適切な関係が保持されます。ただし, PMTU Discovery を使用する場合, セグメントサイズは送信空間のサブマルチプルではない可能性があり, 接続中に変更される可能性があります。これは, PMTU Discovery が PMTU 値を変更するときに, TCP 層が送信ウィンドウサイズを変更する必要がある可能性があることを意味します。最大ウィンドウサイズは, 送信者のバッファ空間サイズ以下のセグメントサイズ (PMTU - 40) の最大倍数に設定する必要があります。

PMTU Discovery は TCP MSS オプションで送信される値には影響しません。なぜなら, その値は接続の他端によって使用され, 無関係な PMTU 値を使用している可能性があるからです。