TCP上のキーボードトラフィックは、パケットごとにごく小さなペイロードを送信する。1回のキーストロークが、40バイトのヘッダーで包まれた数十バイトのセグメントになる。低速な回線では、これがほとんどデータを含まないパケットでネットワークを溢れさせた。Nagleはこの問題を小パケット病またはsilly-window病と呼んだ。

素朴な修正方法は、すぐに送信する(帯域幅を浪費する)か、完全なセグメントがバッファリングされるまで待つ(レイテンシーが増える)かのどちらかである。Nagleの規則はその中間に位置する。小さなセグメントを1つ未確認のまま保持し、残りをその確認応答の後ろにまとめて送る。

TCPはすでにその確認応答を待っているため、このまとめ送りは自然である。アルゴリズムはそれを偶然ではなく規則にしただけであり、インタラクティブなアプリはパケット数のほんの一部で低レイテンシーを得られる。

小さなパケットを1つ送信し、ACKまで残りをまとめて送る

1バイトのパケットは、そのバイトの大半をヘッダーに浪費する。

ACKの後ろにまとめることで、新たな固定待ち時間は増えない。

完全なセグメントをバッファリングする場合のレイテンシーなしで、パケット数を削減する。

浪費を修正するには、小さな単位を1つ許可し、残りをその確認応答の後ろにまとめ、コストをすでに行っていた待ち時間で抑える。

RFC 1122で重要なTCP要件として規定され、Nagleのアルゴリズムは事実上すべてのTCPスタックに搭載され、わずかなレイテンシーと引き換えに負荷を大きく削減する古典的な例となった。

出典をたどる

出典

  1. RFC 896: Congestion Control in IP/TCP Internetworks IETF · rfc-editor.org
  2. RFC 1122: Requirements for Internet Hosts - Communication Layers IETF · rfc-editor.org