1999/11/1
ネットワーク (18)
TCP Interactive Data Flow
- パケットの数
- bulk data (ftp,e-mail,netnews,www) --- 50%
- interactive data (telnet,rlogin) --- 50%
- 転送データ量
- bulk data --- 90%
- interactive data --- 10%
- セグメント・サイズ
- bulk data --- 通常 512byte
- interactive data --- 小さい (90%が 10byte以下)
以下の文章では『確認応答』=『ACK』であるとして読むこと。
interactive data (対話的に入力されたデータ)
rlogin のときの、パケットが送られる様子(p.300,Fig.19.1)。
- 「対話的なキー入力」をクライアントからサーバに送る。
- 「確認応答」をサーバからクライアントへ送る。
- 「キー入力のエコー」をサーバからクライアントに送る。
- 「エコー」の確認応答をクライアントからサーバへ送る。
効率を上げるため 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セグメントに)ことがわかる。
- silp → vangogh へは遅延確認応答が見られない(echoが返ってくる
よりも前にキーボード入力されているため)。
- セグメント12のACKでは、サーバが忙しかったらしく、
200ms以内に echo できなかったため、遅延確認応答になった。
- セグメント18では 確認応答 21 を返しているので(セグメント16の
ACK 18と比べて)3文字受けとったことがわかる。
しかし echo は1文字しかしていない。
これは、rloginサーバはまだ1byteしか受けとっていないが、tcp部が
受けとったデータにACK を返しているためである。
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)