ネットワークアーキテクチャの階層化
先ほど少しだけ触れましたが、TCP/IPプロトコル群などのネットワークアーキテクチャは複数の階層で構成されています。そうすることの意味を理解するために、もし一つのプロトコルで通信を行う場合どうなるのかを想像してみます。
プロトコルが一つしかない場合の問題点
一つのプロトコルだけを定義すると一つだけ覚えておけばいいので、一見するとすばらしい解決策のように見えます。しかし、深く考えていくにつれて数多くの欠点が分かってきます。
まず第一に、ネットワーク機器が増えた場合どうするのでしょうか? 単一プロトコルで定義するということは、定義する際に検討した機器しか使えないことになってしまいます。そうしないと、前提が崩れることになりプロトコルが使用できなくなってしまいます。
第二に、プロトコルを変更した場合の影響が大きすぎます。単一プロトコルは初め使用する際に便利なのですが、それと同時に少し変更しただけで既存のネットワークシステムが停止してしまうかもしれません。他にも色々な問題が考えられるので、誰しも複数のプロトコルを定義することを考えるでしょう。
複数のプロトコル間の競合
複数のプロトコルを定義すれば、先ほど言った単一プロトコルの問題は解決できます。しかし、この方法でもやはり問題があります。それは、新しいプロトコルを定義する際に、既存のプロトコルの一部と重なったら正常に動作しなくなります。なぜならば、似たプロトコルを2つ組み合わせて使用すると言うことは、どちらの定義を優先するのか考えなくてはならないことを意味するからです。これでは、プロトコルを新しく作るたびに全ての既存のプロトコルとの組み合わせを検討しなければならなくなります。これが問題なのは誰の目にも明らかです。
この事例は特殊な例だと感じるかもしれませんが、昔は異なるベンダの機器を同時には使えないことなんてざらにあったそうです。今でこそ、TCP/IPが広く使われていますが、昔はベンダごとにプロトコルが定義されている時代があったのです。
プロトコルの階層化とカプセル化
こうした問題を解決するために、機能を区分けして、より柔軟にプロトコルを組み合わせられるように、プロトコルを階層化する方法が考え出されました。なぜ階層化すると柔軟になるのかというと、自分の役割だけを考えて定義すればよくなるからです。例えば、TCP/IPにはDNSというプロトコルがあります。このプロトコルは、どんな機器を使っても、どのような回線を使っても作動します。おまけに、開発者は使用する回線や機器を考えなくともDNSを実装できます。この様に分業化ができるので階層化は非常に重要な概念といえます。また階層化した時にデータを送る方法を「カプセル化」と呼びます。階層化については、オブジェクトが階層化した時のことを思い浮かべると分かりやすいでしょう。ただし、ネットワーク通信でのカプセル化は、オブジェクト指向言語のカプセル化とは違った概念なので注意してください。次項ではこのネットワーク通信におけるデータのカプセル化について説明します。
カプセル化
TCP/IPではプロトコル階層が4つあります。下位層から順番に名前を挙げると、「ネットワークアクセス層」「インターネット層」「トランスポート層」「アプリケーション層」です。

端末からデータを転送する時は、アプリケーション層、トランスポート層、インターネット層、ネットワークアクセス層の順番で必要なデータだけを単純に付加していきます。そして、データを受信した方は、付加されたデータを逆順に取り出しながら処理をします。この動きは、後入れ先出し法だといえるでしょう。この一連のデータ送受信の方法を「カプセル化」と呼びます。

この方法がなぜ前項で述べた利点を生むのかというと、自分の層の処理だけに集中して後のデータは他層へデータを送るだけだからです。単純に他層へデータを任せるだけなので、他層でどのような処理をしていても正常に動作します。この方法を応用することによりVLANなどが実現されています。他にも色々な場所で筆者の役に立っています。ですからカプセル化は非常に役に立つ手法だといえます。後入れ先出し法の応用例として覚えておくことをお勧めします。
