TCPの高い信頼性は、コネクションと呼ばれる論理的な通信路を基盤として実現されている。コネクションの状態は大きく分けて接続状態と開放(切断)状態がある。ここでは、これらの間を行き来するコネクション確立とコネクション解放のシーケンスを説明する。
コネクションの状態管理
TCPはコネクション型のプロトコルであり、データ転送を始める前に、論理的な通信路(コネクションまたは論理リンク)を設定する。この動作を「コネクション確立」という。また、データ転送が終わったあとで論理的な通信路を抹消することを「コネクション解放」という。このように、コネクションは通信の必要に応じて、動的に生成/消滅を繰り返す。
コネクションの両端はそれぞれのホストのアプリケーションになっており、IPアドレスとポート番号の組である「ソケット」で識別される。それぞれのホストのOSは、自ホスト・相手ホストのソケット番号と順序番号、状態といった情報を記録した「コネクション状態テーブル(CSテーブル)」をメモリ上に持ち、ホストで生成されたコネクションを管理する。
コネクションの確立
コネクションの確立は、図1に示すように3回のメッセージのやり取りで行なわれる。これを「スリーウェイハンドシェイク」または「スリーメッセージハンドシェイク」と呼ぶ。メッセージの交換を3回行なうのは、お互いの順序番号の初期値を確認するために必要かつ十分な回数だからである。
1. コネクション確立要求
ホストAはホストBへ確立要求を送信する。このメッセージのTCPヘッダの順序番号(SEQ)フィールドには、ホストAの順序番号の初期値を記入する。この値は、直前のコネクションの順序番号と重なってしまうと具合が悪いことが起こるので、固定値を取らずにランダムな値を設定する。ここでは、仮に“1234”とする。また、TCPヘッダ中の制御ビットのSYN(SYNchronize:同期)フラグを1(セット)にする。
2. コネクション確立要求への応答
ホストBは、ホストAへ応答を送信する。このメッセージのTCPヘッダのSEQフィールドには、ホストBの順序番号の初期値を記入する。仮に“3456”とする。同時に、確認応答番号(ACK番号)フィールドには、相手(ホストA)の順序番号を正常に受信したことを伝えるため“+1”の計算を行ない、“1235”を記入する。また、制御ビットのSYNフラグとACKフラグの両方をセットする。
3. コネクション確立
最後に、ホストAはホストBへ確認応答を送信する。このときACK番号フィールドには、相手(ホストB)の順序番号を正常に受信したことを伝えるために“+1”の計算を行ない、“3457”を記入する。また、制御ビットのACKフラグをセットする。
通常、クライアントのアプリケーションはサーバのIPアドレスとポート番号を指定してコネクションの確立要求を出す。これをコネクションの「能動的開設」と呼ぶ。一方、サーバはこの要求を受け付けるアプリケーションとして働く。このため、サーバはあらかじめコネクション受付用のポートを作って待ち受けている。このサーバ側の挙動はコネクションの「受動的開設」と呼ばれる。
また、この手続きでは順序番号の初期値のほかにも、互いのウィンドウサイズ(次パート参照)の最大値も交換している。
(次ページ、「コネクションの解放」に続く)

この連載の記事
-
第8回
ネットワーク
HTTP、FTP、SMTP、SIPはどう動くの? -
第7回
ネットワーク
帯域を効率的に利用するTCPの仕組みとは? -
第5回
ネットワーク
TCPのキモはコネクションとポート番号 -
第4回
ネットワーク
ルータの向こうに広がるネットワーク -
第3回
ネットワーク
特別なIPアドレスって知っていますか? -
第2回
ネットワーク
TCP/IPはどのように普及していったの? -
第1回
ネットワーク
TCP/IPの基礎の基礎を理解していますか? -
ネットワーク
TCP/IPまるわかり - この連載の一覧へ