Nagleアルゴリズム
Nagleアルゴリズムは以下の条件がどれか1つでも成立するまで送信を遅延させる。
未送信データが最大セグメントサイズ以上になる
過去の送信パケットで ACK が未受信の物がなくなる(TCP遅延ACKに注意)
タイムアウトになる
擬似コードでは以下の通り:
このアルゴリズムは TCP遅延ACK との相性が悪い。TCP遅延ACK は別のグループにより1980年代初期に同時期に導入された。両方を有効にすると、アプリケーションが2回書き込みを行い、2回目の書き込みが受信側に届くまで受け取れない読み込みを送信側が行うと、最大 500ms の遅延が発生し、これは「ACK遅延」と呼ばれる。この理由から、TCP の実装は、たいてい、Nagleアルゴリズムを無効にするオプションを提供している。一般にこれは TCP_NODELAY オプションと呼ばれる。
もし、アプリケーションが可能なら、小さな書き込みを複数回連続して行うのを避けるべきであり、すると Nagle アルゴリズムが発動するのを回避できる。アプリケーションはバッファリングを行い、小さな書き込みを1つにまとめるべきである。UNIX などでは writev() で実現できる。各種プログラミング言語のバッファ付きストリームでも良い。
小さなパケット問題と silly window syndrome は時々混乱される。小さなパケット問題はウィンドウがほとんど空の時に発生する。silly window syndrome はウィンドウがほとんどいっぱいの時に発生する。
Nagleアルゴリズムのタイムアウトは、一般的に200msだが設定で変更も可能。
Nagleアルゴリズム(ネーグルアルゴリズム、Nagle’s algorithm)は、TCP/IP ネットワークで送信しなければならないパケット数を減らし、効率性をあげるためのアルゴリズムである。ジョン・ネーグル (John Nagle) から名づけられた。
Nagleが1984年に書いたRFC文章、Congestion Control in IP/TCP Internetworks (RFC 896) では、彼が「小さなパケット問題」と呼ぶ、アプリケーションが繰り返し1バイトなど小さな粒度で送信する問題を取り上げている。IPv4 で 20バイト、TCP自体で20バイトのヘッダーがあり、合計40バイトになるため、1バイトを送信するのに合計41バイト送信しなくてはならなく、オーバーヘッドが大きい。これは、Telnet セッションなどでよく発生し、キー操作が1バイトのデータを生成し、即時に送信されるからである。悪いケースでは、通信速度が遅い回線では、同時にそのようなパケットが大量に送信され、輻輳崩壊へとつながる可能性がある。
Nagleアルゴリズムでは最大セグメントサイズ以下の複数の送信メッセージを一つに束ね、まとめて送信する。特に、送信パケットで送信側が ACK を受け取っていないのがある場合、送信するに値するまで送信側はバッファリングを行い、そして、一度にまとめて送信する。