TCPで通信するために,まずしなければならないのがTCPコネクションの確立だ。
TCPコネクションは,アクセス元のアプリケーションからアクセス先のアプリケーションを呼び出す形で確立する。このときに,通信相手のパソコン内で動いているアプリケーションを間違いなく呼び出す必要がある。
ポート番号でアプリを指定
TCPは,ポート番号という情報を使ってアプリケーションを指定するようになっている(図2-1)。
図2-1●ポート番号でどのアプリケーションの通信かを指定する 主要なサーバー・アプリケーションはポート番号が決まっており,アクセス元のパソコンはその番号をあて先に指定することで的確にサーバーと通信できるようになっている。クライアント・アプリケーションのポート番号は,クライアント側のTCPスタックが空いている番号を選んで割り当てることが多い。 [画像のクリックで拡大表示] |
ポート番号はあて先ポート番号と送信元ポート番号が組になってTCPパケットに書き込まれる。アクセス元のアプリケーションは,相手のアプリケーションのあて先ポート番号をあらかじめ知っている。
アクセス元のアプリケーションは,あて先ポート番号を指定してTCPコネクションの確立を依頼する。送信元ポート番号は特に指定しなくても,TCPスタックが空いている番号を割り当ててくれる。
TCPスタックは,相手のTCPスタックに対してTCPコネクションの確立を要求する。アクセス先のTCPスタックは,あて先ポート番号を見て,コネクションをアクセス先のアプリケーションにつなぐわけだ。このようにして,TCPコネクションは番号で明確に識別される。
3回のやりとりで確立する
次は,IPネットワークでTCPコネクションがどうやって作られるのかを見ていこう。TCPコネクションは,三つのTCPパケットをやりとりして確立する(図2-2)。パケットが3回行き来するので,このやり方を「スリーウエイ・ハンドシェイク」と呼ぶ。
図2-2●TCPコネクションはTCPパケットのやりとりで確立する 確立するときはメッセージを託したパケットを3回やりとりする。このためスリーウエイ・ハンドシェイクともいう。切断するときはTCPパケットを4回やりとりする。 [画像のクリックで拡大表示] |
TCPスタックはまず,通信相手のTCPスタックに「コネクションを確立して」という意味のTCPパケットを送信する。「コネクションを確立して」という意味を持たせるために,ヘッダー部の制御ビットのうち,5ビット目のSYN(シン)(同期)フラグを「1」にする。こうしたパケットを「SYNパケット」と呼ぶ。
SYNパケットを受け取ったTCPスタックは,制御ビットの2ビット目のACK(アック)(肯定応答)フラグと,SYNフラグを「1」にした「SYN+ACKパケット」を送り返す。SYNフラグも「1」にするのは,TCPコネクションには向きがあり,受け取った側が改めて逆方向でコネクションの確立を要求する必要があるからだ。
最初にSYNパケットを送ったTCPスタックは,相手からのSYN+ACKパケットを見て,ACKパケットを送り返す。このパケットを相手が受け取ることで双方向のTCPコネクションが確立し,データ転送に移る。
一通り通信が終わると,TCPスタックはアプリケーションからの指示でコネクションを切断する。ちなみに切断のことは開放ともいう。切断するときは制御ビットの6ビット目のFIN(フィン)(終了)フラグとACKフラグを「1」にしたFIN+ACKパケットを送信する。FIN+ACKパケットを受け取った通信相手は,切断を了解したという意味のACKパケットを送信し,改めてFIN+ACKパケットを送信する。その返信のACKパケットを受け取ることで,コネクションは切断される。