要約
- RFC 6298は、平滑化した往復時間と変動から再送タイムアウトを計算し、どの送信がACKされたか不明な標本を拒む。
- 最初は1秒から待てるが、SYNのタイムアウト後はデータ用に3秒へ戻し、その後の満了ごとに次の試行までのRTOを倍にする。
沈黙は弱い証拠である。セグメントが失われたのか、ACKが失われたのか、単にどちらかが遅いのか判別できない。早すぎる再送は複製を作り、すでに混雑しているかもしれない経路へ負荷を足す。待ちすぎれば本当の損失が直らない。RTOは原因を知ったふりをせず、この二つの誤りを選ぶ規則である。
推定値は時間と不確実性を持つ
最初のRTT標本より前は、RTOを1秒にすることが推奨され、より保守的な大きい値も許される。最初の標本Rを得ると、SRTT = R、RTTVAR = R/2、RTO = SRTT + max(G, 4*RTTVAR)とする。Gは時計粒度である。
以後は古いSRTTを使って先にRTTVARを更新し、その後SRTTを更新する。betaは4分の1、alphaは8分の1、Kは4である。この順序により、新しい標本が以前の推定からどれほど外れたかを変動へ反映できる。RTOは再びSRTTに、Gと4倍のRTTVARの大きい方を加える。
計算値が1秒未満なら1秒へ切り上げるべきである。最大値を置く場合も60秒以上でなければならない。実装はより保守的になれるが、規定より積極的に再送してはならない。
すべてのACKが時計を教えるわけではない
Karnのアルゴリズムは必須である。再送後のACKは最初のコピーと再送コピーのどちらに対応するか曖昧なため、RTT標本にしてはならない。TCP Timestampsが対応関係を明らかにする場合だけ例外となる。タイムスタンプなしでも通常は1 RTTにつき少なくとも1標本を取り、タイムスタンプがあれば複数を取れるが、推定規則は残る。
これはPAWSとは異なる。ここで時間は、ACKがどの送信に対応したかを見分けるために使われ、周回した古い番号の排除には使われない。
一つのタイマーが最古の未確認データを守る
新しいデータを送り、タイマーが停止中なら、現在のRTOで開始する。全未確認データを覆うACKなら停止する。新しいデータを確認しつつ未確認分が残るACKなら、現在のRTOで再開始する。
満了すると、最も古い未確認セグメントを再送し、RTOを倍にして、その値でタイマーを再開する。指数バックオフは、繰り返す沈黙に対する行動を徐々に高価にする。後で曖昧でないRTT標本を得ればRTOは下がり得る。複数回バックオフした後は、古いSRTTとRTTVARを消去してもよい。
1秒の初期値には例外がある。3秒未満のRTOでSYNがタイムアウトした場合、接続確立後にデータを送るときはRTOを3秒へ戻さなければならない。経路が速いという仮定を反証したためである。
タイマーは制御であり診断ではない
攻撃者は測定対象を遅らせてRTOを増やしたり、偽造通信で下げようとしたりできる。平滑化とバックオフは影響の持続を抑えるが、遅延を認証しない。満了は不確実性の下での行動であり、特定パケット損失の証明ではない。
唯一の情報源は2011年6月に標準化過程で公開されたRFC 6298である。規範的アルゴリズムと歴史的理由を定めるが、現在の実装初期値や個別経路のRTTは証明しない。
会員向け解説
プロフィールの詳細
適切な会員レベルでログインすると、解説全文と出典メモをご覧いただけます。
Strategic Circle 限定
Strategic Circle
すべての読者に公開されています。参加してログインすると プロフィール解説 を閲覧できます。
Strategic Circle に参加Leadership Alliance 会員限定
Leadership Alliance
対象となる IP 資産の所有者・管理者向けです。ログインすると Leadership Alliance の解説を閲覧できます。
Leadership Alliance に参加
