P2Pとルーティング【後編】

さて、前章に引き続いてP2Pのルーティングの説明をしていきます。前章ではデフォルトゲートウェイとなるユーザを導入しました。これを発展させてより広範囲に適用できるルーティング方法を説明します。

その前に通常のルーティング方法を説明しましょう。一般にダイナミックルーティングでは、 あるエリア内のルーティングを行うIGPとエリア間のルーティングを行うEGPに分かれます。IGPにはRIP、OSPF、EGPとしてはBGPが有名です。前章ではP2PにおけるIGPを説明した事になります。今度はEGPを検討しましょう。

まずは下図を見て下さい。今、各ユーザがブロードキャストをできる範囲を隣接2ホップまでとします。今、ネットワーク上にはデフォルトゲートウェイがユーザCとユーザJの2つがあります。各ゲートウェイがブロードキャストできる範囲をそれぞれエリア1、エリア2としましょう。

今回の方法ではデフォルトゲートウェイが通信を行い、ルーティングテーブルを交換します。ルーティングを自律的に階層化し、これがP2PにおけるEGPとなります。ゲートウェイであるユーザCとユーザJはエリア1とエリア2の共通部分であるユーザFとユーザEを用いてお互いのゲートウェイの存在を気づく事ができます。これによってデフォルトゲートウェイ間はルーティングテーブルを交換することができるのです。

では、デフォルトゲートウェイはどのようなルーティングテーブルを交換するのでしょうか?下図をご覧になって下さい。今A,B,Cというデフォルトゲートウェイがあり、A⇔B、B⇔Cでルーティングテーブルを交換しているとします。エリアAにはP、エリアBにはQ、エリアCにはRというユーザがいます。ではこれらはどのようにルーティングテーブルに書かれているのでしょうか?

EGP用ルーティングテーブルでは各ユーザがエリアを何ホップまたがっているかを記述します。つまり、AのEGP用ルーティングテーブルにおいて、Rを記述する時にはホップ数2、次へ渡すデフォルトゲートウェイはBと記述すれば良いのです。BのEGP用ルーティングテーブルにおいてPを記述するにはホップ数1、次へ渡すデフォルトゲートウェイはAと記述します。すなわち、IGPとEGPではルーティングテーブルの表記が異なりますが、これによって容易に各ユーザをルーティングする事が可能となります。

今のルーティングを更に階層化することも可能です。下図はイメージ図です。縦の線は同じユーザを表わします。上に行くほど上位のデフォルトゲートウェイとなり、ユーザの数が少なくなる、すなわち集約されていることがわかるでしょう。

ルーティングを自律的に階層化することにより、容易に大きな範囲のルーティングを行うことができるのです。このため、デフォルトゲートウェイになるユーザは回線等で大きな負担を強いられるかもしれません。またデフォルトゲートウェイとなるユーザがネットワークから離脱しても通信が断しないように、バックアップとなるユーザを考え、そことルーティングテーブルを同期させ、同時に隣接ユーザの情報も教える工夫も必要でしょう。デフォルトゲートウェイがネットワークから離脱した場合、バックアップとなるユーザが元のデフォルトゲートウェイの隣接ユーザとリンクを張り、ただちに通信を復活させるように機構を作るのも面白いでしょう。

さて、前章に説明したIGPにおけるルーティングをもう一度振り返りましょう。前章では基本的に各ユーザに対する情報として最小のホップ数のルーティングを覚えるということにしました。果たしてこれだけで、ユーザがネットワークから離脱した際にうまくルーティングができるのでしょうか?それでは簡単なネットワーク図を考えて見ましょう。下図を見て下さい。今、AとC間のルーティングを考えましょう。AのとってCのルーティング情報とはCへの次ホップはB、ホップ数は2という情報です

では、Bがネットワークから離脱したとします。通常のダイナミックルーティングでAはCに対する複数のルーティング情報を持っていて、それを切り替えることによって通信を可能とします。しかし、今は最小ホップ数の情報すなわちCの通信にはA⇔B⇔Cしかわかりません。そこでリンクの自己修復機能を備わることでこれを解決します。Bが離脱すると、CはBに成り代わってAとリンクを自動的に形成します。これによって、AはC(CはAとリンクを張る時に、Bの代わりで張っていることを宣言する必要があります。)と速やかに通信を再開できます。下図はリンクの自己修復後のネットワーク図です。

このようなリンクの自己修復をしても、各ユーザのルーティングテーブルの影響はあるユーザへの最小ホップ数が1少なくなるか、あるいは同じだけとなります。そのため、各ユーザはほとんど影響なしに通信を継続することができます。

では自己修復の方法について説明します。今、Aと言うユーザの周りにB、C、Dというユーザがいます。各ユーザは定期的に自分のGUIDを隣接ユーザに周知します。今の場合、B,C,DはAにGUIDを教えてます。Aは隣接ユーザB,C,Dの中でGUIDが一番大きいユーザをB,C,Dに定期的に返答します。DがGUIDが一番大きいとしましょう。すると、Aがネットワークから離脱した場合にはGUIDが一番大きいDがAの代役としてBとCにリンクを張ります。BとCはDにリンクを張ることによって、DがAに置き換わったことを認識します。具体的には下図を見て下さい。

P2Pネットワークではインターネットで実現しているので、(ここでは無線LANを想定していません)各通信は極めて冗長化されてネットワーク上で行っています。そのため、あるユーザが他方のユーザと通信できない場合、それは他方のユーザがネットワークから離脱しているということが高い確率で言う事ができます。ですから上記の方法でほとんどの通信は障害を回避できると考えられます。

とは言え、ルーティングテーブルの交換について、もう少し慎重に見ていきましょう。まず、下図を見て下さい。B⇔C間のリンクが切れ、うまくリンクの自己修復ができなかった場合を想定します。(このようなケースはレアケースだと思われますが、説明のために敢えて例を挙げます。)

さて、ルーティングテーブルの規則として次のことを挙げて置きます。

今、AとCに注目します。Aは最初A⇔B⇔Cで通信できたはずです。すなわちAにはルーティングテーブルとしてCには次ホップB、2ホップと言う情報があります。ところがB⇔Cのリンクが切れてしまった今、次ホップはBでなくEにする必要があります。STEP別に見ていきましょう。まず、BはCとリンクが切断されたので、BはCのルーティング情報を削除します。規則2からAはBからの情報を元にCのルーティング情報を削除します。次にどこからCのルーティング情報を学ぶかと言う事ですが、隣接ノードにはEとFがいます。ところが規則3よりEはAにCのルーティング情報を教えられません。結局AはEからCのルーティング情報を教えられ、めでたくCへは次ホップのユーザE、ホップ数3という情報に更新することができます。

これでP2Pのルーティングについての概要を説明することができました。さて、今まで説明したテクニックを使うと、ユーザの識別子を知るだけで、そのユーザまでルーティングができるようになります。そこでWinnyのようなネットワーク構造の中で以前提案したFloating Server modelのように自律的に代表サーバを設け、そこにユーザの識別子を書いておけば、だれもユーザのIPアドレスを知らずに識別子だけで通信(例えばインスタントメッセージ)が可能になります。

時間があれば自分でオリジナルのルーティング方法を考えてみると、他のルーティング方法もよくわかってくると思います。


参考:
P2Pとワイヤレスの交差点
http://internet.watch.impress.co.jp/www/column/wp2p/wp2p01.htm
コンピュータネットワーク第4版 タネンバウム著 日経BP

次にP2Pの分野で注目著しい分散ハッシュについて説明します。

NEXT

TOPページに戻る