はじめに
エンドユーザーの要求は複雑化の一途を辿り、それに伴って開発者にも多くの知識が求められるようになりました。その一例がネットワークプロトコルの知識です。
昔はネットワーク管理者が知っていればよい知識でしたが、いまや業務システムではネットワーク環境が当たり前なので、知らないでは済まされません。それに加え、業務システムには様々な問題がつきものです。ですからトラブルが起こった時、障害がどこで発生しているのか素早く判断しなければなりません。
それらのことを考慮すると、広く使われているTCP/IPプロトコル群を知ることは非常に有益です。しかしながら、巷に出版されている専門書は、その多くはネットワーク管理本もしくはプロトコルを図で説明するものです。著書が知っている限り、プロトコルの実装を解説した本はピアソン・エデュケーション社が出版している『詳解TCP/IP』だけですが、この本はFreeBSD 4.4のカーネルの実装に基づく解説しかなされていないので、非常に高度な前提知識を求められてしまいます。おまけに実地で身に付けようとしても非常に困難です。
こういった諸事情からネットワークプロトコルは、プログラマが習得し辛い知識だと言えると思います。そこで筆者は今回、プログラマの方がネットワークプロトコルの知識を「手を動かしつつ目で見て身に付けられる」記事を書こうと考えました。この連載を通じて、プログラマの方々がネットワークプロトコルの知識を習得するお手伝いができれば幸いです。
対象読者
- C#もしくはVB.NETで基本的なプログラミングはできる方。 ※ダウンロードページはこちらです。
- TCP/IPの動きを身に付けたい方。
- ネットワークの初心者。
必要な環境
C#もしくはVB.NETのコンパイラが必要です。お持ちでない方は、マイクロソフト社のホームページにて配布していますので、ダウンロードして入手してください。
この連載が取り扱う範囲
TCP/IPプロトコル群を題材に取り扱うとき問題となるのは膨大な情報量です。TCP/IPを本当に細部まで知ろうとすれば、書籍にすると数千ページは必要となるでしょう。その膨大な情報をそのまま書いてしまうと、この連載は非常に読み辛いものとなってしまいます。
そこでこの連載では、TCP/IPの歴史、プロトコルのオプション機能、数多くの個別プロトコルの解説はせずに、筆者が実際にシステム構築をする上で重要だと考えた「TCP/IPの根幹となる部分」を習得するコツを解説します。あらかじめご了承下さい。なお、省略した部分については資料として記事の最後に書きます。
プロトコルとネットワークアーキテクチャ
TCP/IPプロトコル群はネットワークアーキテクチャと呼ばれるものの一種です。ですからTCP/IPを知るには、ネットワークアーキテクチャとは何かを知らなければなりません。そこでこの項では、簡潔にネットワークアーキテクチャの概要を解説します。
PC同士が通信するとき何が問題となるでしょうか? それはバイナリデータ(0と1で表現される数値)の取り扱いです。以前の連載でも解説しましたが、PCの頭脳と呼べるCPU(Control Processor Unit)は0と1しか理解できません。ですから、PC同士が通信する時には、あらかじめ一定の形式を定義しておかねばなりません。
分かりにくいと思いますので少し具体的に言うと、次のような疑問が頭に浮かぶでしょう。
- 0と1が並んでいるということは、どこからどこまでがデータなのでしょうか?
- インターネット上でどのようにして送信先の端末を識別しますか?
- 一つの回線に複数の端末がバイナリデータを送信した場合、どうやってバイナリを解釈するのでしょうか?
この様なデータ通信での数多くの課題を解決するための取り決めを「プロトコル」と呼びます。CPUと同じくあらかじめバイナリに対して厳密に意味を定義し、それに加えて明確な手順を決めておくとこれらの課題が解決できるのです。
さらに、それらプロトコルを複数統合したものを「ネットワークアーキテクチャ」と呼びます。なぜ複数必要なのかというと、何でもできる一つのプロトコルを決めたり、フラットなプロトコルを無数に開発してしまうと色々な問題が発生するからです。そこで、プロトコルは通常、役割を階層分けした上で明確な役割を持ったプロトコル定義して、それらを柔軟に組み合わせて使います。これは大変重要な概念なので、次項では階層化をする意味について書きます。