要約

  • 古典的なRFC 3168では、データ上のCEを見た受信側は、新しいデータでCWRを受け取るまで後続ACKにもECEを付け続ける。
  • 一回のCE観測が複数のECE付きACKを生むため、ECEパケット数はCEマーク数や独立した輻輳事象数ではない。
  • 接続確立時のECE/CWRは能力交渉であり、トンネルや後年の実験仕様も生のフラグ集計から得られる結論を限定する。

何度も返すことに意味がある

監視画面にECE付きACKが八個並べば、「輻輳八回」と書きたくなる。しかし確実に言えるのは八個のパケットを観測したことだけだ。確立済み接続のデータ段階で、受信側がCongestion Experiencedの符号を持つデータを受けると、ACKにECEを設定する。遅延ACKが複数の到着をまとめ、そのうち一つでもCEなら、そのACKにもECEが付く。

受信側は一度通知して終わりにしない。後から届いたデータにCEがなくても、送信側からCWR付きデータが来るまでは後続ACKにECEを設定し続ける。この間のフラグは新しいキュー事象を逐次測っているのではなく、まだ閉じていない通知状態を表している。

理由はACK損失だ。最初の通知だけに頼れば、その返りパケットが失われた瞬間に輻輳情報も消える。後続ACKで同じ状態を繰り返すから、送信側には次の受信機会がある。証拠として扱うべき単位は個数ではなく、CEで開き、ECE列で維持され、CWRで閉じる区間である。

CWRが区間を閉じる

古典的動作では、送信側はECEを損失信号に類する輻輳指示として扱い、輻輳ウィンドウを縮小する。ただしECE付きACKを受け取るたびに縮小してはならない。一つのデータウィンドウ、おおむね一往復時間内に連続する損失やCEには、ウィンドウ縮小を一度だけ行う。

反応後、送信側は最初の新しいデータパケットにCWRを設定する。RFC 3168は再送パケットに載せないよう勧告する。その新規パケットを受信すると、受信側は状態を解除し、その後の無印データに対するACKからECEを外す。新たなCEがあれば別の区間が始まる。

CWRを載せた新規パケットが失われた場合も考慮されている。ECEが持続するため、後の通知で送信側が再び応答し、新たなCWRが現れ得る。この耐障害性こそ、一つの出来事から多数のフラグが生まれる理由だ。CWRは送信側が関連データ送信後に反応したことを支持するが、特定のECE ACKの到着やマーク装置の場所までは証明しない。

SYNでは同じビットが能力を語る

接続確立時には文法が変わる。開始側はSYNでECEとCWRをともに立て、ECN利用を求める。対応側はSYN-ACKでECEだけを立て、CWRを下げて返す。このECEはECN能力の表明であり、SYNが輻輳を経験したという報告ではない。

TCPの段階や方向を捨て、「ECEあり」だけを保存する抽出処理は、交渉が成功するたびに架空の輻輳を作る。完全なフラグ組合せが必要だ。能力交渉の成立も、その後の送信パケットすべてがECTになることを約束しない。

純粋なACKには別の限界がある。古典的RFC 3168ではNot-ECTで送るため、同じ仕組みで復路の輻輳を報告するわけではない。ECE列は順方向データに基づく受信状態であり、両方向の輻輳調査票ではない。

フラグからキューの住所は分からない

RFC 7567が説明するアクティブキュー管理は、軽度から中程度の輻輳で廃棄の代わりにECNマークを用い、キュー満杯になる前にも動作できる。CEはバッファあふれ、実損失、特定遅延、個別装置のしきい値を単独では証明しない。

トンネルでは場所の推定がさらに難しい。内部の転送装置は見えている外側ヘッダーだけをマークする場合がある。RFC 6040は終端で内外のECNフィールドを組み合わせ、情報を伝える規則を定める。終点のECEが正しくても、どの区間でCEになったかは別問題だ。

RFC 5681の重複ACKとも区別が要る。重複ACKには固有の条件があり、損失、順序入れ替わり、複製で生じ得る。ACK番号、シーケンス空間、再送、ECE、CWR、時刻を別々に残さなければならない。

またRFC 8311は、文書化された実験でRFC 3168の一部制約を緩和し、異なるマークや応答を試す道を開く。ここで扱うラッチは古典的RFC 3168のTCP契約であり、すべてのECN実験へ機械的に当てはめるものではない。

出典