はじめに
TCP フラグとして広く知られる SYN に対して、ECE(ECN-Echo)と CWR(Congestion Window Reduced)は、輻輳制御のための ECN(Explicit Congestion Notification)機能と結びついて使用されるフラグです。これらの挙動は RFC 3168 に定義されています。
一般的に、ECE は輻輳の通知、CWR は輻輳ウィンドウを減らしたことの通知という役割を持っています。すでに通信が始まっている状態でネットワーク上に輻輳が発生した場合、ルーターが IP ヘッダーの CE(Congestion Experienced)ビットをセットし、それを受けた TCP が ECE と CWR を使って輻輳制御を行う、というのが ECN の基本的な流れです。
ただし、この説明だけではひとつ誤解されやすい点が残ります。SYN の段階でも ECE と CWR が登場するという点です。
SYN に付く ECE / CWR は「輻輳の通知」ではない
ECN を使う TCP 実装では、初回接続(SYN)で次のようなフラグがセットされます。
- SYN + ECE + CWR(クライアント → サーバー)
これは 「この接続で ECN を使いたい」という意思表示であって、輻輳が起きていることを示しているわけではありません。あくまで ECN の利用可否を交渉するためのフラグとして ECE/CWR が流用されているのです。
サーバー側が ECN に対応していれば、以下のような SYN/ACK を返します。
- SYN/ACK + ECE(サーバー → クライアント)
これにより「この接続では ECN を有効化できる」という合意が取れます。最終 ACK では ECE/CWR はクリアされ、ここで通常の ECN 動作に移行します。
要するに、SYN に付く ECE/CWR と、データ通信中に使われる ECE/CWR はまったく別の目的で使われるという事実が、ECN を正しく理解する上でとても重要なのです。
本来の ECE / CWR は「輻輳通知」に使われる
交渉が終わり通信が始まると、ECE と CWR の役割は本来のものに戻ります。
- ルーターが CE フラグを付けたパケットを送る
- TCP 受信側は次の ACK に ECE=1 を付けて「輻輳を検知した」と通知
- 送信側は輻輳ウィンドウを減らし、その次のパケットで CWR=1 を送信して「制御を適用した」と返答
- その後は ECE/CWR は 0 に戻る
このように、通常のデータ通信では ECE=“輻輳通知”、CWR=“輻輳ウィンドウを減らした通知” として使用されます。
まとめ
ECN 対応スタックでは、初回 SYN に ECE/CWR が付くのは 標準仕様であり、不正でも異常でもありません。
しかし、ECN の仕様を正しく解釈していないファイアウォールや古いセキュリティデバイスは、この SYN + ECE + CWR を「不正な SYN」と誤判断することがあります。現代の TCP 仕様に即して考えると、これは誤検知と言えます。
おわりに
ECN の仕様は、「輻輳通知」と「能力交渉」が同じフラグを使うというクセの強い設計のせいで、どうしても誤解しやすいところがあります。しかし、この二重構造さえ押さえてしまえば、SYN の時点で ECE/CWR が出てくる理由もすっきり理解できます。



