MXの次はなんなんだ?8

このエントリーをはてなブックマークに追加
38647
正直、NATやDDNS絡みは、どう設定したらいいか作者も把握できてませんが、
これ絡みでやっていることを書くと次のようになってます。

1.まず、適当なノードに検索リンクでコネクションに行きます。
この時に使うIPとポートはNoderefに書いてある例の暗号です。

2.検索リンクで接続すると、接続された方は相手のグローバルIPが分かりますので、
これをノードのグローバルIPとして記録しておきます。
この時点で接続してきた相手のポート情報は分かりません
(表示の上では0になってます)

3.検索リンク間でお互いのノード情報を交換します。
交換する情報は、回線速度と接続に用いるポート番号と例のDDNS情報と
自己申告のIPアドレスです。これは接続してきたノードが自分のノードの
IPを取得した値(つまりローカルIP)です。
あと、外部からの接続か可能かどうかもここで申告します。

4.もし相手の申告してきたIPとAccept時に取得したIPが違っていたら
そのノードはNAT経由とみなしてNAT野郎フラグ付けときます。

5.もし他のノードから他のノード情報を要求された場合、DDNS名が空でないノードなら
DDNS名とポート番号を知らせます。ネゴの結果、DDNS名が空のノード情報の場合、
グローバルIPとポート番号を知らせます。

6.他のノードとキーのやり取りをする場合ですが、キーには本体の位置がIPとポートの
形式で書いてあります。ここで、もしNATフラグがついているノードから来たキーの場合、
そこに書いてあるIPと相手が申告してきた自分のIPとを比較します。
もし同じならそれはキャッシュかUPファイルなわけですが、それはローカルIPなんで
グローバルIPに書き換えます。逆に、もしそのノードにキーを渡す必要が出て、
そのキーが相手のグローバルIPなら相手のローカルに変えて渡します。

あと、もしキーを送ってきたノードがPort0申告しているノードだったら、そこから来たキーの
IPは全て自分のノードのIPに書き換えて他に送ります
(変換は渡すときだけ、手持ちのキーのIPはPort0申請ノードのまま、そうでないと転送動作にならない)。
これにより、Port0への転送リンク接続はかからず、自分のノードのところに来るようになります。
port0設定で動作が変わるのはここだけです。

6.キーに対してダウン要求がかかったら、キーに書いてあるIPとポート番号のノードに
転送コネクションをかけます。これは常にグローバルIPです。ただし、本体が
そこにあるかどうかは分かりません(違ってたら向こうのノードで同じことが起きて転送になる)

相手がルータ越しの場合、検索リンクで繋がっているノードから見たIPアドレス+
ファイル本体を持っているノードが申告したポートのところに繋がることになります。

もしPort0申告していたら、隣のノードが身代わりしてくれてるはずなんで
そちらに繋がります。

7.ここまででDDNS名はまったく使っていませんが、もしこれを受け取っていたら、
終了時にNoderefTemp.txtファイルにIPの代わりにこれを書いときます。
次に検索コネクションをかけるときに、もしDDNS名が空でなければgethostbyname(相当)
のAPIでIPを調べて、そこに接続にいくことになります。

以上、こんな感じになってますので、どう動作するかは各自の判断でお願いします。