ルーティングアルゴリズムのしくみ

Nov 19 2002
ルーターがどのように機能するか知っていると思いますか?これらのデバイスは、複雑な式を使用して、パケットの送信先と送信方法を正確に把握します。ルーティングアルゴリズムのすべてを学びます。
ルーターがどのように機能するか知っていると思いますか?これらのデバイスは、複雑な式を使用して、パケットの送信先と送信方法を正確に把握します。コンピュータネットワークの写真をもっと見る。

ルーターのしくみの記事を読んだら、ルーターがネットワークトラフィックを管理し、パケットを送信するための最適なルートを見つけるために使用されていることを知っています。しかし、ルーターがこれをどのように行うかについて考えたことはありますか?ルーターは、パケットの送信方法と送信先を決定するために、ネットワークステータスに関する情報を持っている必要があります。しかし、彼らはどのようにしてこの情報を収集するのでしょうか?

この記事では、パケットの送信先を決定する際にルーターが使用する情報を正確に調べます。

コンテンツ
  1. 基礎
  2. LSアルゴリズム
  3. 例:ダイクストラアルゴリズム
  4. DVアルゴリズム
  5. 階層型ルーティング

基礎

ルーターはルーティングアルゴリズムを使用して、宛先への最適なルートを見つけます。「最適なルート」と言うときは、ホップ数(パケットがネットワーク内のあるルーターまたは中間ポイントから別のポイントに移動する)、時間遅延、パケット送信の通信コストなどのパラメーターを考慮します。

このコンテンツは、このデバイスと互換性がありません。

ルーターがネットワークの構造に関する情報を収集する方法と、情報を分析して最適なルートを指定する方法に基づいて、グローバルルーティングアルゴリズム分散ルーティングアルゴリズムの2つの主要なルーティングアルゴリズムがあります。分散型ルーティングアルゴリズムでは、各ルーターは直接接続されているルーターに関する情報を持っています。ネットワーク内のすべてのルーターを知っているわけではありません。これらのアルゴリズムは、DV(距離ベクトル)アルゴリズムとも呼ばれます。グローバルルーティングアルゴリズムでは、すべてのルーターがネットワーク内の他のすべてのルーターとネットワークのトラフィックステータスに関する完全な情報を持っています。これらのアルゴリズムは、LS(リンク状態)アルゴリズムとも呼ばれます。次のセクションでは、LSアルゴリズムについて説明します。

LSアルゴリズム

LSアルゴリズムでは、すべてのルーターは次の手順に従う必要があります。

  1. 物理的に接続されているルーターを特定し、それらのIPアドレスを取得します。ルーターが動作を開始すると、最初にネットワーク経由で「HELLO」パケットを送信します。このパケットを受信する各ルーターは、そのIPアドレスを含むメッセージで応答します
  2. 隣接ルーターの遅延時間(または平均トラフィックなど、ネットワークの他の重要なパラメーター)を測定します。これを行うために、ルーターはネットワークを介してエコーパケットを送信します。これらのパケットを受信するすべてのルーターは、エコー応答パケットで応答します。ラウンドトリップ時間を2で割ることにより、ルーターは遅延時間をカウントできます。 (ラウンドトリップ時間は、ネットワーク上の現在の遅延の尺度であり、パケットがリモートホストからバウンスされるタイミングによって検出されます。)この時間には、送信時間と処理時間の両方が含まれることに注意してください。受信者がそれを処理して応答するのにかかる時間。
  3. ネットワークを介して他のルーターの情報をブロードキャストし、他のルーターの情報を受信するこのステップでは、すべてのルーターが知識を共有し、情報を相互にブロードキャストします。このようにして、すべてのルーターはネットワークの構造とステータスを知ることができます。
  4. 適切なアルゴリズムを使用して、ネットワークの2つのノード間の最適なルートを特定します。このステップでは、ルーターはすべてのノードへの最適なルートを選択します。彼らは、ダイクストラ最短経路アルゴリズムなどのアルゴリズムを使用してこれを行います。このアルゴリズムでは、ルーターは、他のルーターから収集された情報に基づいて、ネットワークのグラフを作成します。このグラフは、ネットワーク内のルーターの位置とそれらの相互リンクを示しています。すべてのリンクには、重みまたはコストと呼ばれる番号が付けられています。この数は、遅延時間、平均トラフィック、および場合によっては単にノード間のホップ数の関数です。たとえば、ノードと宛先の間に2つのリンクがある場合、ルーターは重みが最も小さいリンクを選択します。

