インターネットの仕組みを勉強しようと思ったとき,真っ先に学ぶのが「TCP/IP」である。IP(Internet Protocol)とTCP(Transmission Control Protocol)という二つのプロトコルが,インターネットの中核と言えるからだ。

 ただ,これら二つのプロトコルには,理解しやすさに差があるようだ。というのも,「IPは分かりやすいが,TCPは分かりにくい」という声をよく耳にする。

 確かにIPは,「IPアドレス」や「IPネットワーク」など用語を目にすることが多く,「データを目的地まで届けるための仕組み」というのも何となくイメージできる。一方のTCPは,普段あまり意識しないプロトコルだけに,その役割や具体的な働きをイメージしにくい。

もしTCPが忘年会の幹事だったら

 TCPの役割は,「データを正確かつ効率的にやり取りすること」である。インターネットでWebアクセスやメールができるのも,TCPの働きがあってこそである。では具体的にその役割や働きをどうイメージしたらいいか。こういうときは,自分にとって身近な物事に例えてみると理解が進むときがある。

 季節はそろそろ忘年会シーズンだ。そこで,「TCPが忘年会の幹事だったら」という状況を考えてみた。“TCP幹事”の働きぶりを見ることで,TCPの働きぶりをイメージできればしめたもの。インターネットにおけるTCPの役割や存在意義が分かってくる。

 例えるのは,主人公である幹事がクライアント・マシン内のTCP(TCP処理ソフト),サーバーが店の厨房,やり取りするデータが注文と料理,データを運ぶパケットが店員---である。多少強引なところもあるが,ご容赦いただきたい。

最初は握手であいさつ---通信路の確立

 忘年会当日,店に入ると参加者一同は決められたテーブルに通される。このときTCP幹事が最初にすることは,厨房に対してあいさつをすること。「○番テーブルに着いた者です。これからしばらくの間よろしくお願いします!」という具合である。ここでのポイントは,テーブル番号を忘れずに相手に伝えることである。

 TCPでは,お互いが通信するに当たって最初に,どこからどこあてにデータを送るのかを確認し合う。この「どこ」に当たるのが「ポート番号」と呼ばれるアプリケーションの識別番号である。以降,両者はこのポート番号を使って相手を識別しながらデータをやり取りする。

 実際のTCPにおけるこの処理は,3回のパケットのやり取りによって実現される。このあいさつのやり取りは握手に例えられていて「スリーウエイハンドシェイク」と呼ばれる。最初に握手をしてお互いの信頼性を高めた上で確実にデータをやり取りする。これが,確実性を重視するTCPの最初の仕事である。

参加者の調子を見ながら注文量を調整---フロー制御

 いよいよ料理の注文だ。最初は大量に注文したくなるところだが,TCP幹事はここで焦らない。まずは手始めにビール,次におつまみ,次第に本格的な料理…というように,参加者のお腹の調子を見ながら徐々に注文する量を増やしていく。

 これは,TCPに備わっている「フロー制御」と呼ばれる機能である。TCPは受け取れるデータの量を調整する機能を持っている。具体的には,受信側が一度に受信できるバッファの大きさである「ウインドウ・サイズ」を調整する。

 このウインドウ・サイズは,最初は小さくて徐々に増やしていく。というのも,いきなり大量のデータをやり取りしようとすると,処理できないものが出てきたり経路の途中で廃棄されてしまうものが出てきたりする可能性が高いからだ。そこでTCPでは,通信しながら自身の処理能力や回線の混雑具合を踏まえて適切なデータ量でやり取りを図る。これも,効率性を重んじるTCPの特徴である。

料理の到着や不備をチェック---再送制御

 TCP幹事は,届いた料理のチェックも忘れない。もし,届いていない料理があったら再び注文する。さらに,届いた料理に不備がないかもチェックする。大切な宴会の場で変な料理を出して参加者の機嫌を損ねることは避けねばならない。これも正確さを重んじるTCP幹事の特徴である。

 TCPでは,データを受け取ると「確かに受け取りました」という内容を示す「ACK」(acknowledgement)というデータを返す。一定時間待ってACKが返ってこなければ,そのデータが相手に届いていないことが分かる。そのときは再びデータを送る。また,データの欠損は,TCPパケット内にある「チェックサム」という情報を使って調べることができる。

 TCP幹事は,もし料理に不備があることが分かったら,その料理は受け取らなかったことにして返事をしない。お客の了解が得られないことが分かった厨房は,その料理をもう一度作るはめになるわけだ。

「とにかくジャンジャン持ってこい!」というときは?

 ただ,場合によっては「何でもいいからとにかく料理をジャンジャン持って来い!」というケースもあるだろう。そういうときは,正確さや効率性ではなく,速さや簡易さを重視するUDP(User Datagram Protocol)に幹事をお願いすればよい。UDP幹事は,料理に対して文句をつけたり,再び作らせたりすることもない。到着した料理をただひたすら食卓に運ぶ。

 実際UDPは,正確さより速さ(リアルタイム性)が求められる動画や音声などの通信に使われている。TCPの役割を学習する際,TCPとは対照的なこのUDPと比較しながら学習すると,特徴がつかみやすい。

 「TCPの仕組みは?」と問われたとき,以上のような幹事の奮闘振りを思い浮かべることができたら,TCPの主な役割はつかめていると言えるだろう。こうした役割がおおまかに理解できていると,具体的な仕組みを学習する際も習得が速い。この記事で,TCPに対する苦手意識が少しでも薄れ,ネットワークの学習が進むきっかけになったら幸いである。