|
送信元ホストからのIPパケットを宛先ホストへ送信するためにはどのような経路を通るかを決めなければならない。この経路を決定する処理をルーティングと呼ぶ。このとき最も重要な役割を果たすのがルータである。本節ではルータの役割と、パケットが宛先ホストに届くまでの過程をルーティングを通して説明する。まずはルータについて簡単に紹介する。
1.5.1 ルータ
パケットを宛先ホストに配送する際、パケットは複数のネットワークを経由する必要がある。ネットワーク間でパケットを中継する機器をルータと呼ぶ。ルータにもIPアドレスを割り当てる必要がある。ルータの主な役割にルーティングとフィルタリング(filtering)がある。
1.5.1.1 ルーティング
ルータはIPアドレスを元にネットワーク間のパケット配送を行う。この処理をルーティングと呼ぶ。 パケットを宛先ホストへ配送する際には「宛先がこのアドレスならここへ送る」という情報が必要になる。この情報の一覧表をルーティングテーブル(ルーティングテーブル)という。ルータはこのルーティングテーブルを元にしてパケットを次のルータまたはホストへ配送する。実際には、ルーティングテーブルはルータの管理者が手動で設定するか、ルーティングテーブルを自動的に作成するプロトコルを定義しなければならない。ここではルーティングテーブルはすでに作成されているものとして説明する。
1.5.1.2 フィルタリング
フィルタリングとは、不要なパケットの配送を拒否したり、特定のパケットのみを中継する機能である。ブロードキャストアドレスのパケットはこのフィルタリング機能によりルータを通過する事ができない。もし、ブロードキャストアドレスのパケットをルータが通過させると、ネットワーク上に大量のパケットが氾濫する事になってしまう。
ルーティングテーブルを作成するプロトコル(ルーティングプロトコル(routing protocol))についてはコース2の第3章で、ルータの概要や詳細な設定方法はコース3、コース4で行う。
1.5.2 パケットが宛先ホストに届くまでの処理
図1.5.1のようなネットワークでホストAからホストXにパケットを送ることを考える。個々のルータのルーティングテーブルは表1.5.2の通りである。
 |
|
図1.5.1:ネットワークのモデル
|
|
表1.5.2:各ルータのルーティングテーブル
|
|
ルータAのルーティングテーブル
|
目的のネットワーク
|
次のルータ
|
| 192.168.1/24 |
Direct |
| 192.168.2/24 |
192.168.2.1 |
| 192.168.3/24 |
192.168.2.1 |
| 192.168.10/24 |
192.168.2.1 |
|
|
ルータBのルーティングテーブル
|
目的のネットワーク
|
次のルータ
|
| 192.168.2/24 |
Direct |
| 192.168.1/24 |
192.168.1.1 |
| 192.168.3/24 |
192.168.3.1 |
| 192.168.10/24 |
192.168.10.1 |
|
|
ルータCのルーティングテーブル
|
目的のネットワーク
|
次のルータ
|
| 192.168.3/24 |
Direct |
| 192.168.1/24 |
192.168.1.1 |
| 192.168.2/24 |
192.168.2.1 |
| 192.168.10/24 |
192.168.2.1 |
|
|
ルータXのルーティングテーブル
|
目的のネットワーク
|
次のルータ
|
| 192.168.10/24 |
Direct |
| 192.168.1/24 |
192.168.2.1 |
| 192.168.2/24 |
192.168.2.1 |
| 192.168.3/24 |
192.168.3.1 |
|
|
ホストAのルーティングテーブル
|
目的のネットワーク
|
次のルータ
|
| 192.168.1/24 |
Direct |
| 127/8 |
Direct |
| 0.0.0.0 |
192.168.1.1 |
|
ホストAはホストXのIPアドレスを知っているものとする。パケットを送り出す際に、まず、ホストAは自身のルーティングテーブルを参照する。ルーティングテーブルはルータだけが持っているわけではない。ホストもルーティングテーブルをもっている。正確にはホストのTCP/IPアプリケーションが持っている。こういった機能のアプリケーションは最近のOSなら最初から付属している。例えばLinuxならば、netstat
-r コマンドでルーティングテーブルを参照できる。(図)
 |
|
図1.5.3:ホストのルーティングテーブルの例(Linux)
|
1.5.2.1 ホストAでの処理1−まずは出力先を決める−
ホストAでは、まず、パケットをどこへ出力するのかを決める。外部に接続するルータが1つのみの一般的なネットワークでは、宛先IPアドレスのネットワークアドレスによって3つのパターンがある。
1つ目は自身が所属しているネットワークアドレスのときである。このときのパケットは宛先ホストへ直接出力される。このようにルータを経由しないで直接ホストに送信することをダイレクトルーティングと呼ぶ。
2つ目はループバックアドレスのときである。このときパケットは外部に送出されずに自分自身が受け取る。
3つ目は上記2つ以外のアドレスのときである。このとき、パケットはあらかじめ設定してあるデフォルトゲートウェイ(ルータ)へ出力される。
 |
