TCP/IP
まずはじめに
本章でのTCP/IPの取り上げるスタンスについて説明します。 本章では、UNIXとTCP/IPの関係性を取り上げ、GNU/Linuxの中でどう扱われているかの議論を試みます。TCP/IP自体の説明、また、インターネット自体の説明は本章の趣旨ではないので本章では扱いません。またTCP/IPに関する基本知識(例えば 3 way handshakeなど)は既に学習しているものとして話を進めます。
GNU/LinuxはTCP/IPだけではなく、Appletalk、DECNETなど多数のプロトコルをサポートしていますが、本章では主要な論点であるTCP/IPのみ取り上げます。
UNIXとTCP/IP
TCP/IPとは1970年代初頭にDRAPAの研究成果として既に出来上がったネットワーク通信用プロトコルで、元々はUNIXにはなかった機能です。DARPAからの研究資金を得て、4.1bBSD(1982年8月)に対してBBN Technologiesで実装されていたTCP/IPコードをベースとして組入れるという作業が始まり4.2BSDで正式にTCP/IPを含んでリリース(1983年8月)となりました。ここでは「BBNの実装ベースで」とあっさり書いていますが、実際にはもうちょっと複雑な話になっています。 [1]
TCP/IPというとインターネット用プロトコルというイメージがありますが、当時のBSDの実装はイーサーネット接続されたLANやキャンパスネットワークで高速に情報を伝達するのに適したものになっています。一方でオリジナルのBBNの実装は広域なネットワークであるインターネットで使うことを前提としているもので、そのため80年代当時の低速なネットワーク向けに作られています。このようにターゲットとなるネットワークの前提が違うため、BBNの実装をそのままBSDに組み込んだような単純な話ではありません。
この期間でのエポックとしては1983年1月1日にARPANETの公式プロトコルはTCP/IPに切り替わっています。 [2] 当時TCP/IPの実装を持っていたオペレーティング・システムはそんなに多くはなく、BSDの他の名の知れたシステムはDEC社のTOPS-20 system [3] ぐらいです。当時、DARPAの資金で開発した、他に参考となる実装が多くなく、ソースコードが公開されているなどのいくつかの要因により実質BSDがコンピュータにおけるTCP/IPのリファレンス実装となっていました。
リファレンス実装であったというおもしろい傍証は1997-8年頃に問題となった Ping of Death のケースが良いかも知れません。これは規定外サイズのICMPパケットを脆弱性を持つシステムに送るとオペレーティングシステムごとハングアップしてしまうというものです。そもそもの原因はBSDのコードがパケットの分割を考えていなかった実装だったからです。分割されるケースを設計時点で考慮に入れなかったある意味、単純なバグで、そんなに深い意味はありません。もし、IPパケットとICMPパケットの仕様[4]だけで作っていたら設計時に考慮し、この脆弱性はたぶん現れないでしょう。しかし実際にはGNU/LinuxだけではなくMacintoshやWindowsにも同じ脆弱性が現れました。このことから仕様ドキュメントから設計をしたわけではなく、商用のオペレーティングシステムもオープンなコードであるBSDのTCP/IPコードをリファレンスとしていたのではないかといわれています。
Xerox PARCで開発されたイーサーネット、TCP/IP、そしてBSDの組み合わせによって構築されたLANがARPANET経由でエンド・ツー・エンドで接続し広域ネットワークを構築してしまうという当時は技術的にかなり画期的な仕組みであり、これこそ今日私たちがインターネットと呼んでいるものそのものです。ですからUNIXの存在はインターネットの大きな礎としての存在であった決して過言ではありません。
Internet Protocol Suite
BSD由来のTCP/IPの特徴は、クライアントだけでなく、サーバだけでもなく、ルーターだけでもない、TCP/IPの機能一式をもったInternet Protocol Suiteの実装であるということです。つまり、UNIXはサーバとしても使え、クライアントとしても使え、そしてまたルーターとしても使えるということです。もちろんその上で動作するアプリケーションは、TCP/IPの機能をフルに使うことができます。
GNU/Linuxベースのサーバーやクライアントはインターネットにおける日常の風景的な部分ではありますが、形をかえて組み込み系でも市販のルータの中身がGNU/Linuxベースであったりするものよく見かけます。もちろんGNU/Linuxは、Internet Protocol Suiteで一式揃えているので、サーバとクライアントとルータやブリッジを同時に兼ねることも当然可能です。
典型的なのがGNU/Linux上で動作するバーチャルマシン・モニタXenのネットワーク構成です。Xenのドメイン0 (他の仮想マシンを動かすためのベースとなる環境)では、内部的にブリッジの機能を作り、ドメインU(個々の仮想マシン)からはそこに仮想的に接続する形を取りネットワークを形成します。このために特別なプロトコルスタックを用意するわけではありません。既にGNU/Linuxには必要なネットワークの能力が用意されているのです。
一般にTCP/IPのようなプロトコルが重ねられている構造のことをプロトコルスタック ( Protocol Stack ) と呼びます。
そして各々のプロトコルのメカニズムあるいは実装のことを、その層のスタック、たとえばTCPであればTCPスタック、IPであればIPスタックと呼びます。意味は、TCPの層だけではなく、その下層も含めたメカニズムあるいは実装をさしています。
脚注
- ↑ 詳しくは Open Sources: Voices from the Open Source Revolution に納められているMarshall Kirk McKusickが書いたTwenty Years of Berkeley Unix From AT&T-Owned to Freely Redistributable を読むことをお勧めします。
- ↑ 核戦争にも耐えうる軍事ネットワークを作るためにインターネットを作ったという俗説がまことしやかに流れていますが、そのような事実はありません。Internet Society のサイトにある Brief History of the Internet に目を通して正しいインターネットの歴史の全体像を知っておきましょう。
- ↑ http://panda.com/tops-20/ by Mark Crispin
- ↑ RFC791
目次へ