STUNとは

インターネット上の端末はIPアドレスを持っている

インターネットに繋がっている端末には、すべてIPアドレスが振られています。このIPアドレスをもとに、相手の端末に接続する事ができます。

GoogleのWebページは、"www.google.jp"というアドレスをもっていますね。GoogleのWebページにアクセスすると、ブラウザーの上のほうに表示されています。

$nslookup www.google.jp
Non-authoritative answer:
Name:    www.google.jp
Address: 216.58.197.3

この、"216.58.197.3"というIPアドレスを、ブラウザーに入力してみてください。 GoogleのWebページが表示されるはずです。

インターネットの凄いところは、このIPアドレスさえわかれば、世界中のコンピュータに接続できるという事です。 もちろん、私たち利用者のコンピュータにも接続ができます。

ほとんどのユーザーは、利用している時だけIPが配布されている

 しかし、さまざまな、経緯から、IPアドレスはサーバー側にしか所持していません。もちろん、ネットワークゲームをハードに利用するために、プロバイダーとIPアドレスを所持する契約をしている人や、IPアドレスを豊富に所持しているプロバイダーを利用しているユーザーは、IPを持っています。

良く持ちいられる話としては、現在、もっとも利用されているIPv4が、枯渇しているのが理由です。 IPv4は、2の32乗=43億のIPアドレスしか管理できません。 一見、大きな数字ですが、地球の人口はすでに、70億をこえていまから、一人にひとつのIPを割り振る事ができない状態な訳です。

 このような背景から、他の端末からアクセスされる端末には、固定のIPアドレスを割り振りますが、他の端末からアクセスされる事が発生しにくい端末には、利用する時だけIPを割り当てるという事が行われています。

P2P接続は考慮されていない場合がほとんど。

利用時に割り振られている、IPアドレスを調べ、相手に伝える事ができれば、P2Pアプリを作成できます。固定IPを持つサーバーでなくても、サーバーが提供するようなサービスを作成する事ができます。サーバー以上に、P2P独自のサーバーでは実現できない、より優れたサービスを提供する事もできます。

しかし、残念な事にこの割り振られIPが、一時的なものであったり、複数の端末で共有しているものだったりして、P2Pアプリとして利用できない場合があります。 もちろん、企業などてはセキュリティーを確保するたるにも、P2Pとして利用できないように制限をかけていたりする事もありのます。

試しに、自分の端末に割り振られているIPをチェックしてみましょう。

$ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=3<RXCSUM,TXCSUM>
    inet6 ::1 prefixlen 128 
    inet 127.0.0.1 netmask 0xff000000 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    nd6 options=1<PERFORMNUD>
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV>
    ether 10:dd:b1:d1:b1:37 
    inet6 fe80::12dd:b1ff:fed1:b137%en0 prefixlen 64 scopeid 0x4 
    inet 192.168.10.101 netmask 0xffffff00 broadcast 192.168.10.255
    nd6 options=1<PERFORMNUD>
    media: autoselect (100baseTX <full-duplex,flow-control>)
    status: active

といった、情報が表示されます。"127.0.0.1" "192.168.10.101"が割れ振られているIPv4です。残念ながら、グローバルに固定なIPではないはずです。 "10." "192." "172." "168."で始まるIPは、プライベートアドレスと言われているものです。ご家庭のインターネットに接続する機器(ルータ)が、あなたの端末に割り振っているIPです。

一時的にせよ、固定にせよ、実際に割り振られているIPはルーターが知っています。 ルーターから、IPアドレスを教えてもらわないと、P2Pアプリを実現できません。

STUN を利用して、これらの状態を知る事ができる。

 本書では、STUNを利用する方法を紹介します。姉妹本である "なぜなに Torrent" では UPnP Port Mapという方法を紹介しました。詳しくはそちらをみて欲しいのですが、軽く説明すると。

 ルータにどのようなIPが設定されているかを聞くための方式がま、UPnPという仕様で定められています。実際のこの仕様にそってルータに問い合わせる事で、IPとPortを知る事ができます。

ただ、UPnP Portmap 自体をサポートとしていない場合や、ルータもIPアドレスを知らない場合があります。そのような場合、STUNを利用すると上手くいく事があります。