要約

  • RFC 2001は連続する三つの重複ACKをセグメント損失の強い兆候とみなし、再送タイマーを待たずに見かけ上の穴を再送した。
  • 高速回復ではcwndを一時的にssthresh + 3セグメントへ置き、追加の重複ACKごとに一つ増やし、新しいデータを確認するACKでssthreshへ戻した。
  • ACKが支えるのは受信前線と流れ続けるデータについての限定推論であり、原因、容量、相手の身元、アプリ受領、将来の配送を保証しない。

同じ番号が三度戻った瞬間

最初の重複ACKだけでは、古いセグメントが失われたのか、後続より遅れているだけなのか分からない。二つ目でも順序逆転の説明は残る。RFC 2001は三つ目を操作上の境界に選んだ。そこから先は、タイマー満了を待つ費用より、欠落と推定して再送する価値が上回る。

これはネットワーク内部を直接観測した判決ではない。RFCは通常の並べ替えなら一、二個の重複ACKの後に遅れたセグメントが処理され、新しいACKが出ると仮定した。三という数は、不完全な観測を行動へ変換する閾値である。

この瞬間から読むと、slow start、congestion avoidance、fast retransmit、fast recoveryは一本の遷移列になる。未知の経路を小さく探り、増加を抑え、特定のACK列で早期再送し、それでも後続データが動いている証拠を捨てずに回復する。

受信窓と輻輳窓は別の問いに答える

受信側が広告する窓は、相手TCPのバッファが受け入れられる量を表す。cwndは、送信側が知覚した輻輳に基づき、未確認で経路へ置ける量を制限する。RFC 2001では小さい方が上限となる。相手に空きがあることは、中間のルーターやリンクに余裕がある証拠ではない。

ssthreshは増え方を切り替える。閾値より下では新しいデータを確認するACKに従って窓を速く開く。上ではおおむね一RTTに一セグメントの線形増加へ移る。タイムアウトは流れが続く証拠に乏しいためcwndを一つへ戻すが、三つの重複ACKは別の状態を示す。累積前線は止まっていても、後続セグメントは受信TCPへ届いている。

重複ACKが残す狭い証拠

RFC 1122は、有効なセグメントが受信窓内にあるものの左端に一致せず到着したとき、RCV.NXTを確認するACKを送ることを認めた。同じACK番号は、次に必要な位置が変わらず、その先のデータが順不同で到着したことを示す。

示さないことの方が多い。輻輳による破棄、破損、経路変更、自然な並べ替え、ACKの複製、受信側の挙動は、送信側から似た形に見え得る。三つの重複ACKは損失仮説を強くするが、場所や原因を明らかにしない。空き容量、公平配分、将来のスループットも測らない。

三セグメント分は容量ではなく仮勘定

三つ目の重複ACKを受けると、RFC 2001は現在のcwndの半分をssthreshへ保存し、二セグメント未満にはしない。見かけ上欠けたセグメントを再送し、cwndをssthresh + 3*segsizeへ置く。

上乗せされた三つは、新たに発見した帯域ではない。受信側は別のセグメントを受け取らなければ重複ACKを生成できないため、三つの後続セグメントがネットワークを離れ、受信バッファへ入ったと推定する。その出発分を仮に置き換え、ACKクロックを急停止させないための勘定である。

さらに重複ACKが来るたび、cwndは一セグメント増える。新しい値が許す場合だけ一つ送る。追加のACK一つに追加の暫定枠一つという対応であり、恒久的な送信権ではない。

新しいACKが仮勘定を閉じる

新しいデータを確認するACKが来ると、cwndはssthreshへ戻る。三つ分と、その後の重複ACKで積み上がった膨張は消える。送信側は損失推定前のおよそ半分のレートでcongestion avoidanceへ移り、タイムアウト時のように一セグメントからやり直さない。

RFCはこのACKが再送分と、その後ろで待っていた中間セグメントを確認すると見込む。ただし送信側が観測するのは累積前線の前進である。どのコピーが結果を生んだか、アプリがデータを読んだか、その後の処理が完了したかは直接見えない。

膨張を解く処理こそ、fast recoveryを一時的な仕組みに保つ。再送開始だけ記録して縮小を残さなければ、例外的な権限が恒久的な容量に見えてしまう。

回復を一つの成功印にしない

監査可能な記録には、重複したACK番号、窓端、回数、未確認のシーケンス範囲、前後のcwndとssthresh、再送範囲、仮膨張が許した送信、新データACKを別々に残す必要がある。アプリケーション結果はさらに別の証拠である。

RFC 793は、TCPのACKがエンドユーザーへの配送を保証せず、受信TCPが責任を引き受けたことだけを意味すると限定する。重複ACKの主張はさらに狭い。相手の身元を認証せず、RFC 2001自身もセキュリティを論じていない。

RFC Editorの記録はW. Richard Stevens、1997年1月、現在はRFC 2581により廃止という状態を示す。HTML、テキスト、IETF履歴が当時の手順を保存する。RFC 1122は順不同ACKの背景、RFC 793は確認の意味、RFC 2581は文書上の後継だけを支える。

現行実装の性能史ではない。対象は、受領、推論、暫定許可、許可の解除という1997年の制御台帳である。