TCPは、通信の信頼性を高めることで、通信相手にデータを確実に送るプロトコルだ。そのための手段として、通信路(コネクション)の確立、再送制御、輻輳制御などを実施している(図2-1)。

図2-1●TCPの目的は通信の信頼性を上げること
TCPは通信の信頼性を高めることでデータを確実に送れるようにする。そのために、通信路(コネクション)の確立、再送制御、輻輳制御などを実施している。
[画像のクリックで拡大表示]

 最初にコネクションを確立することで、きちんとしたデータの通り道を確保する。再送制御では、データが途中のどこかで消失してしまった場合、届かなかったデータを送り直す。輻輳制御は、通信量が増え過ぎて回線が混み合ってしまった場合に、通信量を意図的に減らして混雑を緩和する機能だ。それぞれについて順に見ていこう。

最初に道を確保する

 コネクションは、データを確実に相手に届けるための仮想的な通信路だ。TCPでは、データは必ずコネクションを通して送る。

 コネクションを確立するために、まず、送信側と受信側が互いにメッセージをやりとりする(図2-2)。最初に、通信を始めたいほうから「SYN」というメッセージを送る。SYNはsynchronize(同期する)という意味。最初に「同期したい」と持ちかけるのだ。

図2-2●コネクションの確立と終了
TCPではコネクションを確立するために3ウエイハンドシェークを実施する。TCPの状態は通信を行うソフトウエアが管理している。
[画像のクリックで拡大表示]

 SYNメッセージを受け取った側は、「SYN+ACK」というメッセージを返す。ACKはacknowledge(了解する)という意味で、SYNメッセージに対する承認を表す。そして、こちらからもSYNを送ることで、同様に同期を持ちかける。

 SYNメッセージを受け取った側がACKメッセージを返すことで、双方向の同期の合意が得られたことになる。これにより、コネクションが確立する。

 こうしたやりとりをハンドシェークという。ハンドシェークは日本語では握手を意味する。最初に握手を交わすことで、そこから先のデータの受け渡しをスムーズに行うのだ。TCPのコネクションの確立は3つのメッセージを使うため、「3ウエイハンドシェーク」と呼ぶ。

 コネクションの終了についても見ておこう。接続を切りたいほうからまずFINメッセージを送る。FINはfinish(終了する)という意味だ。このメッセージを受け取った側はACKメッセージを返す。同様に逆方向のやりとりも行い、最終的にコネクションが終了する。

 なお、SYN、ACK、FINといったメッセージを表現するために、TCPヘッダーの中にフラグが用意されている。例えば、SYNフラグだけが1になっていればSYNメッセージ、SYNフラグとACKフラグが1になっていればSYN+ACKメッセージになる。

 このように双方でメッセージを送り合うことで、TCPの状態が変化する。例えば、コネクションを開始する前のクライアントは「CLOSED(無接続)」という状態になっている。SYNメッセージを送信することで「SYN-SENT(SYN送信)」という状態になり、ACKメッセージを受け取ることで「ESTABLISHED(確立)」という状態に変化する。Webサーバー側も「LISTEN(待ち受け)」から「SYN-RECEIVED(SYN受信)」を経てESTABLISHEDに至る。双方の状態がESTABLISHEDになることでコネクションが確立し、データを送れるようになる。

この先は有料会員の登録が必要です。「日経NETWORK」定期購読者もログインしてお読みいただけます。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら