TCPの制御(接続の確立)

 TCPにおける通信では、TCPヘッダ内にあるCodeBit(コードビット)が重要な意味を持ちます。TCPヘッダは、以下のようになっています。

 通信を行う側が、コードビットのSYNフラグを「1」にセットしたセグメントを相手に送ります。受信側は、通信できる状態であれば、同じく、SYNフラグを「1」にセットしたセグメントで応答します。もし、通信ができない状態であれば、RSTフラグを「1」にしたセグメントを返します。

このやりとりは、データを持たない、TCPヘッダだけのパケットがやり取りされます。

双方が、「OK」した段階で、接続が確立されます。

 これで、お互いのセグメントを送受信するための伝送路が出来上がります。この伝送路を仮想回線(Virtual Circuit)といいます。この回線は、通信が終了するか、何かの理由で遮断されるまで維持され、以降のパケットのやり取りに使用されます。

TCPの制御(データの送受信)

 TCPのコネクションが確立され、仮想回線が出来上がるとデータの送受信が始まります。データの送信側は、TCPヘッダのウィンドウサイズで示されるデータ量のセグメントを送信します。

 ウィンドウサイズとは、TCPの通信において、フロー制御に用いるものです。ウィンドウサイズによって一度に送信できるセグメントの数が決まります。TCPでは、一度に送受信するセグメントの数をコントロールすることで、フロー制御を行っています。

※ウィンドウサイズは、相手のバッファの量を指します

セグメントを受け取った相手側は、受け取ったセグメントが破損していないかどうかを調べます。

 受け取ったセグメントのチェックサムを計算し、TCPヘッダ内のチェックサムの値と照合し、一致していれば、破損していないと判断します。また、シーケンス番号を確認して、どのセグメントが届いているのか、どのセグメントが届いていないのかも確認します。

 受信側は、正常にデータを受け取った場合、応答セグメントを送信側に送ります。送信側は、戻ってきた応答メッセージの応答セグメントを確認して、次のセグメントの送信に備えます。

 送信側に、一定時間内に、応答セグメントが戻ってこない場合、送信側は、送信に失敗したものと判断して、セグメントを再送します。そうすることで、送信エラーに対処しています。

 チェックサムを見て、セグメントを修復しているわけではないので注意して下さい。TCPでは、セグメントを再送することで、送信エラーに対処しています。

TCPの制御(回線の切断)

TCPにおける通信の終了は、以下のようなケースがあります。

  • データ送信の終了
  • 回線の強制切断

データ送信の終了

送信側で、送信するデータがなくなったら、コードビットのFINフラグを「1」にセットしたセグメントを送信します。

 相手側も送信するデータがなければ、FINフラグを「1」にセットしたセグメントを返します。その後、バーチャルサーキットの接続が切断されます。

※実際には、最後に送信元がACKフラグをセットし、「シーケンス番号+1」したセグメントを送信してコネクションが終了となります。

 TCPのクローズ処理では、これ以上送信するデータがないということをお互いに通知し合うことで、初めてクローズ処理が完了します。一方的に受信をやめるだけでは、正しいクローズ処理にはなりません。

回線の強制切断

TCPでは、データ伝送の信頼性を確保するために送信データに対するACKの返送の監視をしています。

 一定時間、ACKの返事が届かない場合は、送信を再度繰り返します。そして、一定回数再送してもACKが返って来ない場合には、コードビットのRSTフラグを「1」にセットしたセグメントを送信して、コネクションを強制終了させます。

 ここでは、説明を簡略化するために繰返し3回失敗すると、強制切断していますが、監視時間と再送回数の決め方には、いろいろな方法があります。