• 検索結果がありません。

DTUN ネットワークへの参加

ドキュメント内 JAIST Repository https://dspace.jaist.ac.jp/ (ページ 61-64)

第 4 章 Kademlia のルーティングテーブルとデータ構造 23

5.3 Distributed Traversal of UDP through NATs の設計

5.3.3 DTUN ネットワークへの参加

5.1節で述べたように,グローバルアドレス側で利用するポートが違う場合が

Symmet-ric NAT であり,同じ場合がCone NAT である.従って,グローバルアドレスを持つ

2つのノードと通信を行えば,Symmetric NATかCone NATかが判別出来ることにな る.図 5.8は,2つのDTUNノードにアクセスしてNAT種別の判別を行うプロトコル である.

図5.8のプロトコルでは,NAT下にあるノードはDTUNノード1と2に対して,echo メッセージを送信する.echo メッセージを受け取った DTUNノード 1 と2は,NAT ノードに対して echo replyメッセージを返信する.このecho reply メッセージ中には,

recvfrom関数から得られたNAT ノード側のグローバルアドレスとポート番号が含まれ

ている.

このとき,DTUNノード1と2が返信したポート番号が同じであればCone NAT,違 えばSymmetric NATと判別することが出来る.なお,各echoecho replyメッセージ 中にはnonceが含まれており,NATノード側でこのnonceを確認し,正しいecho reply メッセージのみ受信する.

図5.9は,図5.7と図 5.8のプロトコルを用いたときの状態遷移を表している.一番は じめの状態はunknownとなり,最終的に,global,cone NAT,symmetric NATのいず れかの状態となる.

このように,NATの検出には異なるグローバルアドレスを持つ2つのノードを利用し て行う.そのため,本論文で述べるNAT越え手法が正しく働くためには,グローバルア ドレスを持つノードが2つ以上存在し,それらノードがDTUNネットワークに参加して いることが必須となる.

Node 1: ID1 Node 2 (DTUN Node): ID2 find node, ID1,

find node reply, nonce, nodes NAT | Global, DestID, nonce

add to routing table

add to routing table

ID2, localhost, 0

etc...

ID2, IP(Node2), Port(Node 2)

ID2, DestID, nodes

if src is global routing

table routing

table

nodes

merge translate

etc...

(Node 1)

(Node 2)

lookup

5.10 DTUN上でのfind node

一方,グローバルアドレスを持たないノードは,DTUNネットワークに参加しないが,

DTUNネットワークへメッセージを送信するために,ルーティングテーブルの維持のみ 行う.ルーティングテーブルの維持のみなので,他ノードからのメッセージ受信やフォ ワーディングは行わない.

グローバルアドレスを持つ持たないに限らず,Symmetric NAT下に居るノード以外の 全ての新規ノードは,まずDTUNネットワークへfind nodeを行う.図5.10は,DTUN ネットワークで用いるfind nodeのプロトコルと,メッセージ受信時における動作を表し ている.ここで,find nodeを行っているノードをNode 1とし,find nodeメッセージを 受信するノードをNode 2とする.

図5.10では,まず,Node 1Node2に向けてfind nodeメッセージを送信している.

このfind nodeメッセージ中には,Node 1のIDであるID1,宛先IDのDestID,nonce と,さらに,Node 1がグローバルアドレスを持つかどうかを示すフラグも含まれている.

このフラグは,図 5.9の状態によって決定され,状態がglobalであるなら,Globalのフ ラグを,状態がNATecho wait2 cone NATであればNATのフラグを立てることにな る.但し,状態がsymmetric NATであった場合は,5.1.1節で述べたように,対称な通 信を行うことが出来ないため,DTUNネットワークや,サービスネットワークには直接 参加しない.Symmetric NATの扱いについては5.3.7節で述べる.

3.2節で述べたように,Kademliaでは find nodeなど通常のメッセージを受信した際 に,ルーティングテーブルの更新を行う.そのため,Node 2 はNode 1 の情報を自身 のルーティングテーブルに追加するか決めなければならない.DTUNネットワークは グローバルアドレスを持つノードのみで構成されるネットワークである.したがって,

Node 2は,find nodeメッセージ中に含まれる,NATかグローバルアドレスかのフラグ を見て,ルーティングテーブルに追加するかを決める.もしも,Node 1がグローバルア ドレスを持っているのならルーティングテーブルに追加し,NAT下であるならば追加し ない.なお,ルーティングテーブルへの追加処理は,3.2節で述べたアルゴリズムと全く 同じである.

find nodeを受信したNode 2は,自身のルーティングテーブルをルックアップし,find

node replyメッセージを用いて,その結果を返信する.ただし,ルックアップした結果に

自身の情報が含まれていた場合,自身のアドレスを127.0.0.1:0とする.これは,5.3.1節 で述べたように,自身の利用しているアドレスを正しく決定することが難しいための措置 であり,find node replyメッセージを受信したNode 1は,127.0.0.1:0というエントリ があった場合,recvfromで得られたアドレスに置き換えて処理を続ける.

find node replyメッセージにはNode 2のIDであるID2とnonce,さらに結果であ るnodes が含まれている.Node 1nonceを確認した後,自身のルーティングテーブ ルにNode 2の情報を追加する.find nodeを行う相手は必ずグローバルアドレスを持つ DTUNノードであるため,NATかどうかの情報を得る必要はない.

送信ノードがNATかそうでないかを区別するフラグをfind nodeメッセージ中に入れ ておくことで,グローバルアドレスを持つノードのみで構成され,かつNAT下からもア クセス可能なネットワークが構成可能となる.

Node 1: ID1 DTUN Nodes

find node reply

register, ID1

...

find node (dest = ID1)

registerd nodes add ID, IP and Port of Node1

5.11 ノード情報の登録

ドキュメント内 JAIST Repository https://dspace.jaist.ac.jp/ (ページ 61-64)