- 必要とする知識など:
- UNIX (含む Linux) 上での C 言語と SOCKET によるプログラミング経験および TCP/IP に関する知識。
皆さん、日々プログラミングに励んでいらっしゃいますか?プログラミング能力の向上を考えているけれど、どうも行き詰まっているという方はいらっしゃいませんか?私は、プログラミング能力の向上には、たくさんのプログラムを書き、多くのことを経験することが重要だと考えています。また、他人が書いたソースコードを読み解くことにより新たな発見や「このコーディングはないだろう」といった批判などを行なうのも、重要なことだと考えています。
ということで、今回からは他人が書いたソースコードを覗いていこうと思います。世の中には自由に閲覧できるソースコードがたくさんありますが、その中から、FreeBSD の kernel のソースコードを覗いてみることにします。FreeBSD の kernel といっても、プロセス管理、ファイルシステム、ネットワークなど多くの機能がありますが、今回はネットワーク関連部分の SOCKE I/F のソースコードを覗いてみることにします。
- なぜ FreeBSDなのか?
- 単なる個人的な趣味です。
- なぜ kernel なのか?
- kernel のソースコードを読めるようになると、より UNIX を理解したような気になれるかも知れないから。
- なぜネットワークなのか?
- 仕事・趣味など、日々ネットワークを使用していますが、そもそも手元のパソコンとサーバはどうやって通信しているのという素朴な疑問から。
ところで、「SOCKET I/F」とは… UNIX 環境などで SOCKET という仕組みを使用して、プロセス間の通信を行なう機能です。同一マシン上でのプロセスだけではなく、ネットワーク経由で他のマシン上で動作しているプロセスとの通信も行なえます。コンピュータ用語辞典的なものに掲載されているかは分かりませんが、私はこのように呼んでいます。仕事でも「SOCKET I/F」という言葉を使用しても通じているようなので、多分一般的に使用しても問題無い用語であろうと考えています。
FreeBSD の ソースコードは、http://svnweb.freebsd.org/base/release/9.1.0/sys/ ここから閲覧できます。手元に FreeBSD を所有されている方は、/usr/src/sys を参照してください。なお、筆者の環境では、FreeBSD 9.1 RELEASE の /usr/src/sys を参照しているので、上記 URL も 9.1.0/sys としています。
本題に入る前に、簡単にインターネット上の通信に関しておさらいしておきます。
MyPC が自宅のパソコンです。www.example.co.jp, www.example.org は、インターネット上のどこかに置かれているサーバです。
ここで、MyPC のブラウザを使用して、Example社 www.example.co.jp の Web ページを閲覧する時は、
- ブラウザに http://www.example.co.jp/ を入力する。
- ブラウザが www.example.co.jp に要求を発行する。
- 要求に対する応答を受け取る。
この後、画面上に Example 社の Web ページが表示されます。TCP に関する部分をもう少し細かく書くと、
- サーバマシン (www.example.co.jp) 上で、Web サーバプロセスが TCP の 80 番ポートで接続待ちになっている。
- クライアントマシン (MyPC) 上のブラウザプロセスが、サーバマシン (www.example.co.jp) の 80番に接続する。
- ブラウザプロセスは接続が確立した後に、サーバプロセスに要求を発行する。
- サーバプロセスはブラウザプロセスからの要求に対する応答を返す。
- ブラウザプロセスはサーバプロセスからの応答を受け取った後に、接続を切断する。
このような流れになると思います。実際の通信ではホスト名ではなく、www.example.co.jp, MyPC の IP アドレスを使用します。上記の説明では、「サーバプロセス」、「ブラウザプロセス」と表現しましたが、「サーバ」、「クライアント」と表現する方が、一般的だと思います。
www.example.org との通信も、IP アドレスは異なりますが、手順は同様です。
上記の例は TCP ですが、今回の kernel のソースコードの追跡では、TCP ではなく UDP の処理を追いかけることにします。
- なぜ UDP なのか?
- TCP よりも処理が単純なためです。
今回は、これから扱う内容に関して説明を行ないました。次回は、kernel 内に踏む込む足掛かりとして、簡単なサーバとクライアントのプログラムを提示します。