まず復習から

 前回は,人間のコミュニケーションを例に,コミュニケーションにおける機能や役割の階層構造をお話しました。そのあと,コンピュータ・ネットワークに見られる階層構造として,物理層,データリンク層,ネットワーク層,トランスポート層,アプリケーション層の順番で,それぞれの役割を説明しました。

 ここでもう一度,フォローの意味も含めて,前回説明した階層構造による役割分担モデルをかいつまんでお話することにしましょう。

 まず最初は物理層です。物理層の役割は「物理的なつながり」を提供することです。声を使ったコミュニケーションでは空気がこの役割を担っています。電話やLANでは電線や光ファイバが用いられています。最近では,無線LANのように電波が使われるケースも多くなってきました。

 次のデータリンク層の役割は,物理層の機能を使って具体的に何かを伝えることでした。ここで「何かを」と書いたのは,伝える方法は適当に(任意に)決めて良いことを匂わせるためです。違う言い方をすると,同じ物理層で直接繋がっている相手とコミュニケーションするのがデータリンク層の役割です。この層は,インターネットの「足回り」となる通信技術(例えば衛星通信や電話網など)といえます。

 3番目のネットワーク層は、この連載で一番重要な階層です。なぜなら,IPv6はネットワーク層のプロトコルだからです。その役割は,「異なる通信技術を統一的に扱う」と説明しました。もう少し形式的に言えば、「通信技術に依存せずに,任意の2点間で通信する機能」といえるでしょう。任意の2点間で通信するために必要な機能については,このあとで議論していきます。

 あと二つ残っています。トランスポート層の役割は,あるコンピュータに届けられたデータが,どのアプリケーションに届けるべきなのかを区別することです。そしてアプリケーション層は,アプリケーションそのものを意味します。つまり,利用者が直接操作する通信機能そのものがアプリケーション層の機能といえます。

 ここまでが前回の復習です。思い出せましたか?

通信相手はIPアドレスで指定する

 さて今回は,インターネット上で行われているさまざまな「会話」に着目したいと思います。会話と言っても,コンピュータ同士が「今日はなんだか忙しいね」などと話しているわけではありませんよね。ここで会話とは,アプリケーション・ソフトウェアによって作られるデータを,コンピュータ同士が交換している様子を指します。

 先ほど,コミュニケーションの階層構造を思い出してもらいました。その中でいま述べたコンピュータ同士の「会話」を担当する階層はどこでしょう?

 答えはネットワーク層です。ネットワーク層の役割は「任意の2点間の通信を提供すること」でした。一口に任意の2点と言っても,まずその二つがどのコンピュータからも明確に特定できないと,会話を始められません。我々人間は,会話を始める段階で「○○さん」などと名前を呼びかけることで,誰と話したいのかを明確に指定します。ネットワーク層も,人間における名前のように,通信相手となりうるすべてのコンピュータの一台一台を「一意に区別できる」必要があります。

 実は,ネットワーク層には,一意に通信相手を指定できるように「アドレス」と呼ばれる「識別子」が用意されています。すべての通信は,通信の両端をこの識別子で指定することによって成り立ちます。インターネットの場合,相手と通信するネットワーク層の実体はIP(internet protocol)です。このため,インターネットにおけるアドレスを,明示的に「IPアドレス」と呼んでいます。

 インターネットでは,IPアドレスを使うことで通信相手を一意に識別できるようになるわけですが,それだけではデータを相手に届けることができません。つまりネットワーク層にはIPアドレスのほかに,送りたいデータや伝えたい情報を相手に届ける配送機能が必要になります。IPはこの配送のしくみも備えています。

バケツリレーのようにパケットを運ぶ

 IPはインターネットにおいて,バケツリレー方式でデータ配送のしくみを実現しています。バケツリレーとは,火事の時に水を火のあるところまで運ぶ代表的な方法です。なるべく疲れないように多くの人間が参加して一人一人の仕事を少なくした上で,大量の水を効率よく素早く火のあるところに運べるように考えられています。

 バケツリレーは,まず人間が水のあるところから火のあるところまで列をつくるところから始まります。列ができるといよいよ水を入れたバケツの中継が始まります。このとき,バケツリレーに参加している人は,隣の人から渡されたバケツをその反対側の隣の人に渡すします。この単純な処理の繰り返しによって,水の入ったバケツは火のあるところまで届けられるのです。

 水の入ったバケツは水のあるところから火のあるところに向かいます。これに対し,水を使ったあとの空のバケツは,火のあるところから水のあるところへ向かって手渡しが繰り返されます。つまり,このケースでは,バケツリレーに参加する人は一つのルールに基づいて中継処理を実行することになります。そのルールとは,「隣の人からバケツを受け取ったら,片側にいる別の隣の人に受け取ったバケツを渡す」というものです。

