全2893文字
PR

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

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

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

最初に道を確保する

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

 コネクションを確立するために、まず、送信側と受信側が互いにメッセージをやりとりする(図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になることでコネクションが確立し、データを送れるようになる。