アイデンティティ泥棒とシュレッダー
鍋焼きうどん

「知りたがり虫」の餌

P2p

 この業界に入ってずいぶん発つが、日進月歩で色々な技術革新がされていくので、中々全てを網羅して理解し続けることが難しい。とかく、「自分が直接関わっている分野」にだけ目を向けて楽をしてしまうのが人の常である。個々の部品作りをしている場合はそれでも良いが、全体のシステム設計をする場合は、大まかでも良いから色々な技術の最先端を理解しておかねばならない。

 幸い私は新しいもの好きなので、何か新しい技術革新が起こると、どうなっているか知りたくてしょうがなくなるタイプだが、なにせ中々腰を落ち着けて勉強する時間が無いのが辛いところである。そんな訳で、新しい技術に出会って、それを勉強するための時間が取れないと、私の「知りたがり虫」が巣から這い出してきて、「忙しいなんて言ってないで勉強してよ」(ちなみに声は「千と千尋...」のカエルの声)と私をせっつくようになるのである。

 P2P通信の技術もその一つであった。マイクロソフトのボイス・チャットが日本の家とシアトルの家の動かなかったときに、これは「ネットワーク・ルーター(一つしか口の無いインターネット・モデムと複数のパソコンを繋げるための仕組み)の問題だな」と漠然とは思っていたのだが、深くは掘り下げなかった。しかし、2ヶ月ほど前に 各種のネットワーク・ルーター越しに動く SkyPe というボイス・チャット・サービスがあることを知り、それが P2P の技術を使っているから可能だと知ってから、私の「知りたがり虫」がムクムクと巣から這い出して来て、「いつ勉強してくれるの」と私を煩わせるようになった。

 そんな訳で、今日は少し時間を使って、P2Pの勉強をした。幸い Google でサーチをすると、P2Pにやたら詳しい人のブログが見つかり、そこからたどって、P2P技術のバイブル的ドキュメントに出会うことが出来た。非常に分かりやすくP2P技術を解説しており、私の「知りたがり虫」は満足して巣に戻って行ってくれた。

 以下は自分のためのメモである。P2P技術に興味が無い人は消化不良を起こすので要注意。

Peer-to-Peer (P2P) Communication across Network Address Translaters (NATs) 「NAT を介しての P2P 通信方式」

 端末が家庭用のルーターなどに代表されるNATに繋がっていてグローバルIPアドレスを持っていない場合、いかにして端末間のP2Pコミュニケーションを確立するかについてとても良くまとめて書いてあるドキュメントである。

 まず、NATがプライベートIPアドレス空間とグローバルIPアドレス空間をどのようにマッピングするかを説明している。ただし同じNATでも Core NAT方式とSymmetric NAT 方式という2つのタイプがあり、Symmetric NAT 方式のものだとP2P通信の確立が難しいと指摘してある。プライベートIPアドレスとポート番号(以下 IP:Port と略)を一度グローバルIP:Portにマッピングすると、通信相手が変わっても同じマッピングを続けるのが Core NATで、マッピングを変えてしまうのが Symmetric NATである。Core NATの場合には、一度サーバー側で端末のグローバルIP:Portを取得すれば、それを別の端末に渡して使わせることが出来るが、Symmetric NAT の場合はそれが出来ない点が難点である。

 次にUDP Port Punching のテクニックが丁寧に解説してある。まずは両方の端末がサーバーを介して互いのグローバルなIP:Portを交換し、次に一つの端末Aからもう一つの端末Bに相手のグローバル IP:Port でUDPパケットを送信する。この送信は端末B側のNATで拒否されるが、端末A側のNATには「端末BのグローバルIP:Port 向きの通信」がされた履歴が残る。引き続いて今度は逆に端末Bから端末AのグローバルIP:Port に対してUDPパケットを送信すると、端末A側のNATには先の「端末BのグローバルIP:Portに向けた通信」の履歴が残っているためそのパケットは素通りする。同時に端末B側のNATにも「端末AのグローバルIP:port外向き通信」の履歴が残り、この時点で2つの端末のUDP通信が確立されたことになる、と言うものである。(後、細かなことだが、両端末が同じNATにぶら下がっていた場合、この手法だとパケットのルーティングをしてくれないタイプのNATがあるらしく、そのケースに備えてローカルの IP:port も交換しておき、グローバルのものが働かなかった場合にローカルのを試すよう薦めている)。

 筆者は、これ以外にも、TCP/IP Port Punching の方法(ただしあまり信頼性は高くない)、Symmetric NAT で UDP Port Punching をする方法(これもあまり信頼性は高くない)なども述べているが、確実性という意味で、Core NAT 向けの UDP Port Punching を強く薦めている。その他にも、NAT設計者向けのメッセージや、P2Pアプリケーションを作る人向けの注意点(特にセキュリティに関して)がしっかりと書かれており、P2Pアプリケーションを作る人はぜひ一度は読むべき資料である。

Comments

やえ

こんにちは(^^)コメント、ありがとうございました。
知りたがり虫、美味しいご飯にありつけてよかったですね♪
早速、古川さんとこにもコメントしたりしてます。まだ、ブログ歴1ヵ月ですが、色んな方の日記や情報を、盗み見るような(!)楽しみにすっかりはまってます。
こうして、色んなとこに訪れることで、最新情報の知識が増えたりするのも楽しいです。私の知りたがり虫は怠け者で、よく眠っており、時折、飛び起きて消化不良をおこすのですが…(^^;)

Tomo

Tomo's Hotlineの管理人Tomoです。リンクありがとうございます。
Skypeですが、UNIX Magazineの今月号にシステムの解説が載っていますので、ご興味があればご覧になって下さい。

TKG

こんにちわ
P2Pの基本に感動できるメモに出会えました。
NAT Trasevalと呼ばれる技術は親切な「ゆびきたす」を目指すキーテクノロジーと再認識しました。消化不良を解消するために指摘されるUDP上に仮想TCPを実現しさらにその上位層とHTTPの間に暗号を実装するとほとんどの市販ルータのNAT越え&実用できることが実現できそうです。
欠点はどうしてもNTA越えるパターンを学習するサーバが必要なことと1回目だけ学習に必要な時間(2,000ms)が予想されることですが、実装にチャレンジする価値がありそうです。

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Your Information

(Name is required. Email address will not be displayed with the comment.)