1999/11/1

ネットワーク (18)


TCP Interactive Data Flow

以下の文章では『確認応答』=『ACK』であるとして読むこと。

interactive data (対話的に入力されたデータ)

rlogin のときの、パケットが送られる様子(p.300,Fig.19.1)。
  1. 「対話的なキー入力」をクライアントからサーバに送る。
  2. 「確認応答」をサーバからクライアントへ送る。
  3. 「キー入力のエコー」をサーバからクライアントに送る。
  4. 「エコー」の確認応答をクライアントからサーバへ送る。
効率を上げるため 2,3は組み合わされて同じパケットで送られる。
rloginの例で送られるデータ (Fig.19.2参照)
    client(bsdi)から: date LF
    server(srv4)から: Sat Feb  6 07:52:17 MST 1993CR/LF
                      srv4 % 


遅延確認応答 (delayed ACK)

TCP ではデータを受けとると ACK を返すが、 ACK を送るタイミングを少し(RFCホスト要求では500ms以下、 ほとんどの実装では200msとなっている)遅らせることで、 同じ方向へのデータをACKに便乗して(piggy back)送ろうとする。

Fig.19.3 において bsdi から svr4 へ送られた 7個の ACK は、 元になったパケットからの遅延時間はまちまちである。しかし、 ackの間隔はそれぞれ 0.399988, 0.400169, 0.399882, 0.399980, 0.200202, 0.199934 (秒) と 200msの倍数である。

srv4が受けとったデータを echo するのに必要な時間は 16ms 程度 (200ms よりも短い)なので、遅延ACKは見られなかった。

Nagleアルゴリズム

Fig.19.3 では Nagleアルゴリズムによる動作が見られなかったのは 「ネットワークが速いため(RTTが16ms程度なので)、人間のキーボード のタイプスピードよりも応答が返ってくるのが早かった」ため。

Fig.19.4 は低速なネットワーク上で rlogin した例。 送られたデータは順番に、1,1,2,1,2,2,3,1,3 なので、 Nagleアルゴリズムによってセグメントがまとめられて いる(16byteが9セグメントに)ことがわかる。


Nagleアルゴリズムを無効にする

アプリケーションに よっては Nagle のアルゴリズムは邪魔になる (たとえば X-Window System の X serverではマウスの動きは 直ちに反映されないと使いごこちが悪くなる) 。 socketのオプションで TCP_NODELAY を使うと Nagleアルゴリズムを 無効化できる。

(例) rloginで複数のキャラクタを生成するキー(F1 = ESC [ M) を押す (Fig.19.5 と Fig.19.6)

(例)Nagleのアルゴリズムを無効化したrlogin (Fig.19.7 と Fig.19.8)