|
図1.5.4:経路決定の3つのパターン
|
この例の場合、目的のIPアドレスは192.168.10.10である。宛先はホストAが所属するネットワークでもなければ、ループバックアドレスでもない。したがって、デフォルトゲートウェイであるルータA(192.168.1.1)へ送出される。
1.5.2.2 ホストAでの処理2−ルータAのMACアドレスを取得する−
パケットの送出先は決まった。次はパケットをルータAに送信することになる。しかし、ここで思い出してもらいたい。パケットを実際に運搬するのはMACフレームの仕事である。もし、ホストA−ルータ間がEthernetならEthernet用のMACフレームが使用される。そして、MACフレームで送信するときは宛先MACアドレスと送信元MACアドレスが必要である。送信元MACアドレスは自身のMACアドレスなのですぐに知ることができる。しかし、送信先(この場合はルータA)のMACアドレスはどのようにして取得すればいいのだろうか。
ここで登場するのがARPだ。ARPはIPアドレスからそのホストのMACアドレスを知るためのプロトコルである。
ホストAは、まず、自身のARPテーブルを参照し、ルータAのMACアドレスが登録されているかを確認する。自ホストのARPテーブルはLinuxでは
arp -a コマンドで参照できる。もし、ARPテーブルにない場合はARP要求パケットをブロードキャストして、全てのホスト、ルータに対してルータAのIPアドレスに対するMACアドレスを問い合わせる。各ホスト(ルータ)はARP要求パケットを受け取ったら、内容を確認し、それが自分のIPアドレスならばMACアドレスを送信元(ホストA)に返す。
 |
|
図1.5.5:ARPによるアドレス解決
|
 |
|
図1.5.6:ホストのARPテーブルの例(Linux)
|
ルータAのMACアドレスを取得したら、MACフレームの完成である。MACフレームは図1.5.7のようになる。
 |
|
図1.5.7:ホストAから送信されるMACフレーム
|
送信先のIPアドレスは192.168.10.10(ホストX)、送信元IPアドレスは192.168.1.10(ホストA)、送信先MACアドレスはルータAのMACアドレス、送信元のMACアドレスはホストAのMACアドレスである。
これで準備は全て整った。パケットはルータAに送信される。
1.5.2.3 ルータAでの処理−宛先アドレスからネットワークアドレスを探る-
経路制御の際にルータが行うことは以下の通りである。
- MACフレームからIPパケットを取り出す。
- IPパケットの中から送信先IPアドレスを取り出す。
- 送信先IPアドレスのネットワークアドレスを算出する。
- 3.で求めたネットワークアドレスとルーティングテーブルから次のルータ、またはホストを決定する。
- パケットを送出する。
上の1.から5.の処理の中で問題なのが3.の「送信先IPアドレスのネットワークアドレスを算出する」である。なぜなら、IPヘッダにはサブネットマスクは格納されないため、送信先IPアドレスの中でどこまでがネットワークアドレスかが分からないためである。それでは、どのようにしてネットワークアドレスを算出するのだろうか。
ネットワークアドレスの算出は次のように行う。ルーティングテーブルの中で最もプレフィックス値の大きいサブネットマスクと送信先IPアドレスでAND(論理積)を求める。これを図1.5.1のケースに当てはめてみる。ルータAの場合では最も大きいプレフィックス値は24、そのサブネットマスクは255.255.255.0である。また、送信先のIPアドレスは192.168.10.10である。この2つのANDを求めると、192.168.10.0である。この求めた値が仮のネットワークアドレスである。
次にこの仮のネットワークアドレス(192.168.10.0)がルーティングテーブルの中にあるかどうかを調べる。ルータAのルーティングテーブルには192.168.10.0が存在し、次のルータは192.168.2.1(ルータB)と記されている。これが次の送信先になる。もし、一致するネットワークアドレスが存在しない場合、次に大きいプレフィックス値のサブネットマスクで計算し、以下繰り返す。最後まで一致するものがない場合、そのパケットを破棄するか、管理者があらかじめ設定しておいたデフォルトのルータに送信する。
 |
|
図1.5.8:ルータAにおける経路決定
|
ケットの送信先が決定したら、ホストAのときと同様にMACフレームを生成する。ルータAによって作成されたMACフレームは図1.5.9のようになる。
 |
|
図1.5.9:ルータAから送信されるMACフレーム
|
送信先のIPアドレスは192.168.10.10(ホストX)、送信元IPアドレスは192.168.1.10(ホストA)、送信先MACアドレスはルータBのMACアドレス、送信元のMACアドレスはルータAのMACアドレスである。このMACフレームはホストAから送信されたMACフレームとは別のものである。しかし、IPパケットの内容は変わらない。このようにパケットは、ネットワークが変わる度にMACフレームを乗り換えていくのである。
1.5.2.4 ルータBでの処理
ルータBでの処理はルータAの処理と全く同じである。次のルータはルータXになる。このとき生成されるMACフレームは図1.5.10のようになる。
 |
|
図1.5.10:ルータBから送信されるMACフレーム
|
送信先MACアドレスはルータXのMACアドレス、送信元のMACアドレスはルータBのMACアドレスである。IPパケットの内容は変わらない。
1.5.2.5 ルータXでの処理
ルータXでの処理もルータA、ルータBの処理とほとんど同じである。ただし、次のルータ欄がDirectとなっている。これはホストXがルータXがあるネットワークに所属していることを意味する。したがって、ルータXからホストXに直接パケットが送信される。このときのMACフレームは図1.5.11の通りである。
 |
|
図1.5.11:ルータXから送信されるMACフレーム
|
以上の手順でホストAからホストXにパケットが届く。この説明でIPアドレスとMACアドレスの役割が全く違うことが分かって頂けただろうか。
実際には、パケットが途中で行方不明になったり、ルータの故障などでパケットを送り届けることができなくなる場合がある。このようなトラブルに対処するためのプロトコルとしてICMPがある。ICMPについては次の章で説明する。
|