概要
TCPが提供する様々な機能について解説していきます。
信頼性提供
TCPでの信頼性を提供するために、シーケンス番号の管理と確認応答を行う事で実現しています。確認応答には通信を受け取った時に返す「肯定確認応答(ACK)」と破損しているときなどに返す「否定確認応答(NACK)」があります。パケット送信後に確認応答を待ちますが一定時間戻ってこなければデータが喪失したと判断しもう一度同じデータを送信します。
データ送信中の喪失であれば再送処理を行えばよいが、確認応答が喪失した場合には受信データが重複するため、重複データの破棄を行う必要があります。その為に使用されるのがシーケンス番号です。シーケンス番号は送信データ1オクテット毎に連番で付けられた番号で、受信側でこの番号とデータ長を調べて次に必要なデータを確認応答として送信します。
確認応答を待つ時間を再送タイムアウト時間と呼びますが、これはラウンドトリップタイム(RTT)とその揺らぎを計測して動的に設定されます。RTTとはパケットの往復にかかる時間のことで、揺らぎとはパケットが別々の経路を通った時に発生する時間差を意味しています。これらを加味して安全率を加味した値が再送タイムアウト時間として設定される事で無駄な再送を減らす仕様となっています。再送処理を行う際にはこの再送タイムアウト時間を2倍、4倍と指数関数的に増やすことと一定回数の限度を設ける事で無限に送信し続ける事は無いようにしています。
コネクション管理
コネクションの確立と切断の手順は下記のようになっています。この様にお互いの確認が完了してから通信を行うようになっており、通信をする準備と終了処理で7度のやり取りが発生します。
№ | 発信者 | パケット種 | 内容 |
---|---|---|---|
1 | 送信側 | SYN | コネクション確立要求 |
2 | 受信側 | ACK SYN | SYNに対する確認応答 コネクション確立要求 |
3 | 送信側 | ACK | SYNに対する確認応答 |
4 | 送信側 受信側 | 目的の通信 | |
5 | 送信側 | FIN | コネクション切断要求 |
6 | 受信側 | ACK | FINに対する確認応答 |
7 | 受信側 | FIN | コネクション切断要求 |
8 | 送信側 | ACK | FINに対する確認応答 |
最大セグメント長とウインドウ管理
TCPでは送信するデータの最大セグメント長(MSS:Maximum Segment Size)をコネクション確立時に通知しあって決定し、このサイズに合わせてデータを区切って送信します。
しかし、1セグメント毎に確認応答を待つと非常に時間がかかるのでウインドウ管理が採用されています。ウインドウとは下図の赤枠のように複数のセグメントを並列送信できる範囲を指し、手前の確認応答が取れ次第新しいセグメントにも許可を出しています。
確認応答には次に受信するシーケンス番号を送信者へ通知する仕組みになっています。下図のように1~6のセグメントをウインドウで許可している場合に、2の送信データが欠損したと仮定します。その場合確認応答では「次は2」という通知が3つ重複することにより再送処理が行われます。これはタイムアウトによる再送に比べて高速に動作するため高速再送制御と呼ばれています。重複数の「3」についてはセグメントの順番入れ替えが2つまでを許容するという考えから「3」が設定されています。
フロー制御
フロー制御とは受信側の処理能力に合わせてパケット送信量を制御する機能をいい、受信側が高負荷に陥ったがためのパケット再送信という事態を避けるためにあります。具体的には送信側へ受信可能なデータサイズをウインドウサイズとして通知する事で実現しています。
受信側が高負荷状態でウインドウサイズを一次的に「0」にした場合、送信側は一定時間毎にウインドウプローヴと呼ばれるデータ送信の再開催促を行います。ウインドウプローヴには再開通知のパケットが失われた場合にも有効に機能し、待ちぼうけになることを防いでいます。
ふくそう制御
ウインドウ制御とフロー制御により通信中に負荷を増大させない工夫がなされていますが、そもそも通信開始時点ですでに高負荷状態にある可能性もあります。その為、TCPでは通信するデータ量を調整するために「ふくそうウインドウ」と「スロースタート閾値」というパラメーターを使いスロースタートするような仕様になっています。
送信できるデータ量はふくそうウインドウとスロースタート閾値の小さいほうが採用されます。それらの調整方法は具体的には下記のように決定されます。
- 通信開始時、再開時にはふくそうウインドウを「1」からスタートする。
- 確認応答を受け取るたびにふくそうウインドウを倍々にする。 「1,2,4・・・」
- スロースタート閾値は下記の計算式で求める。
- タイムアウトによる再開時にはふくそうウインドウサイズの半分の値が設定される。
- 高速再送制御による再開の場合、スロースタート閾値はその時のウインドウサイズの半分が設定され、送信するウインドウサイズをスロースタート閾値に3セグメントを加えた値を使用します。
キープアライブ機能
キープアライブ機能とはシーケンス番号を1小さくしたデータ0オクテットのパケットを送信して相手からの確認応答を見る機能です。通常無効か2時間間隔で確認されているが、制御システムでは1秒以下の高頻度で確認している場合もある。
ネットワークの利用効率を高める仕組み
Nagleアルゴリズム
Nagleアルゴリズムとは少量のデータを送信する必要が発生した場合に都度対応していては効率が悪いため、下記のどちらか条件が成立する場合にのみ送信を行う処理の事です。両条件に不成立の場合は送信を遅らせ、他のパケットとともに送信処理を行います。
- すべての送信済みデータがACKを受信する
- MSSのデータが送信できる
- タイムアウトになる
遅延確認応答
受信側がデータを受信した際に即時確認応答を発信した場合、バッファには同時に送られてきたデータが残っているためウインドウサイズを小さく通知する可能性があります。また、都度確認応答を行うこともネットワーク効率を低下させるため、遅延時間を設けることと確認応答を複数セグメントに1つの応答とすることで効率化を図っています。
- 2 × MSSのデータを受信するまで待機する
- 最大0.5秒間の遅延時間を設ける。通常は0.2秒
ピギーバック
ピギーバックとは確認応答を受け取ったアプリケーションが再度やり取りを行う場合に、これらの通信をまとめて送信する事をいいます。ピギーバックを利用するためには確認応答は先に述べた遅延確認応答を行う必要があり、その間にアプリケーション側でデータ処理・返事データ作成・送信要求を行わなければなりません。これを利用する事はネットワーク効率だけでなく、コンピューターの負荷率低下にも貢献します。
コメント