ダイクストラアルゴリズムは、これらのステップを経ます:

  1. ルーターはネットワークのグラフを作成し、送信元ノードと宛先ノード(V1やV2など)を識別します。次に、「隣接行列」と呼ばれる行列を作成します。この行列では、座標は重みを示します。たとえば、[i、j]はViとVjの間のリンクの重みです。ViとVjの間に直接のリンクがない場合、この重みは「無限大」として識別されます。
  2. ルーターは、ネットワーク上のすべてのノードのステータスレコードセットを作成します。レコードには、次の3つのフィールドが含まれます。先行フィールド-最初のフィールドは、前のノードを示します。長さフィールド-2番目のフィールドには、ソースからそのノードまでの重みの合計が表示されます。ラベルフィールド-最後のフィールドはノードのステータスを示します。各ノードには、「永続的」または「暫定的」の1つのステータスモードを設定できます。
  3. ルーターは、ステータスレコードセット(すべてのノード)のパラメーターを初期化し、その長さを「無限大」に設定し、ラベルを「暫定」に設定します。
  4. ルーターはTノードを設定します。たとえば、V1をソースTノードにする場合、ルータはV1のラベルを「永続的」に変更します。ラベルが「永続的」に変更されても、二度と変更されることはありません。Tノードはエージェントであり、それ以上のものではありません。
  5. ルータは、送信元Tノードに直接リンクされているすべての仮ノードのステータスレコードセットを更新します。
  6. ルータはすべての暫定ノードを調べて、V1への重みが最も低いノードを選択します。そのノードが宛先Tノードになります。
  7. このノードがV2(目的の宛先)でない場合、ルーターはステップ5に戻ります。
  8. このノードがV2の場合、ルータはステータスレコードセットから前のノードを抽出し、V1に到達するまでこれを実行します。このノードのリストは、V1からV2への最適なルートを示しています。

次のページでは、このアルゴリズムを例として使用します。

例:ダイクストラアルゴリズム

ステップ1
ステップ2
ステップ3
ステップ4

ここでは、AとEの間の最適なルートを見つけたいと思います(以下を参照)。AとEの間には6つの可能なルート(ABE、ACE、ABDE、ACDE、ABDCE、ACDBE)があり、重量が最も少ないため、ABDEが最適なルートであることは明らかです。しかし、人生は必ずしも簡単ではなく、最適なルートを見つけるためにアルゴリズムを使用しなければならない複雑なケースがいくつかあります。

  1. 最初の画像でわかるように、ソースノード(A)がTノードとして選択されているため、そのラベルは永続的です(塗りつぶされた円で永続ノードを示し、->記号でTノードを示します)。
  2. 次のステップでは、Tノード(B、C)に直接リンクされている仮ノードのステータスレコードセットが変更されていることがわかります。また、Bの重みが小さいため、Tノードとして選択され、ラベルが永続的に変更されました(以下を参照)。
  3. ステップ3では、ステップ2と同様に、Tノード(D、E)に直接リンクしている仮ノードのステータスレコードセットが変更されています。また、Dの重みが小さいため、Tノードとして選択され、ラベルが永続的に変更されました。
  4. ステップ4では、暫定的なノードがないため、次のTノードを特定するだけです。Eの重みが最も小さいため、Tノードとして選択されています。

最後に、Eが目的地なので、ここで停止します。

終わりです!次に、ルートを特定する必要があります。Eの前のノードはD、Dの前のノードはB、Bの前のノードはAです。したがって、最適なルートはABDEです。この場合、総重量は4(1 + 2 + 1)です。

