ネットワーク同士をつなぐ-IP Routing

 皆さんは既にハブやスイッチについて学習しました。スイッチやハブではインターネットは出来ません。皆さんは既に気づいていると思いますが、スイッチやハブのポートにつながっているのは全部同じサブネットに所属するホストです。スイッチやハブでは1つのサブネットを構成する事しかできないのです。これに対してルータは全てのポートがそれぞれ異なるサブネットに所属します。ということは異なるいくつかのサブネット同士をつなぐことが出来るということを意味します。ネットワーク同士をつないだものがインターネットワーク(inter-network)です。ルータを使うとインターネットワークが構築できます。このインターネットワークを世界規模にまで拡大したものがインターネットです。これは世界で1つのものですから、固有名詞になります。これがいわゆる"the Internet"ということになります。



1 IPルーティングの基本動作

 インターネットは小さなネットワーク(サブネット)の集まりです。インターネット通信をするためにはサブネットを越えてパケットを運ぶ装置が必要です。サブネットを越えてパケットを運ぶ装置は、複数のサブネットを跨ぐ形で設置されている必要があります。この装置がルータ(Router)と呼ばれる装置です。

 ルータはNIC(Network Interface Card)を装着した装置です。インターフェースとは境界面とか、接点とか言う意味の言葉で、IT関係では2つのものが接続する箇所や、両者の間で情報や信号をやり取りするための手順や規約などを意味しています。NICはNIC同士で信号のやり取りをしますが、その信号のやり取りは通常は有線ケーブルを介して行います。従って、通信ケーブルを差す部分がないといけません。この部分をポートと言っています。

インターフェース毎に異なるサブネットに所属

 各ポートはサブネットにつながっていますが、ポートはその属するサブネットと同じネットワークプレフィックスを持っています。上の図でブロードキャストドメインAのネットワークプレフィックは"192.168.1.0/24"ですが、ルータ1のインターフェース0(if0)のネットワークプレフィックスも"192.168.1.0/24"です。ルータ1のインターフェース1(if1)のネットワークプレフィックスは"192.168.2.0/24"ですから、インターフェース0とプレフィックスが異なっています。

 ルータの基本動作はいくつかあります。まず、パケットを受信することです。次にこのパケットをどのインターフェースから出すかを決めることです。出力インターフェースが分かったら、パケットをフレームでカプセル化して送信します。パケットの受信はただ受信するだけですので、難しい問題はありません。出力インターフェースが決まったらフレームでカプセリングしてパケットを送信するという場面ではARPが関係して来ます。この部分に関しては既にARPの章で説明しています。

 ルータの重要な仕事は受信パケットをどのインターフェースから送り出すかを決定することです。これにはルーティングテーブルが重要な機能を果たします。それから、このルーティングテーブルをどのように作るかという問題もあります。これに関しては手動で行う方法と、ルーティングプロトコルというプログラムを使う方法があります。

 ルーティングテーブルを如何にして作成するかについてはまた後で説明することにして、次はルーティングテーブルを参照して、ルートを決定する方法について説明します。


2 ルートの決定

 次にルーティングテーブルのエントリの例を示します。