知的な判断の追加で配送機能が高まる

 ただし,この簡単なルールだけで動作すると,どこかで誤ってバケツをもらった人に戻してしまうと,火のあるところに空のバケツが届けられたり,水の入ったバケツが水のあるところに戻ってきたりします。このとき,バケツリレーに参加する人の何人かがもう少し知的に動作できるとしたらどうなるでしょう?

 例えば,バケツリレーに参加する人の何人かが,「バケツの中身で次に渡すべき方向決める」というルールも守ることにします。つまり,受け取ったバケツに水が入っていれば火のある方へ,逆に空のバケツであれば水のある方へバケツを渡すというルールにも従うことにするわけです。こうすると,何かの拍子で空のバケツが火のあるところへ向かったとしても,この新しいルールに従う人がバケツの向かう方向の誤りに気がつき,正しい方向に向きを変えてくれます。この結果,空のバケツが火のあるところに届く確率は小さくなります。

 別の例として,複数の場所で火の手が上がっているケースを考えてみましょう。例えば,3カ所の火に対して,1カ所の水のあるところからバケツリレーするとします。もし火のある場所が増えたのに気がつかず,これまでと同じようにバケツリレーしてしまうと,水はこれまで通り1カ所にしか届けられません。他の火のあるところにも水を届けるには,別のしくみが必要になります。さて,どうすればいいでしょう。

 一つのアイデアは,バケツリレーの列を分岐させ,3カ所に水が届くような並び方に変えることです。

 ただし,それぞれの火のあるところに,きちんと偏りなく水を届けるには,バケツを中継するルールにも何らかの見直しが必要になります。分岐ルールを決めなければなりません。

 このとき,火のある場所を番号で区別し,水を汲んでいる人が偏りなく火のあるところに水を届けるために,それぞれのバケツに「この水は○番の火へ」と書いてみたらどうでしょうか。バケツが分岐している部分に届けられたら,バケツに書かれた番号で分岐するかどうかを判断するのです。この分岐ルールを追加すれば,それ以外のところはこれまでのバケツリレーのルールをそのまま使えます。分岐する人だけが分岐ルールに従うだけで,偏りなく水を適用とまったく同じように動けばいいことになりますね。

 バケツリレーそのものはとてもシンプルなモデルですが,途中の人が少しだけ知的な判断を加えるようにすれば,複数の火に対しても効率を保ちながら偏りなく水を運ぶことができるわけです。

 話をインターネットに戻しましょう。インターネットでは,バケツに相当するデータのかたまりをパケットと呼びます。このパケットの一つ一つには,先ほど紹介したIPアドレスが書かれています。パケットをバケツリレーするコンピュータは,このアドレスを読みとって,パケットを次に渡すコンピュータを判断します。したがって,任意の2点間の間に介在するコンピュータ,すなわち「中継ノード」はすべでのあて先について,次にどの方向(どの中継ノード)にパケットを渡せばいいかを調べ,それに基づいてパケットを配送していることになります。なお,この中継ノードのことを一般にルーターと呼びます。

 最後にもう一度ネットワーク層の役割をまとめておきます。それは(1) 通信の相手を識別すること,(2)「知的なバケツリレー」のように通信の相手までパケットを届けること--の二つです。

識別子を考えてみる

 今回,ネットワーク層の役割に通信相手の識別があり,それはIPアドレスで実現することを紹介しました。ただし,通信相手を識別する方法はいろいろ考えられますよね。このアドレスをもっと深く理解するために,以下のクイズを用意しました。

「アメリカに出張中の私が,皆さんにコンタクトしたいと思いました。さて,世界中の人の中から皆さんを特定するための識別子にはどのようなものがあるでしょうか」

 もちろん答えは一つではありません。コンタクトの手段が電話なら電話番号でしょうし,郵便なら住所となります。識別するという部分に着目すると,例えば「○○会社の◆◆さん」といった識別法も考えられるでしょう。「識別子」という観点で考えてみると,いろいろなアイデアが浮かぶと思います。いかがででしょうか。