このアルゴリズムはうまく機能しますが、ルーターが処理するのに長い時間がかかる可能性があり、ネットワークの効率が低下するほど複雑です。また、ルーターが他のルーターに間違った情報を提供すると、すべてのルーティング決定が無効になります。このアルゴリズムをよりよく理解するために、Cによって作成されたプログラムのソースは次のとおりです。

#define MAX_NODES 1024 / *ノードの最大数* /
#define INFINITY 1000000000 / *すべての最大パスよりも大きい数* /
int n、dist [MAX_NODES] [MAX_NODES]; / * dist [I] [j]は、iからjまでの距離です* /
void shortest_path(int s、int t、int path [])
{struct state {/ *作業中のパス* /
intの前身; / *前のノード* /
int length / *ソースからこのノードまでの長さ* /
列挙型{永続的、暫定的}ラベル/ *ラベル状態* /
}状態[MAX_NODES];
int I、k、min;
構造体の状態*
                     NS;
for(p =&state [0]; p <&state [n]; p ++){/ *状態を初期化* /
p->先行= -1
p-> length = INFINITY
p-> label = tentative;
}
state [t] .length = 0; state [t] .label = permanent;
k = t;                                                          
/ * kは最初の作業ノードです* /
行う{                                                            
/ * kからのより良いパスですか?* /
I = 0の場合; I <n; I ++)                                       
/ *このグラフにはn個のノードがあります* /
if(dist [k] [I]!= 0 && state [I] .label ==暫定){
            if(state [k] .length + dist [k] [I] <state [I] .length){
		       state [I] .predecessor = k;
		       state [I] .length = state [k] .length + dist [k] [I]
		    }
}
/ *最小のラベルを持つ暫定的にラベル付けされたノードを見つけます。* /
k = 0; min = INFINITY;
for(I = 0; I <n; I ++)
     if(state [I] .label ==暫定&& state [I] .length <
min)= state [I] .length;
     k = I;
	}
state [k] .label = permanent
} while(k!= s);
/ *パスを出力配列にコピーします* /
I = 0; k = 0
Do {path [I ++] = k; k = state [k] .predecessor;} while(k> = 0);
}

DVアルゴリズム

ルーターJの一般的なネットワークグラフとルーティングテーブル

DVアルゴリズムは、ベルマン-フォードルーティングアルゴリズムおよびフォード-ファルカーソンルーティングアルゴリズムとも呼ばれます。これらのアルゴリズムでは、すべてのルーターにルーティングテーブルがあり、宛先に最適なルートを示します。ルーターJの一般的なグラフとルーティングテーブルをページの上部に示します。

表に示すように、ルーターJがルーターDにパケットを取得する場合は、ルーターHに送信する必要があります。ルーターHにパケットが到着すると、ルーターJは自身のテーブルをチェックし、パケットをDに送信する方法を決定します。

DVアルゴリズムでは、各ルーターは次の手順に従う必要があります。

  1. 直接接続されているリンクの重みをカウントし、その情報をテーブルに保存します。
  2. 特定の期間に、テーブルを隣接ルーター(すべてのルーターではない)に送信し、各隣接ルーターのルーティングテーブルを受信します。
  3. ネイバーのルーティングテーブルの情報に基づいて、自身を更新します。

DVアルゴリズムの最も重要な問題の1つは、「無限大にカウント」と呼ばれます。例を使ってこの問題を調べてみましょう。

以下に示すようなグラフのあるネットワークを想像してみてください。このグラフに示されているように、Aとネットワークの他の部分の間には1つのリンクしかありません。ここでは、すべてのノードのグラフとルーティングテーブルを確認できます。

ネットワークグラフとルーティングテーブル

