■基本構造
インターネットで一番重要なのはインターネット・プロトコルである。
これが意識されることは少ない。
通常ネットワークの説明は、OSI 7階層モデルを元になされる。
http://www.big.or.jp/~mio/ga/cd/ref/cd_ref_tcpip.html
一番下が物理層(+データリンク層)で、通常はおおよそethernetに対応する。
もちろんethenetを使わないインターネットもありうる。
つまりethenetはインターネットにおいて必須のものではない。
その次のネットワーク層で、IP (Internet Protocol)に対応する。
その次がトランスポート層で、TCP (Transmission Conrtol Protocol)
に対応する。しかしよく知られているように、UDP(User Datagram Protocol)
というものもあって、これも重要なインターネットの一部である。インターネッ
トのよいところは、場合によってTCPとUDPを使いわけられるというところにあ
るという言い方もできる。TCPのような確実な通信もできるが、UDPのようにほ
とんどIPを生で触る方法も提供されている。UDPだけでインターネットができ
るかというとそれはちょっと無理だと思うが、TCPだけってことではないって
ことだ。つまりTCPも必須なものではない。
その間に挟まれたIPこそが、インターネットをなりたたせているプロトコルで
ある。
IPの特徴を一言でいうと、いい加減であること、と言えるかもしれない。とに
かく不確実であることを前面にうちだしたプロトコル、みたいな感じ。なにか
あったらすぐ死ぬ、うまくいくように努力したりしない、というのが根本的姿
勢である。(固いビルをたてようとしても地震があったら倒れる、しかし柳は
倒れることがない、というポリシーに似ている。)
ある意味ネットワーク屋がこれを強調するのは、根本的には電話屋とネットワー
ク屋の対立から来ているとみることもできる。電話屋の考えるネットワークと
いうものは、とにかくある一定のレベルにおいて確実なものをつみあげていっ
て、なにか確実なことを保証できるようなネットワークを作りあげる。しかし
ネットワーク屋はそうは考えない。ここには深〜い対立があって、それがネッ
トワーク屋が不確実性を強調しとうとする要因である可能性はある。
■物理層+データリンク層
さてある端末から例えばtelnetで文字をうち、それが先方に届くまで、どのよ
うなルートを通るのだろうか。順番に書けばいいのだが、どこがスタートなの
かが難しいので、とりあえずはしょって適当に書く。まずは物理層から。
なにかキーを押すと、つながっている10BaseTのケーブルからハブへ信号
(ethenet datagram)がとびでる。もしつながっているハブがダムハブだとする
と、そこからぶらさがっている全てのマシンに同時にそのdatagramが伝わる。
ダムハブは単なる銅線である。つまり全部が一本の銅線につながってるのと同
じことだ。
現在は10BaseTが主流だが、昔は10Base2、10Base5というのがあった。もっと
も初期の10Base5というのを見れば、このことははっきりする。黄色い太いイー
サネットケーブル(10Base5)が部屋をはっていて、そこにある特殊な器具で、
ケーブル自体を切ってしまわないように、しかし確実にケーブルの芯に触れる
ように穴をあけ、そこにトランシーバをぶらさげる。まさしく一本の銅線にみ
んながぶらさがっている状態。
これはethernetの成立を考えるとよくわかる。ハワイ大学で研究されていた、
ALOHA netという無線を使ったネットワーク技術が元になっている。ハワイは
島にわかれているため、島間のネットワークは無線を使うのがリーズナブルだっ
た。電波において交換機のようなものはありえないので、みんなが同じ媒質に
ぶらさがっていて、それでも通信できる技術が要請されたのだ。
ethernet ALOHA NET 電波
http://www.atmarkit.co.jp/icd/root/98/5787298.html
http://www.d1.dion.ne.jp/~tom_tom/zyousyo/05281.htm
http://www.internetclub.ne.jp/TECH/Ztoday/1998/980515.html
ethernetのetherとは、有名な話だがあのエーテルのことだ。光が伝わる媒体
として、エーテルというものが真空中をも満たしていると以前考えられていた
のだが、そのエーテルのことだ。だれかがシャレでこんな名前をつけたのが、
いまにいたるまでずっと生き残っているということらしい。(?)
で、ethernet datagramは当然ヘッダーとデータにわかれている。あるデータ
のつらなりのどこからどこまでがヘッダーで、どこからがデータかは、あらか
じめ約束事として来めている。ヘッダーには行き先と出発点(自分)のそれぞれ
のMACアドレス(=イーサネットアドレス)という48bit長のアドレスがついてい
る。あとは当然データ長や種類などの情報もはいっているが省略。
MACアドレスは上位何bitだかは、そのイーサネットカードを作っているベンダー
固有のアドレス。その下のbitはそれぞれのベンターが決めた番号。つまり、
販売されているありとあらゆるイーサネットカードには、一つ一つ確実に違う
番号がわりふられている。(実はMACアドレスを変更できるカードもある。これ
はすごいトラブルの原因になることがある。)
全て違う番号がふられているというのはすごいことで、イーサネットアドレス
がわかればほとんどの場合、どこのだれだかが特定できてしまうということだ。
例えばGUIDというのはMACアドレスとその時の時間を元にして、世界中でユニー
クなアドレスを生成している。WordファイルやExcelファイルには勝手にこの
GUIDがうめこまれる。メリッサウイルスの作者がCIA(?)につかまったのは、こ
のGUIDが元になっている。またRealPlayerはユーザが何を聞いているか、見て
いるかを、GUIDと共に収集していた。このへんの情報も、エシュロンは保持し
ているのではないか、という噂も根強くある。
で、ethernetにながれたethernet datagramは、その同じ媒質にぶらさがって
いるマシン全てに同時に届く。各マシンは、そのヘッダーを見て、宛先アドレ
スが自分宛かどうかを見て、違うようなら捨てる。自分宛なら拾う。
ここで、プロキシメイトリーなんとかモード(?)といって、流れてるパケット
をなんでもかんでも拾って中身を見ることができちゃうモードもある。
tcpdumpとかはこれをやっているわけ。このモードになっているマシンがネッ
トワーク上に存在するかどうかを識別するソフトもあるらしい。盗聴探知器み
たいだが、どのような方法かはわからない。
で、あるマシンからethenetにdatagramを流すとき、他のマシンがたまたま同
時にdatagramを流そうとすることがある。まったく同じ媒質に同じ方法で送出
しようとしているので、ぶつかってしまう。これはどのように回避するかとい
うと、全てのイーサネットカードは、自分が送出するdatagramをすぐ横で読み
とって、そのCRC?(チェックサムだっけ?)を計算する。そうすれば、datagramが
こわれちゃったかどうかはすぐに認識できる。こわれちゃったこと
(=collisionが起ったこと)がわかったら、そうしたら、ランダム秒待って再送
する。(このランダムの精度は重要。適当なランダムにしたら、何度もぶつか
るってことになっちゃうから。)
この方式を、CSMA/CD(Carrier Sense Multiple Access with Collision
Detection)方式と呼ぶ。イーサネットのキモとなる部分。この、だめだったら
また送ればいいじゃん、というところがいかにもネットワーク屋っぽいところ
である。
CSMA/CD (Carrier Sense Multiple Access with Collision Detection)
http://www.i.h.kyoto-u.ac.jp/~shom/network/csma.html
ハブのレベルでcollisionのLEDがついていることがある。これがなぜハブ、つ
まり銅線と同じレベルのもので判断できるのかというと、通常のethenetの中
を流れる信号はある一定の周波数だっけ?(マンチェスターコーディングだっけ?)
を維持しているのだが、datagramがこわれるとこの周波数が変わるので、それ
でわかる、という方式だったはず。
ここまで理解すれば、同じethenetに100台とかぶらさげるのが危険なのはすぐ
わかるだろう。またethernetは、メルトダウンという現象が起ることがある。
ある一定以上ethernet datagramを出すと再送しようとするのだが、またコリ
ジョンしてしまい、それが永遠に続いてしまうという状態になる可能性がある。
ネットワーク屋さんはこれをすごく恐れている。
スイッチングハブだと若干違う方法になる。これはハブが多少インテリジェン
トな機能を持ち、どこに差さっている10BaseTがどのMACアドレスに対応するか
を覚えていてくれるというものだ。ちょっとばかし高級でしょ。
別の方式でいうと、トークンリングやFDDIとかはリング状のネットワークになっ
ている。これは仕組み自体がとてもきれいだ。回転寿司をイメージすればいい。
目の前にぐるぐる回っている板があり、空きがあったらパケットをのせられる。
ぐるぐる回る。流れてきたものが自分宛だなと思ったら拾う。それだけ。
ネットワーク屋さんが死ぬほどきらいなATMというものもある。これがどんな
仕組みかはよくわからない。53byteのセルというものがあり、そのうちの
5byteがアドレスを指定している。とかいうのは知ってるが、ルーティングに
相当するものがどう行なわれてるかよくしらない。相当に高度なことをしてい
るらしい。どこをどう流れるかを知る方法が無い、または高速に動的にきりか
わるといった方法らしくて、ATMクラウドといって雲のようにモワモワした関
係性によるネットワークになっているらしい。
さて、ヘッダーにMACアドレスをもったethernet datagramは、ethenetにたど
りついたら、全てのマシンに同時に到達する。(スイッチングハブだとまた別
なのだが、省略。) 到達したマシンは自分宛だなと思ったら拾う。そして上位
レイヤーにわたす。同じethernet界を共有しているマシン同士だったら、これ
だけで終る。ルーターはでてこない。
さて、ルーターはどこから出てくるか。それは上位層を見てみよう。
(ethernetを物理層に使っているプロトコルは、インターネット以外にあるか?
たくさんある。NetBEUIやEtherTalkがそうだ。昔は結構使っていた。 つまり
ethernetはインターネット専用ってわけじゃない。インターネットといえば
ethernetというわけでもない、はずなのだが、そういうことになっているのは、
やはり上記のCSMA/CD方式にみられるいい加減さが、ネットワーク屋の心にマッ
チしたから、という解釈が正しいのではないかと思っている。)
■ネットワーク層
物理層のすぐ上がネットワーク層。ここがIPの世界。
|header|data |
|IP packet-----------------|
|header|data |
|ethernet datagram----------------|
こんな感じの階層構造になっている。ethernet datagramのdataの部分に、
そっくりIP packetがまるごとはいっている。
headerの中にはやはりethernetと同じく自分のところと、相手のところのIPア
ドレスがはいっている。32bit。133.27.4.203のような感じに表記する。(関係
ないが、なぜ10進で表わすのか、最初のころ不思議でしょうがなかった。いま
も不思議だ。)
この32bitしかないアドレスを使って通信する方法がIPv4だ。いま現在主流。
それに対して32bitじゃたりないからってIPv6を作った。128bitのアドレスを
使う。そんなにあってどうすんだという意見もある。
なぜ128bitなのかにはこんな理由もある。128bitの中には48bitのMACアドレス
を二個埋めこんでもまだ32bit余る。これをうまく使えば、二台のethernetホ
スト間で、自動的にIPアドレスをわりふるみたいなことができるはずだ。
そう考えて、64bitじゃなくて128bitにした。
しかしIPv6は森首相が演説で使ってるくらいのネタだから、実はもうだめなの
かもしれない。Nintendo64用のディスクシステムと似たような感じかもしれない。
というふうに僕は思ってるんだけど。
さてさて、もう一度telnetの例えに戻る。
あるマシンから同じethernet上の別のマシンにtelnetするとする。
このときはルーターは介在しない。
たとえば202.19.236.63から202.19.236.73にtelnetするとする。これは同じ
ethernet上にある。なぜそれがわかるのか? 各マシンにはIPアドレスがわり
ふられる。最近じゃDHCPといってそれを自動的にやるってのがある意味当たり
前になったから、手動でIPアドレスをふったりしなくなってるかもしれないが、
最初はこれを当然必要なものとしてやっていた。
各マシンにはIPアドレスという一意の番号をわりふる。これは当り前だね。
(しかしよく間違える。間違えると悲惨なことになる。)
しかしそれだけだとインターネットらしい通信はできないのだ。
ここがethernetとかとの違いだね。
netmask (broadcast address, network address)
gatewary address
この二つもわりふることが必須なのだ。
netmaskとはなにか? つまりこのnetmaskがあることによって、ある相手先にIP
アドレスが、同じethernet上に存在するかどうかがわかるのだ。
たとえばさっきの「202.19.236.63から202.19.236.73にtelnet」するとして、
この場合のnetmaskは、255.255.255.224だ。
切りが悪い数値に見えるが、2進数で見れば切りがいい数字だということがわかる。
11111111111111111111111111100000
という数値。つまり下5bit分だけが0で、残りが1ってことだ。
相手先IPアドレスをこのnetmaskでANDしてやって、その結果と、
自分のIPアドレスとnetmaskのANDしてやった結果を見比べる。同じじゃん。
なので、同じethernet上のマシンなのだなとわかる。
ちなみにIPを設定するとき、IPアドレス、netmask以外に、network address,
broadcast addressを入力しなくちゃいけないことがよくあるが、本当はこん
なの入力する必要ないはずなのだ。上記計算で、ANDをとった値がnetwork
addressで、そのうえで下の00000の部分を11111にしてORした値がbroadcast
addressである。ここで、それ以外の値を入力しなくちゃいけなくなったこと
は一度もない。ようするに、IPアドレスがあって、それが下5bitのところで境
目ができているということだけが重要。
同じethernetだとわかったらどうするか。さっさと直接送りつけちゃえばいいのだ。
同じethernetにいることはわかっているので、
「202.19.236.73というアドレス持ってる人はだれですか?」とethernet上で
ブロードキャスで聞く。
そしたら「私です。MACアドレスは○○です。」と返事がくるはずだ。
(これをARP(Address Resolution Protocol)という。)
そうしたら、そのMACアドレスに直接送りつければいい。
さて、相手先IPアドレスが202.19.236.136だったらどうだろう?
netmaskで切ってみてみると、上位network addressの部分が、ほんの
ちょこっとだけど違っているのがわかる。同じethernet上にはいない。
さてここで、gatewayアドレスの登場。これがルーターだ。
とにかく自分じゃ送り届けられないってことはわかるから、
だれかに頼む。宛先のIPアドレスを指定した上で、それを
MACアドレス的にはgatewayアドレスに相当するマシンに送りつける。
相手先 address→ |header|data |
|IP packet-----------------|
gateway address→ |header|data |
|ethernet datagram----------------|
というふうになる。
(あーよく考えたらネットワーク上に複数gatewayがあることもよくあるし、
普通のPCでもちゃんとルーティングテーブルを持ってるんだった…。
ここはもうちょっとちゃんと説明しないといけないが、省略。)
このパケットはgatewayがひろって、でも宛先IPアドレスを見て、
自分宛じゃないってことがわかる。なのでまた違う方向に転送する。
違う方向とは? 当たり前なのだが、gatewayマシン(=ルーター)とは、
一つのネットワークだけじゃなくて、複数のネットワークに
ぶらさがっているマシンをいう。
(いや、ぶらさがってるだけじゃだめで、交換する機能が必要。)
(IPアドレスだけちゃんと設定して、netmaskをちょっと間違って設定してしま
うことがよくある。こうすると、外部インターネットとは問題なく通信できる
し、同じethernet上のホストとも通信できるが、どうもそれ以外のところとは
通信できない、なぜだ? という現象が生じる。上記の経路を理解していれば理
由はわかる。)
gatewayは受けとったIPアドレスを見て、どのネットワーク転送すればいいの
かを判断して、また次のネットワークへと送りだす。
どうやって判断するか?
実は最初の判断、同じethernet上にあるかどうかの方式と、基本的には同じだ。
gatewayマシンには、例えば二つethernetアダプタがついている。
つまり二つのethernetにぶらさがっている。
それぞれについてIPアドレス、netmaskをもっている。
行き先IPアドレスを見て、それで二つなら二つのIPアドレスについて、順に判断していく。
(来たところから反対の方へとかいう知的な反応ではなく、
アドレスによって機械的に判断しているということだ。)
network addressが同じか? 同じだったら同じほうへいく。どれとも違うよう
だったら? ここでもやっぱりdefaultのgateway addressというのがあり、
そこに行くことになる。gatewayからgatewayにいくということだ。
こうやってどんどんgatewayからgatewayへと移動していくことになる。ここか
ら先は、長い長い旅の初まりだ。ようやくここからインターネットのインター
ネットらしいところが始まる。
gatewayからgatewayに移動していくと、だいたいにおいて、どんどん中心に相
当する部分にあつまっていくことが想像つくだろう。そうやって、かなり中心
にまで移動していくと、原理的にはやっぱりまだまったく同じことをやってい
るのだが、かなり規模がでかい話になってくる。二つネットワークがあるとして、
それぞれについて、どんなネットワークが先にあるのかの情報が大量に必要に
なってくる。これがルーティングテーブルの肥大として問題になっていることだ。
たとえばこういった大規模な話になったとき、たとえばある特定のリンクがき
れたとする。そうすると、そのリンクが切れたという情報を、ある方法をもって
gateway間で交換するメカニズムが必要になってくる。これがRIPとかOSPF(?)とか
そういったルーティングプロトコルだ。(たぶん。)
このように中心によっていくことになるが、話を元にもどすと、
基本型は、
・IPアドレスはネットワーク部とホスト部にわかれていて、
・そのネットワークアドレスでルーティングされるということだ。
そのネットワークアドレスは、つながっているホストはみんな自分で
あらかじめ知ってるってこと。
ようするにこれだけってことですね。単純だ。
■トランスポート層
トランスポート層は、その上にのっかり、ちゃんとデータが相手先まで届いた
かどうかを確認する層。すごくいろんなことをやる。省略。
■リンク集
http://www.asahi-net.or.jp/~yy5t-nmr/network/tcpip.html
わりとわかりやすい。
http://www.ohmsha.co.jp/data/books/contents/4-274-06257-0.htm
http://www12.cds.ne.jp/~hkami/network/tcpip.html
このような概念モデルを元にして、どのような物理的モデルが可能か。
まず上からいくと、TCPのレベルは説明に含める必要はないだろう。
これは人力で、つまり来場者がやればいい。
TCPがどのような動作をしているのかを説明する文章を作るなり、
説明員が説明するなどして、そのとうりにやればいい。やらなくてもいい。
(面白いワークショップができるだろう。)
このあいだの説明で難しいポイントは、
物理層(+データリンク層)とネットワーク層との区分だろう。
スムーズに説明するためには、ethernetのレベルとIPのレベルが不可分なのだ。
実際の話、ethernetが無いようなインターネットはありうるのだろうか?
たとえばPPPのようなシリアル接続だけからなりたつグローバルネットワーク。
ちょっと想像がつかないが、可能かもしれない。
そこまで極端にとばなくても、トークンリングやFDDIだけからなるインターネットを
想像することは不可能ではない。
その意味で言えば、ethernet独自の方式、CSMA/CD方式などは、説明する必要は
ないのかもしれない。ただ、ネットワーク屋の気持的には、インターネットの
モデルといったとき、各ノードの目の前のネットワークが、トークリングみたいな
接続になっているのはゆるせないと感じるのだろう。
その意味で、これは感情的な問題なのだと思う。回転寿司方式でデータが運ばれて
たとしても、絶対違うとは言えないはず。
そこから上、IPのレベルがやはりもっとも重要な区分だ。
(あらかじめ、アドレス方式はネットワーク部とホスト部に分かれているものとする。)
まず個々のホストは、目的ホストが自分と同じネットワークに属するのかどう
かを判定する。これは自分のネットワーク部と目的アドレスのネットワーク部
を比較すれば簡単にわかる。そうであったら、そのまんまネットワークに流す。
そうすると、ネットワークを流れるデータは常に受けとる準備をしているので、
ネットワーク部とホスト部が一致したデータは、受けとられる。
このようにして、LAN内部の通信は可能。
で、WANにおける通信はどうすればいいのか。
現実世界を考えると、まず同じネットワークかどうかを調べて、
そうでなかったらルーター(このアドレスはあらかじめ設定されている)の
MACアドレスに向かってパケットを送る。
ここで、MACアドレスはルーターを指す、その中のIPアドレスは
目的アドレスを指すようになり、つまり入れ子型になる。
> 相手先 address→ |header|data |
> |IP packet-----------------|
> gateway address→ |header|data |
> |ethernet datagram----------------|
しかしよく考えたら、ここも入れ子にしない方法はあるのではないか。
つまりネットワーク上の流れを常に監視していて、その中でネットワーク部が
そのネットワークアドレスと一致しないものが流れてきたら、それはルーター
へのパケットなのであるとして認識する。そのようにして、ルーターはパケッ
トを拾うというシステムで、おおよそウソをついていないことにはなるのでは
ないだろうか。このくらいだったら物理的に実装できそうだ。
その後、ルーターの内部でネットワークアドレス部を判定し、どちらのルート
に行くかを考える。ここの部分で、ルーティングテーブルに相当するものが
でてくる。優先順位の違いなどもでてくる。
それでルーターからルーターへと移動するようになる。
最終的にはまたLANにつながる。
こう考えれば、おおよそいまのインターネットシステムの根本的な部分を
表現できたことになるような気がする。