情報源 宛先 距離 nexthop 経過時間 インターフェース
R 190.165.230.0/24 [120/1] 125.10.40.33 00:00:17 FastEthernet0/1

 最初の例の情報源は、そのルートをどのようにして入手したかを示します。管理者が手動で書いたのか、ルータがそのサブネットに直接接続しているために自分で入手したのか、あるいはルータ同士の情報交換で入手したのかなどです。ルーティング同士で情報交換するプロトコルをルーティングプロトコルと言います。ルーティングプロトコルにはいくつかの種類があります。上の例の"R"はRIPというルーティングプロトコルで入手したルートであることを示しています。
 次は宛先です。
 その次は距離ですが、ここは「アドミニストレーティブディスタンス/メトリック」となっています。アドミニストレーティブディスタンスとは管理的な距離ということになります。上で述べましたようにルートを手に入れる方法には様々な方法がありますが、その方法の評価値がアドミニストレーティブディスタンス値です。この値は、ルーティングプロトコル、手動設定、自動取得などによって予め定義されています。小さな値のルートほど優先度が高くなります。120というのはRIPの評価値になります。ここではアドミニストレーティブディスタンスと「メトリック」が一緒に示されています。メトリック(metric)は距離を表します。このメトリック値もルートを入手する手段ごとに異なります。RIPの場合には、ルートをいくつ越えるかの回数を表しています。上の例の「1」は隣のサブネットが宛先ネットワークがあることを示しています。
 nexthopは隣のルータのことです。宛先ネットワークへの最適ルートの場合の次のルータという意味です。
 次は経過時間です。そのエントリを入手してからどれくらい時間が経っているかということです。あまり時間が経過しすぎていると、もうそのルートはないかも知れません。
 最後はnexthopへパケットを送り出すときの出口(インターフェース)です。

 次に宛先フィールドが190.165.230.20というパケットを受け取ったとします。ルータはこの宛先アドレスをルーティングテーブルのエントリとどのように比較するのでしょうか。パケットヘッダフィールドにはサブネットマスクの情報が入っていないことに注意して下さい。サブネットマスクという概念は後で取り込まれた概念ですので、パケットにはそのようなフィールドは元々なかったのです。ルータは受信パケットの宛先アドレスを取り出します。このアドレスをルーティングテーブルの各エントリの宛先ネットワークと順次比較していくのですが(実際は上から順番に比較するのではなくもっと効率的な比較の方法がありますが、専門的になりますので、順次比較するものと考えて下さい)、このとき比較しようとするエントリのサブネットマスクの情報を使って計算します。計算は論理積という方法で行います。

 論理積(AND)は2つの値(この場合はビット列)を比較して、双方が1であれば1を、どちらか一方でも0なら(両方とも0でも)0を出力するという演算です。1 AND 1 = 1、1 AND 0 = 0、0 AND 1 = 0、0 AND 0 = 0となります。

 それでは実際に計算してみましょう。宛先アドレスは190.165.230.20です。比較しようとするエントリのサブネットマスクは/24ですので、255.255.255.0となります。この2つを各桁毎にAND計算をします。

   190.165.230.20= 10111110 10100101 11100110 00010100
AND)  255.255.255.0= 11111111 11111111 11111111 00000000
   190.165.230.0= 10111110 10100101 11100110 00000000

 計算結果は190.165.230.0でこれは比較しようとしたエントリのネットワークアドレスと一致しています。今回はぴったりと一致したエントリが1だったので問題はありませんが、ぴったりと一致してしまったエントリが複数見つかった場合はどうしたらいいでしょうか?

 受信パケットの宛先アドレスが「200.10.38.200」でルーティングテーブルのエントリが、「200.10.32.0/21」と「200.10.38.0/23」だとしましょう。これで、上の様に計算をしてみたいと思います。

宛先ネットワーク
200.10.32.0/21
200.10.38.0/23

 初めは、「200.10.32.0/21」との比較です。/21のマスクは255.255.248.0です。計算の結果は「200.10.32.0」ですので、ルーティングテーブルのエントリの「200.10.32.0/21」と一致します。

  200.10.38.200= 11001000 00001010 00100110 11001000
AND 255.255.248.0= 11111111 11111111 11111000 00000000
  200.10.32.0= 11001000 00001010 00100000 00000000

 次は「200.10.38.0/23」との比較です。/23は255.255.252.0となります。計算結果は「200.10.38.0」ですので、ルーティングテーブルのエントリの「200.10.38.0/23」とぴったり一致します。

  200.10.38.200= 11001000 00001010 00100110 11001000
AND 255.255.252.0= 11111111 11111111 11111110 00000000
  200.10.38.0= 11001000 00001010 00100110 00000000

 どちらのエントリも受信パケットの宛先アドレスから抽出したネットワークプレフィックスとぴったり一致してしまいました。このような場合にはどうしたらいいでしょうか。このような場合はロンゲストマッチという方法を使います。200.10.32.0/21とは21ビットマッチしています。これに対して、200.10.38.0/23とは23ビットマッチしています。この場合、マッチしているビット数が長い方の「200.10.38.0/23」がロンゲストマッチということになります。






3 ルーティングアルゴリズム

 ルーティングテーブルの生成に関してはいくつかの方法があります。

