- up: 📝通信プロトコル(Communication Protocol)
- refs.
- links
TCPとは
TCP は信頼性のある双方向のストリーム型通信を実現するプロトコル.
TCP の主な役割は以下.
- 終点を見つける
- 信頼性を確保する
実現するための機能は以下.
- バイトストリームコネクション
- マルチプレクシング (多重化)
- 信頼性の確保
- ACK 応答
- 再送制御
- 順序制御 (シーケンス番号)
- ウィンドウ方式
- フロー制御
- ウィンドウ制御
Port
同一コンピュータ上で動作する複数のアプリケーションを区別するための番号.
TCP ヘッダ
TCP オプション
TCP 接続の送信側が受信側に対して提示するパラメータ.
TCP コネクション
3-way ハンドシェイク
TCP 接続オープン時の手続き.
ACK
確認応答. Acknowledge.
ウィンドウ制御
複数の TCP パケットを連続して (ACK 確認なしで) 送信するという方式.
通信の往復回数を削減することで, 遅い回線における高速化を実現する.
スライディングウィンドウ方式
個々のデータを ACK を待たずに転送する仕組み.
送信したいデータを複数の TCP パケットに分け, ACK を待たずにまとめて連続して送信する. そして ACK は, それらのデータに対して, まとめて 1 つだけ返送する.
more. Sliding Window Algorithm
ウィンドウサイズ
ACK を待たずに一度に送信できるデータ量.
ウィンドウサイズ = セクメントサイズ * スライディングウィンドウの個数.
一般的にはウィンドウ・サイズの初期値は数 Kbytes から数十 Kbytes 程度.
ウィンドウ・サイズ・フィールドは 16bit 幅なの<で, 最大では 65,535bytes までのウィンドウ・サイズを設定することができる. また RFC1323 で定義されている TCP の拡張プロトコルを使うと, より大きなウィンドウ・サイズを利用することもできる.
The Cable Guy - 2005 年 11 月 : 次世代の TCP/IP スタックのパフォーマンスの拡張機能
ウィンドウ・サイズを大きくすると, その分プロトコル・スタックで使用するメモリ領域も増える.
- 基礎から学ぶ Windows ネットワーク:第 14 回 信頼性のある通信を実現する TCP プロトコル (その 1) (3/3) - @ IT
- 基礎から学ぶ Windows ネットワーク:第 16 回 信頼性のある通信を実現する TCP プロトコル (3) (2/4) - @ IT
TCP ヘッダ 「ウィンドウ・サイズ」フィールド:16bit 幅
受信側のウィンドウ・サイズを相手に伝えるために利用される. TCP の送信側では, 相手から通知されたウィンドウ・サイズを見て, 送信可能な最大のデータ量を判断している.
フロー制御との関係
アプリケーションのデータ処理速度がネットワークの受信速度よりも十分速ければ, ウィンドウ・サイズはずっと大きいままで, 帯域幅をフルに活用することができる.
アプリケーションの処理速度が遅ければ, ウィンドウ・サイズが自動的に縮小して, データの受信を抑制する.
セグメント
TCP におけるデータの送信単位.
TCP ではセグメントというサイズごとに区切ってデータを送信している.
MSS
MSS (Maximum Segment Size. 最大セグメント・サイズ).
受信可能なセグメントの最大サイズを通信相手に通知するためのオプション.
MSS のサイズが分かると, TCP データを送信する側では, 常にこのサイズ以下になるようにデータを分割して送信することができる. 無用な IP フラグメンテーションを起こすことなく, 常に最大の効率でパケットを送信することができる.
最も効率よくデータを送信するためには, ウィンドウ・サイズを MSS の整数倍にするのが望ましい.
Ethernet を使うとき, このサイズは 1,460 オクテットとなります
ウィンドウ・スケール・オプション
TCP の最大 64Kbytes となっているウィンドウ・サイズをより大きくするために利用されるオプション.
再送制御
TCP パケット受信側では, データを受け取ったことを表すため ACK 応答を返送する.
TCP パケット送信側では, この ACK を受け取って初めて送信が完了したとみなす. しばらく待っても ACK が受信できなければ, 送信が失敗したものとみなし,再送制御を実施する.
あらかじめ規定された回数 経っても ACK を受信できない場合は, TCP コネクションが切れてしまったと判断し, 上位アプリケーションに対してエラーなどを通知する.
RTO
Retransmission Time Out.再送タイムアウト.
タイムアウト値は RTT を推測することで動的に決定する.
- RTO の初期値は RTT の 4 倍 + α
- RTO の値は再送を行うたびに 2 倍に増やされる.
- 最大で 64 秒までなる.
- RTT は初期値を 3 秒とし, これまでに送ったデータに対し
- ACK が返って来るまでにかかった時間から算出する.
ref. TCP における確認応答と再送制御 — Key:雑学事典
Windows での 再送制御
- TCP 接続が確立されたときに, 再送タイマーは 3 秒に初期化される.
- 特定の接続で通常生じる遅延に応じた調整を自動的に行う.
- タイムアウト値は, 接続で再送が連続して行われるごとに 2 倍になる.
- 再送回数の既定値は 5.初期再転送時間は 5 秒
以下に, 再送タイムアウト調整のためのレジスタ情報がある.
画像付き.
WireShark でのエラー
TCP Retransmit ・ DupACK ・ Fast Retransmit トラブルシューティング時のキーワード
TCP Retransmit
WireShark では, TCP Retransmit というメッセージが再送がおこなわれたことを示している.
TCP DupACK
パケットロス等で, 受信者が想定しているシーケンス番号より, 大きな値のシーケンス番号が送信者から送られてくることがあります.
すると, 受信者は自分が想定しているシーケンス番号をACK 番号にセットした ACK を直ちに送信者に送ります. これが DupACK です.
TCP Fast Retransmit
高速再転送.データ送信者が, DupACK を複数回受け取ると, Retransmission Timeout の経過を待つことなく, 再送を行います.
抜けているセグメントのみ送信するのではなく, 抜けているセグメント以降を全て送信し直す.
順序制御
送信したパケットが順番が入れ替わって到着する可能性もある. 送信するパケットには番号が付けられており, 受信側ではパケットを番号順に並べ替えてから元のデータを復元し, それを上位のアプリケーションへ渡すようになっている.
累積的確認応答
到着しているすべてのセグメントについて, その次に到着することを期待しているシーケンス番号 + 1 を を確認応答番号として返す.
選択的確認応答
遅延確認応答
連続したデータは遅延を入れることでバッファに貯めて, まとめて送出することで, ネットワーク上に流れるパケットの数を減らして, ヘッダのオーバヘッドを小さくする.
遅延時間は Nagle アルゴリズムで決定する.
リアルタイムに通信したい場合は, TCP オブションで Nagle アルゴリズムを無効にする.
フロー制御
TCP プロトコルにおける送受信では, シーケンス番号とウィンドウ・サイズが重要な意味を持つ.
- シーケンス番号は, これから送受信しようとしているデータの位置
- ウィンドウ・サイズは送信可能なデータの最大サイズ
双方のシーケンス番号は同期し (同じ値を保持している), 同じウィンドウ・サイズ情報を共有している.
- シーケンス番号情報は送信側
- ウィンドウ・サイズ情報は受信側
シーケンス番号
バイト単位のストリーム型通信を実現するため, TCP では通信路内を流れるバイト・データに対して, それぞれのバイト位置を決める「シーケンス番号」を定義している.
シーケンス番号に基づいてデータを整列したり, ウィンドウ制御を行ったりする
コネクションごとにランダムに決められる.
データ送信
Step1
TCP 層では, ウィンドウ・サイズに以下になるようにデータを切り分け, 先頭から順次送信を行う.ウィンドウ・サイズ以下ならば, 一度に送信することが可能.
Step2
TCP パケットを受信した側では, データを受信バッファにコピーしてアプリケーションに通知すると同時に,受信したことを示す ACK パケットを返信する.
以下ががセットされている.
- データを受信したことを示す更新済み受信 ACK 番号
- 新しいウィンドウ・サイズ
Step3
受信側が送った ACK パケットを受け取る.
- 自身の開始シーケンス番号を更新する
- さきほど再送に備えて取っておいた送信データのコピーを破棄する
- ウィンドウ・サイズを, ACK パケットで通知されたものに更新する.
Step4
TCP/IP のプロトコル・スタックでは, 受信バッファからアプリケーションにデータが引き渡され, 空きが増えた場合にウィンドウ・サイズを増加させる.
輻輳制御
輻輳は, ふくそうとよむ.
以下の二つで輻輳を避ける仕組み.
- スロースタート
- 輻輳回避アルゴリズム
ウィンドウサイズは,以下の 2 つの小さい方を採用する.
- 送信側の輻輳ウィンドウサイズ
- 受信側からの告知ウィンドウサイズ
1 -> 2 -> 4 -> 8 -> 16 -> 32 (ここで輻輳発生) -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 ここで輻輳発生)
1 -> 2 -> 4 -> 8 -> 16 -> 32 (ここで輻輳発生) -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 ここで輻輳発生)
…
ref. TCP 各バージョンの輻輳制御の観察
スロースタート
輻輳ウィンドウははじめは 1 にセットされて,指数関数的に増加させる.
輻輳が発生したら, 輻輳回避アルゴリズムへ移行する.
輻輳回避アルゴリズム
現在の輻輳ウィンドウサイズと同じだけの確認応答をうけとると, ウィンドウサイズを 1 つ増やす.
送信側でタイムアウトを検出すると, スロースタートへ移行する.
TCP タイマシステム
重要なものは以下の 4 つ.
- タイムアウトタイマ … セグメント転送タイマ.
- 持続タイマ … ゼロウィンドウ検査用.
- 終了時タイマ … TIME-WAIT から CLOSED 状態へ遷移するための待ち時間タイマ
- keep-alive タイマ
Keep-Alive
ある 2 つの機器間の通信接続において, 相手が活きているかを確認しその接続を維持する仕組み.
データ通信が何も行われない場合でも, 一定時間間隔で空の TCP パケットを送受信することにより, TCP 接続がアクティブであることをお互いに通知, 確認するための通信機能.
何も通信を行わないでいると, 無通信で回線が切断されてしまったり, TCP 接続がタイムアウトして切断されてしまったりするので, キープ・アライブでこれを防ぐことができる.