2013年12月15日日曜日

Tremaを試す ~simple-ruter その1~

サンプルプログラムの中にあるsimpel-routerのソースコードを見ていきたいと思います。

ただし、simple-routerのソースに入る前にルータが何をしているのかを調べておきます。

今回はルータやL3スイッチなどの動作の一つ、ルーティングおよびルーティングテーブルについてです。

ルーティングとはパケットを宛先まで送る際に、最適な経路の選択をする事を言います。
その経路を選択するのに使用するのがルーティングテーブルです。
ルーティングテーブルには宛先までの経路情報が記録されています。

ルータ等はパケットの宛先IPアドレスを元にルーティングテーブルを参照して、次はどこにパケットを送るかを決定します。
ルーティングテーブルから次のパケット転送先が特定出来ない場合、パケットは破棄されます。

■ルーティングテーブルには以下のような情報が記録されています。
宛先ネットワーク 宛先ネットワークアドレスとネットマスクの情報。
ルーティングをする際は宛先IPアドレスと宛先ネットワーク情報から経路を選択する
ネクストホップ 宛先ネットワークに到達する為に、次のパケット送り先となるネットワーク情報。
メトリック 宛先ネットワークへの経路が複数存在する場合の優先順位です。
出力インターフェイス ネクストホップのパケット出力先インターフェイス。
その他 経路を学習してからの経過時間や経路の情報源等

■ルーティングテーブルの作られ方
・スタティックルーティング(静的経路制御)
管理者の手でルート情報をルーティングテーブルに追加しておく方法です。

・ダイナミックルーティング(動的経路制御)
ルーティングプロトコルにより自動でルーティング追加・管理させる方法です。


以下はルーティングテーブルに関する動作についてです。

■ルート集約
ルーティングテーブルの複数の経路情報のエントリをまとめる事です。
エントリをまとめる理由は、宛先毎に経路情報を保持していくとルーティングテーブルのエントリーががどんどん多くなり、経路を見つけるまでの時間がかかるようになったり、大量のメモリが必要になるためです。

例えば以下の2つのルーティングは一つにまとめられます
宛先ネクストホップ 宛先ネクストホップ
192.168.0.0/24ルータ1 192.168.0.0/23ルータ1
192.168.1.0/24ルータ1

この例を2進数表示と合わせて表にすると以下のようになります。
まずは集約前のルーティングテーブルの状態です。
宛先(10進数)宛先(2進数)ネクストホップ
192.168.0.0/24 11000000.10101000.00000000.00000000ルータ1
192.168.1.0/24 11000000.10101000.00000001.00000000ルータ1

この2つの経路情報はネクストホップが同じであり、サブネットマスクを/24から/23にする事で両方のネットワークを表すことができるため、エントリを一つにまとめることができます。
サブネットマスク/24から/23にすると以下のようになります。

11111111.11111111.11111111.00000000
11111111.11111111.11111110.00000000

例のルーティングテーブルのサブネットマスクを/24→/23に変更したネットワークアドレスは以下のようになります。
宛先(10進数)ネットワークアドレス(2進数)ネクストホップ
192.168.0.0 11000000.10101000.0000000ルータ1
192.168.1.0 11000000.10101000.0000000ルータ1

このように全く同じ内容になるため、集約できるわけです。

■ロンゲストマッチ
宛先ネットワークへの経路が複数存在する場合、プレフィックス長が長い方を選択します。
例えば以下のルーティングテーブルを持つルータを経由して192.168.1.1へパケットを送る時は 2の経路が選択されます。

No宛先ネクストホップ
1192.168.0.0/16ルータ1
2192.168.1.0/24ルータ2

以上です。

0 件のコメント:

コメントを投稿