Views
Transmission Control Protocol
TCP
- Transmission Control Protocol
- コネクション指向(Connection Oriented)
- 信頼性 (Reliable)
- バイト・ストリーム (Byte Stream)
確認応答
- セグメント分割
- チェックサムによる確認
- 確認応答が無ければ再送(タイマー)
信頼性・効率の向上
- フラグメント再構成
- 重複データ破棄
- フロー制御(バッファサイズ広告)
TCP パケット
<---- IP データグラム ----> <---- TCP セグメント ----> IP
ヘッダTCP
ヘッダTCP データ 20 バイト 20 バイト
TCP ヘッダ
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 16 bit 発信元ポート番号 16 bit 宛先ポート番号 32 bit シーケンス番号 32 bit 確認応答番号 4 bit
ヘッダ長予約ずみ
(6bit)U
R
GA
C
KP
S
HR
S
TS
Y
NF
I
N16 bit ウィンドウサイズ 16 bit TCP チェックサム 16 bit 緊急ポインタ オプション(もしあれば) : データ :
フラグ
- URG (緊急)
- ACK (確認)
- PSH (プッシュ)
- RST (リセット)
- SYN (同期)
- FIN (終了)
コネクションの確立と終了
コネクションの確立
- クライアントは、接続したいサーバーのポート番号とクライアントの初期シーケンス番号 (普通クロックから作成される 32bit unsigned int) を指定した SYN セグメントを送る。
- サーバーは、サーバーの初期シーケンス番号を含む SYN セグメントを送る。この際 クライアントのシーケンス番号+1のACKをつける。
- クライアントはサーバーから送られてきた SYN に対して、サーバーのシーケンス番号 +1 のACKで確認応答を返す。
コネクション終了プロトコル
- 片方(普通はクライアント)から FIN を送る。
- もう一方(普通はサーバー)から FINに対する ACK を送る。 この段階で「片方」はデータの送信を終了したことになる。しかし、TCP は上位のアプリケーション層に対して「全二重」通信を提供しているので、必ずしも「もう一方」からのデータ送信が終了したわけではない。この状態を ハーフ・クローズという。
- 「もう一方」から FIN を送る。
- 「片方」から ack を送る。
TCP 状態ダイアグラム
インタラクティブ・データフロー
- リモートホストへのログイン
- 1 文字 = 1 パケット
- 遅延 ACK
- Nagle アルゴリズム
- 遠いホストへはパケットを集積(タイピングの早い人むけ)
バルク・データフロー
- ファイル転送など
- 基本:セグメントごとに ACK
- ただし:ウィンドウサイズまでは ACK 無しで送ってよい
- 受け手が速い:ACK をひとつおき
- 次の ACK が来ていれば先へ進んでよい
- 受け手が遅い:ウィンドウサイズを 0 に。(送信 stop)
輻輳
- Congestion
- 途中に低速回線
- 送り手も受け手も余裕
- パケット落ちが発生
- congestion window (スロースタート)
- 1 パケットでスタート
- Ack が返ってきたら 2倍に
- エラーになったら戻す
TCP のスループット
- 最大スループット
- ウィンドウサイズ / 遅延時間 (RTT)
- 65536 byte / 100 ms -> 5.2 Mbps
- 帯域幅遅延積
- 最適ウインドウサイズ