Transcript 詳解TCP/IP
詳解TCP/IP
ACE B2
mewtwo
TCPインタラクティブ・
データ・フロー
インタラクティブ入力
• Rloginコネクションではキーストロークは1行
単位ではなく1バイト単位で送られる
• クライアントがタイプした文字をサーバーがエ
コーするため4つのセグメントが生成される
キーストローク
データバイト
データバイトのack
データバイトのエコー
表示
エコーバイトのack
サーバー
エコー
date¥nをタイプしたときのデータの流れ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0.0
0.016497 (0.0165)
0.139955 (0.1235)
0.458037 (0.3181)
0.474386 (0.0163)
0.539943 (0.0656)
0.814582 (0.2746)
0.831108 (0.0165)
0.940112 (0.1090)
1.191287 (0.2512)
1.207701 (0.0164)
1.339994 (0.1323)
1.680646 (0.3407)
1.697977 (0.0173)
1.739974 (0.0420)
1.799841 (0.0599)
1.940176 (0.1403)
1.944338 (0.0042)
2.140110 (0.1958)
bsdi.1023 > svr4.login: P 0:1(1) ack 1 win 4096
svr4.1ogin > bsdi .1023: P 1:2(1) ack 1 win 4096
bsdi .1023 > svr4.login: . ack 2 win 4096
bsdi .1023 > svr4.login: P 1:2(1) ack 2 win 4096
svr4.login >b sdi.1 023:P 2 :3(1) ack 2w in 4096
bsdi.1023 > svr4.login: . ack 3 win 4096
bsdi.1023 > svr4. login: P 2:3(1) ack 3 win 4096
svr4.login >b sdi.1 023: P3 :4(1) ack 3w in 4096
bsdi.1 023 >s vr4.login: .a ck 4w in 4096
bsdi.1023 > svr4.login: P 3:4(1) ack 4 win 4096
svr4.1ogin > bsdi .1023: P 4:5(1) ack 4 win 4096
bsdi.1023 > svr4.login: . ack 5 win 4096
bsdi.1023 > svr4.login: P 4:5(1) ack 5 win 4096
svr4.login > bsdi.1023: P 5:7(2) ack 5 win 4096
bsdi.1023 > svr4.login: . ack 7 win 4096
svr4.login > bsdi.1023: P 7:37(30) ack 5 win 4096
bsdi.1023 > svr4. login: . ack 37 win 4096
svr4.login> bsdi.1023: P 37:44(7) ack 5 win 4096
bsdi.1023 > svr4.login: . ack 44 win 4096
d
a
t
a
CR/LF
表示
遅延確認応答
• データを受信したホストがすぐにACKを返す
と効率が悪くなってしまう
• ACKを200ミリ秒遅らせて同じ方向に向かう
データに便乗させることで効率が良くなる
Nagleアルゴリズム
• 小さいパケットをなるべくまとめて転送する
• 送出した小パケットのACKを受信するまでデ
ータをためて一つのセグメントとして送信する
application
kernel
Receiver
データ
ACK
まとめ
• インタラクティブデータは通常最大セグメント
サイズよりも小さなセグメントで転送される
• 遅延確認応答によってRloginセッションでや
り取りされるセグメントの数を減らせる
• 低速なWANではNagleアルゴリズムがセグメ
ント数を減らすために利用される
TCPバルク・データ・フロー
スライディング・ウィンドウ
スライディング・ウィンドウ
スライディング・ウィンドウ
スライディング・ウィンドウ
PUSHフラグ
• 受信したデータをバッファリングせず、直ちに
アプリケーションに渡すことを要求するフラグ
• しかし、ほとんどのAPIはアプリケーションが
TCPにPUSHフラグを指示するための方法を
用意していない
TCPヘッダ
送信元ポート番号(16)
シーケンス番号(32)
確認応答番号(32)
データオフセット(4) 予約(6)
チェックサム(16)
オプション
URG
宛先ポート番号(16)
制御ビット(6) ウィンドウ(16)
緊急ポインタ(16)
ACK
PSH
RST
SYN
FIN
スロー・スタート
• セグメントを送る数を1から始めてACKが届く
うちは倍々に増やしていく
• 輻輳が発生しACKが1つでも帰ってこなけれ
ば、送る数を減らす
ある程度まで行ったら
増加数は1ずつにする
セ
グ
メ
ン
ト
数
輻輳発生
送信数を
半分に落とす
時間
更に送信数を
半分に落とす
バルク・データ・スループット
送t=0
り data1
手t=1
受
け
手
data1
t=8
data2
t=9
data3
t=2
data2
t=10
data1
data3
t=3
data2
t=11
data1
t=4
data3
data2
t=12
data3
ack2
ack1
t=5
t=13
ack1
t=6
ack2
t=14
ack1
ack2
t=7
t=15
ack1
ack2
ack3
ack3
ack3
バルク・データ・スループット
送t=16
り data4
ack3
手t=17
data5
受
け
手
data4
ack6
ack7
t=25
data8
ack7
t=26
data5
data4
data10
ack7
t=19
data7
data8
ack5
data9
ack6
t=18
data6
t=24
data9
data8
data10
data9
data8
data11
data10
data9
ack8
t=27
data6
data5
data4
t=20
data11
t=28
data7
data6
adata5
ack4
t=21
data12
t=29
data7
ack4
data6
ack5
t=22
data13
data12
data11 data10
ack8
ack9
t=30
ack4
ack5
data7
ack6
dara14
data13 data12 data11
ack8
ack9
ack10
t=23
t=31
ack4
data15 data14 data13 data12
ack8
ack9
ack10
ack11
ack5
ack6
ack7
バルク・データ・スループット
• パイプのキャパシティ
=帯域幅×往復時間
RTT
1
2
3
4
2倍のRTT
1
2
3
4
5
6
1 2 3 4 5 6 7 8
2倍の帯域
7
8
バルク・データ・スループット
• ACKの間隔は経路で最も低速な回線と同じ
になる
送
り
手
ル
ー
20 19 18 17 16 15 タ
ー
1
2
ル
ー
タ
ー
14
3
13
4
12
5
11
6
ル
ー
タ
ー
ル
ー
タ
ー
10
9
受
け
手
7
太いパイプから細いパイプに向かうことで生じる輻輳
8
緊急モード
• TelnetやRloginで書り込みキーを押すときや
、FTPで転送を中止する時に利用される
まとめ
• スライディング・ウィンドウ・プロトコルの解説
• スロースタートの解説
• バルクデータのスループットの検証