PART2 Skype、その通信の仕組み特集:Skypeは企業IP電話を変えるか(3/4 ページ)

» 2005年05月30日 19時48分 公開
[岩田真一,N+I NETWORK Guide]

●基本はUDPパケットの投げ合い

 最もシンプルな通信が行われるのは、同一LAN内のノード同士の通話である。間に何も遮るものがなければ、ダイレクトにP2Pによる通話が行われる。多くのリアルタイムアプリケーションと同様に、Skypeにおいても、セッション管理よりもスピード優先のUDP(*7)が使われている。Skypeによる音声通話は、ノード同士が相手のノードへ向かってUDPパケットを投げ合うことで行われる。

●NAT越えの仕組み(1):STUN(UDP Hole Punching)

 ところで、実運用となると、同一LAN内で通話が必要になるようなケースはむしろ稀である。IP電話を活用したいのは部署間、会社間でのコミュニケーションだが、インターネットを経由した通信となると話は変わってくる。通話したい相手は会社や組織が備えているファイアウォールの背後に存在しているのが普通で、外部からの接続を受け付けないことが多い。また、通常社内のPCにはNATによるプライベートIPアドレスが割り振られており、ポートフォワーディングが設定されていないかぎり、WAN側からは内部のPCを特定(*8)することができない。これらの理由から、ピア同士が直接通信を行うのは技術的に非常に困難だといえる。

 ところがSkypeでは、NAT/ファイアウォール内のノードともUDPによる直接の通信を実現している。その仕組みを見てみよう。

 Skypeのパケットは暗号化されているため、プロトコルの詳細については推測になるが、SkypeのNATを意識しないP2Pの通信には、UDP Hole Punching(*9)やその応用技術である「STUN(Sinmple Traversal of UDP Through NATs:RFC3489)」が活用されていると思われる。

 UDP Hole Punchingの原理は、「内部から外向きに用意した通路を使って、外部から内向きの通信を行う」というものだ。たとえば、外部のノードAからNAT内のノードBへ通信を行うとしよう。そのためには、まずノードBがその準備を行う(*10)。つまり、ノードBからノードAへ通信を行うことにより、NAT機能を提供しているルータのマッピングテーブルにそのエントリが記録されるのだ。そして、そのエントリが残っている間は、外部からルータのIPアドレスとポート番号へ向けたパケットは、エントリに従ってノードBに届けられるという具合だ。

●双方のノードがそれぞれNATの背後にある場合

 それでは、ノードAもNATの背後にある場合はどうだろう(図5)? 当然ノードBの通信はノードAに直接届かない。そのため、ノードAもノードBのWAN側のアドレス(ルータβにマッピングされたアドレス)を知ることができない。

図5 図5●NAT内のノード同士のSkype通話 通信を行うノードは、WAN側のIPアドレスをSTUNサーバに登録しておく。Skypeシステムの場合、STUNサーバにスーパーノードを使う

 ここで必要になってくるのが、自分のWAN側のIPアドレスとポート番号を相手に教える仕組みだ。この方式はSTUNが説明している。

 STUNでは、STUNサーバというグローバルIPアドレスを持つサーバの存在を前提とし、NAT内のノードはこのSTUNサーバと通信することで、自分のWAN側のIPアドレスとポート番号の組(この例ではルータαのIPアドレスとポート番号)を教えてもらう。こうして、ノードはお互いにSTUNサーバに登録されたお互いのWAN側のIPアドレスを知ることができる。

●スーパーノードをSTUNに活用

 ここで思い出してほしいのは、Skypeの場合、STUNサーバの役割をスーパーノードに持たせられるということだ。そうすれば、初期接続の際に自分の接続情報として、WAN側のIPアドレスをあらかじめ登録しておくこともできる。

 こうして、お互いのWAN側のIPアドレスとポート番号を入手したら、直接パケットを投げる。このとき、NATのルーティングテーブルにエントリが追加されるため、相手からのパケットはマッピング情報(*11)に基づいてNAT内部のノードに届く。UDPにはTCPの3ウェイ・ハンドシェイクのような手順がないため、ノードまで届いたパケットは上位層に渡されるのだ。

 このように、UDP Hole Punchingは最初にNAT/ファイアウォールの内側にいるPCが道すじを作る必要があるため、もともとPC上でプログラムが動作しているSkypeなどのP2Pアプリケーションには向いている技術といえる。

●NAT超えの仕組み(2):リレーノードによる中継

 最新技術を駆使してNATを介したP2P通信を可能としているSkypeだが、もちろんこの方法でうまくいかない場合もある。NATがSymmetric型だったり、ファイアウォールがUDPの使用を禁止している場合などだ。

 Skypeはこのような環境でも通話を実現している。それは、リレーノードという中継ノードを使用した通信だ。リレーノードもスーパーノードと同様に、一般ノードから選ばれる。リレーノードの中継にはTCPセッションが張られている。UDPによるNAT越え技術が使えないノード間では、リレーノードがパケットを中継することで、間接的なエンド・ツー・エンドの通信を実現する(図6)。

図6 図6●リレーノード経由の通信 STUNやUDP Hole Punchingが使えない環境では、リレーノードによるTCP接続の中継が行われる


*7 User Datagram Protocol。IPの上位プロトコルの1つ。ネットワーク層のIPとセション層以上のプロトコルの橋渡しをする。コネクションレスのプロトコルのため、TCPに比べて負荷が低く転送速度が高いが、信頼性は低い。

*8 このほか、UPnP(Universal Plug and Play)という技術によっても可能だが、ルータとアプリケーション双方での対応が必要である。

*9 P2P通信でファイアウォールを通過させるための技術。このNAT越えの仕組みは、UDPによる通信において実現される。

*10 ノードBはスーパーノードへTCPのセッションを保っているので、その接続に乗ってAからの接続要求を受け取る。

*11 接続相手ごとにマッピングされるポート番号が異なる「Symmetric NAT」では、STUNは使えない。

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

注目のテーマ