ここで、AとBの間のリンクが切断されていると想像してください。このとき、Bはテーブルを修正します。特定の時間が経過すると、ルーターはテーブルを交換するため、BはCのルーティングテーブルを受信します。 Cは、AとBの間のリンクに何が起こったのかを知らないため、重み2(CからBの場合は1、BからAの場合は1)のAへのリンクがあると言います。 BにはAへのリンクがないことを知っています)。 Bはこのテーブルを受け取り、CとAの間に別のリンクがあると考えるので、テーブルを修正し、無限大を3に変更します(Cが言ったように、BからCの場合は1、CからAの場合は2)。繰り返しますが、ルーターはテーブルを交換します。 CがBのルーティングテーブルを受信すると、BがAへのリンクの重みを1から3に変更したことがわかるため、Cはテーブルを更新し、リンクの重みをAから4に変更します(CからBの場合は1、3 Bが言ったように、BからAへ)。

このプロセスは、Aへのリンクの重みが無限大であることがすべてのノードで検出されるまでループします。この状況を次の表に示します。このように、専門家は、DVアルゴリズムの収束速度遅いと言います。

 

「無限に数える」問題

 

この問題を解決する1つの方法は、ルーターが宛先への排他的リンクではないネイバーにのみ情報を送信することです。たとえば、この場合、BがAへの唯一の方法であるため、CはAに関する情報をBに送信しないでください。

階層型ルーティング

ネットワークグラフとAのルーティングテーブル

ご覧のとおり、LSアルゴリズムとDVアルゴリズムの両方で、すべてのルーターは他のルーターに関する情報を保存する必要があります。ネットワークのサイズが大きくなると、ネットワーク内のルーターの数が増えます。その結果、ルーティングテーブルのサイズも大きくなり、ルーターはネットワークトラフィックを効率的に処理できなくなります。この問題を克服するために、階層型ルーティングを使用します。例を挙げてこの主題を調べてみましょう。

DVアルゴリズムを使用して、ノード間の最適なルートを見つけます。以下に示す状況では、ネットワークのすべてのノードが17レコードのルーティングテーブルを保存する必要があります。Aの一般的なグラフとルーティングテーブルは次のとおりです。

階層型ルーティングでは、ルーターはリージョンと呼ばれるグループに分類されます。各ルーターには、独自のリージョン内のルーターに関する情報のみがあり、他のリージョン内のルーターに関する情報はありません。したがって、ルーターは、他のすべてのリージョンのテーブルに1つのレコードを保存するだけです。この例では、ネットワークを5つの地域に分類しています(以下を参照)。

Aがリージョン2(D、E、F、またはG)のルーターにパケットを送信する場合、AはパケットをBに送信します。ご覧のとおり、このタイプのルーティングでは、テーブルを要約できるため、ネットワーク効率が向上します。上記の例は、2レベルの階層型ルーティングを示しています。3レベルまたは4レベルの階層型ルーティングを使用することもできます。

 

3レベルの階層型ルーティングでは、ネットワークはいくつかのクラスターに分類されます。各クラスターは複数のリージョンで構成されており、各リージョンには1つまたは複数のルーターが含まれています。階層型ルーティングはインターネットルーティングで広く使用されており、いくつかのルーティングプロトコルを利用しています。

ルーティングと関連トピックの詳細については、次のページのリンクを確認してください。

多くの詳細情報

関連記事

  • ルーターのしくみ
  • ルータークイズ
  • ファイアウォールのしくみ
  • インターネットインフラストラクチャの仕組み
  • LANスイッチのしくみ
  • ホームネットワークのしくみ
  • ネットワークアドレス変換のしくみ
  • パケットとは何ですか?
  • 人々が「コンピュータアルゴリズム」に言及するとき、彼らは正確に何について話しているのですか?

その他のすばらしいリンク

  • インターネット百科事典:ルーティング
  • ルーティングテーブル
  • ネットワークルーティング
  • ネットワーク層
  • 階層型ルーティング

著者について

Roozbeh Razaviは、KNT工科大学の電子工学の学生です。彼はまた、MicrosoftCorporationの著書「NetworkingEssentialsPlus」の翻訳者でもあります。彼の研究は、TCP / IP、ルーティング、およびネットワークセキュリティの分野に焦点を当てています。