智宏2005/07/15Skypeの通信のしくみを探る前回述べたとおり、Skypeの大きな魅力である半面、管理者の不安要因になっていることとして、接続可能性の高さがある。実際Skypeを使ってみると、ファイアウォールやNATルータの存在によって、ほかのインスタント・メッセージング・ソフトウェアでは通話できないような環境でも、Skypeではあっさりと問題なく接続できてしまうケースが多い。以下本稿では、Skypeでの通話時、Skypeネットワーク内部で何が起こっているのかを解説する。後述するように、Skypeの通信は暗号化されており、詳細な通信プロトコルも公開されていないため、具体的にどのようなメッセージがやりとりされているのかは分からない。以下の解説は、ノードの挙動や、コンピュータの通信状況のモニタリング(使用ポートなど)、通信パケットをキャプチャし分析した結果、インターネットなど各所で公開された情報、一般的なPtoP技術の常識などに照らし合わせて作成したものである。できるかぎり検証して裏付けを取るように心掛けたが、前記のような理由から、類推や憶測による部分が残されていること、将来的には変更される可能性があることをあらかじめお断りしておく。起動直後のバージョン確認Skypeクライアント(以下、クライアントとしてSkypeネットワークに参加する通常ノードのことを「Skypeクライアント」と呼ぶことにする)のインストール直後、およびそれ以後の起動時のたびに、SkypeクライアントはSkypeサーバ(skype.com)に対して、HTTPのGETリクエストを送信し、サーバから最新版のバージョン情報を取得して、自身のバージョンが古くないかどうかをチェックする。自身が古いバージョンであることが分かったときには、以下のようなダイアログを表示して、Skypeクライアントのバージョンアップをユーザーに促す。Skypeクライアントのバージョンアップを促すダイアログSkypeクライアントは、(デフォルト設定では)起動時にSkypeサーバに接続し、自身のバージョンが古くなっていないかどうかを確認する。画面は、新バージョンが公開済みであることをユーザーに知らせるダイアログ。ここで[はい]を選択すると、新バージョンのSkypeクライアントのダウンロードとインストールが開始される。ここで[はい]を選択すると、新バージョンのSkypeクライアントのダウンロードとインストールが実行される。バージョンアップをすぐに実施したくなければ、[キャンセル]をクリックする。保証はされないが、基本的な機能については、多少古いバージョンであっても問題なく通信できることが多いようだ。ホスト・キャッシュを使用したスーパー・ノードへの接続バージョンチェックが終了すると、次にSkypeクライアントは、スーパー・ノードへのTCP接続を試みる。述べたとおり、スーパー・ノードは、Skypeネットワークをつかさどるノード群であり、Skypeクライアントが起動してオンラインになっている間は、ずっとこのTCP接続が維持されている。スーパー・ノードのアドレスは、「ホスト・キャッシュ」としてSkypeクライアントがローカルに保持している。Skypeクライアントは、このリストを使用して、スーパー・ノードへの接続を試みる。スーパー・ノードへの接続Skypeクライアントは、ホスト・キャッシュと呼ばれるアドレス・リストを保持しており、これを基にスーパー・ノードへの接続を試みる。ホスト・キャッシュのリストは、Skypeネットワークに接続しているときには自動的に追加、更新される。ホスト・キャッシュの内容は固定されているわけではない。スーパー・ノードは、Skypeネットワーク内にあるほかのスーパー・ノードの存在を知っており、それらをSkypeクライアントにも通知する。して通知されたスーパー・ノードのIPアドレスとポート番号の情報は、Skypeクライアントのホスト・キャッシュに保存され、以後のスーパー・ノード接続に利用される。することで、より新しいスーパー・ノードのリストを保持できる。Skypeクライアントは、必要に応じて自分が接続するスーパー・ノードを切り替える。回線速度が高速な(回線に余裕のある)スーパー・ノードなどに切り替える。条件さえ満たせば、自分自身をスーパー・ノードに切り替える場合もある。SSLプロトコル)も使用する。ファイアウォールで外部へのアクセスが厳しく制限された環境でも(組織によっては、メールとWebだけしか通さないなど、非常に制限された通信しか許可していない場合がある)、Webサイトの閲覧は許可されていることが多いので、80番ポートや443番ポートを使ってインターネットへアクセスすれば、接続できる可能性が高くなるからだ。PtoPネットワークでは、すべてのノードが対等に通信するので、自身からの発信ばかりでなく、ほかのノードからの受信(着信)にも備える必要がある。443番)が使われる。各Skypeクライアントは、これらのポートをリッスンして着信に備える(ポートがすでにほかのアプリケーションによって使用されている場合を除く)。Skypeの通信ポートTCP80番(HTTP)、443番(HTTPS)はWebによって使われるため、ファイアウォールが設置された環境でも、これらのポートを使用すれば、インターネットへアクセスできる可能性が高い。Skypeクライアントは、これらのポートを使用して、相手との通信を試みる。80番ポートを利用していても、通信内容はSkype独自のものであり、一般的なWebサーバとWebブラウザ間における通信とは異なる。着信で使用するポートの番号は、Skypeの[設定]メニューから表示されるダイアログの[接続]タブで確認、変更できる。Skypeの[設定]メニューで表示されるダイアログの[接続]タブここでは、Skypeクライアントが通信に使用するTCPのポート番号を指定する。このポート番号(とノードのIPアドレス)情報がホスト・キャッシュに登録される。デフォルトでは、インストール時に決められたランダムな数値が指定されている。このポート番号でほかのノードからのTCPの着信要求を待つ(リッスンする)。このポート番号は、後述のUDPを使った通信におけるパケットの送信元ポート番号としても利用される。TCPの80番/443番ポートも使用する場合にはチェックする。デフォルトではこのチェック・ボックスは有効になっている。-an」などを実行すると確認できる。スーパー・ノードと接続する際、Skypeクライアントは、ホスト・キャッシュにあるエントリの「IPアドレス:ポート番号」へのTCP接続を試みる、「IPアドレス:80(HTTPポート)」への接続を試みる、「IPアドレス:443ポート(HTTPSポート)」への接続を試みるといった具合に、接続可能性に応じて複数の方法でSkypeネットワークへの接続を試みる。後述するように、Skypeクライアントは、ファイアウォールやNATルータの存在によるネットワーク環境に応じて、外部との通信手段を自動的に切り替えることで、ネットワーク環境によらない高い接続性を実現している。スーパー・ノードとの接続可能性検査の結果は、Skypeクライアントのネットワーク環境を知る1つの手掛かりになっていると考えられる。して確立されたスーパー・ノードとのTCP接続を利用して、Skypeクライアントは、自身の状態などをスーパー・ノードに通知する。通話時の音声パケットは、通常はこのTCP接続ではなく、通話するノード同士が直接UDPパケットをやりとりするようになっている(詳細後述)。Skypeプログラムに埋め込まれているブートストラップ・ノードこれまで、Skypeクライアントによるスーパー・ノードへの接続について説明してきた。Skypeネットワークはダイナミックにスーパー・ノードが切り替わるPtoPネットワークであり、スーパー・ノードのアドレス(およびポート番号)は一定していない。一度Skypeネットワークに接続して、ホストのリストが蓄積されれば、次回はこのリスト中のエントリの情報を使ってスーパー・ノードに接続できる可能性が高い。Skypeを初めてインストールして起動したとき、Skypeクライアントはどうやってスーパー・ノードのアドレスを知ればよいだろうか。文献などによると、Skypeのクライアント・プログラムには、7カ所のスーパー・ノードの「IPアドレス:ポート番号」情報があらかじめ埋め込まれているようである。インストール直後のSkypeクライアントは、ホスト・キャッシュの代わりにこれらの情報を使ってスーパー・ノードに接続する。一部の文献では、これらは「ブートストラップ・ノード」と呼ばれている(ただし文献中に示されているレジストリ設定などが現在のバージョンのSkypeクライアントでは見当たらないため、初期設定時に、動的にリストを取得しているのかもしれない)。ブートストラップ・ノードは、Skypeを使い始めたユーザーから大量のアクセスを受けることになる。ノードとしての機能自体は、ほかのスーパー・ノードと同一で、ブートストラップ・ノードだからといって特別な処理が行われているわけではない。前述したとおり、Skypeネットワークにいったん接続すれば、ホスト・キャッシュが追加・更新され、次回以降の接続では、プログラムに組み込まれたブートストラップ・ノードではなく、更新されたホスト・キャッシュの接続先に接続することになる。(2017/7/21)キーボード配列が異なる言語に誤認識された場合の対処方法を紹介。