Linuxカーネルのバージョン2.4.0から新しく追加されたコンパイルオプションに、
しかし一部のルータはこの機能に対応しておりません。またLinuxカーネル(バージョン 2.4.18)の実装の性質から、有効になっていると、通信が不可能になる場合があります。
この機能の設定は次の方法で確認できます。
% cat /proc/sys/net/ipv4/tcp_ecn
出力が1ならば有効、0またはファイルがなければ無効になっています。
もし有効ならば、以下の方法で一時的に無効にすることができます(rootユーザで実行)。
# echo 0 >/proc/sys/net/ipv4/tcp_ecn
また、永久に無効にしたい場合は、rootユーザになり、次の行を /etc/sysctl.confファイルに追加してください。
ECN(Explicit Congestion Notification)は、ネットワーク混雑の状況によってデータの送信を制御します。
提案段階であり、対応する義務はありませんが(2002年3月現在)、すでに制定されている標準規格に抵触する機器がネットワーク中にあると通信自体ができなくなる場合があります。
ECNは、IPのヘッダ部にあるTOSフィールド内の2ビットと、TCPのヘッダ部で未使用のフラグ領域を使い、組み合わせて、ネットワークの輻輳検知・通知とデータ送信制御を行います。
IPでは、ECT(ECN Capable Transport)とCE(Congestion Experience)の二つのビットが使われます。それぞれ、ECNに対応していることと、ネットワークが輻輳状態であることを示します。ネットワークの経路上にあるネットワーク機器と、通信の両端にあるコンピュータの間のコミュニケーションが行われます。
TCPでは、ECE(ECN Echo)フラグとCWR(Congestion Window Reduce)フラグが使われます。通信の両端のコンピュータ間で、ネットワーク輻輳通知(ECE)と送信制御通知(CWR)を行います。
受信側 ルータ 送信側
+-----+ +-----+
| ECT | | ECT | IP
CEを検知し | CE | | |
ACKパケットに <---- +-----+ <------ +-----+
ECEをセットし、 | | | |
送信側に通知 | | | | TCP
| | | | |
| +-----+ +-----+
| ネットワーク輻輳を
| 検知し、IPのCEをセット
+-----+
| ECT |
| | ACK 受信したACKパケットの
+-----+ -----------------------> ECEを見て、ネットワークの
|ECE | 輻輳を認識。
| | ウィンドウサイズを
| | 縮小し、そのことを通知する
+-----+ CWRをセットし送信。
+-----+
| ECT |
| |
<-------------------- +-----+
| |
|CWR |
| |
+-----+
+-----+
| ECT |
| |
<-------------------- +-----+
| |
| |
| |
+-----+
...............
ウィンドウサイズを縮小すると、送信側から受信側に送られるACKパケットの到着を待たずに送信できるパケットの数が減ります。したがって、送信に失敗したときに再送しなければならないパケットの数が減り、より確実な伝送が可能となります。
ECNによるTCPの通信を開始するには、送信側がまずECEとCWRフラグがセットされたSYNパケットを送信します。受信側はこのパケットに対する応答として、ECEフラグがセットされたACK-SYNパケットを送信します(CWRフラグはオフ)。
しかし、ECEとCWRフラグがセットされたSYNパケットに対する応答がない場合の挙動についての規格が決められていません。
Linux 2.4.18の実装では、ECEとCWRフラグがセットされたSYNパケットを送り続けることになっているため、途中のネットワーク機器(ルータやファイアウォールなど)で捨てられてしまうと、受信側のサーバにSYNパケットが到達せず、通信を開始することができません。
このため、対処療法として、ECN機能を解除する必要がある場合が生じてしまいます。