@ITでSkypeの通信メカニズムに関する記事が載ってました。
@IT ネットワーク管理者のためのSkype入門 第2回 Skypeの通信メカニズム
Skypeは普段から愛用していて、そのグレートな音声品質の恩恵を受けまくってます。特に仕事上海外とのやり取りが多いので、Skype導入してからは通信コストがかなり削減できています。音声だけじゃなくチャット部分もバージョンアップの度に絵文字が増えたりして、なかなか使い勝手がいいですね。当然ファイル転送も可能。手放せないツールのひとつですな。
んで、Skypeの通信メカニズム。なるほどと思えるものばかりです。
これに対しスーパー・ノードは、複数の通常ノードが接続してくるだけでなく、スーパー・ノード同士も接続して相互に通信を行っている。スーパー・ノードは、ノードとして自身が通話するだけでなく、コンタクト・リスト(接続先リスト)を処理し、通話のルーティングを行うことで、Skypeネットワークの一端を担う。不特定多数のノードがこのようなネットワーク管理を行うのが、PtoPネットワークの特徴である。
スーパーノードについては、前に何かで知っていたのですが、P2PネットワークとしてのSkypeのキモとなるメカニズムですね。どのPCがスーパーノードになるかは自動的に決定されるようです。
スーパー・ノードは、Skypeネットワークを担う重要なノードであるから、ネットワーク的な制限がなく、インターネットと高速なバンド幅で接続されており、長時間安定的に稼働しているものが望ましい。Skypeネットワークに接続したコンピュータがスーパー・ノードになるかどうかは、以下のような条件により決定されている。
- アクセス可能性:ファイアウォールやNATによるアドレス変換が行われることなく、インターネット上の任意の相手と通信できるかどうか。
- 起動時間:コンピュータを起動してから現在までの時間。これが長いほど、安定的に稼働しているコンピュータと見なされ、スーパー・ノードになる可能性が高まる。
- 回線速度:高速な回線に接続されているコンピュータほどスーパー・ノードになる可能性が高い。
文献によれば、全ノードのうち、1%程度がスーパー・ノードになるように調整されているという。
高速インターネット常時接続の普及、エンドユーザーPCのハイスペック化、辺りの背景をうまく利用しているという感じですね。自分のPCがスーパーノードかどうかってのは、どうやったら判別できるんだろ。
Skype最大の特徴は、ファイアウォールやNATルータの存在によって、ほかのメッセンジャー・ソフトウェアやVoIPソリューションでは通信不可能な環境においても、外部と接続して会話できることだ。接続性を向上させるため、SkypeはファイアウォールやNATルータを越えるためのさまざまな接続手段を持っており、環境によってそれらを切り替えている
Skypeのもうひとつキモとなるところが、NATやファイヤーウォール配下のネットワークでも使えちゃうってとこです。これは他のメッセンジャーソフトに対して、非常に大きなアドバンテージになってると思います。
着信側がNATの内側に存在する場合 着信側がNATの内側に存在する場合、発信側はこれを直接呼び出すことはできない。スーパー・ノードは、SkypeクライアントとのTCPコネクションを持っているので、スーパー・ノードを経由して、着信側に呼び出しパケットを転送してもらう。続いて着信側が発信側に向けて音声パケットを送出させれば、NATがあっても問題なく双方向のパケット送受信が可能になる。
UDPである音声パケットをNATの内側にいるPCとこんな風に送受信しています。なるほど。UDP、TCP、NATの機能を組み合わせてかしこく利用してますね。これは着信側がNATの内側にいる場合のテクニックですが、発信・着信側ともNATの内側にいる場合も『UDP hole punching』っていう手法を使って解決しています。
UDPホール・パンチングの原理はこうだ。仮にコンピュータAとコンピュータBがそれぞれNATルータA、Bによってプライベート・ネットワーク内部にいるとする。 UDPホール・パンチングの原理 UDPホール・パンチングでは、まず一方が相手に向けてパケットを送出する。相手先はNATルータの内側なので、このパケットは相手に届かないが、NATルータAのNATエントリにAからBへのエントリが作成され、Bからのパケットを受信可能な状況ができる。次にコンピュータBは、あらかじめ知っているコンピュータAに対してパケットを送信する。今度はルータAのNATテーブルにエントリがあるので、パケットはコンピュータAに到着する。つまり、コンピュータAから送信されたUDPパケットに対する応答パケットを、コンピュータBが偽装することにより(送信されたパケットと同じポート番号を持つように、コンピュータB側でパケットを組み立てる)、あたかもUDPパケットの送信と、それに対する応答であるかのように見せ掛けている。
なるほどなるほど。これなら、両方がNATの内側にいても通信できるな。『UDPホール・パンチング』はここで初めて知りました。最近、丁度TCP/IPの復習をしていたので、NATテーブルのエントリを利用しているってあたりが非常に参考になります。音声通信はUDPですが、スーパーノードとの通信はTCP。うまい!なるほどなあ。TCPとUDPうまく使い分けてます。ホント参考になる。
とはいえ、
ただし、あらゆる種類のNATルータに対してこの方法が適用できるわけではなく、ある特定のアルゴリズムを使っている、一部のNATルータにのみ対応可能な手法である。
ということなので、未対応のNATルータ、又はファイヤーウォールを介す場合は、
このようなファイアウォールが利用されている場合、Skypeは、最後の手段として、各Skypeクライアントとスーパー・ノードとのTCP接続を利用して、音声パケットを中継する。ただしこの方法では、スーパー・ノードによる中継のために、システムやネットワークに負担がかかるし、遅延時間も大きくなるので音声品質などにも少なからず影響が出る。
と、スーパーノード経由でのTCPによる音声通信となります。スーパーノード大活躍です。この場合、音声品質は落ちるでしょうけどね。介すノードが増えますし、そのうえTCPなので。それでもここまで考慮して、高接続性を実現しているSkypeのテクノロジーには脱帽です。
PtoPなので、ユーザーがどんなに増えても、サーバの負荷があがるといったことがなく、音声通信もスーパーノードが最適なルーティングをするので、品質が落ちることもありません。SkypeがVoIPのスタンダードとなることは間違いないだろうし、既存の一般電話もおびやかす存在になってくんだろうなと思います。
ところで、TCP/IPの勉強をする際に、こういった事例があると非常に良いですね。今回のSkypeの通信メカニズムの例は、TCP、UDP、ポート番号、NAT、ファイヤーウォールと、TCP/IPでもキモとなる部分の理解にとてもいい助けになります。この辺をきっかけにして、もっとコアな部分の理解を深めていきたいと思います。
ちなみにSkypeには、PCから公衆回線(一般電話)と通話できる、Skype Outというサービスもあるのですが、これをこの間の上海出張中にホテルのインターネット接続(ADSL)で試してみたところ、音声品質が悪くて使えませんでした。色んな原因があるんでしょうけども。今度自宅か、他の国に行った時に試してみようかと。
Pingback: もしSkypeがなかったら・・・
Pingback: Skype通話 – いくらで話せるの? | iphoneミステリアス