図1
 Ethernetのような共有型のネットワークでは,あるマシンが特定のマシンあてに送信したデータは,すべてのマシンに届けられる。図1[拡大表示]で説明すると,マシンAがマシンCあてにデータを送信すると,Cはもちろん,Bにもそのデータは届けられる。ただし,このデータには“AからCあて”という“表書き”がある。Bはこの表書きを見た時点で自分には関係ないと判断し,受け取ったデータを破棄する。一方のCは,自分あてのデータであるから,その中身を見る,というわけだ。

 では,相手のマシンを特定するための“あて名”とは,具体的にはどのようなものなのだろうか。これが今回のメイン・テーマである。実は,各マシンはネットワーク上の他のマシンと区別するために,3つの識別子をもっている。コンピュータ名,IPアドレス,MACアドレス──である。

 前回も説明したが,自分のマシンのコンピュータ名を知りたければ,Windows95 であれば,[コントロールパネル]の[ネットワーク]を選び,[ユーザー情報]タブを選べばよい。また,同じ[ネットワーク]の[ネットワークの設定]タブで[TCP/IP]のプロパティを見ると,[IP アドレス]タブのところで,自分のIPアドレスを発見できる。しかし,DHCP利用時は「IP アドレスを自動的に取得」ボタンがマークされ,IPアドレスは明示的に示されていない。この場合は,マシン立ち上げ時にDHCPサーバーと呼ぶサーバーから,動的にIPアドレスを振ってもらう。振ってもらったIPアドレスを知るには,winipcfgを実行すればよい。

 自分のマシンのMACアドレスを知るには,Windows95であれば,winipcfg.exe を起動する。ここでMACアドレスが「アダプタアドレス」と表現されているのは,MACアドレスは各NIC,つまりLAN アダプタが備えているものだからだ。試しにNICを取り替えてwinipcfg を起動してみると,MACアドレスは違うものになる。

 ここで,不思議に思わないだろうか。1つのマシンを他のマシンと区別するためなら,識別子は1つあれば十分なはずだ。なぜ3つもあるのだろう。まあ,コンピュータ名の必要性は,理解しやすい。MACアドレスにしてもIPアドレスにしても数字の羅列であるため,覚えにくい。接続したい相手を明示的に表現する場合は,例えば“Soumu_Server”だとか,“Kobara_Win95”といった名前を使ったほうが分かりやすい。

基本は唯一無二のMACアドレス

図2
 では,MACアドレスとIPアドレスの違いは何だろうか。それを理解するために,まずはMACアドレスから説明しよう。「コンピュータ名とIPアドレスくらいは,自分で設定したから分かっている」という人も,MACアドレスまでは覚えていないだろう。MACアドレスは自分で設定するようなものではないからだ。基本的には,出荷時に各NICに全世界でただ一つの値が割り振られ,ROMなどに設定されている。MACアドレスは48ビットで構成し,前半部分はベンダーごとに異なる値,後半部分はそのベンダー内で固有な値になっている。

 MACアドレスは,他のマシンと異なるアドレスを振るといったアドレスの登録や維持を,ユーザーが意識して行う必要がない。実際にアプリケーション開発やシステム設計において,MACアドレスを意識している人はいないだろう。だが,このMACアドレスこそ,LANでのデータ転送の基礎となるものである。図1で示した“Aから”や“Cあて”は,このMACアドレスを用いて表現するからだ。具体的には,Ethernet上を流れるデータは,図2[拡大表示]のような構成をしている。フレームのタイプによって異なる部分はあるが,(1)あて先MACアドレス,(2)送信元MACアドレス,(3)データ,の順番に並んでいるということが分かればよい。

MACアドレスを基に中継するブリッジ

 図1は,1本のLANに接続されたマシン間のデータのやり取りのみを取り上げている。ただ,1つのLANは物理的な距離の制限や台数の制限などがあるため,ある程度の規模になると,複数のLANを接続する必要が出てくる。

 2つのLANをつなぐ機器,つまりLAN間接続装置は,大きく分けて3つある。リピータ,ブリッジ,ルーターである。リピータは電気信号を中継するものであり,データの単位であるフレームは認識しない。単に物理的な距離を延長するためや,ケーブル配線上の自由度を高めるために使用する。リピータで接続したLAN同士は,合わせて図1で示す1本のLANだと考えてよい。“ハブ”はリピータの応用製品,マルチポート・リピータである。つまり,あるマシンから送信されたデータは,ハブの他のポートすべてに送られる。

図3
 アドレスが関係するのは,ブリッジとルーターである。ブリッジは片方のポートから入ってきたデータのあて先MACアドレスを見て,それが他方のポートに接続されているMACアドレスであれば,データを中継する(図3[拡大表示])。逆に,入ってきたデータのあて先MACアドレスがそのポート側のものであれば,データを中継せずに廃棄してしまう。片方のLANに閉じるデータは,他方のLANに送出しないため,これによってトラフィックが制御され,ネットワーク全体の帯域を増やすことができる。これが,リピータとブリッジの最大の違いである。

 しかし,接続するLANの数が増えたり,WANに接続したりすると,ブリッジだけでは問題が起きてくる。極端な例として,インターネットがブリッジだけで構成されている状態を考えてみてほしい。自社とインターネットを接続する部分のブリッジのテーブルは,世の中のすべてのマシンのMACアドレスによって随時更新される。また,世の中のどこかのマシンが出したブロードキャスト・データは,すべて社内に届いてしまう。

 そこでIPアドレスの登場だ。一言でいうとIPアドレスは,ネットワークを複数に分け,そのネットワーク間の中継を効率的に行うためのものである。そしてIPアドレスに基づく中継を行うLAN間接続機器がルーターだ。

