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 (論理的なリクエストの続き) を送信しない。 これによりパフォーマンスが低下する。