UPnPによるポートマップ
Natを越えないとP2P通信できない
UPnPを使えば、TCPでもNat越えができる
Socketを使う事で簡単に、インターネットを利用したアプリケーションが作成する事ができます。プラウザーとかメーラーとかです。
しかし、P2Pアプリケーションを作る場合は、もう一つ考慮しなくてはならない事があります。それが、「Nat越え」です。
P2Pアプリとして、必ず満たさなければならない条件は、何でしょうか? それは、ユーザーが所有する端末同士が直接データ通信をできる事です。P2Pの定義そのものですね。 これができません。
Nat越えをする方法はいくつかあります。本章では、UPnPを用いてNat越えをする方法について解説したいと思います。
Global IP が必要
P2P通信するするためには、相手に自分の「IPアドレス」と「Port番号」を教える。必要ががあります。しかし、Nat越えの問題を解決しないと、これができません。
ご家庭からインターネットにアクセスする場合、ルーターというデバイスを利用しています。 ルーターは、ルータに接続している端末に 「Private IP」 を割り振ります。
>> netstatとコマンドを入力してみましょう。「192.168.100.1」といったアドレスが端末に割り振られている事が確認できます。このアドレスを相手に伝えても、通信ができません。
ルータから教えてもらおう
しかし、ルーターからインターネットに接続できているという事は、「Global IP」をルーターは持っているから通信できるのです。つまり、ルーターは「Global IP」をルーターは知っている。しかし、ルーターを利用している端末は「Global IP」をしらないという問題があります。
UPnPを用いてPort Mappingをしよう
UPNPを実現するには、UDPとTCPを用いて通信できる必要があります。 具体的には、
UDP Multicast を利用して、使用中のルーターに、ポートマッピングを依頼するためのアドレスを教えてもらう。
TCP を使って、教えてもらったアドレスからポートマッピングの依頼をだす。
といった事をします。実際にTryしてみましょう。
依頼先を調べる
UDPで以下のメッセージを通知する
もしもルーターが存在していれば、以下のような返答があります。
LOCATIONで指定されたアドレスのXMLファイルのタグの中に依頼先のアドレスが記載されています。このアドレスへ依頼をだせば、インターネットから、あなたの端末へアクセスできるようになります。
外部の端末から見えているアドレスを聞く
成功すると、以下のような返信を受け取ります。
ポートマッピングの依頼をだす
Kyorohiro work
Last updated