図4
 実は図2で示したEthernetフレームのデータの部分には,アプリケーションが送信したいと思ったデータのみが入っているわけではない。IPデータグラムが入っており,そのIPヘッダーには送信元IPアドレス,あて先IPアドレスなど,いくつかの情報が入っている(図4[拡大表示])。

ARPでIPアドレスからMACアドレスを調べる

 IPを利用しているネットワークでは,基本的には1つのMACアドレスに1つのIPアドレスがマッチングされている。そのため,図1でマシンAがCあてに送ったデータ(Ethernetフレーム)では,あて先MACアドレスにはマシンCのMACアドレスが,そのデータ内のあて先IPアドレスにはマシンCのIPアドレスが入っている。ユーザーはMACアドレスを意識することはほとんどないが,実は,接続したい相手をコンピュータ名で指定すると,最終的にはその相手のMACアドレスを調べ,そこにデータを送る。まずは“名前解決”と呼ぶもので,そのコンピュータ名をもつマシンのIPアドレスを調べ,さらにARPと呼ぶプロトコルで,そのIPアドレスに対応するMACアドレスを調べるのである。名前解決に関しては次回で詳しく解説するので,ここでは省略する。

 ARPで,同じネットワークの上にある相手マシンのMACアドレスを取得する仕組みは以下のようになっている。

 例えばIPアドレスがccccであるマシンCにデータを送る場合,ccccに対応するMACアドレスを調べる。各マシンは,最近データをやり取りした相手のIPアドレスとMACアドレスの“組”を,ARPテーブルとして保持している。MS-DOSプロンプトで

arp - a

と打ってみてほしい。その時に保持しているARPテーブルの一覧が出るはずだ。もしccccがARPテーブルになければ,「ccccというIPアドレスのMACアドレスを教えてください」というARPリクエストをブロードキャストする。するとマシンC が「IP アドレスがccccである私のMACアドレスはCCCCです」と答えを返す。

 実験をしてみよう。まず隣のマシンのIPとMACアドレスを調べる。ARPテーブルにそれらのデータがないことを確認してから,そのIPアドレスにpingをかけ,ARPテーブルを確認すると,隣のマシンのIPアドレスとMACアドレスの組が登録されていることがわかる。

図5
 しかし,単に送りたい相手のMACアドレスを調べるだけならば,名前解決の時にコンピュータ名から直接MACアドレスを調べられればよい。なぜコンピュータ名とMACアドレスの間にIPアドレスが入るのだろう。それは,ルーターの動作を知れば,理解できる。図3で説明したように,ブリッジはMACアドレスを見て,データを中継するかどうかを判断する(図5[拡大表示]a)。一方のルーターは,IPアドレスを基に中継を判断する(同b)。ルーターでは,各ポート配下は“異なるネットワーク”である。異なるネットワークのマシンにデータを送るときは,先に説明した同じネットワークの場合(ARPによるMACアドレスの取得)の方法は使えない。

 図5bでマシンCがマシンDにデータを送ろうと思ったとき,「ddddというIPアドレスのMACアドレスを教えてください」というARPリクエストをブロードキャストしても,そのリクエストはマシンDまで届かず,誰もARPリクエストに答えてくれないからだ。そこで,マシンCでの動作は,以下のようになる。

 (1)マシンDのIPアドレス「dddd 」が自分と同じネットワーク内かどうかを判断する。(2)同じネットワークであれば,ARPリクエストなどで「dddd 」のMACアドレス「DDDD 」を調べ,「DDDD」あてにデータを送信する。(2')(2)で異なるネットワークであれば,そのネットワークにデータを送ってくれるルーターのIPアドレス「gggg」を自分のルーティング・テーブルで知る。(3)「gggg 」のMACアドレス「GGGG」をARPリクエストなどで調べ,「GGGG」をあて先MACアドレス,「dddd」をあて先IPアドレスとしたデータを送信する。

 それが図5b の状態である。このデータを受け取ったルーターは,自分のルーティング・テーブルから「dddd 」が右側のLANにあることを知り,ARPリクエストなどで「dddd 」のMACアドレス「DDDD」を調べ,送信する。もちろんマシンDがさらに先のネットワークにある場合は,その中継を行ってくれるルーターに対してデータを送信する。図5bで分かるように,ルーターは中継においてMACアドレスの変換を行う。

 次回は,IPアドレスの補足説明と,第1回で解説したpingを使って,実際に名前解決を実感してみよう。

 この連載は,日経オープンシステムに連載した「新人SEのためのネットワーク入門」の内容をもとに,Webコンテンツとして再編集したものです。なお,日経オープンシステム別冊「新人SEのためのネットワーク入門」では,本記事の内容を詳しく説明するほか,実践編としてトラフィックの把握やネットワーク設計の実際などの内容もご紹介しております。内容のご確認とご購入は,http://coin.nikkeibp.co.jp/coin/nos/se/でお願いいたします。