(57)【要約】【解決手段】シンメトリックＮＡＴの背後にあるノード用の、ＮＡＴ経過中の複数接続を扱う技術が開示される。シンメトリックＮＡＴ経過中に接続が失敗する確率は、ポート予測後のクリティカルタイムウィンドウを直列化することで低下する。ひとたび１番目の接続用のポート予測が始まると、それに続く接続用のポート予測は、１番目の接続のための接続性チェックが始まるまで遅延される。他のノードへ複数同時に接続するためのＮＡＴ通過を扱うために、この処理は繰り返される。【選択図】図４
2011514100.tif 000002
【特許請求の範囲】
【請求項１】
第１のシンメトリックＮＡＴ（network address translator）の後ろに位置している第１のノードと、２またはそれ以上の他のノードとの間をネットワークを通じてピアツーピア接続するための方法であって、
ａ）前記第１のノードと第２のノードとの間でコミュニケーションセッションを開始し、および前記第１のノードのある前記第１のＮＡＴ上における予測された転送アドレスのリストを構築するためにポート予測を実行し、
ｂ）予測された転送アドレスのリストを含む接続リクエストメッセージを前記第１のノードから第２のノードへ送信し、
ｃ）前記第１のノードにおいて前記接続リクエストメッセージの暫定応答を受信し、
ｄ）前記予測された転送アドレスを使って前記第１のノードと前記第２のノードとの間の接続性チェックを実行し、
ｅ）ｄ）が始まるまで、前記第１のノードと第３のノードとの間のコミュニケーションのためのポート予測を遅延することを特徴とする方法。
【請求項２】
ｆ）ｅ）の後、前記第１のＮＡＴ上の予測された転送アドレスのリストを構築する前記第１のノードと、第３のノードとの間のコミュニケーションのためのポート予測を実行し、
ｇ）予測された転送アドレスのリストを含む接続リクエストメッセージを前記第１のノードから第３のノードへ送信し、
ｈ）前記予測された転送アドレスを使って前記第１のノードと前記第３のノードとの間の接続性チェックを実行することをさらに含むことを特徴とする請求項１に記載の方法。
【請求項３】
ｉ）ｇ）の後まで、前記第１のノードと第４のノードとの間のコミュニケーションのためのポート予測を遅延することをさらに含むことを特徴とする請求項２に記載の方法。
【請求項４】
接続性チェックの実行は、前記接続リクエストメッセージ内の前記第１のノードによって提供された一またはそれ以上の転送アドレスに、前記第２のノードからのＳＴＵＮパケットを送信することを含むことを特徴とする請求項１に記載の方法。
【請求項５】
接続性チェックの実行は、ＳＴＵＮパケット応答を前記第１のノードから前記第２のノードに送信することをさらに含み、
前記ＳＴＵＮパケット応答は、前記第２のノードから送信された前記ＳＴＵＮパケットのうち一つが前記第１のノードに到達するとき通った前記第１のＮＡＴ上の外部ポートの転送アドレスを含むことを特徴とする請求項４に記載の方法。
【請求項６】
ａ）は、前記第１のＮＡＴ用のポート増加量Δｐを決定し、当該ポート増加量Δｐを用いて前記予測された転送アドレスのリストを生成することを含むことを特徴とする請求項１に記載の方法。
【請求項７】
ａ）は、前記第１のＮＡＴ用のポート増加量Δｐを決定し、当該ポート増加量Δｐおよび１又はそれ以上の異なるポート増加量を用いて前記予測された転送アドレスのリストを生成することを含み、
追加のポート増加量それぞれは、Δｐと深さＭだけ異なり、
Ｍは１よりも大きい正の整数であることを特徴とする請求項１に記載の方法。
【請求項８】
Ｍは３と等しいことを特徴とする請求項７に記載の方法。
【請求項９】
ｂ）の後一定期間ＴＷ待機するが、ｃ）の前に、前記第２のノードが他のノードと接続するために待ち行列に入れられたことを示す前記第２のノードからのメッセージに応じて、前記第１のノードと前記第２のノードとの間のコミュニケーションセッションを中止し、
ａ）、ｂ）、ｃ）、ｄ）、およびｅ）を繰り返すことをさらに含み、
前記ＴＷは、０と同じかそれより大きく、かつ前記第１ノードと前記第２のノードの間の接続失敗用のタイムアウトよりは小さいことを特徴とする請求項１に記載の方法。
【請求項１０】
ｄ）は、前記予測された転送アドレスのリストからの転送アドレスを用いて、一又はそれ以上のテストパケットを前記第１のノードから前記第２のノードへ送信することを含むことを特徴とする請求項１に記載の方法。
【請求項１１】
ｅ）は、前記一又はそれ以上のテストパケットのうちのひとつが送信されるまで、前記第１のノードと前記第３のノードとの間のコミュニケーション用のポート予測を遅延することを含むことを特徴とする請求項１０に記載の方法。
【請求項１２】
第１のシンメトリックＮＡＴ（network address translator）の後ろに位置している第１のノードと、２またはそれ以上の他のノードとの間をネットワークを通じてピアツーピア接続するための方法であって、
ａ）前記第１のノードにおいて、第１の予測された転送アドレスのリストを含む接続リクエストメッセージを第２のノードから受信し、
ｂ）前記第１のノードと第２のノードとの間でコミュニケーションセッションを開始、および前記第１のノードのある前記第１のＮＡＴ上における、予測された転送アドレスのリストを構築するためにポート予測を実行し、
ｃ）前記第１のノードから前記第２のノードに前記接続リクエストメッセージの暫定応答を送信し、
ｄ）前記接続リクエストメッセージ内の前記予測された転送アドレスを使って前記第１のノードと前記第２のノードとの間の接続性チェックを実行し、
ｅ）ｄ）が始まるまで、前記第１のノードと第３のノードとの間のコミュニケーションのためのポート予測を遅延することを特徴とする方法。
【請求項１３】
接続性チェックの実行は、前記接続リクエストメッセージ内の前記第１のノードによって提供された１またはそれ以上の転送アドレスに、前記第２のノードからＳＴＵＮパケットを送信することを含むことを特徴とする請求項１２に記載の方法。
【請求項１４】
接続性チェックの実行は、ＳＴＵＮパケット応答を前記第１のノードから前記第２のノードに送信することをさらに含み、
前記ＳＴＵＮパケット応答は、前記第２のノードから送信された前記ＳＴＵＮパケットのうちのひとつが前記第１のノードに到達するとき通った前記第１のＮＡＴ上の外部ポート転送アドレスを含むことを特徴とする請求項１３に記載の方法。
【請求項１５】
ｂ）は、前記第１のＮＡＴ用のポート増加量Δｐを決定し、当該ポート増加量Δｐを用いて前記予測された転送アドレスのリストを生成することを含むことを特徴とする請求項１２に記載の方法。
【請求項１６】
ｂ）は、前記第１のＮＡＴ用のポート増加量Δｐを決定し、当該ポート増加量Δｐおよび１又はそれ以上の異なるポート増加量を用いて前記予測された転送アドレスのリストを生成することを含み、
追加のポート増加量それぞれは、Δｐと深さＭだけ異なり、
Ｍは１よりも大きい正の整数であることを特徴とする請求項１２に記載の方法。
【請求項１７】
Ｍは３と等しいことを特徴とする請求項１６に記載の方法。
【請求項１８】
ｄ）は、前記予測された転送アドレスのリストからの転送アドレスを用いて、１又はそれ以上のテストパケットを前記第１のノードから前記第２のノードへ送信することを含むことを特徴とする請求項１２に記載の方法。
【請求項１９】
ｅ）は、前記１又はそれ以上のテストパケットのうちのひとつが送信されるまで、前記第１のノードと前記第３のノードとの間のコミュニケーション用のポート予測を遅延することを含むことを特徴とする請求項１８に記載の方法。
【請求項２０】
プロセッサと、
メモリと、
ネットワークインタフェースと、
前記メモリ内に具体化され、前記プロセッサで事項するように構成された命令を含むノードであって、前記命令は、
Ａ）命令セットであって、実行されたとき前記ノードに、
i）第１のノードと第２のノードとの間でコミュニケーションセッションを開始し、および前記第１のノードのある前記第１のＮＡＴ上における予測された転送アドレスのリストを構築するためにポート予測を実行し、
ii）前記第１のノードから第２のノードへの予測された転送アドレスのリストを含む接続リクエストメッセージを送信し、
iii）前記第１のノードにおいて前記接続リクエストメッセージの暫定応答を受信し、
iv）前記予測された転送アドレスを使って前記第１のノードと前記第２のノードとの間の接続性チェックを実行し、
v）iv）が始まるまで、前記第１のノードと第３のノードとの間のコミュニケーションのためのポート予測を遅延することを前記ノードに実行させるか、または、
Ｂ）命令セットであって、実行されたとき前記ノードに、
i）前記第１のノードにおいて、第一の予測された転送アドレスのリストを含む接続リクエストメッセージを第２のノードから受信し、
ii）前記第１のノードと第２のノードとの間でコミュニケーションセッションを開始、および前記第１のノードのある前記第１のＮＡＴ上における予測された転送アドレスのリストを構築するためにポート予測を実行し、
iii）前記第１のノードから前記第２のノードに前記接続リクエストメッセージの暫定応答を送信し、
iv）前記接続リクエストメッセージ内の前記予測された転送アドレスを使って前記第１のノードと前記第２のノードとの間の接続性チェックを実行し、
v）iv）が始まるまで、前記第１のノードと第３のノードとの間のコミュニケーションのためのポート予測を遅延することを前記ノードに実行させるかのいずれか一方の命令セットを含むことを特徴とするノード。
【発明の詳細な説明】
【技術分野】
【０００１】
本出願は、２００８年３月５日に出願された米国出願第１２／０４３，０８０号の優先権を主張し、開示内容全体を参照によりここに完全に組み入れる。
【０００２】
本発明の実施の形態はコンピュータネットワークに関し、より具体的には、コンピュータネットワーク上のＮＡＴ（network address translator）を横断するピアツーピア通信に関する。
【背景技術】
【０００３】
ＮＡＴ機能付きルータの使用は、外部ネットワークから内部ネットワークへのアクセスを妨げることがありうる。このことは、ＶｏＩＰ（voice communication over the Internet）として知られるインターネットを通じた音声通信やオンラインゲーム等のピアツーピアのアプリケーションで特有の問題となりうる。ＮＡＴは、ＬＡＮ（local area network）がプライベートＩＰアドレスのセットを内部トラフィックに利用し、グローバルＩＰアドレスを外部トラフィックに利用することを可能にするインターネットの標準である。ＮＡＴ機能を持ったノードは、しばしば「ＮＡＴボックス（NAT box）」と呼ばれる。
【０００４】
ＮＡＴは（文字どおり）、ふたつのネットワーク間のネットワーク（ＩＰ）アドレスを翻訳する。ＮＡＰＴ（Network Address Port Translation）はＩＰアドレスのみならず、転送レイヤのプロトコルのポート番号も翻訳する。ＮＡＴ／ＮＡＰＴはよい特性を持っているが、重大な副作用も存在する。もし翻訳が動的に実行されると、外部ネットワークのノードは、内部ネットワーク内のノードに連絡するためのＮＡＴ条のＩＰアドレス（およびポート番号）を前もって知るすべがない。都合の悪いことに、これは現在の市場に展開されている住宅およびＳＯＨＯのルータの最も日常的な振る舞いである。
【０００５】
ＮＡＴは一般的に、フルコーン、制限付きコーン、ポート制限付きコーン、またはシンメトリックに分類することができる。フルコーンＮＡＴは、同じ内部ＩＰアドレスおよびポートからのすべてのリクエストを同じ外部ＩＰアドレスおよびポートにマップする。さらに、任意の外部ホストは、マップされた外部アドレスにパケットを送ることにより、フルコーンＮＡＴを通して内部ホストにパケットを送ることができる。制限付きコーンＮＡＴでは、同じ内部ＩＰアドレスおよびポートからのすべてのリクエストは同じ外部ＩＰアドレスおよびポートにマップされる。フルコーンＮＡＴとは違って、ＩＰアドレスがＸである外部ホストが内部ホストにパケットを送ることができるのは、内部ホストがそのＩＰアドレスがＸである外部ホストにパケットを以前送ったことがある場合に限られる。ポート制限付きコーンＮＡＴは制限付きコーンと似ているが、制限はポート番号も含む。具体的には、ＩＰアドレスＸかつポート番号Ｐの外部ホストが、ある内部ホストにパケットを送ることができるのは、内部ホストが以前ＩＰアドレスＸかつポート番号Ｐにパケットを送ったことがある場合に限られる。
【０００６】
シンメトリックＮＡＴでは、同じ内部ＩＰアドレスおよびポートから特定の宛先ＩＰアドレスおよびポートへのすべてのリクエストは、同じ外部ＩＰアドレスおよびポートにマップされる。もし、同じ内部ホストが、同じ送信元アドレスおよびポートをもつが宛先が異なるパケットを送信するなら、異なるマッピングが使われる。さらに、パケットを受信する外部ホストだけがＵＤＰパケットを内部ホストに送り返すことができる。シンメトリックＮＡＴは、通過において最も問題のある種類のＮＡＴとなる傾向がある。シンメトリックＮＡＴ通過のためのひとつの技術は、「ポート予測」として知られている。これは米国特許出願公開２００７００７６７２９Ａ１に詳細に記載されており、参照によりここに組み入れる。この種類のシンメトリックＮＡＴの通過では、第１のノードはシンメトリックである第１のＮＡＴの背後にあり、第２のノードは第２のＮＡＴの背後にある。第１のノードは第１のＮＡＴ上における予測された転送アドレスのリストを構築する。予測された転送アドレスを用いて、第２のノードで接続性チェックが実行される。
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ＮＡＴの１８％がシンメトリックであると推定され、また接続の失敗率のうち１０％以上は、ポート予測なしと予測されている。ＮＡＴ通過を含むいくつかのアプリケーションでは、最大で６４個の同時接続が要求されることもあり得る。ポート予測がそのようなアプリケーションで確実に動作するか否かは明確でない。
【０００８】
本発明の実施の形態はこのような文脈の中で生じた。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、本発明のある態様は、第１のシンメトリックＮＡＴ（network address translator）の後ろに位置している第１のノードと、２またはそれ以上の他のノードとの間をネットワークを通じてピアツーピア接続するための方法である。この方法は、ａ）前記第１のノードと第２のノードとの間でコミュニケーションセッションを開始し、および前記第１のノードのある前記第１のＮＡＴ上における予測された転送アドレスのリストを構築するためにポート予測を実行し、ｂ）予測された転送アドレスのリストを含む接続リクエストメッセージを前記第１のノードから第２のノードへ送信し、ｃ）前記第１のノードにおいて前記接続リクエストメッセージの暫定応答を受信し、ｄ）前記予測された転送アドレスを使って前記第１のノードと前記第２のノードとの間の接続性チェックを実行し、ｅ）ｄ）が始まるまで、前記第１のノードと第３のノードとの間のコミュニケーションのためのポート予測を遅延する。
【図面の簡単な説明】
【００１０】
本発明の実施の形態は、添付の図面と併せて、以下の詳細な説明を考慮することによって容易に理解される。
【図１】図１Ａと図１Ｂとはポート予測を用いたＮＡＴ通過を示すメッセージの流れの図である。
【図２】本発明の実施の形態に係る修正されたポート予測を示すタイミング図である。
【図３】本発明の実施の形態に係るふたつのノード間のＮＡＴ通過のためのシステムを示す概略図である。
【図４】本発明の実施の形態に係るふたつのノード間のＮＡＴ通過の方法を示すフロー図である。
【図５】同時予測の問題を示すネットワークを通じて通信する３つのノードの概略図である。
【図６】本発明の実施の形態に係るポート予測を実行するように構成されたノードの概略図である。
【発明を実施するための形態】
【００１１】
以下の詳細な説明には、説明のための多くの具体的な詳細事項が含まれるが、それらに対する多くの変更や修正も本発明の技術範囲に含まれることは、当業者であれば誰でも理解するであろう。したがって、以下に説明する本発明の例示的な実施の形態は、クレームされた発明の一般性をなんら損なうことなく、また限定も行うことなく記載されている。
【００１２】
II．概要
ポート予測の技術はシンメトリックＮＡＴ（Network Address Translator）を通過するために用いられる。もしシンメトリックＮＡＴの背後にあるノードが、多くの遠隔のノードに同時に接続することを試みると、高い確率で予測は失敗する。本発明の実施の形態は、同時にポート予測する場合に生じる接続の失敗を、前の要求が接続性チェックの段階に到達するまで新しい要求を保留することによって回避する。これにより、ポート予測の問題を引き起こすことなく、ひとつのノードがシンメトリックＮＡＴを通して複数の同時接続することを可能にする。
【００１３】
III．用語
本明細書において、下記の用語は表１に示された意味を持つ。
【表１】
2011514100.tif 000003
【００１４】
略語
本明細書において、下記の略語は表２に示された意味を持つ。
【表２】
2011514100.tif 000004
【００１５】
IV．問題分析
ポート予測の失敗の基本的な問題は、図１Ａおよび図１Ｂとを参照して理解されよう。図１Ａは、第１のノード２がシンメトリックＮＡＴ（図示せず）の背後にあるときのＮＡＴ通過の基本的な流れを示す。第２のノード４と通信を開始するために、第１のノード２はＳＴＵＮサーバ６にバインディングリクエスト１０を送信する。その応答として、ＳＴＵＮサーバ６はシンメトリックＮＡＴからのアドレス情報１２を送り返す。アドレス情報１２とポート予測とを用いることで、第１のノード２はポート番号を含む候補となるアドレスのリストを構築することができる。第１のノード２は、リスト付きの接続リクエストを、シグナリングサーバ８を経由してノード４に送信することができる。第２のノード４もバインディングリクエスト１６をＳＴＵＮサーバ６に送信し、その応答としてアドレス情報を受信してもよい。アドレス情報１８を用いて、第２のノード４はそれ自身の候補のリストを生成し、暫定応答２０内でそのリストを第１のノード２に送信してもよい。その後、第１および第２のノードはチェックパケット２２、２４を送信することで接続性チェックを実行してもよい。
【００１６】
クリティカルタイムウィンドウＴＣ１は、第１のノード２のために、バインディングリクエスト１０の送信と１番目のチェックパケット２２の送信との間に存在することに留意する。この間、第１のノードによって実行されるポート予測は、バインディングリクエスト１０に対する応答としてＳＴＵＮサーバ４によって送信されたアドレス情報１２に基づく。もしこのクリティカルタイムの間にアドレス情報が変化すると、ポート予測は失敗するかも知れない。もし第１のノード２が第３のノード（図示せず）との通信のために別のバインディングリクエストを開始すると、アドレス情報が変化しうる。同様のクリティカルタイムウィンドウＴＣ２が、第２のノード４用に、第１のノード２からの接続要求１４への応答と１番目のチェックパケット２４の送信との間に存在する。
【００１７】
一般に、ＮＡＴ通過のためのクリティカルタイムウィンドウは、１番目の接続性チェックのパケットのセットが送信されたときに終了する。図１Ａを参照すると、第１のノード２用のクリティカルタイムウィンドウＴＣ１は、１番目のチェックパケット２２のセットが送信されたときに終了する。第２のノード４用のクリティカルタイムウィンドウＴＣ２は、１番目のチェックパケット２４のセットが送信されたときに終了する。
【００１８】
図１Ａに関して記載されたシンメトリックＮＡＴの通過は一般に、あるひとつのノードと他のノードとの間の通信には非常によく機能する。もしあるノードが他の複数のノードに多数同時に接続することを試みると、予期せぬ問題が発生しうる。そのような状況は、例えばマルチプレイヤのオンラインゲームで生じうる。図１Ｂは、シンメトリックＮＡＴの背後にあるノード上で動いている単一のアプリケーション３０による多数の通信セッションにおける問題を示す。例として、アプリケーション３０は１番目のセッション３２を開始する。１番目のセッション３２の中で、アプリケーション３０はノードＡへの接続を試みる。１番目のセッション３２はバインディングリクエストから接続の交渉を開始し、暫定応答の受信に続いて接続性チェックを始める。しかし、クリティカルタイムウィンドウＴＣ１の途中で、アプリケーション３０がノードＢとの通信を試みる２番目のセッション３４を開始したとする。２番目のセッション３４用の交渉の一部として、新しいＮＡＴバインディングリクエストがＳＴＵＮサーバに送信されることになる。これはＮＡＴ上のポートの割り当てを変更する。都合の悪いことに、１番目のセッション３２は、ノードＡとの通信用のポート予測のための、前のポート割り当てに依存している。この結果、１番目のセッション３２のためのポート予測は失敗し、所定のタイムアウト期間が経過した後に１番目のセッションはタイムアウトとなる。従来のポート予測スキームは、上述した顕著なポート予測の不具合に陥りやすい、問題となる特有な性質にもかかわらず、一般的には認識されていない。
【００１９】
IV．解決手法
本発明の実施の形態は、複数のポート予測における問題を、同時に多数の接続を確立しているＮＡＴ通過の交渉段階の間、「クリティカルウィンドウ」を直列化することによって克服する。マルチプレイヤのオンラインゲームのようなある種のアプリケーションが複数のピアツーピア接続の確立をサポートできるようになる点に留意する。
【００２０】
本発明のある実施の形態では、クリティカルタイムウィンドウの直列化が、２またはそれ以上のノードについてネットワークを経由してピアツーピア接続を開始しようとする、シンメトリックＮＡＴの後ろに位置しているノード上に実装されてもよい。具体的には、第１のノードと第２のノードとの間でコミュニケーションセッションを開始し、シンメトリックＮＡＴ上における予測された転送アドレスのリストを構築し、その後第１のノードから第２のノードへの予測された転送アドレスのリストを含む接続リクエストメッセージを送信してもよい。接続リクエストメッセージに対する暫定応答を受信したとき、第１のノードは、予測された転送アドレスを使って、例えばパケットを送信する等、第１のノードと第２のノードとの間の接続性チェックを実行してもよい。第１のノードは、接続性チェックが始まるまで第１のノードと第３のノードとの間のコミュニケーションのためのポート予測を遅延することにより、クリティカルタイムウィンドウを直列化してもよい。
【００２１】
同様に、クリティカルタイムウィンドウの直列化は、１またはそれ以上のノードとＮＡＴ通過の交渉をしている間にネットワークを経由してピアツーピア接続を開始するための接続リクエストを受信するシンメトリックＮＡＴの背後にあるノード上で実装されてもよい。そのようなノードが他のノードから接続リクエストメッセージを受信するとき、ポート予測を実行し、予測されたアドレスのリストを含む接続リクエストメッセージに対する暫定応答を送信し、接続性チェックを実行してもよい。追加ノードとのコミュニケーションのためのポート予測は、接続性チェックが始まるまで遅延されてもよい。
【００２２】
具体的に、図２のタイミング図に示すように、第１のノード２はＮ個の接続リクエストＲ１、Ｒ２、・・・、ＲＮを同時に生成または受信してもよい。１番目のリクエストＲ１は図１Ａに関して上述したように処理されてもよい。しかしながら、それに続くリクエストＲ２、・・・、ＲＮは、生成または受信した順番で直列的に並べられる。特に、それに続くリクエストそれぞれは、ポート予測を始める前に、その前にあるリクエストそれぞれのクリティカルタイムウィンドウＴＣが経過するまで待機する。
【００２３】
上述したように、タイムアウト期間ＴＯ内に接続か確立できない場合、接続は失敗しうる。したがって、タイムアウト期間ＴＯはＮ個全ての接続が確立できるように十分に長いことが望ましい。例えば、接続用の全てのクリティカルタイムウィンドウＴＣであり、ある接続の最大数を仮定すると、タイムアウト期間ＴＯはＮｍａｘＴＣ＋Ｔｃｏｎｎ未満とすべきである。ここで、Ｔｃｏｎｎは接続性チェックのための時間であり、Ｎｍａｘは同時接続しうる最大の数である。
【００２４】
図３に示すように、第１のノード１０２は、第１のＮＡＴ１０３を経由してパブリックネットワークＰＮＷ（例えばインターネット）と物理的に接続している第１のプライベートネットワークＮＷ１内に属する。同様に、第２のノード１０４は第２のプライベートネットワークＮＷ２内に属し、第２のＮＡＴ１０５を経由して同じパブリックネットワークにアクセスすることができる。プライベートネットワークＮＷ１とＮＷ２はそれぞれ第１および第２のノード１０２、１０４や第１および第２のＮＡＴ１０３、１０５に加えて、他のノードやＮＡＴを含んでもよい。他のプライベートネットワークもまた、パブリックネットワークＰＮＷと接続されていてもよい。パブリックネットワークＰＮＷはＳＩＰプロキシサーバ１００とＳＴＵＮサーバ１０１とを含む。第１のノード１０２は、第１のＮＡＴ１０３の背後にある第１のプライベートネットワークＮＷ１の中でのみ有効なプライベートＩＰアドレスを持っている。第１のノード１０２は、グローバルにただひとつのルーティング可能なＩＰアドレスをもっており、第１のＮＡＴ１０３は、パブリックネットワークとプライベートネットワークとの間のＩＰアドレスおよびポートの翻訳を実行する。同様に、第２のノード１０４は第２のＮＡＴ１０５の背後にある第２のプライベートネットワークＮＷ２の中でのみ有効なプライベートＩＰアドレスを持っている。第２のノード１０４はグローバルにだだひとつの、ルーティング可能なＩＰアドレスを持っており、第２のＮＡＴ１０５は、パブリックネットワークとプライベートネットワークとの間のＩＰアドレスおよびポートの翻訳を実行する。
【００２５】
ノード１０２、１０４は、例えばオーディオ／ビデオ（Ａ／Ｖ）チャット、マルティメディアストリーミング装置、ファイル共有ノード、オンラインゲームモジュール等をホストするサーバとすることができる。ノード１０２、１０４それぞれは、図６の方法のステップを実装するための命令等の命令を実行するときに特定の目的のコンピュータとなる、汎用的な目的のコンピュータであってもよい。例としては、ノード１０２および１０４はＳＩＰユーザエージェントであり、ＳＩＰプロキシサーバ１００を通して各々でメッセージを送受信できるものであってもよい。ノード１０２および１０４はＳＴＵＮクライアントでもある。それ故、第１のノード１０２は、ＳＴＵＮプロトコルを使ってＳＴＵＮサーバ１０１と通信することにより第１のノード１０２とＳＴＵＮサーバ１０１との間の通信経路内にあるＮＡＴの存在とその種類とを見出すことができる。第２のノード１０４も同様に、第２のノード１０４とＳＴＵＮサーバ１０１との間にあるＮＡＴの存在とその種類とを見出すことができる。
【００２６】
本発明の実施の形態に係るＮＡＴ通過の方法は、図３のブロック図と図４のフロー図とを同時に参照することによって理解されよう。はじめに、ノード１０２、１０４それぞれは、図４の２０２、２０４に示すようにＳＴＵＮプロトコルを使ってＮＡＴ探索を実行する。図に示す例では、第１のノード１０２は、第１のＮＡＴ１０３の背後にあってその種類はシンメトリックであることを探知する。第２のノード１０４もまた、第２のＮＡＴ１０５の背後にあってその種類は、例えばポート制限コーンであることを探知する。続いて、２０６、２０８に示すように、ノード１０２と１０４とはともに、ネットワークに参加するために自身をＳＩＰプロキシサーバ１００に登録する。これはＳＩＰプロキシサーバ１００に向かう第１および第２の信号経路１１６、１１７を確立する。ひとたび確立されると、ＳＩＰプロキシサーバ１００は、第１および第２の信号経路１１６、１１７を通して第１および第２のノード１０２、１０４それぞれにメッセージを転送することができる。
【００２７】
例として、第１のノード１０２が第２のノード１０４とピアツーピアの接続を確立したいとする。第１のノード１０２は新しいピアツーピア接続のためのローカルポート１０７を割り当てる。続いて第１のノード１０２はローカルポート１０７からＳＴＵＮサーバ１０１にバインディングリクエスト１１８を送信することによって外部ポート１１２を取得する。バインディングリクエストの送信は、第１のノード１０２用のクリティカルタイムウィンドウを開始する。第１のノード１０２は第１のＮＡＴ１０３の存在とその種類がシンメトリックであることを知っているので、２１０に示すようにポート予測を実行し、転送アドレス１０７、１１２、１１３、および１１４のリストを構築する。そのリストは接続リクエストメッセージの中に入れられてもよい。好適な実施の形態では、第１のノード１０２は第１のＮＡＴ１０３に関する情報を送信しなくてもよい。さらに、第２のノード１０４ではなく、第１のノード１０２が、ポート予測を行ってもよい。加えて、転送アドレスを含む接続リクエストメッセージの送信は、現存するＩＣＥの手順と完全互換である。
【００２８】
２０９に示すように、他のノードへ接続するために後に行われるバインディングリクエストがポート予測に干渉することを避けるために、第１のノード１０２は、バインディングリクエスト１１８を送信するときに待機期間を開始する。待機期間の間、他のノードとの通信のためのバインディングリクエストは、一時的に延期され、生成された順番で待ち行列に入れられる。
【００２９】
ステップ２１２において、第１のノード１０２は、ローカルポート１０６と既に確立された通信経路１１６とを通して、転送アドレスのリスト付きの接続リクエストメッセージをＳＩＰプロキシサーバ１００に送信する。ＳＩＰプロキシサーバ１００は、最終目的地が第２のノード１０４であるというメッセージを見つけ出し、既に確立された通信経路１１７とポート１１１とを通して接続リクエストメッセージを転送し、メッセージは最終的にローカルポート１０８上の第２のノード１０４に到達する。接続リクエストを受信すると、第２のノード１０４は、将来のピアツーピアセッションのためにローカルポート１０９を割り当てる。その後第２のノード１０４は、ローカルポート１０９からＳＴＵＮサーバ１０１にバインディングリクエスト１１９を送信することによって外部ポート１１５を取得する。２１１に示すように、他のノードへ接続するために後に行われるバインディングリクエストがポート予測に干渉することを避けるために、第２のノード１０４は、接続要求リクエストメッセージを受信するときに待機期間を開始する。待機期間の間、第２のノード１０４は、他のノードとの通信のためのバインディングリクエストは、一時的に延期され、生成された順番で待ち行列に入れられる。具体的には、第１のノード１０２はノードＸ（符号１２５）からの要求２１７を、リクエストが受信された順序で待ち行列に入れる。第２のノード１０４も同様に、ノードＹ（符号１２７）からのリクエスト２１９を待ち行列に入れる。
【００３０】
第２のノード１０４は第２のＮＡＴ１０５がシンメトリックでないことを知っているので、ローカルポート１０９と外部ポート１１５とを新たな暫定応答メッセージに入れて、そのメッセージをＳＩＰプロキシサーバ１００と第１および第２の信号経路１１６、１１７とを経由して第１のノード１０２に送り返す。暫定応答の送信は、転送交換フェーズを停止し、接続性チェックのフェーズを開始する。このステージでは、第１および第２のノード１０２、１０４は、他のノードとの通信のための新しいバインディングリクエストを安全に開始しうる。その結果、２１３、２１５それぞれに示すように、第１および第２のノード１０２、１０４用の待機期間が終了する。
【００３１】
接続性を確認するために、ノード１０２と１０４との両ノードは、ステップ２１６、２１８において他のノードから取得した転送アドレスに、ローカルポート１０７、１０９からＳＴＵＮパケットの送信を開始する。第１のノード１０２がＳＴＵＮパケット１２０を送信するとき、第１のＮＡＴ１０３は新たな外部ポート１１３を割り当て、その後パケット１２０は第２のＮＡＴ１０５上の外部ポート１１５に到達する。第２のＮＡＴ１０５はポート制限コーンＮＡＴであり第２のノード１０４はまだローカルポート１０９から第１のＮＡＴ１０３上のローカルポート１１３にパケットを送信していないかも知れないので、少量の第１のパケットは外部ポート１１５において捨てられることもあり得る。第２のノード１０４はまた、ＳＴＵＮパケット１２１、１２２、１２３を取得した転送アドレス１１２、１１３、および１１４に送信する。第１のＮＡＴ１０３はシンメトリックＮＡＴであり、ポート１１２はＳＴＵＮサーバ１０１とのセッションのために排他的に割り当てられているため、ポート１１２に到達したパケット１２１は捨てられる。第１のＮＡＴ１０３によって割り当てられた外部ポートにポート１１４は存在しないため、ポート１１４に到達したＳＴＵＮパケット１２３もまた捨てられる。ポート１１３に到達したＳＴＵＮパケット１２２は第１のＮＡＴ１０３によってローカルポート１０７に転送される。第１のノード１０２はその後第２のノード１０４に応答を送信し、その応答を受信したとき第２のノード１０４はポート１１３との接続性を持つことを見出す。第１のノード１０２上のローカルポート１０７から第２のＮＡＴ１０５上の外部ポート１１５へ送信されたＳＴＵＮパケットは、最終的に第２のノード１０４のローカルポート１０９で受信される。第２のノード１０４はその後、第１のノード１０２に応答を返信する。
【００３２】
ステップ２２０において、応答メッセージを受信したとき、第１のノード１０２は、第２のノード１０４に対して第１のノード１０２は外部ポート１１５への接続性を見つけた旨を伝えるためにＳＩＰプロキシサーバ１００を経由して第２のノード１０４にアップデートメッセージを送信する。これは、ステップ２２２において、第２のノード１０４が第１のノード１０２に接続確率処理を終了させるための最終応答メッセージを送信する契機となる。
【００３３】
ＮＡＴの種類をメッセージに入れたり第２のノード１０４に予測させたりする代わりに、第１のノード１０２が予測を行い、ＳＴＵＮサーバ１０１から取得した外部ポート１１２とともに予測した外部ポート１１３、１１４を新たな接続要求リクエストメッセージに入れる。これにより、第１のノード１０２は第１のＮＡＴ１０３に関する何の情報も第２のノード１０４に提供しない。そのようなＩＣＥメソッドの利用が、先行技術（米国特許出願公開２００４−１３９２２８）に開示されるような、「ブレイクアウト（break-out）」パケットのための複雑なＮＡＴ組み合わせロジックを完全に排除する。その代わり、本発明の実施の形態は、「ブレイクアウトパケット」と本質的に等価である接続性チェックを実行することによって同じ結果を達成することができる。このように、本発明の実施の形態によれば、予測された転送アドレスを接続性チェックリストに単に加えることで、既にＩＣＥの手順を利用しているシステムにシンメトリックＮＡＴの通過能力を追加することができる。
【００３４】
上述したように、例えば第２のノード１０４との通信を開始しようとしているノードである第１のノード１０２がポート予測を実行して予測されたポートを接続リクエストメッセージに入れる。ポート予測のための技術は多数存在する。例えば、ポート予測は次に述べる検査を用いるポート割り当てルール発見処理を用いて実装されてもよい。第１のノード１０２は、リクエスト変更（CHANGE-REQUEST）属性やアドレス応答（RESPONSE-ADDRESS）属性にあるフラグセットを付けることなくＳＴＵＮバインディングリクエストをＳＴＵＮサーバ１０１に送信する。これにより、ＳＴＵＮサーバ１０１はリクエストが来たアドレスおよびポートに応答を返信することになる。この検査は、ＮＡＴ１０３のポート割り当て特性を把握するために、ＩＰアドレスとポートとの異なる組み合わせに適用される。ＳＴＵＮサーバ１０１は、下記の表３に示すふたつの異なるＩＰアドレスＣＡおよびＤＡと、ふたつの異なるポートＣＰおよびＤＰを用いる。
【表３】
2011514100.tif 000005
【００３５】
表３に見られるように、この例ではひとつのポート毎に検査が４回（例えば試行１から試行４まで）行われる。同一のローカルポートについて全ての検査が実行されなければならない。第１のノード１０２は応答から４つのマッピングされたアドレスを取得する。これら４つのマッピングされたアドレスは、ポート割り当てルール、ポート増加量ΔＰ、および評価の一貫性を決定するために解析される。一貫性を探すために処理が複数回実行され、好ましくは異なるローカルポートであってそれと関連したＮＡＴバインディングを持っていないポートを用いるのがよい。ポート割り当てルールは、マッピングされたアドレスから取得されたポート番号を探すことによって決定できる。もし全てのポート番号が、異なるポート番号を持つ連続する宛先のために増加される場合、ポート割り当てルールは「ポートセンシティブ（port sensitive）」と呼ばれる。もし同じＩＰアドレスを持つ連続する宛先からのポート増加量（例えば、試行１から試行２、および試行３から試行４）が常に０で、かつ異なるＩＰアドレスを持つ連続する宛先からのポート増加量（例えば試行２から試行３）が０でない場合、ポート割り当てルールは「アドレスセンシティブ（address sensitive）」と呼ばれる。もし獲得したマッピングされたアドレスの全てのポート番号が同じ場合、ＮＡＴ１０３は「コーンＮＡＴ」である。
【００３６】
ΔＰの値は次のよう決定されてもよい。すなわち、アドレスセンシティブ割り当て用に、ΔＰの値は、例えば試行２と試行３のような宛先ポートが異なる連続する試行間のポート増加量と等しい。表４に示すように処理は他のローカルポートから繰り返される。この例では、試行１から試行４は表３と同様で、試行５から試行８は表３の宛先ＩＰアドレスとポート番号とのパターンを継続する。
【表４】
2011514100.tif 000006
【００３７】
表４より、連続する試行について宛先ＩＰアドレスが同じ場所は、対応するマッピングされたアドレスのポート番号も同じであることが分かることに留意する。これより、ポート割り当てルールは「アドレスセンシティブ」であることが決定できる。さらに、ΔＰの値は試行２と試行３との間、試行４と試行５との間、および試行６と試行７との間のポート増加量と等しい。
【００３８】
ポートセンシティブ割り当てでは、試行［Ｎ＋１］と試行［Ｎ］との検査から得られたマッピングされたアドレスにおける隣接するポート番号間でΔＰの値は異なる。第１のノード１０２がΔＰ決定のためのポート増加量の一貫性を決定できないような状況に関し、アプリケーションは統計的な観察に基づくΔＰの値を決定したり、有効なΔＰの取得をあきらめる決定をしたりするアルゴリズムを含んでいてもよい。
【００３９】
もし第２のＮＡＴ１０５がシンメトリックでない場合、例えば第１のノード１０２だけのためのＮＡＴ探索ステップ２０２の一部としてＮＡＴポート予測を実行するので十分であろう。第２のＮＡＴ１０５もシンメトリックＮＡＴである場合、第２のノード１０４はＮＡＴ探索フェーズ２０４の一部として同様のポート予測を実行してもよい。
【００４０】
本発明の実施の形態では、ＮＡＴ通過のためのクリティカルタイムウィンドウを直列化するように構成されたノードは他の複数のノードとの複数の接続のために直列化されてもよいことに留意する。上述のクリティカルタイムウィンドウの直列化は、ここではシンメトリックノード接続ループ（Symmetric Node Connection Loop）として参照される、落とし穴を潜在的に引き起こす可能性がある。クリティカルタイムウィンドウを直列化するために接続リクエストを待ち行列に入れることは、シンメトリックＮＡＴの背後にないノードには一般的には必要とされないことに留意する。しかしながら、３またはそれ以上のノードであってそれぞれがシンメトリックＮＡＴの背後にあるノード用にクリティカルタイムウィンドウの直列化が実装される場合には、ロックアップ（lockup）が発生しうる。この落とし穴の性質は、３つのノードが全てシンメトリックＮＡＴの背後にあることが示される図５を参照して理解されるであろう。もしノードＢがノードＡと接触を試みる間にノードＡがノードＢに接触を試みると開始依存性ループが３つのノード間で生成され、いずれのノードもピアツーピア通信を首尾よく開始できないというロックアップとなってしまうという結果となりうる。
【００４１】
図５に示される例では、もし３つのノード全てが、図２に関して上述したような直列化されたクリティカルタイムウィンドウを実装するように構成されていれば、ノードＣがノードＡと開始するのをノードＢが待つ間、およびノードＡがノードＢと開始するのをノードＣが待つ間に、ノードＡはノードＢがノードＣと開始するのを待つ。このような状況では、３つのノード全ては同じ時間待つことになり、これはロックアップの状況を生成する。この問題を克服するために、新規転送タイムアウトを実装してもよい。
【００４２】
例として、ノードＣは「待ち行列に入れられた（QUEUED）」というメッセージＱをノードＢに送信してもよい。待ち行列に入れられたというメッセージＱは、ノードＣはシンメトリックＮＡＴの背後にあり、他のノードとの接続を待っているということを示す。ノードＢは所定の待ち時間ＴＷ待機し、その後ノードＣとの開始を中止する。続いてノードＡからの接続リクエストを処理した後、再びＣと開始する。待ち時間ＴＷは０以上で、かつノードＢがノードＣとの通信をあきらめる前に待機する通常のタイムアウト時間未満であってもよい。もう少し具体的には、以下の理由から、Ｃは「待ち行列に入れられた」というメッセージＱをＢに送信する。すなわち、ＣがシンメトリックＮＡＴの背後にあること、およびリクエストはすぐに処理されずに待ち行列に入れられたということをＣは知っているからである。ノードＢは、その「待ち行列に入れられた」というメッセージに応じて比較的短い期間（例えば３秒間）待機し、ノードＣとの接続処理を中止（延期）し、待ち行列内の他のリクエストを処理して、最終的に再びＣと開始する。ノードＢが永久にノードＣとノードＣと開始しようとすることを防ぐために、同一ノードとの再試行の回数は制限され（例えば３回まで）、その後ノードＢは完全にあきらめる。そのような場合、ノードＢ上で実行しているアプリケーションは接続エラーを受信する。
【００４３】
ロックアップの別の解決手法としては、上述の手法を下記のように修正してもよい。クリティカルタイムウィンドウは外部接続リクエストのみ直列化し、やや深めのポート予測を実行してもよい。例えば、ポート増加量ΔＰに基づいてポート予測を生成するのではなく、２ΔＰ、３ΔＰ、・・・、ＭΔＰに基づくさらなるポート予測を生成してもよい。ここでＭは整数であり、予測の「深さ（depth）」と称する。例として、特定のシンメトリックＮＡＴ用にポート増加量ΔＰ＝１と決定されたと仮定する。このΔＰの値に基づいてポート予測の深さＭ＝１をもとにした候補リストは以下のようになる。
候補１：種類＝ＳＴＵＮ、202.10.9.20:9021（予測済み）
候補２：種類＝ローカル、192.168.1.2:3658
Ｍ＝１からＭ＝３まで予測を深くすると以下の候補リストが生成される。
候補１：種類＝ＳＴＵＮ、202.10.9.20:9021（予測済み）
候補２：種類＝ＳＴＵＮ、202.10.9.20:9022（予測済み）
候補３：種類＝ＳＴＵＮ、202.10.9.20:9023（予測済み）
候補２：種類＝ローカル、192.168.1.2:3658
【００４４】
「待ち行列に入れられた」という信号メッセージを用いる場合と異なり、前述の解決手法は全ての考えられるロックアップの状況に対処しうるものではないが、実装を単純化しうる。さらに、接続処理は呼ぶ側においてより並列に起こりやすいので、内部接続ではなく外部接続を直列化することは、ほとんどの起こりやすいロックアップ状況を回避することができる。内部接続用のクリティカルタイムウィンドウは直列化されないので、ポート予測は失敗しうる。ポート予測の深さを、例えばＭ＝＋１からＭ＝＋３まで増加する予測された候補の数が増加し、これはポート予測の失敗の確率を減少させる。
【００４５】
図３と図４とともに以上に説明された例は、ＳＩＰ（Session Initiation Protocol; RFC 3261）プロトコルを用いるピアツーピアのＵＤＰセッションの確立と関連する。しかしながら、本発明の実施の形態は、直接的な接続の確立の前にパブリックネットワーク上のプロキシサーバを経由して他のピアに信号を送受信することを可能とする任意の他の信号プロトコルに適用することができる。そのような信号プロトコルはＨ．３２３、ＭＧＣＰ、ＨＴＴＰ、ＸＭＰＰ等を含みうるがこれに限定されるものではない。
【００４６】
ＮＡＴ通過アルゴリズムはソフトウェアまたはハードウェア、あるいは両者の組み合わせによって実装してもよい。例として、図６はそのようなアルゴリズムを実装するコンピュータ装置を示す。装置４００はプロセッサモジュール４０１とメモリ４０２とを含む。プロセッサモジュール４０１はシングルプロセッサまたはマルチプロセッサを含む。シングルプロセッサの一例として、プロセッサモジュール４０１はインテル社のＰｅｎｔｉｕｍ（登録商標）マイクロプロセッサや同様のＩｎｔｅｌ互換のマイクロプロセッサを含んでもよい。マルチプロセッサの一例として、プロセッサモジュール４０１はセルプロセッサを含んでもよい。
【００４７】
メモリ４０２は、集積回路（例えばＲＡＭ、ＤＲＡＭ、ＲＯＭ、など）の形態をとる。メモリ４０２はメインメモリまたはセルプロセッサのシナジスティックプロセッサエレメント（synergistic processor element）のローカルストアでもよい。コンピュータプログラム４０３は、プロセッサモジュール４０１上で実行することができるインストラクションの形で、メモリ４０２に格納される。プロセッサモジュール４０１は、プログラム４０３命令を格納する１またはそれ以上のレジスタ４０５を含んでもよい。プログラム４０３の命令は、例えば図２、図３、および図４に関して上述したようなネットワークを経由したピアツーピア接続方法のステップを含んでもよい。具体的には、プログラム４０３は、多数の接続の試みがポート予測に干渉することを防ぐために、上述したような他のノードへの接続のための要求を待ち行列に入れる。プログラムはメモリ４０２に格納される接続キュー４０７を生成してもよい。接続キュー４０７はテーブルかまたは別のデータ構造で実装してもよい。接続キュー４０７は、前の他の開始キュー用のクリティカルタイムウィンドウが経過した後にキュー４０７から接続が解放されるために、ある特定の接続が開始された時間を格納する。
【００４８】
プログラム４０３は、Ｃ、Ｃ＋＋、ＪＡＶＡ（登録商標）、アセンブリ言語、ＭＡＴＬＡＢ、ＦＯＲＴＲＡＮ、あるいはその他の数多くの言語のような、プロセッサに読み取り可能な適切な言語で書かれてもよい。装置は、入出力（Ｉ／Ｏ）エレメント４１１、電源（Ｐ／Ｓ）４１２、クロック（ＣＬＫ）４１３、およびキャッシュ４１４のようなよく知られた補助機能４１０を含んでもよい。装置４００は、ディスクドライブ、ＣＤ−ＲＯＭドライブ、テープドライブ等のようなプログラムおよび／またはデータを格納するため大容量ストレージを随意に含んでもよい。装置４００は、デバイスとユーザとの間のやり取りを手助けするためのディスプレイユニット４１６とユーザインタフェースユニットとを随意に含んでもよい。ディスプレイユニット４１６は、テキスト、数字、グラフィカルな記号や画像を表示するＣＲＴ（cathode ray tube）や他のフラットパネルスクリーンの形態としてもよい。ディスプレイユニット４１６は、聞き取り可能な音声を出力するスピーカや他の音声変換器を含んでもよい。ユーザインタフェース４１８は、ＧＵＩ（graphical user interface）とともに用いられるキーボード、マウス、ジョイスティック、光学ペン、マイクロフォン、または他のデバイスを含んでもよい。装置４００は、インターネットのようなネットワークを介して他のデバイスと通信を可能とするためのネットワークインタフェース４２０を含んでもよい。これらの構成要素はハードウェア、ソフトウェア、またはファームウェア、あるいはこれらのうちの２または３個の組み合わせによって実装されてもよい。
【００４９】
Ｖ．結果
本発明の実施の形態は、ＮＡＴ通過機能を実装するピアツーピアライブラリで、そのピアツーピアライブラリ上で動作する簡単な接続性チェックツールを用いてテストした。接続の両端のノードはシンメトリックＮＡＴの背後にある。ＰｌａｙＳｔａｔｉｏｎ３の開発ステーション上に実装されたピアツーピアライブラリのノードは、Ｌｉｎｕｘ ＰＣ上で動作している６４個の他のノードに接続を試みた。外部および内部への接続用のクリティカルタイムウィンドウはともに直列化された。６４個全ての接続は首尾よく確立できた。
【００５０】
本発明の好ましい実施の形態を完全な形で説明してきたが、いろいろな代替物、変形、等価物を用いることができる。したがって、本発明の範囲は、上記の説明を参照して決められるものではなく、請求項により決められるべきであり、均等物の全範囲も含まれる。ここで述べた特徴はいずれも、好ましいかどうかを問わず、他の特徴と組み合わせてもよい。請求項において、明示的に断らない限り、各項目は１またはそれ以上の数量である。請求項において「〜のための手段」のような語句を用いて明示的に記載する場合を除いて、請求項がミーンズ・プラス・ファンクションの限定を含むものと解してはならない。
【図１Ａ】
2011514100.tif 000007
【図１Ｂ】
2011514100.tif 000008
【図２】
2011514100.tif 000009
【図３】
2011514100.tif 000010
【図４】
2011514100.tif 000011
【図５】
2011514100.tif 000012
【図６】
2011514100.tif 000013
【国際調査報告】
2011514100.tif 000014
2011514100.tif 000015