3.1 スタティックルーティングとダイナミックルーティング

 スタティックルーティング(static routing)はネットワークの管理者が予めオフラインで計算し、ルートを決める方法です。
 スタティックルーティングには帯域を消費しない、CPUに負荷をかけないというメリットがあります。ダイナミックルーティングではお互いのルート情報を交換し合うために頻繁に通信を行いますが、スタティックルーティングではそのような必要がありません。しかし、スタティックルーティングでは手作業で設定を行いますので、ネットワークの変化に柔軟に対応することができません。また、全部手作業で行いますので、大規模ネットワークでは管理の手間が膨大になります。

 ダイナミックルーティングでは、ルータ同士がネットワークに関する情報を交換し合い、自律的にルートの計算を行います。ネットワーク障害によって、あるルートが使えなくなったとしても、ルータ同士の情報交換の結果、ルータはそれを知り、最適ルートの再計算をすることが出来ます。ただし、ルータ同士が定期的に情報を交換し合いますので、帯域を消費し、CPUに負荷をかけることになります。また、設定ミスによって間違った情報が広報されることもあり、その結果ネットワークが通信不能に陥ってしまうこともあります。

 大規模ネットワークではダイナミックルーティングという選択肢しかありません。大規模ネットワークで障害が発生した場合に手作業でそれを修復するのは無理です。しかし、スタティックルーティングが使われるという場面がないわけではありません。それは次のような場合です。

● 外のネットワークへの出口が1つの場合
● 回線の帯域幅が狭い場合
● 低機能のルータを使っている場合

 次にデファクトスタンダードになっているCiscoシステムズのスタティックルートのコマンドを示します。
ip route <宛先ネットワークアドレス><サブネットマスク><出口インターフェース>


3.2 ディスタンスベクタ型とリンクステート型

 ダイナミックルーティングのアルゴリズムには大きく分けてディスタンスベクタ型とリンクステート型があります。ディスタンスベクタ型は古くからあるタイプで、実装や設定が単純です。代表的なものとしてRIPがあります。大きなネットワークの管理には向いていません。リンクステート型は新しいプロトコルで、OSPFが代表的な例です。大きなネットワークにも対応できます。

 ディスタンス(距離、distance)とベクタ(方向、vector)を基準にして最適ルートを決める方法です。代表的なRIPではホップ数(ルータをいくつ越えるか)によって最適ルートを決定します。ディスタンスベクタ型では、自分の視点から見たルート情報(相対的な情報)を送信します。受信者は受信した情報を自分の視点から見たものに修正します(実装では、最初から相手の視点で見たものに直してから送ります)。このようにして情報を修正しながらバケツリレーしていきます。ルート情報を修正しつつバケツリレーするので情報が全体に行きわたるのに時間がかかります。この場合の全体とは例えばRIPでルート情報をやり取りしているルータのネットワークのことです。ルータは実際のネットワークトポロジとルーティングテーブルの間の矛盾を修正しつつ情報をバケツリレーしていきますので、ネットワーク全体からみると、ルーティングテーブルとネットワークトポロジの間の整合性が取れたところと、矛盾が残ったところとが混在してしまいます。この混乱状態がルーティングループを発生させてしまいます。

 ルーティングテーブルと実際のネットワークトポロジーの間の矛盾が解消されることを収束と言います。ルータ間で一斉に(同期して)ルーティングテーブルを修正すれば、収束時間が短くなり、結果的にループの発生は抑えられます。このような方法を取っているのがリンクステート型のルーティングプロトコルです。
 ディスタンスベクタ型はルーティングテーブルそのものを交換しますが、リンクステート型のルーティングプロトコルでは、リンクステート情報を交換します。リンクとはネットワークで、ステートは状態ですから、ネットワークの状態、具体的にはルータとネットワーク間の接続の状態を交換します。これはディスタンスベクタ型の使っている相対情報ではなく、絶対情報です。
 リンクステート型の急速な収束を助けているのはそれだけではありません。リンクステート型ではネットワークをエリアに分けて、エリア内のルータが隣接関係を構築します。隣接関係のあるルータ間でリンクステートデータベースを同期させ、それを元にして各自でルーティングテーブルを算出します。リンクステートデータベースを同期させるのでループの発生は抑えられます。また、エリアを小さくすれば、ルーティングテーブルの再計算もすぐに終わります。
 エリアの外へは簡略化したリンクステート情報しか送りません。エリア内のネットワーク障害の情報はエリア外に出しませんので、エリア外ではルーティングテーブルの再計算の必要はありません。


