TCPは,IPネットワークを介して確実にデータをやりとりするためのプロトコルである。

 IPネットワークの仕事は,パケットを通信相手に届けること。IPネットワークはその仕事に最善を尽くすが,通信相手にパケットが抜けなく正しい順番で届くことまでは保証していない。

 状況によってはネットワークが混雑して,送り出したパケットの一部が届かなかったりする。また,転送経路が変わってしまうこともあるので,送り出した順番通りにデータが届くとは限らない。

パイプラインでデータを運ぶ

 この不安定さは,データを1ビットでも間違うと問題が起こるアプリケーションにとってはやっかいだ。メールやファイル転送といったアプリケーションは,少しでもデータが抜けたり,順番が前後すると処理できなくなる。表示される文字が化けたり,最悪の場合プログラムが暴走したりしてしまう。つまりIPネットワークはそのままでは使い物にならないのだ。

 そこで活躍するのがTCPだ。IPネットワークにつながるパソコンはどれも,TCPに基づくソフトウエアである「TCPスタック」を備えていて,それを使ってデータをやりとりしている。

 アプリケーションから見ると,TCPは,あてにならないIPネットワーク上に自分専用のパイプラインを敷設して,データをやりとりしてくれるしかけに見える(図1-1)。パイプラインにデータを流し込めば,それがそのまま通信相手のアプリケーションに渡されるイメージだ。

図1-1●TCPは頼りないネットワーク上でデータを確実に転送するためのプロトコル
図1-1●TCPは頼りないネットワーク上でデータを確実に転送するためのプロトコル
IPネットワークでは送ったデータがきちんと相手に届くかはわからない。そこでTCPは,通信相手との間に論理的な通信路を作り,確認しながら転送することで,データを相手に確実に届ける。  [画像のクリックで拡大表示]

 実際のTCPではパイプラインに相当する専用の通信路を「TCPコネクション」と呼ぶ。アプリケーションの指示に基づいてTCPスタックはTCPコネクションを確立する(図1-1の(1))。TCPコネクションを確立したあと,TCPスタックはアプリケーションから渡されたデータを確実に通信相手まで届ける。そのために,互いのTCPスタックが確認し合いながら転送する(同(2))。

 このようにTCPが信頼できるデータ転送を提供することで,アプリケーションはIPネットワークを意識しなくて済む。TCPスタックは,複数のアプリケーションが共同で利用できるようになっている。

ツボはTCPヘッダーにある

 TCPコネクションはパイプラインのようなものだが,IPネットワーク上に物理的なつながりができるわけではない。あくまでTCPコネクションは論理的なものだ。通信する双方のTCPスタックが,互いに「TCPコネクションを確立した」ということを確認し,約束し合うことで成立する。

 TCPコネクションを確立したり,TCPコネクションを使って確実にデータを転送するための情報は,すべてTCPパケットのヘッダー部に書き込まれる(図1-2)。実際にデータを送るときには,TCPヘッダーに続けてデータが付けられる。

図1-2●TCPのさまざまな機能はTCPパケットで実現する
図1-2●TCPのさまざまな機能はTCPパケットで実現する
TCPパケットはIPパケットのデータ部分に入れて送られる。データ以外の必要な情報は,すべてTCPパケットのヘッダーに含まれている
[画像のクリックで拡大表示]

 TCPヘッダーのフォーマットは,どんなときでも基本的に同じ。TCPコネクションを確立したり識別するための情報は,送信元ポート番号,あて先ポート番号,制御ビットという部分に書き込まれる(図1-2のオレンジ色)。一方,データを確実に送り届けるための情報は,シーケンス番号,確認応答番号,ウインドウ・サイズ,チェックサムといった部分に書き込まれる(同緑色)。

 さらにTCPはヘッダーのオプション部分を使って,標準的な機能以外の機能を実現するための情報が書き込めるようになっている。

 例えば,1個のパケットで転送できるデータ・サイズを調整するための「最大セグメント・サイズ」や,連続して送れるデータ量を拡大するための「ウインドウ・スケール」,指定したパケットだけを再送してもらうための「SACK(サック)」(Lesson4で解説)といった情報は,オプション部分に書き込まれる。

 オプションを拡張しながら,TCPは今でも進化し続けている。

 このように,TCPの制御はすべてTCPヘッダーを持つTCPパケットのやりとりで実現する。この部分の細かい機能をLesson2~4で見ていくことにしよう。