Web/DB プログラミング徹底解説

ホーム > 雑記帳 > Nagle アルゴリズムと遅延 ACK

Nagle アルゴリズムと遅延 ACK

パケットの解析をする上で、TCP/IP の基礎知識が必要であることはもちろんです。 また、Nagle アルゴリズムと遅延 ACK、及びそれらによる (有名な) 問題を理解していないと、 パケットを読む上で説明できない事柄が増えてしまいます。

ここでは、Nagle アルゴリズムと遅延 ACK をとりあげます。

Nagle アルゴリズム

Nagle アルゴリズム は 1984 年に John Nagle 氏が提案したアルゴリズムで、 RFC 896 に既定されています。このアルゴリズムにより、 ネットワークの輻輳を引き起こす、タイニーグラムの氾濫を防ぎます。

Nagle アルゴリズムは、データをできるだけまとめて送信することにより、 通信の効率を向上させるためのアルゴリズムです。

ルールは次の通り:

TCP の送信バッファ中に送達が確認されていないデータがある場合、TCP はバッファ中の 全てのデータの送達が確認されるか、MSS (Max Segment Size) 分のデータを送信できるまで、 セグメントの転送を遅延させる。

尚、BSD 系の実装では最大遅延は 200ms です。

遅延 ACK

  • RFC 1122
  • 「受信データに対してアプリケーションが直ちにアクションを起こす場合に、データに ACK を負わせるため、ACK を遅らせる」

紛らわしいので整理すると...

Nagle アルゴリズム遅延 ACK
データセグメントの送信を遅らせるACK を遅らせる

相互作用として問題になりうる点としては、例えば次のような例が考えられます。

要求が二つに分割されサーバーがそれに応答する場合…要求1 をサーバーが受け取った時点ではサーバーは応答データがない (要求が途中だから)。しかし、遅延 ACK により 200ms 程度応答が遅れる。一方、クライアント側は ACK が来ないから Nagle アルゴリズムにより要求 2 (論理的なリクエストの続き) を送信しない。 これによりパフォーマンスが低下する。