3.3 非階層型と階層型

 ディスタンスベクタ型の様にネットワークを一様に取り扱うタイプと、リンクステート型の様にネットワークをいくつかのエリアに分割して、階層的に扱うタイプがあります。概して階層型の方が素早く収束します。

3.4 IGPsとEGPs

 IGPsとEGPsの違いはASの中だけで機能するか、AS間で機能するかの違いです。AS(Autonomous Sysetm、自律システム)とは大規模なTCP/IPネットワークにおいて、各組織が保有・運用する自律したネットワークのことです。ASは単一のルーティングポリシーを持つネットワークのことで、個々のISPや企業や大学などが保有するネットワークのことです。内部がどんなに複雑でも外から見ると1つのネットワークに見えます。インターネットはマクロの視点から見ると、このASを相互に接続したものと言えます。ASは各国のNICが発行するAS番号を持っていて、これによって識別されます。

 IGP(Interior Gateway Protocol)はAS内のルーティングに使われるルーティングプロトコルでRIPやOSPFなどがあります。EGP(Exterior Gateway Protocol)はAS間のルーティングに使われるルーティングプロトコルでBGPなどがあります。


3.5 クラスフルとクラスレス

 ルーティング情報の中にサブネットマスクの情報を含ませるかどうかの違いで、クラスフルルーティングプロトコルと、クラスレスレスルーティングプロトコルがあります。
 RIPなどの昔からあるルーティングプロトコルはサブネットマスクは含んでいませんでした。これをクラスフルと言います。これに対して、OSPFなどの最近の新しいものはサブネットマスクの情報を含んでいます。これをクラスレスと言います。RIPのVersion2はクラスレスになっています。

 最近はクラスフルのルーティングプロトコルはほとんど動いていませんので、あまり不都合は起きないのですが、参考のためにクラスフルルーティングの不都合を例示しておきます。クラスの概念にもとづいて、IPアドレスのネットワークアドレスとして予約されているバイト部分をメジャーネットワークと呼びます。例えば、10.2.100.0/24のメジャーネットワークは10.0.0.0/8となります。また、クラスの概念で考えると異なるネットワーク同士を接続するルータのことをメジャーネットワーク境界と言います。

メジャー境界を越えるときにデフォルトマスクを適用

 メジャーネットワーク内では推測でマスクを適用します。どのように推測するかというと、自分のインターフェースに付けられたマスクをそのまま適用します。しかし、メジャーネットワークを越える場合は、予測の範囲外ですので、デフォルトマスクが適用されます。例えば、「172.1.3.0」がルータCを越えてルータBに行くときは「172.1.0.0」となります。「172.1.4.0」も同じ扱いを受けますので、ルータB、ルータAからは見えなくなります。同様に「172.1.2.0」、「172.1.1.0」もルータCに行くと見えなくなってしまいます。また、「1.1.1.0」は同様の理由で、ルータAからは見えません。





3.6 アドミニストレーティブディスタンス値とメトリック値

 ルーティングプロトコル毎にルートの計算方法が異なりますので、最適ルートが異なっている可能性があります。従って、ルータで複数のルーティングプロトコル(の実装)が稼働している場合、どのルーティングプロトコルのルートを最適ルートとしてルーティングテーブルに記載するべきかという問題が起きます。このときにルートを評価する基準が必要となります。この基準をアドミニストレーティブディスタンス値と言います。アドミニストレーティブディスタンス値は予め定義されています。次に示すのはCiscoシステムズのIOS(Internetworking Operationg System、ルータのOS)が採用している定義です。アドミニストレーティブディスタンス値が小さいものほど優先されます。

ルートの情報源 アドミニストレーティブディスタンス値
直接接続 0
スタティックルート 1
EIGRPサマリー 5
外部BGP(eBGP) 20
EIGRP内部ルート 90
IGRP 100
OSPF 110
IS-IS 115
RIP 120
EGP 140
EIGRP外部ルート 170
内部BGP(iBGP) 200
不明(unknown) 255

 メトリック値はルーティングプロトコルがルートの良しあしを測るときに使う指標です。信頼性、遅延、帯域幅、負荷、パスの長さ、通信コストなどを元にして決めます。RIPはホップ数、OSPFは通信コスト、BGPはパス属性でそれぞれ決めています。いくつかの要素を総合的に判定して決めるプロトコルもあります。



4 RIP

 RIP(Routing Information Protocol)は、とても古いプロトコルでインターネットを開発する時点で、既に[routed」というプログラムとしてUNIX(BSD系のUNIX、4.3BSD)上で動いていました。RIPの仕様はRFC1058で策定されていますが、この規格も「routed」を元にしたものです。この規格は現在RIP version1(RIPv1)として知られています。その後、RIPv1を改良したRIPv2がRFC2453として規定されています。

 最初にRIPv1の特徴を説明し、RIPv2についてはRIPv1と異なる点について説明したいと思います。

 RIPはダイナミックルーティングプロトコルで、IGPsで、代表的なディスタンスベクタ型のプロトコルで、非階層型で、クラスフルです。メトリック値としてはホップ数を採用しています。

 既に説明しましたが、ディスタンスベクタ型のルーティングプロトコルは収束(コンバージェンス、convergence)が遅くなります。何故かというと、ネットワーク全体を平面的に捉え、更に情報伝達をバケツリレーにしているため、トポロジーの変化の影響が及ぶ速さよりも、トポロジー変化の情報の方が、全体に行きわたるのが遅れてしまうためです。そのため、大きなネットワークでは適用が難しくなります。この問題の影響をできるだけ顕在化させないためには、ネットワーク規模を制限する必要があります。RIPではホップ数の限界を15までに限定しています。ルーティングテーブル上にホップ数16と記録されている場合は、そのネットワークへは到達不能であることを示します。

 ディスタンスベクタ型のルーティングプロトコルでは、基本的にベルマンフォードというアルゴリズムを採用しています。ディスタンスベクタ型の代表的なプロトコルであるRIPもこのアルゴリズムを採用しています。このアルゴリズムを採用するとルーティングループが発生しやすいという問題があります。更に、収束が遅いという特徴が重なると、ルーティングループの発生確率が増大します。

 次に、ベルマンフォードアルゴリズムについて説明しますが、その前に確認しておかなくてはならないことはRIPではルーティングテーブルに記載されている情報がやり取りされるということです。情報は次に説明するスプリットホライズンの原則に従って配信されますので、ルーティングテーブルの情報全部というわけではありません。

ベルマンフォードアルゴリズムの特徴
① 受信したルートと同じエントリがルーティングテーブル上になければ、そのルートを受け入れる。
② 受信したルートと同じエントリがルーティングテーブル上に既にある場合、ネクストホップアドレスが異なればメトリックによって優劣を決し、ネクストホップが同じなら新しいルートを無条件で受け入れる。

 既存のエントリと同じルート(ネクストホップが同じで、メトリックも同じ)を受信したら、ルートに何も変化がない、ネクストホップが同じでメトリックが小さい場合は、より良いルートが見つかったということでいいと思います。では、ネクストホップが違って、メトリックが小さい場合はどうでしょうか?もしかしたら、以前のルートがダウンしたのかもしれません。ベルマンフォードアルゴリズムの考え方は、「古いルートがだめなら、新しいルートで」という単純なものですが、この考え方で直ちに新しいルートを採用するとループを発生させる可能性があります。

ネットワークが収束した状態
10.1.1.0がダウンしてメトリックが16に

このことはルータAは知っているが他のルータは知らない



ルータBからの情報にルータAは勘違い

 ルータBが10.1.1.0/24のホップ数を2として発信すると、ルータAは新しいルートが発見されたものと勘違いして、このルートをルーティングテーブルに載せてしまいます。宛先が10.1.1.0/24のパケットは、ルータAはルータBをネクストホップにし、ルータBはルータAをネクストホップにしているので、ルータAとルータBの間でピンポン状態になってしまいます。

 いかがですか?上の様に単純極まりないネットワーク構成でも簡単にループが発生してしまいます。そこでRIPではループを防ぐための方法をいくつか取り入れています。

 RIPが採用しているループ防止の方法の第一がスプリットホライズン(split Horizon、水平分割)です。これは、情報をくれた隣接ルータにはその情報を返さないという方法です。上の例でいえば、ルータBは「10.1.1.0/24」をルータAからもらっていますから、スプリットホライズンの原則から言えば、これをルータAに戻してはならないということになります。

 ディスタンスベクタ型のルーティングプロトコルが採用するベルマンフォードアルゴリズムは本質的にループ発生の危険性を内蔵しており、収束が遅いということが更にループ発生の危険性を増長させているということは既に説明した通りです。このためRIPではループの発生を防止する方法をスプリットホライズン以外にいくつか採用しています。その1つが、トリガーアップデートです。RIPは30秒に1回の割合で定期的に情報交換を行いますが、障害の発生を検知した場合は、定期的な連絡時間を待たずに即時に連絡すべきです。RIPではこの方法を取り入れています。これをトリガーアップデートと言います。

 それからルートポイズニングという手法も採用されています。上の例で、ルータAは「10.1.1.0/24」がダウンしたことを知ったら、それを直ぐに隣接ルータBに知らせるべきだったのです。そして、更にルータBはルータCに知らせるべきでした。こうすればネットワーク全体が素早く「10.1.1.0/24」のダウンを知ることが出来て、ループの発生は抑えることが出来たはずです。このためにはベルマンフォードアルゴリズムの原則だけでルーティングテーブルを作るのではなく、若干の修正が必要となります。つまり、メトリックが「16」のルートは、受け入れてルートを書き換えるということです。

 ネットワークは障害に備えて冗長構成を採用している場合が多いのですが(特に大規模ネットワークでは必須)、このような場合は、スプリットホライズンの手法を採用しても、ループが発生してしまいます。

冗長構成で収束している状態

 上のネットワークで収束しているとしましょう。ここで、「10.1.4.0/24」がダウンしたと考えて下さい。ルートポイズニングのルールに従って、ルータCは「10.1.4.0/24 hop 16」という情報をルータBとルータDにします。次にルータBから、ルータAに、ルータDからルータAにこのことが連絡されれば問題はありません。トリガーアップデートが採用されているので、そうなることが多いと思います。しかし、ディスタンスベクタ型の場合は、情報の送信が同期していませんので、そうなるとは限りません。次のタイミングで、ルータAは「10.1.1.0/24 hop3」という情報をスプリットホライズンの方式に沿って、ルータBとルータDに連絡してしまう可能性は残っています。もし、そうなるとルータBとルータCはこれを信じて、ルーティングテーブルを更新してしまうことになります。

 このような場合に頼りになるのがポイズンリバースという考え方です。ポイズンリバースでは、「hop 16」の連絡に関しては、スプリットホライズンを法則を破って、情報をもらった方向へも、つまりスプリットホライズンの原則からは逆の方向へも(つまり、全ての方向へ)送信します。でも、これだけだとうまく行きません。もう一つホールドダウンタイマを使います。「hop 16」のルートをもらったら、ホールドダウンタイマをスタートし、タイムアップするまで、そのエントリは書き換えません。

hop 16を書き込んだエントリはホールドダウンタイマをスタート

 「hop16」を受信したエントリについてはホールドダウンタイマをスタートし、タイマがタイムアップするまで、そのエントリは書き換えません。ルータB、ルータDは、ルータCから「10.1.4.0/24 hop 16」を受信したときにホールドダウンタイマをスタートさせます。それと、同時にルータCに(つまり、スプリットホライズンの原則からは逆方向に)「10.1.4.0/24 hop 16」を返します。ルータCはこれを受信し、ルーティングテーブルに記載し、同時にホールドダウンタイマをスタートさせます。

 タイミングによっては、ルータAからルータB、ルータDに「10.1.4.0 hop 3」という情報が届いて、それをルーティングテーブルに保存することがあるかも知れません。しかし、いずれはルータAの「10.1.1.0/24」の情報もそのうちに「hop 16」になります。

 RIPv1はクラスフルルーティングプロトコルですので、うまくルーティングできない場合もあります。これについては、既に説明しました


 RIPはアプリケーション層のプロトコルで、ポート番号は520です。トランスポート層のプロトコルはUDPを使います。このパケットを30秒に1回定期的に配信します。配信の仕方はブロードキャストです。これは何を意味しているでしょうか?RIPの情報を聞きたくないホスト(RIPの実装が稼働していないホスト、たとえばごく普通のクライアントコンピュータ)にも、RIPの情報がどんどん送られてくるということです。RIPがアプリケーションだということは、この役に立つはずのないパケットをネットワーク層、トランスポート層、アプリケーション層にまで上げて行かなくてはなりません。そして、最後のアプリケーション層のところで、520番ポートにつながる(bind)実装が動いていないということで破棄されます。かなり無駄なことをしているわけですね。

 それでは最後にRIPv2について少し説明をしておきます。RIPv2はクラスレルルーティングプロトコルですので、クラスフルルーティングプロトコルで説明したような不都合はありません。クラスレスということは、サブネットマスクの情報を運ばなくてはなりませんので、RIPv2メッセージのヘッダにはサブネットマスクのフィールドがあります。それから、RIPv2ではブロードキャストではなく、マルチキャストを使っています。RIPv2が情報配信に使っているアドレスは224.0.0.9で、これは全てのRIPv2ルータをターゲットとするという意味になります。普通のクライアントコンピュータのIP(ネットワーク層)は、224.0.0.9を自分のアドレスと認識しませんので、このマルチキャストパケットを破棄します。

 ディスタンスベクタ型のルーティングプロトコルには様々なデメリットがありますが、それが顕在化するのは大きなネットワークを管理する場合です。小さなネットワークを管理する場合は、そのデメリットは余り表面化しません。また、扱いが簡単で、高機能なルータでなくても動かすことが出来ますので、これからも小さなネットワークでは使われ続けるかもしれません。しかし、大規模なネットワークの管理には向いていないことは明らかです。何かディスタンスベクタ型に変わる選択肢が欲しいところです。





5 OSPF

 ディスタンスベクタ型に代わるべきものとして期待されるのがリンクステート型のルーティングプロトコルです。リンクステート型のルーティングプロトコルにもいくつかの種類がありますが、代表的なものがOSPF(Open Shortest Path First)です。

 OSPFはRIPと同様にIGPsのプロトコルですので、AS内部でのルーティングに利用します。クラスレスのルーティングプロトコルで、メトリックにはコスト値を使っています。コスト値は帯域幅に基づいて予め定義されていて、パス毎にコスト値を合計することで、パスの優劣を決めていきます。OSPFは収束が速いという特性を持っていますが、これが大規模ネットワークに対応できる秘密です。そして、この収束の速さの原因が、ルーティングテーブルと実際のネットワークトポロジーの矛盾を早期に解消するための工夫です。この工夫にはいくつかの側面がありますが、その第一がネットワークを階層構造で把握すること、その第二がOSPFルータ間でデータベースを同期させてから、各自がルーティングテーブルの計算をすることです。

 階層構造でネットワークを把握するということはネットワークをエリアに細分化して、このエリア内で情報を交換するということです。このときに交換する情報をリンクステートと言います。RIPの場合にはルーティングテーブルそのものを交換していましたが、リンクステートはルーティングテーブルではなく、ルータとネットワーク(リンク)の接続関係(状態)です。このリンクの状態をエリア内から集めて各自がデータベースを構築します。そして、エリア内のルータがこのリンクステートのデータベースを同期させた上で、用意ドンで各自ルートの計算を行い、自分でルーティングテーブルを作成します。ループ発生の原因はディスタンスベクタ型やRIPのところで説明したように、新しいネットワークトポロジにマッチしたルーティングテーブルを持っているルータと、マッチしていない(まだ古いネットワークトポロジにマッチしたルーティングテーブルを保持している)ルータが混在していることです。しかし、リンクステート型はエリア内のOSPFルータがデータベースを同期させた上に、一斉にルートの計算に入るので、ループが生成される可能性が極めて小さくなります。
 ネットワークをエリアに細分化して、その中でルートの計算を行いますので、エリア内のルートの計算は簡単になります。そして、エリア間で共有する情報は必要最小限にしています。つまり、エリア間では簡略化されたリンクステートをやり取りします。そのため、ネットワークトポロジが変更されても、それがエリアの外ならば、そのことに関係した情報はエリアには入ってきません。ということは、エリア外でトポロジに変化が起きても、ルート再計算の必要はないということになります。

 OSPFについて詳しく知りたい方はこちらをご覧ください。





更新履歴

2016/03/10 作成





























 ページの先頭