〔実施形態1〕
(ゲームシステム1の構成)
図1は、本実施形態に係るゲームシステム1の構成の一例を示すブロック図である。ゲームシステム1(通信システム)は、ユーザ端末10−1(コンピュータ、通信装置)、ユーザ端末10−2、ユーザ端末10−3(他のコンピュータ、他の通信装置)、ゲームサーバ30、ルータ50−1、ルータ50−2、およびSTUNサーバ70(サーバ)を備えている。これらの装置は、インターネットを含むネットワークNWを介して接続される。ユーザ端末10−1、ユーザ端末10−2、およびユーザ端末10−3は、同様の構成であるため、特に区別しない場合には、「−1」、「−2」等の記載を省略してユーザ端末10として説明する。ここでは3台のユーザ端末10を図示しているが、任意の台数のユーザ端末10がゲームサーバ30に接続されてもよい。ルータ50−1およびルータ50−2は、同様の構成であるため、特に区別しない場合には、「−1」、「−2」等の記載を省略してルータ50として説明する。ここでは2台のルータ50を図示しているが、任意の台数のルータ50がゲームサーバ30に接続されてもよい。
ユーザ端末10は、ユーザが利用するコンピュータである。ユーザ端末10の例として、PC(Personal Computer)、タブレットPC、スマートフォンおよびフィーチャーフォン等の携帯電話機、携帯情報端末(PDA:Personal Digital Assistant)、据え置き型ゲーム機、および携帯ゲーム機等が挙げられる。
ゲームサーバ30は、ユーザ端末10にゲームを提供するための、サーバ機能を有するコンピュータ(装置)である。ゲームサーバ30は、ユーザ端末10に、ゲームサーバ30と通信しながら進行するゲームを提供する。ゲームは、ユーザ端末10に予めインストールされたゲームであればよい。あるいは、ゲームは、ゲームを実行するための専用のプログラムをユーザ端末10にインストールすることが不要なブラウザゲームであってもよい。ブラウザゲームは、ユーザ端末10においてウェブブラウザを実行することによりウェブブラウザ上に表示されるゲーム画面でプレイすることが可能なゲームのことである。ゲームサーバ30は、ユーザ端末10に対するユーザの操作入力に基づいてゲームの各種の処理を実行し、ゲームの進行に応じてゲーム画面をユーザ端末10に表示させる。
ルータ50は、ユーザ端末10と、ゲームサーバ30およびSTUNサーバとの通信を仲介するルーティング装置である。ルータ50は、NAPT(Network Address Port Translation)機能を有するルータである。図1では、ルータ50−1およびルータ50−2は、それぞれ別のユーザの自宅に設置される。また、ユーザ端末10−1および10−2がルータ50−1に接続され、ユーザ端末10−3がルータ50−3に接続される。
STUNサーバ70は、STUN(Session Traversal Utilities for NAT)のプロトコルに対応した、サーバ機能を有するコンピュータ(装置)である。STUNサーバ70は、当該プロトコルに基づいて、ネットワークNWを介して受信したSTUNパケットの送信元アドレスおよび送信元ポート番号を記憶する。STUNサーバ70は、さらに、受信したSTUNパケットの送信元に対して、記憶した送信元アドレスおよび送信元ポート番号を含むSTUNパケットを返送する。
(ユーザ端末10のハード構成)
図2は、本実施形態に係るユーザ端末10のハードウェア構成の一例を示す図である。ユーザ端末10は、例えば、CPU(Central Processing Unit)11、通信部12、入力部13、表示部14、および記憶部15を備え、ネットワークNWを介して接続されたゲームサーバ30および他の装置等と通信部12を介して通信する。これらの構成要素は、バス16を介して相互に通信可能に接続されている。CPU11は、記憶部15に記憶された各種プログラムを実行し、ユーザ端末10の各部を制御する。
通信部12は、例えば、イーサネット(登録商標)ポートやUSB等のデジタル入出力ポート、WiFi(登録商標)等の無線通信等を含んで構成される。入力部13は、例えば、タッチパネルとしてディスプレイと一体に構成されており、ユーザの操作により各種の指示が入力される。また、入力部13は、キーボードやマウス、タッチパッドや、音声により各種の指示が入力されるマイクロホンなど、その他の入力装置であってもよい。
表示部14は、画像やテキスト等の情報を表示するディスプレイであり、例えば、液晶ディスプレイパネルまたは有機EL(Electro Luminescence)ディスプレイパネルなどを含んで構成される。
記憶部15は、例えば、HDD(Hard Disk Drive)、SSD(Solid State Drive)、EEPROM(Electrically Erasable Programmable Read-Only Memory)、ROM(Read Only Memory)、およびRAM(Random Access Memory)などを含み、ユーザ端末10が処理する各種情報および画像、ならびにプログラム(ゲーム制御プログラムを含む)等を記憶する。なお、記憶部15は、ユーザ端末10に内蔵されるものに限らず、USB等のデジタル入出力ポート等によって接続された外付け型の記憶装置でもよい。また、ユーザ端末10は、不図示のスピーカ、音声出力端子、カメラ、ジャイロセンサ、GPS(Global Positioning System)受信モジュールなどのハードウェア構成を含んで構成されてもよい。
(ゲームサーバ30のハードウェア構成)
図3は、本実施形態に係るゲームサーバ30のハードウェア構成の一例を示す図である。ゲームサーバ30は、例えば、CPU31、通信部32、入力部33、および記憶部34を備え、ネットワークNWを介して接続された複数のユーザ端末10および他の装置等と通信部32を介して通信する。これらの構成要素は、バス35を介して相互に通信可能に接続されている。CPU31は、記憶部34に記憶されたゲーム制御プログラムを実行し、複数のユーザ端末10でプレイ可能なゲームを提供する。
通信部32は、例えば、イーサネット(登録商標)ポートやUSB等のデジタル入出力ポート、WiFi(登録商標)等の無線通信等を含んで構成され、CPU31による制御に基づいて、ネットワークNWを介して複数のユーザ端末10や他の装置と通信を行う。
入力部33は、例えば、キーボードやマウス、タッチパッドや、音声により各種の指示が入力されるマイクロホンなど、その他の入力装置である。
記憶部34は、例えば、HDD、EEPROM、RAMなどを含み、ゲーム制御プログラム、アプリケーションプログラム、ゲームに必要な各種設定情報および履歴情報などを記憶する。なお、記憶部34は、ゲームサーバ30に内蔵されるものに限らず、USB等のデジタル入出力ポート等によって接続された外付け型の記憶装置でもよい。また、記憶部34は、ゲームサーバ30とは物理的に離れた外部の記憶装置であってもよく、ゲームサーバ30とインターネットなどの通信網を介して接続されてもよい。また、ゲームサーバ30は、不図示の表示部、スピーカ、音声出力端子などのハードウェア構成を含んで構成されてもよい。
(ユーザ端末10の機能構成)
図4は、本実施形態に係るユーザ端末10の機能構成の一例を示すブロック図である。図4に示すように、ユーザ端末10は、記憶部15に記憶されているゲーム制御プログラムをCPU11が実行することにより実現される機能構成として、入力受付部110、表示制御部120、ゲーム管理部130、および通信制御部140(通信部、第1受信部、第2受信部、第1送信部、第2送信部)を備えている。通信制御部140は、ポート番号決定部141(特定部)およびポートフォワーディング設定部142(設定部)を備えている。
入力受付部110は、入力部13に対するユーザの操作を受け付ける。例えば、入力受付部110は、表示部14に表示されるゲーム画面に対してプレイするユーザの操作を、入力部13を介して受け付ける。また、入力受付部110は、受け付けたユーザの操作に基づく操作情報を、通信部12を介してゲームサーバ30へ送信する。操作情報には、コントローラなどの入力部3から出力された信号そのもの(例えば、所定のボタンが押下されたことを示す情報)が含まれる。操作情報には、他にも、入力部3から出力された信号そのものから、ゲームの状況に応じて加工された、ゲーム内で用いられる情報が含まれる。このような情報として、例えば、例えば所定のボタンの押下がキャラクタに所定の動作を実行させることを規定した情報が挙げられる。
表示制御部120は、ゲーム管理部130が生成した各種のゲーム画像を表示部14に表示させる。
ゲーム管理部130は、ユーザ端末10において実行されるゲームに関する処理を管理する。
通信制御部140は、ユーザ端末10とゲームサーバ30との間の通信を制御する。通信制御部140は、例えば、入力受付部110が受け付けた操作に基づく操作情報を、通信部12を介してゲームサーバ30へ送信する。入力受付部110は、他にも、ゲームをプレイするユーザのユーザ情報、および、ゲーム処理の実行結果を示す情報なども、通信部12を介してゲームサーバ30へ送信する。ユーザ情報として、ユーザを識別するための識別情報(例えば、ユーザID)、パスワード、およびユーザ名(ゲーム内でのユーザの名称)等が挙げられる。また、通信制御部140は、ユーザ端末10でプレイされるゲームに関する情報を、通信部12を介してゲームサーバ30から取得する。通信制御部140は、さらに、ユーザ端末10とSTUNサーバ70との間の通信を制御する。
ポート番号決定部141は、ユーザ端末10のローカルポート番号、およびルータ50のポート番号をそれぞれ決定する。ポートフォワーディング設定部142は、NAPTに基づくポートフォワーディングを、ルータ50に設定する。ポートフォワーディングの詳細は後述する。
(ゲームサーバ30の機能構成)
図5は、本実施形態に係るゲームサーバ30の機能構成の一例を示すブロック図である。図5に示すように、ゲームサーバ30は、記憶部34に記憶されているゲーム制御プログラムをCPU31が実行することにより実現される機能構成として、ゲーム管理部310、マッチング部320、および通信制御部330を備えている。
ゲーム管理部310は、ゲームサーバ30において実行されるゲームに関する処理を管理する。マッチング部320は、複数のユーザのなから、対戦ゲームにおける対戦相手である2名のユーザをマッチングする。通信制御部330は、ゲームサーバ30とユーザ端末10との間の通信を制御する。通信制御部330は、例えば、ユーザ端末10から送信された操作情報を、通信部32を介して受信する。通信制御部330は、さらに、受信した操作情報に基づいてゲーム処理した結果を示す、ゲームの状況情報を、通信部32を介してユーザ端末10に送信する。状況情報として、例えば、ゲームがサッカーゲームである場合、得点情報、および選手の現在位置情報などが挙げられる。
(ネットワーク接続形態の詳細)
本実施形態では、ゲームサーバ30、ルータ50、およびSTUNサーバ70には、ネットワークNWにおいて一意に識別されるグローバルIPアドレスがそれぞれ割り当てられている。本実施形態では、ゲームサーバ30にIPアドレス「11.11.11.1」が割り当てられ、STUNサーバ70にIPアドレス「11.11.11.2」が割り当てられる。ゲームサーバ30は、例えばポート番号「1000」を使ってゲームサーバ30上でプロセスとして実行されるゲームサービスを、各ユーザ端末10に提供する。STUNサーバ70は、例えばポート番号「80」を使ってSTUNサーバ70上でプロセスとして実行されるSTUNサービスを、各ユーザ端末10に提供する。本実施形態では、さらに、ルータ50−1にIPアドレス「22.22.22.1」が割り当てられ、ルータ50−2にIPアドレス「22.22.22.2」が割り当てられる。
ユーザ端末10は、これらのグローバルIPアドレスを必要に応じて参照することができる。本実施形態では、ユーザ端末10−1および10−2は、ゲームサーバ30、ルータ50−1、およびSTUNサーバ70の各IPアドレスを、事前に参照済みである。また、ユーザ端末10−3は、ゲームサーバ30、ルータ50−2、およびSTUNサーバ70の各IPアドレスを、事前に参照済みである。
ユーザ端末10には、ユーザ端末10が接続されるプライベートネットワークにおいて一意に識別されるプライベートIPアドレスが割り当てられる。図1では、ユーザ端末10−1にIPアドレス「192.168.10.1」が割り当てられ、ユーザ端末10−2にIPアドレス「192.168.10.2」が割り当てられる。ユーザ端末10−3にIPアドレス「192.168.10.1」が割り当てられる。これらのIPアドレスはプライベートネットワークの内側においてのみ有効なアドレスであるため、プライベートネットワークの外側に配置されるゲームサーバ30およびSTUNサーバ70が参照することはできない。
以下では、ユーザ端末10−1を操作するユーザと、ユーザ端末10−3を操作する他のユーザとがオンラインゲームで対戦する際の、ユーザ端末10−1とユーザ端末10−3と間で行われるP2P通信について説明する。
(通信方法の詳細)
図6は、本実施形態に係るユーザ端末10が実行する通信方法の処理手順を示すフローチャートである。図6に示す一連の処理が開始される前に、ユーザ端末10−1のユーザは、ゲームのオンライン対戦をプレイするための操作をユーザ端末10−1に入力する。入力受付部110は、この入力を受け付けると、P2P通信のための準備処理の実行を通信制御部140に指示する。通信制御部140は、この指示に基づいて、ルータ50−1を介して、STUNパケット(第1信号)を、STUNサーバ70に送信する(S101)。その際、通信制御部140は、STUNパケットを、ルータ50−1によって設定されるポートフォワーディングを用いて送信する。
STUNパケット送信は、次のようにして実現される。まず、ポート番号決定部141が、ユーザ端末10−1のポート番号を決定する。このポート番号は、ユーザ端末10−1がルータ50−1と通信するために用いるローカルポート番号である。図6では、ポート番号決定部141は、固定のポート番号「5000」を決定する。通信制御部140は、決定されたポート番号「5000」を用いてSTUNパケットをルータ50−1に送信することによって、ルータ50−1を介してSTUNパケットをSTUNサーバ70に送信するようにルータ50−1に要求する。
ルータ50−1は、ユーザ端末10−1からSTUNパケットを受信すると、NAPTに基づくポートフォワーディングをルータ50−1に設定する。ここでは、ルータ50−1は、UPnPによって設定されないポートフォワーディングを、第1セッションとしてルータ50−1に自動的に設定する。ここでいう「自動的に設定」とは、ルータ50−1がユーザ端末10−1からの指示を受けることなく、自らルータ50−1にポートフォワーディングを設定することを意味する。詳細には、ルータ50−1は、まず、ルータ50−1のポート番号「2000」(第1ポート番号)を決定する。このポート番号は、ルータ50−1がSTUNサーバ70などの外部装置とネットワークNWを介して通信するために用いるグローバルポート番号である。ここでは、ルータ50−1は、ルータ50−1が利用可能な空きポート番号のうちのポート番号「2000」を、STUNパケット送信用のポート番号として決定する。
次に、ルータ50−1は、ユーザ端末10−1から受信したSTUNパケットの送信元アドレスおよび送信元ポート番号を、ユーザ端末10−1のIPアドレス「192.168.10.1」およびポート番号「5000」から、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「2000」に変換するように設定する。ルータ50−1は、変換後のSTUNパケットを、パケットの送信先(STUNサーバ70)に転送する。
ルータ50−1はさらに、ルータ50−1のポート番号「2000」宛に届いたSTUNパケットの送信先アドレスおよびポート番号を、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「2000」から、ユーザ端末10−1のIPアドレス「192.168.10.1」およびポート番号「5000」に変換するように設定する。これにより、ルータ50−1は、変換後のSTUNパケットを、パケットの送信先(ユーザ端末10−1)に転送する。
言い換えれば、ルータ50−1は、ユーザ端末10−1がポート番号「5000」を用いてSTUNサーバ70に送信しようとしたSTUNパケットを、ルータ50−1がポート番号「2000」を用いてSTUNサーバ70に送信したSTUNパケットとしてSTUNサーバ70に転送するように設定する。さらに、ルータ50−1のポート番号「2000」宛に届いたSTUNパケットを、ポート番号「5000」を用いるユーザ端末10−1に転送するように設定する。
ルータ50−1は、第1セッションとして設定されるポートフォワーディングを用いて、ルータ50−1から送信要求されたSTUNパケットを、STUNサーバ70に転送する。これにより、これにより、通信制御部140は、ルータ50−1を介してSTUNパケットをSTUNサーバ70に送信することができる。また、STUNサーバ70は、送信元アドレスとしてIPアドレス「22.22.22.1」およびポート番号「2000」を含むSTUNパケットをルータ50−1から受信する。STUNサーバ70は、受信したSTUNパケットに含まれるIPアドレス「22.22.22.1」およびポート番号「2000」を記憶する。STUNサーバ70は、さらに、記憶したIPアドレス「22.22.22.1」およびポート番号「2000」を含むSTUNパケット(第1返答)を、ルータ50−1のポート番号「2000」宛に送信する。
通信制御部140は、STUNサーバ70から送信されたSTUNパケットを受信する(S102)。詳細には、STUNサーバ70から送信されたSTUNパケットは、ルータ50−1のポート番号「2000」宛に届く。ルータ50−1は、第1セッションとして設定されたポートフォワーディングを用いて、STUNサーバ70から受信したSTUNパケットを、ユーザ端末10−1のポート番号「5000」に転送する。これにより、通信制御部140は、ルータ50−1を介してSTUNパケットをSTUNサーバ70から受信することができる。
ポート番号決定部141は、受信したSTUNパケットに含まれるルータ50−1のポート番号「2000」を、STUNパケットから特定する(S104)。これにより、通信制御部140は、ルータ50−1がポート番号「2000」を使用可能であることを把握することができる。
以上の処理と並行して、ルータ50−1に接続されるユーザ端末10−2が、シングルプレイゲームを開始するための開始要求を、ゲームサーバ30に対して送信する。その際、ユーザ端末10−2は、固定のポート番号「6000」を用いて、開始要求をルータ50−1に送信することによって、ルータ50−1を介して開始要求をゲームサーバ30に送信するようにルータ50−1に要求する。
ルータ50−1は、ユーザ端末10−2から開始要求を受信すると、NAPTに基づくポートフォワーディングをルータ50−1に設定する。ここでは、ルータ50−1は、UPnPによって設定されないポートフォワーディングを、第2セッションとしてルータ50−1に自動的に設定する。詳細には、ルータ50−1は、まず、ルータ50−1のポート番号「2020」を決定する。このポート番号は、ルータ50−1がゲームサーバ30などの外部装置とネットワークNWを介して通信するために用いるグローバルポート番号である。ここでは、ルータ50−1は、ルータ50−1が利用可能な空きポート番号のうちのポート番号「2020」を、開始要求送信用のポート番号として決定する。第2セッションは、第1セッションとは独立して、ルータ50−1が自動的にルータ50−1に設定するものである。
次に、ルータ50−1は、ユーザ端末10−2から受信した開始要求の送信元アドレスおよび送信元ポート番号を、ユーザ端末10−2のIPアドレス「192.168.10.2」およびポート番号「6000」から、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「2020」に変換するように設定する。ルータ50−1は、変換後の開始要求を、開始要求の送信先であるゲームサーバ30に転送する。
ルータ50−1はさらに、ルータ50−1のポート番号「2020」宛に届いたゲームサーバ30からパケットの送信先アドレスおよびポート番号を、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「2020」から、ユーザ端末10−2のIPアドレス「192.168.10.2」およびポート番号「6000」に変換するように設定する。これにより、ルータ50−1は、変換後のパケットを、パケットの送信先であるユーザ端末10−2に転送する。
以上のように、ルータ50−1は、ルータ50−1宛に届いたパケットを、ルータ50−1に設定した各セッションに基づいて、ユーザ端末10−1およびユーザ端末10−2のうちいずれか振り分けて転送する。すなわち、ルータ50−1のポート番号「2000」宛に届いたパケットは、ポート番号「2000」に対応する第1セッションに基づいてユーザ端末10−1に転送し、ルータ50−1のポート番号「2020」宛に届いたパケットは、ポート番号「2020」に対応する第2セッションに基づいてユーザ端末10−2に転送する。このようにして、ルータ50−1は、ユーザ端末10−1またはユーザ端末10−2宛のパケットを、正しい送信先に転送することができる。
ユーザ端末10−1およびユーザ端末10−2は、通常、ルータ50−1が自動的にセッションを設定することを把握することはない。ユーザ端末10−1またはユーザ端末10−2がパケットの送信をルータ50−1に要求すれば、ルータ50−1は、自動的にセッションを設定することによって、この送信要求に対応する。また、ルータ50−1に自動的に設定された第1セッションおよび第2セッションには有効期限があるため、第1セッションおよび第2セッションは、設定後に所定時間が過ぎると消滅する。これにより、第1セッションおよび第2セッションの設定時に用いた各ポート番号が開放される。したがって、ルータ50−1は、開放されたポート番号を他の通信に用いることができるので、少ないポート番号を有効活用することができる。
本実施形態では、ユーザ端末10−1は、第1セッションおよび第2セッションが自動的に設定された後、ユーザ端末10−3とP2P通信するための第3セッションをルータ50−1に設定する。まず、ポート番号決定部141は、STUNパケットから特定したポート番号「2000」と所定数異なるポート番号を決定する。ここでは、所定数は1である。したがって、ポート番号決定部141は、ポート番号「2000」よりも1つ大きいルータ50−1のポート番号「2001」(第2ポート番号)を特定する(S106)。
ポートフォワーディング設定部142は、特定されたポート番号「2001」に対応するUPnPによるポートフォワーディングを、第3セッションとしてルータ50−1に設定する(S108)。すなわち、ポートフォワーディング設定部142は、UPnPのプロトコルに従って、SOAPメッセージを介してポートフォワーディングをルータ50−1に設定する。この設定は、次のようにして実現される。まず、ポート番号決定部141は、ルータ50−1のポート番号「2001」に対応するルータ50−1の新たなローカルポート番号を決定する。ここでは、「5000」よりも1つ大きいポート番号「5001」を特定する。これにより、ルータ50−1は、ユーザ端末10−1のポート番号「5001」およびルータ50−1のポート番号「2001」に対応したポートフォワーディングを、ルータ50−1に設定する。
詳細には、ポートフォワーディング設定部142は、ユーザ端末10−1がポート番号「5001」を用いてルータ50−1に送信要求したSTUNパケットの送信元アドレスおよび送信元ポート番号を、ユーザ端末10−1のIPアドレス「192.168.10.1」およびポート番号「5001」から、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「2001」に変換するように、ルータ50−1に設定する。ポートフォワーディング設定部142は、さらに、ルータ50−1のポート番号「2001」宛に届いたSTUNパケットの送信先アドレスおよびポート番号を、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「2001」から、ユーザ端末10−1のIPアドレス「192.168.10.1」およびポート番号「5001」に変換するように、ルータ50−1に設定する。
言い換えれば、ポートフォワーディング設定部142は、ユーザ端末10−1がポート番号「5001」を用いてSTUNサーバ70に送信しようとしたSTUNパケットを、ルータ50−1がポート番号「2001」を用いてSTUNサーバ70に送信したSTUNパケットとしてSTUNサーバ70に転送するように、ルータ50−1に設定する。さらに、ルータ50−1のポート番号「2001」宛に届いたSTUNパケットを、ポート番号「5001」を用いるユーザ端末10−1に転送するように、ルータ50−1に設定する。
通信制御部140は、第3セッションとしてルータ50−1に設定したポートフォワーディングを用いて、STUNパケット(第2信号)をSTUNサーバ70に送信する(S110)。ルータ50−1には第3セッションが設定済みであるため、ルータ50−1は、新たなセッションを設定することなく、ユーザ端末10−1から送信要求されたSTUNパケットを、ルータ50−1のポート番号「2001」から送信されたSTUNパケットとして、STUNサーバ70に転送する。これにより、通信制御部140は、第3セッションに対応するポートフォワーディングを用いて、STUNパケットをSTUNサーバ70に送信することができる。また、STUNサーバ70は、送信元アドレスとしてIPアドレス「22.22.22.1」およびポート番号「2001」を含むSTUNパケットから受信する。STUNサーバ70は、受信したSTUNパケットに含まれるIPアドレス「22.22.22.1」およびポート番号「2001」を記憶する。STUNサーバ70は、さらに、記憶したIPアドレス「22.22.22.1」およびポート番号「2001」を含むSTUNパケット(第2返答)を、ルータ50−1のポート番号「2001」宛に送信する。
通信制御部140は、STUNサーバ70から送信されたSTUNパケットを受信する(S112)。詳細には、STUNサーバ70から送信されたSTUNパケットは、ルータ50−1のポート番号「2001」宛に届く。ルータ50−1は、第3セッションとして設定されたポートフォワーディングを用いて、STUNサーバ70から受信したポート番号「2001」宛のSTUNパケットを、ユーザ端末10−1のポート番号「5001」に転送する。これにより、通信制御部140は、ルータ50−1を介してSTUNパケットをSTUNサーバ70から受信することができる。
ポート番号決定部141は、受信したSTUNパケットに、ルータ50−1のポート番号「2001」が含まれるか否かを判定する(S114)。判定結果が偽である場合、図6に示す処理は終了する。この場合、通信制御部140は、第3セッションが正しく設定されなかったことを確認する。一方、判定結果が真の場合、通信制御部140は、第3セッションを用いて送信したSTUNパケットに対する返答であるSTUNパケットの受信に成功したことを特定する(S116)。これにより、通信制御部140は、第3セッションが正しくルータ50−1に設定されたこと、すなわちルータ50−1がポート番号「2001」を利用可能であることを確認する。言い換えれば、通信制御部140は、第3セッションを用いてSTUNパケットをサーバ70に送信した後、ポート番号「2001」を含むSTUNパケットをサーバ70から受信した場合、ポート番号「2001」に対応したUPnPによるポートフォワーディングがルータ50−1に正しく設定されたことを確認する。
この後、通信制御部140は、P2P通信のための準備処理が完了したことを、ゲーム管理部130に通知する。ゲーム管理部130は、この通知に基づいて、対戦ゲームのマッチング要求をSTUNサーバ70に送信するように、通信制御部140に指示する。通信制御部140は、この指示に基づいて、ポート番号「2001」に対応したポートフォワーディングを用いて、対戦ゲームのマッチング要求をゲームサーバ30に送信する(S118)。第3セッションに有効期限はないため、ルータ50−1またはユーザ端末10−1が明示的に第3セッションを開放しない限り、永続的にルータ50−1に設定され続ける。そこで、通信制御部140は、第3セッションとしてゲームサーバ30に設定済みのポートフォワーディングを用いて、マッチング要求を送信する。これにより、ルータ50−1は、ユーザ端末10−1から受信したマッチング要求の送信元アドレスおよび送信元を、ユーザ端末10−1のIPアドレス「192.168.10.1」およびポート番号「5001」から、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「2001」に変換する。その結果、ルータ50−1は、送信元アドレスおよびポート番号としてルータ50−1のIPアドレス「22.22.22.1」およびポート番号「2001」を含むマッチング要求を、ゲームサーバ30に転送する。このようにして、通信制御部140は、ルータ50−1を介してマッチング要求をゲームサーバ30に送信することができる。
本実施形態では、ユーザ端末10−3が、上述した手順と同様の手順に従って、P2P通信のための準備処理を完了するものとする。その際、ユーザ端末10−3は、ルータ50−2のポート番号「4001」に対応したUPnPによるポートフォワーディングを、ルータ50−2に設定する。ユーザ端末10−3は、さらに、UPnPによるポートフォワーディングを用いて、ルータ50−2を介してマッチング要求をゲームサーバ30に送信する。これによりルータ50−2は、送信元アドレスおよびポート番号としてルータ50−2のIPアドレス「22.22.22.2」およびポート番号「4001」を含むマッチング要求を、ゲームサーバ30に転送する。
ゲームサーバ30において、通信制御部330が、ユーザ端末10−1から送信されたマッチング要求と、ユーザ端末10−3から送信されたマッチング要求とを、それぞれ受信する。通信制御部140は、受信した各マッチング要求をマッチング部320に通知する。マッチング部320は、通知受領後の所定のタイミングで、対戦ゲームのマッチング処理を実行する。ここでは、ユーザ端末10−1のユーザと、ユーザ端末10−3のユーザとを、対戦ゲームにおける対戦者としてマッチングしたものとする。
通信制御部330は、ユーザ端末10−3から受信したマッチング要求に含まれるIPアドレス「22.22.22.2」およびポート番号「4001」を、ユーザ端末10−3宛に送信されるデータの送信先アドレスおよび送信先ポート番号として特定する。そして、通信制御部330は、IPアドレス「22.22.22.2」およびポート番号「4001」を含むパケットを、ルータ50−1のポート番号「2001」に送信する。同様に、通信制御部330は、ユーザ端末10−1から受信したマッチング要求に含まれるIPアドレス「22.22.22.1」およびポート番号「2001」を、ユーザ端末10−1宛に送信されるデータの送信先アドレスおよび送信先ポート番号として特定する。そして、通信制御部140は、IPアドレス「22.22.22.1」およびポート番号「2001」を含むパケットを、ルータ50−2のポート番号「4001」に送信する。
ルータ50−1は、STUNサーバ70からルータ50−1のポート番号「2001」宛に届いたパケットを、ポート番号「2001」に対応したポートフォワーディングを用いることによって、ユーザ端末10−1のポート番号「5001」に転送する。これにより、ユーザ端末10−1の通信制御部140は、マッチング相手であるユーザ端末10−3に送信されるデータの送信先アドレスおよび送信先ポート番号を含むパケットを、ゲームサーバ30から受信する(S120)。並行して、ルータ50−1は、STUNサーバ70からルータ50−1のポート番号「4001」宛に届いたパケットを、ポート番号「4001」に対応したポートフォワーディングを用いることによって、ユーザ端末10−3のポート番号「5001」に転送する。これにより、ユーザ端末10−3の通信制御部140は、マッチング相手であるユーザ端末10−1に送信されるデータの送信先アドレスおよび送信先ポート番号を含むパケットを、ゲームサーバ30から受信する。
通信制御部140は、受信したパケットをゲーム管理部130に通知する。これにより、ゲーム管理部130は、ユーザ端末10−2のユーザを対戦相手としたオンライン対戦ゲームを開始する。ゲーム管理部130は、対戦ゲームの実行中に、対戦ゲームに関する各種のゲームデータを、随時、通信制御部140に出力する。通信制御部140は、ポート番号「2001」に対応したUPnPによるポートフォワーディングを用いて、ユーザ端末10−3とP2P通信する(S122)。この際、通信制御部140は、対戦ゲームのゲームデータを、ルータ50−1を介して、ルータ50−2のポート番号「4001」に送信する。ルータ50−2は、「4001」に対応したポートフォワーディングによって、ポート番号「4001」宛のゲームデータを、ユーザ端末10−3のポート番号「6001」に転送する。これにより、ユーザ端末10−3は、対戦ゲームに関するゲームデータを、ユーザ端末10−1からP2P通信によって正しく受信することができる。その結果、ユーザ端末10−3のゲーム管理部130は、受信したゲームデータに基づいて、ユーザ端末10−3において対戦ゲームを正常に進行させることができる。
並行して、ユーザ端末10−3のゲーム管理部130は、対戦ゲームの実行中に、対戦ゲームに関する各種のゲームデータを、随時、ユーザ端末10−3の通信制御部140に出力する。ユーザ端末10−3の通信制御部140は、ポート番号「4001」に対応したUPnPによるポートフォワーディングを用いて、ユーザ端末10−1とP2P通信する。この際、ユーザ端末10−3の通信制御部140は、対戦ゲームのゲームデータを、ルータ50−2を介して、ルータ50−1のポート番号「2001」に送信する。ルータ50−1は、「2001」に対応したポートフォワーディングによって、ポート番号「2001」宛に届いたゲームデータを、ユーザ端末10−1のポート番号「5001」に転送する。これにより、ユーザ端末10−1は、対戦ゲームに関するゲームデータを、ユーザ端末10−3からP2P通信によって正しく受信することができる。その結果、ユーザ端末10−1のゲーム管理部130は、受信したゲームデータに基づいて、ユーザ端末10−1において対戦ゲームを正常に進行させることができる。
(主要な作用効果)
本実施形態に係るユーザ端末10−1は、ルータ50−1がSTUNパケットの送信時に用いたポート番号から所定数離れたポート番号を特定し、特定したポート番号に対応したUPnPによるポートフォワーディングをルータ50−1に設定する。ルータ50−1に割り当てられるポート番号群は、一定の連続した番号群であるため、このような番号特定によって、ルータが実際に利用可能なポート番号を特定できる可能性を高められる。さらに、ルータ50−1が使用済みのポート番号「2000」と同じポート番号に対応したポートフォワーディングを設定せずに済むので、ポートフォワーディングを適切にルータ50−1に設定することができる。また、設定したポートフォワーディングを用いたSTUNパケットの送信後、それに対する返答であるSTUNパケットを受信した場合に、すなわちルータ50−1がポート番号「2001」を正常に用いることができることを確認できた場合に、初めてP2P通信を実行する。したがって、ルータが実際の利用可能なポート番号「2001」に対応したポートフォワーディングを用いて、他のユーザ端末10−3と正常にP2P通信することができる。
なお、ポートフォワーディング設定部142は、ルータ50−1がポート番号「2001」を使用できない場合、ポートフォワーディングの設定に失敗する。しかし、NAPT機能を有するルータ50−1は、ポートフォワーディングの設定が失敗しても、ユーザ端末10−1に何もエラーを通知しない場合がほとんどである。したがって、ユーザ端末10−1は、ルータ50−1がポート番号「2001」を実際に使用できるか否かを、ルータ50−1の挙動に基づいて直接把握することができない。そこで、上述したように、ポート番号「2001」に対応したポートフォワーディングが実際に機能するか否かをテストすることが有効である。
本実施形態では、上述した所定数が1であるため、ユーザ端末10−1は、ルータが実際に用いたポート番号「2000」の隣のポート番号「2001」を特定する。ルータ50−1に割り当てられるポート番号群は、一定の連続した番号群であるため、ポート番号「2000」が使用可能である場合、その隣のポート番号「2001」も同様に使用可能である可能性が高い。したがって、ユーザ端末10−1は、ルータ50−1が実際に使えるポート番号を特定できる可能性を最大限に高めることができる。
本実施形態では、ユーザ端末10−1は、ルータ50−1に設定済みのポートフォワーディングを引き続き用いて、ユーザ端末10−3とP2P通信する。これにより、P2P通信のために、新たなポートフォワーディングを設定せずに済むので、処理負荷を下げると共に、P2P通信開始前の通信ラグを減らすことができる。
〔変形例〕
本実施形態は、以下のように変形することができる。これらの変形例は、後述する実施形態2にも等しく適用される。
(通信の他の例)
通信制御部140は、ルータ50−1のポート番号「2001」に対応したポートフォワーディングを用いて、通信システム1を構成する各種のサーバ(他のコンピュータ)と通信してもよい。例えば、通信制御部140は、ポート番号「2001」ポートフォワーディングを用いて、ゲームサーバ30(他のコンピュータ)と通信してもよい。この場合、ゲームのシングルプレイのための通信を、安定的に実行することができる。あるいは、通信制御部140は、ポート番号「2001」に対応したポートフォワーディングを用いて、各種のウェブサーのビスを提供するウェブサーバ(他のコンピュータ、不図示)と通信してもよい。このように、ポート番号「2001」に対応したポートフォワーディングを用いた通信は、P2P通信に限らず、任意の形態の通信であり得る。
なお、ユーザ端末10−1が、TCP(Transmission Control Protocol)に従う通信を実行する場合、通信時にユーザ端末10−1と通信相手とのコネクションが確立されることが前提となる。したがって、ユーザ端末10−1が通信相手に対してパケットを送信した場合、その送信が成功したか否かに関わらず、ユーザ端末10−1に対して通信相手からの応答が必ずある。一方、P2P通信は、UDP(User Datagram Protocol)に従う通信であるため、通信時にユーザ端末10−1と通信相手とのコネクションは確立していない。そのため、ユーザ端末10−1が通信相手に対してパケットを送信した場合、ユーザ端末10−1に対して通信相手からの応答があるとは限らないため、P2P通信の安定した継続が望めない恐れがある。しかし、本実施形態の手法に従ってポートフォワーディングを設定すれば、当該ポートフォワーディングを用いることによって安定したP2P通信を行うことができるので、通信相手からの応答の有無を考慮することなくP2P通信を正常に継続できる。このように、本実施形態の手法によりポートフォワーディングを設定することは、特にP2P通信に対して効果が高い。
(所定数の他の例)
上述した所定数は、1に限らず、任意の数であり得る。例えば、2〜10までのいずれかの数であってもよい。所定数が1以外の数であっても、ユーザ端末10−1は、ルータ50−1が実際に用いたポート番号「2000」に近いポート番号(たとえば2005)を特定することができる。したがって、ポート番号として、ルータが実際に利用可能な番号を特定できる可能性を高められることに変わりない。
また、ユーザ端末10−1は、ルータが実際に用いたポート番号「2000」よりも所定数小さいポート番号(例えば1999または1995)を特定してもよい。この場合でも、ユーザ端末10−1は、ルータ50−1が実際に用いたポート番号「2000」に近いポート番号を特定することができるので、ポート番号として、ルータが実際に利用可能な番号を特定できる可能性を高められることに変わりない。
(ローカルポート番号のランダム決定)
ポート番号決定部141は、第3セッションを設定するためのローカルポート番号を、ランダムに決定してよい。本実施形態では、ポート番号決定部141は、1025〜65536までのいずれかの番号のうちの任意の空き番号を、ローカルポート番号として用いることができる。例えば、ポート番号決定部141は、ポート番号「10425」をランダムに決定したとする。この場合、ポート番号決定部141は、ルータ50−1のポート番号「2001」およびユーザ端末10−1のポート番号「10425」に対応するUPnPによるポートフォワーディングを、ルータ50−1に設定する。これにより、ユーザ端末10−1のポート番号が、ルータ50−1に接続される他の装置のポート番号と競合する可能性を低減することができる。
例えば、ユーザ端末10−1およびユーザ端末10−2に加えて、通信機能を有する他の電子機器が、ルータ50−1に接続されているとする。さらに、他の電子機器は、固定のポート番号「5001」を用いる仕様の機器であるとする。この場合、ポート番号決定部141が、第3セッション用のポート番号として上述した固定のポート番号「5001」を決定すると、他の電子機器が用いる固定のポート番号「5001」と競合してしまう。ポート番号決定部141が、ユーザ端末10−1のポート番号をランダムに決定すれば、ポート番号が「5001」決定される確率は1/(65536−1025)となるため、他の電子機器と同一のポート番号「5001」が決定される可能性は大幅に低減することになる。
(ローカルポート番号決定の他例)
上述したようにローカルポート番号をランダムに決定する例では、1/(65536−1025)の確率で、ユーザ端末10−2と同一のポート番号が決定される可能性がある。したがって、ポート番号が競合する可能性は僅かながら残される。そこで、ポート番号決定部141は、ルータ50−1のポート番号「2001」を決定した後、これと同一のローカルポート番号「2001」を決定してもよい。この場合、ポートフォワーディング設定部142は、ルータ50−1のポート番号「2001」およびユーザ端末10−1のポート番号「2001」に対応するUPnPによるポートフォワーディングを、ルータ50−1に設定する。
例えば、ユーザ端末10−1およびユーザ端末10−2が、いずれも、UPnPによるポートフォワーディングをルータ50−1に設定することを想定する。この際、ユーザ端末10−1は、ルータ50−1のポート番号「2001」を特定し、ユーザ端末10−2は、ルータ50−1のポート番号「2021」を特定するものとする。これらのポート番号は、ルータ50−1が実際に用いた異なるポート番号「2000」および「2020」と所定数異なる番号としてそれぞれ特定されるので、互いに相違することが保証される。
本例では、ユーザ端末10−1は、ルータ50−1のポート番号「2001」と同一のローカルポート番号「2001」を決定し、ユーザ端末10−2は、ルータ50−1のポート番号「2021」と同一のローカルポート「2021」を決定する。このように、ユーザ端末10−1およびユーザ端末10−2が、ルータ50−1の互いに異なるポート番号を特定しているので、ユーザ端末10−1およびユーザ端末10−2が、互いに相違するローカルポート番号が決定することが保証される。これにより、ユーザ端末10−1がUPnPによるポートフォワーディングを設定するために用いるポート番号が、同一のルータ50−1に接続されるユーザ端末10−2がUPnPによるポートフォワーディングを設定するために用いるポート番号と競合することを、回避することができる。さらには、ローカルポート番号を決定するための所定のアルゴリズムに基づく処理(例えばランダムに決定)の実行が不要になるため、プログラム容量を削減したり、通信処理を高速化したりすることが可能になる。
(通信方法の他の例)
図7は、本実施形態に係るユーザ端末10が実行する他の通信方法の処理手順を示すフローチャートである。本実施形態に係るユーザ端末10は、図7に示す一連の処理を実行することもできる。図7のS1100〜S1104までの各処理は、図6のS100〜S104までの各処理と同一であるため、詳細な説明を省略する。
図7の例では、ユーザ端末10−1は、第1セッションおよび第2セッションが自動的に設定された後、ユーザ端末10−3とP2P通信するための第3セッションおよび第4セッションをルータ50−1に設定する。まず、ポート番号決定部141は、STUNパケットから特定したポート番号「2000」よりも所定数大きいポート番号と、所定数小さいポート番号とをそれぞれ決定する。ここでは所定数は1である。したがって、ポート番号決定部141は、ポート番号「2000」よりも1つ大きいルータ50−1のポート番号「2001」と、ポート番号「2000」よりも1つ小さいポート番号「1999」(第3ポート番号)とを特定する(S1106)。
ポートフォワーディング設定部142は、特定されたポート番号「2001」に対応する第1ポートフォワーディングと、特定されたポート番号「1999」に対応する第2ポートフォワーディングとを、それぞれルータ50−1に並列に設定する(S108)。ここでは、第1ポートフォワーディングを第3セッションとして設定し、第2ポートフォワーディングを第4セッションとして設定する。第1ポートフォワーディングの設定は、図6におけるポートフォワーディングの設定と同一であるため、詳細な説明は省略する。
第2ポートフォワーディングの設定は、次のようにして実現される。まず、ポート番号決定部141は、ルータ50−1のポート番号「1999」に対応するルータ50−1の新たなローカルポート番号を決定する。ここでは、「5000」よりも1つ小さいポート番号「4999」を特定する。これにより、ルータ50−1は、ユーザ端末10−1のポート番号「4999」およびルータ50−1のポート番号「1999」に対応した第2ポートフォワーディングを、ルータ50−1に設定する。
詳細には、ポートフォワーディング設定部142は、ユーザ端末10−1がポート番号「4999」を用いてルータ50−1に送信要求したSTUNパケットの送信元アドレスおよび送信元ポート番号を、ユーザ端末10−1のIPアドレス「192.168.10.1」およびポート番号「4999」から、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「1999」に変換するように設定する。ポート番号決定部141は、さらに、ルータ50−1のポート番号「1999」宛に届いたSTUNパケットの送信先アドレスおよびポート番号を、ルータ50−1のIPアドレス「22.22.22.1」およびポート番号「1999」から、ユーザ端末10−1のIPアドレス「192.168.10.1」およびポート番号「4999」に変換するように設定する。
言い換えれば、ポートフォワーディング設定部142は、ユーザ端末10−1がポート番号「4999」を用いてSTUNサーバ70に送信しようとしたSTUNパケットを、ルータ50−1がポート番号「1999」を用いてSTUNサーバ70に送信したSTUNパケットとしてSTUNサーバ70に転送するようにルータ50−1に設定する。さらに、ルータ50−1のポート番号「1999」宛に届いたSTUNパケットを、ポート番号「4999」を用いるユーザ端末10−1に転送するようにルータ50−1に設定する。
通信制御部140は、設定した各ポートフォワーディングを用いて、各STUNパケットをSTUNサーバ70に送信する(S1110)。詳細には、第3セッションとしてルータ50−1に設定した第1ポートフォワーディングを用いて、STUNパケット(第2信号)をSTUNサーバ70に送信すると共に、第4セッションとしてルータ50−1に設定した第2ポートフォワーディングを用いて、他のSTUNパケット(第3信号)をSTUNサーバ70に送信する。
ルータ50−1には第3セッションおよび第4セッションが設定済みであるため、ルータ50−1は、新たなセッションを設定することなく、ユーザ端末10−1から送信要求された各STUNパケットを、ルータ50−1のポート番号「2001」から送信されたSTUNパケットおよびポート番号「1999」から送信されたSTUNパケットとして、STUNサーバ70に転送する。これにより、通信制御部140は、第3セッションに対応する第1ポートフォワーディングを用いてSTUNパケットをSTUNサーバ70に送信すると共に、第4セッションに対応する第2ポートフォワーディングを用いてSTUNパケットをSTUNサーバ70に送信することができる。
STUNサーバ70は、送信元アドレスとしてIPアドレス「22.22.22.1」およびポート番号「2001」を含むSTUNパケットと、送信元アドレスとしてIPアドレス「22.22.22.1」およびポート番号「1999」を含むSTUNパケットとを、ルータ50−1から受信する。STUNサーバ70は、受信した一方のSTUNパケットに含まれるIPアドレス「22.22.22.1」およびポート番号「2001」と、他方のSTUNパケットに含まれるIPアドレス「22.22.22.1」およびポート番号「1999」とを、それぞれを記憶する。STUNサーバ70は、さらに、記憶したIPアドレス「22.22.22.1」およびポート番号「2001」を含むSTUNパケット(第2返答)を、ルータ50−1のポート番号「2001」宛に送信する。STUNサーバ70は、さらに、記憶したIPアドレス「22.22.22.1」およびポート番号「1999」を含む他のSTUNパケット(第3返答)を、ルータ50−1のポート番号「1999」宛に送信する。
通信制御部140は、STUNサーバ70から送信された各STUNパケットを受信する(S1112)。詳細には、STUNサーバ70から送信された一方のSTUNパケットは、ルータ50−1のポート番号「2001」宛に届く。ルータ50−1は、第3セッションとして設定されたポートフォワーディングを用いて、STUNサーバ70から受信したポート番号「2001」宛のSTUNパケットを、ユーザ端末10−1のポート番号「5001」に転送する。また、STUNサーバ70から送信された他方のSTUNパケットは、ルータ50−1のポート番号「1999」宛に届く。
ルータ50−1は、第3セッションとして設定されたポートフォワーディングを用いて、STUNサーバ70から受信したポート番号「2001」宛のSTUNパケットを、ユーザ端末10−1のポート番号「5001」に転送する。ルータ50−1は、さらに、第4セッションとして設定されたポートフォワーディングを用いて、STUNサーバ70から受信したポート番号「1999」宛のSTUNパケットを、ユーザ端末10−1のポート番号「4999」に転送する。これにより、通信制御部140は、ルータ50−1を介して各STUNパケットをSTUNサーバ70から受信することができる。
なお、通信制御部140は、ルータ50−1のポート番号「2001」宛のSTUNパケットと、ルータ50−1のポート番号「1999」宛のSTUNパケットとのうち少なくともいずれかを受信すればよい。
ポート番号決定部141は、受信した一方のSTUNパケットに、ルータ50−1のポート番号「2001」が含まれるか否かを判定する(S1114)。判定結果が真の場合、通信制御部140は、第3セッションを用いて送信したSTUNパケットに対する返答であるSTUNパケットの受信に成功したことを特定する(S1116)。これにより、通信制御部140は、第3セッションが正しくルータ50−1に設定されたこと、すなわちルータ50−1がポート番号「2001」を利用可能であることを確認する。言い換えれば、通信制御部140は、第3セッションを用いてSTUNパケットをサーバ70に送信した後、ポート番号「2001」を含むSTUNパケットをサーバ70から受信した場合、ポート番号「2001」に対応したUPnPによるポートフォワーディングがルータ50−1に正しく設定されたことを確認する。
この後実行されるS1118〜S1122までの処理は、図6のS118〜S122までの処理と同一であるため、詳細な説明を省略する。以上のように、通信制御部140は、ポート番号「2001」を含むSTUNパケットを受信した場合、ポート番号「2001」に対応する第1ポートフォワーディングを用いて、ユーザ端末10−3とP2P通信することができる。
一方、S1114の判定結果が偽である場合、通信制御部140は、第3セッションが正しく設定されなかったことを確認する。そこで、ポート番号決定部141は、受信した他方のSTUNパケットに、ルータ50−1のポート番号「1999」が含まれるか否かを判定する(S1124)。判定結果が偽である場合、図7に示す処理は終了する。この場合、通信制御部140は、第4セッションが正しく設定されなかったことを確認する。一方、判定結果が真の場合、通信制御部140は、第4セッションを用いて送信したSTUNパケットに対する返答であるSTUNパケットの受信に成功したことを特定する(S1126)。これにより、通信制御部140は、第4セッションが正しくルータ50−1に設定されたこと、すなわちルータ50−1がポート番号「1999」を利用可能であることを確認する。言い換えれば、通信制御部140は、第4セッションを用いてSTUNパケットをサーバ70に送信した後、ポート番号「1999」を含むSTUNパケットをサーバ70から受信した場合、ポート番号「1999」に対応したUPnPによるポートフォワーディングがルータ50−1に正しく設定されたことを確認する。
この後実行されるS1128〜S1132までの処理は、通信制御部140が、ゲームサーバ30との通信およびユーザ端末10−3とのP2P通信のために、ポート番号「1999」に対応する第2ポートフォワーディングを用いる点を除き、本質的にS1118〜S1122までの処理と同一であるため、詳細な説明は省略する。以上のように、通信制御部140は、ポート番号「1999」を含むSTUNパケットを受信した場合、ポート番号「1999」に対応する第2ポートフォワーディングを用いて、ユーザ端末10−3とP2P通信することができる。
図7の例では、ユーザ端末10−1は、ルータのポート番号「2000」よりも大きいポート番号「2001」と、ポート番号「2000」よりも小さいポート番号「1999」とをそれぞれ特定するため、ルータが実際に使えるポート番号を特定できる可能性をより高めることができる。例えばポート番号「2000」が、ルートが利用可能な番号群のうち最も大きい番号である場合、ポート番号「2001」はルータが使えない番号になるが、ポート番号「1999」は使える可能性がある。この際、「2001」以外のポート番号として、ポート番号「2001」よりも大きい番号(例えば2002)を特定した場合、ポート番号「2001」が使えなければポート番号「2002」も必ず使えないため、ポートフォワーディングに用いるルータのポート番号の特定のやり直しが生じることになり、非効率である。本例では、このような問題の発生を未然に避けることができる。
また、図7の例では、ユーザ端末10−1は、第1ポートフォワーディングおよび第2ポートフォワーディングをルータ50−1に並列に設定するため、各ポートフォワーディングが有効であるか否かを、並行して確認することができる。したがって、ポート番号「2001」およびポート番号「1999」のうちいずれをルータが利用できるのかを、より素早く特定することができる。
なお、ポートフォワーディング設定部142は、第1ポートフォワーディングと、第2ポートフォワーディングとを、個別にかつ順番にルータ50−1に設定してもよい。この場合、通信制御部140は、まず例えばポート番号「2001」に対応する第1ポートフォワーディングのみをルータ50−1に設定し、それからポート番号「2001」を含むSTUNパケットの受信に成功するか否かを判定する。成功した場合、すなわちポート番号「2001」を含むSTUNパケットを受信した場合、第1ポートフォワーディングを用いてユーザ端末10−3とP2P通信する。したがって、第2ポートフォワーディングをルータ50−1に設定せずに済むので、処理負荷を下げることができる。通信制御部140は、第1ポートフォワーディングを用いたSTUNパケットの送受信に失敗した場合、次にポート番号「1999」に対応した第2ポートフォワーディングをルータ50−1に設定し、それからポート番号「1999」を含むSTUNパケットの送受信が成功するか否かを判定する。成功した場合、すなわちポート番号「1999」を含むSTUNパケットを受信した場合、第2ポートフォワーディングを用いてユーザ端末10−3とP2P通信する。
図7の例では、通信制御部140は、ポート番号「2001」を含むSTUNパケットの受信と、ポート番号「1999」を含むSTUNパケットの受信とを両方とも受信した場合、第1ポートフォワーディングおよび第2ポートフォワーディングのうち所望のいずれかを用いてユーザ端末10−3とP2P通信すればよい。
〔実施形態2〕
図8は、本発明の第2実施形態に係るゲームシステム1Aの構成の一例を示すブロック図である。ゲームシステム1Aは、ユーザ端末10−1、ユーザ端末10−2、ユーザ端末10−3、ゲームサーバ30、ルータ50−1、ルータ50−2、STUNサーバ70、リレールータ90−1、およびリレールータ90−2を備えている。これらの装置は、ネットワークNWを介して接続される。リレールータ90−1およびリレールータ90−2は同様の構成であるため、特に区別しない場合には、「−1」、「−2」等の記載を省略してリレールータ90として説明する。
リレールータ90は、通信事業者の設備に設置され、かつIPv4−IPv6変換機能を有するルータである。図8では、リレールータ90−1は、ユーザ端末10−1のユーザが契約する通信事業者の設備に設置され、リレールータ90−2は、ユーザ端末10−3のユーザが契約する通信事業者の設備に設置される。ルータ50−1は、リレールータ90−1を介してネットワークNWに接続され、ルータ50−2は、リレールータ90−2を介してネットワークNWに接続される。
図8では、ユーザ端末10とルータ50との通信はIPv4を用いて行われ、ルータ50とリレールータ90との通信は、IPv6を用いて行われ、ネットワークNWを介したリレールータ90と他の装置(STUNサーバ70など)との通信は、IPv4を用いて行われる。ルータ50は、NAPT機能に加えて、IPv4−IPv6変換機能をさらに有する。したがって、UPnPに対応したポートフォワーディングが設定されるのは、リレールータ90ではなく、NAPT機能を有するルータ50の方である。
上述したIPv4−IPv6変換機能として、例えば、MAP−E(Mapping of Address and Port Encapsulation)が挙げられる。この例では、ルータ50は、ユーザ端末10から受信したIPv4のパケットを、IPv6のパケットでカプセル化することによって、IPv6のネットワークを通過可能なIPv6のパケットに変換する。ルータ50は、変換後のIPv6のパケットをリレールータ90に転送する。リレールータ90は、ルータ50から受信したIPv6のパケットのカプセル化を解除することによって、ネットワークNWを通過可能なIPv4のパケットに変換する。これにより、リレールータ90は、変換後のIPv4のパケットを、STUNサーバ70などの送信先に正しく転送することができる。
また、リレールータ90は、STUNサーバ70などの送信元から受信したIPv4のパケットを、IPv6のパケットでカプセル化することによって、IPv6のネットワークを通過可能なIPv6のパケットに変換する。リレールータ90は、変換後のIPv6のパケットをルータ50に転送する。ルータ50は、リレールータ90から受信したIPv6のパケットのカプセル化を解除することによって、ユーザ端末10−1接続される配プライベートネットワークを通過可能なIPv4のパケットに変換する。これにより、ルータ50−1は、変換後のIPv4のパケットを、ユーザ端末10に正しく転送することができる。
図8に示すようなIPv4およびIPv6が共存した通信システム1では、1つのリレールータ90に対して複数のルータ50が接続される。さらに、それぞれのルータ50には、同一のグローバルIPアドレスが割り当てられると共に、各ルータ50に対して一定数のポート番号が割り当てられる。したがって、ルータ50が利用可能なポート番号が制限される。換言すれば、ルータ50が利用可能なポート番号の数は、実施形態1の場合に比べて大幅に少なくなる。また、IPv4およびIPv6が共存下では、各ルータ50に対して、一定数の連続したまとまった数のポート番号が割り当てられる。
本実施形態では、ユーザ端末10−1が実行する通信方法は、実施形態1における通信方法と基本的に同一である。したがって、ユーザ端末10−1は、ルータ50が利用可能なポート番号が制限される場合であっても、受信したSTUNパケットに含まれるルータ50のポート番号と所定数異なるポート番号を特定することによって、ルータ50が実際に用いることができるポート番号を特定できる可能性を高めることができる。これにより、実施形態1と同様に、UPnPによるポートフォワーディングをルータ50に正しく設定できる可能性を高めることができる。さらに、実施形態1と同様に、ルータが実際に利用可能なポート番号に対応したポートフォワーディングを用いて、ゲームサーバ30と通信したり、他のユーザ端末10−3と正常にP2P通信したりすることができる。
なお、IPv4−IPv6変換機能は、MAP−Eに限らず、MAP−T(Mapping of Address and Port Translation)であってもよい。
〔まとめ〕
以上に例示した形態から、例えば以下の構成が把握される。なお、各態様の理解を容易にするために、以下では、図面の参照符号を便宜的に括弧書で付記するが、本発明を図示の態様に限定する趣旨ではない。
本発明の一態様に係るプログラムは、通信システム(1)を構成するコンピュータ(10−1)に、NAPT機能を有するルータ(50−1)を介して、第1信号をサーバ(70)に送信するステップ(S100)と、前記第1信号に対する第1返答を、前記サーバ(70)から受信するステップ(S102)と、受信した前記第1返答に基づいて、前記第1信号の送信時に前記ルータ(50−1)が用いた第1ポート番号を特定するステップ(S104)と、前記第1ポート番号と所定数異なる第2ポート番号に対応したUPnPによるポートフォワーディングを、前記ルータ(50−1)に設定するステップ(S108)と、前記ポートフォワーディングを用いて、第2信号を前記サーバ(70)に送信するステップ(S110)と、前記第2信号に対する第2返答を、前記サーバ(70)から受信するステップ(S112)と、前記第2返答を受信した場合、前記第2ポート番号に対応したUPnPによるポートフォワーディングを用いて、前記通信システム(1)を構成する他のコンピュータ(10−3)と通信するステップ(S122)とを実行させる。
前記の構成によれば、コンピュータは、ルータが第1信号の送信時に用いた第1ポート番号から所定数離れた第2ポート番号を特定し、第2ポート番号に対応したUPnPによるポートフォワーディングをルータに設定する。ルータに割り当てられるポート番号群は、一定の連続した番号群であるため、このような特定の手法により、第2ポート番号として、ルータが実際に利用可能な番号を特定できる可能性を高められる。さらに、第1ポート番号と同じポート番号に対応したポートフォワーディングを設定せずに済むので、ポートフォワーディングを適切にルータに設定することができる。また、設定したポートフォワーディングを用いた第2信号の送信後、それに対する第2返答を受信した場合に、すなわちルータが第2ポート番号を正常に用いることができることを確認できた場合に、初めて通信を実行する。したがって、ルータが実際の利用可能な第2ポート番号に対応したポートフォワーディングを用いて、他のコンピュータと正常に通信することができる。
上述したプログラムにおいて、前記ポートフォワーディングを設定するステップ(S1108)では、前記第1ポート番号よりも前記所定数大きい前記第2ポート番号に対応した第1ポートフォワーディングと、前記第1ポート番号よりも前記所定数小さい第3ポート番号に対応した第2ポートフォワーディングとを、前記ルータ(50−1)に設定し、前記第2信号を送信するステップ(S1110)では、前記第1ポートフォワーディングを用いて前記第2信号を送信すると共に、前記第2ポートフォワーディングを用いて第3信号を送信し、前記第2返答を受信するステップ(S1112)では、前記第2返答と、前記第3信号に対する第3返答とのうち少なくともいずれかを受信し、前記通信するステップ(S1122,S1132)では、前記第2返答を受信した場合、前記第2ポート番号に対応するポートフォワーディングを用いて前記他のコンピュータ(50−3)と通信し、前記第3返答を受信した場合、前記第3ポート番号に対応するポートフォワーディングを用いて前記他のコンピュータ(50−3)と通信することが好ましい。
前記の構成によれば、コンピュータは、第1ポート番号よりも大きい第2ポート番号と、第1ポート番号よりも小さい第3ポート番号とをそれぞれ特定するため、ルータが実際に使えるポート番号を特定できる可能性をより高めることができる。例えば第1ポート番号が、ルートが利用可能な番号群のうち最も大きい番号である場合、第2ポート番号はルータが使えない番号になるが、第3ポート番号は使える可能性がある。この際、もし第3ポート番号として、第2ポート番号よりも大きい番号を特定した場合、第2ポート番号が使えなければ第3ポート番号も必ず使えないため、ポート番号の特定のやり直しが生じることになり、非効率である。本構成ではこうした不具合が生じないため、効率的にポート番号を特定することができる。
上述したプログラムにおいて、前記ポートフォワーディングを設定するステップ(S108)では、前記第1ポートフォワーディングと前記第2ポートフォワーディングとを並列に設定することが好ましい。
前記の構成によれば、コンピュータは、第2ポート番号および第3ポート番号のうちいずれをルータが利用できるのかを、より素早く特定することができる。
上述したプログラムにおいて、前記通信するステップ(S122)では、前記ルータに設定済みの前記ポートフォワーディングを引き続き用いて、前記他のコンピュータ(50−3)と通信することが好ましい。
前記の構成によれば、コンピュータは、他のコンピュータとの通信のために、新たなポートフォワーディングを設定せずに済むので、処理負荷を下げると共に、通信開始前の通信ラグを減らすことができる。さらには、プライベートIPアドレスが設定されている他のコンピュータと通信することができる。
上述したプログラムにおいて、前記プログラムは、前記コンピュータ(50−1)に、ローカルポート番号をランダムに決定するステップをさらに実行させ、前記ポートフォワーディングを設定するステップでは、前記ローカルポート番号および前記第2ポート番号に対応したポートフォワーディングを設定することが好ましい。
前記の構成によれば、コンピュータがルータに第2信号を送信する際の用いるローカルポート番号が、同じルータに接続される他の装置が用いるローカルポート番号と競合する可能性を低減することができる。
上述したプログラムにおいて、前記プログラムは、前記コンピュータに、前記第2ポート番号と同一のローカルポート番号を決定するステップをさらに実行させ、前記ポートフォワーディングを設定するステップでは、前記ローカルポート番号および前記第2ポート番号に対応したポートフォワーディングを設定することが好ましい。
前記の構成によれば、各コンピュータが用いるローカルポート番号が競合することを回避することができる。
本発明の一態様に係る通信装置は、通信システム(1)を構成する通信装置(10−1)であって、NAPT機能を有するルータ(50−1)を介して、第1信号をサーバ(70)に送信する第1送信部(140)と、前記第1信号に対する第1返答を、前記サーバ(70)から受信する第1受信部(140)と、受信した前記第1返答に基づいて、前記第1信号の送信時に前記ルータ(50−1)が用いた第1ポート番号を特定する特定部(141)と、前記第1ポート番号と所定数異なる第2ポート番号に対応したUPnPによるポートフォワーディングを、前記ルータ(50−1)に設定する設定部(142)と、前記ポートフォワーディングを用いて、第2信号を前記サーバ(70)に送信する第2送信部(140)と、前記第2信号に対する第2返答を、前記サーバ(70)から受信する第2受信部(140)と、前記第2返答を受信した場合、前記第2ポート番号に対応したUPnPによるポートフォワーディングを用いて、前記通信システム(1)を構成する他の通信装置(10−3)と通信する通信部(140)とを備えている。
前記の構成によれば、上述したプログラムと同様の作用効果を奏する。
また、本発明の一態様に係る通信方法は、通信システム(1)を構成するコンピュータ(10−1)が実行する通信方法であって、NAPT機能を有するルータ(30−1)を介して、第1信号をサーバ(70)に送信するステップ(S100)と、前記第1信号に対する第1返答を、前記サーバ(70)から受信するステップ(S102)と、受信した前記第1返答に基づいて、前記第1信号の送信時に前記ルータ(70)が用いた第1ポート番号を特定するステップ(S104)と、前記第1ポート番号と所定数異なる第2ポート番号に対応したUPnPによるポートフォワーディングを、前記ルータ(70)に設定するステップ(S108)と、前記ポートフォワーディングを用いて、第2信号を前記サーバ(70)に送信するステップ(S110)と、前記第2信号に対する第2返答を、前記サーバ(70)から受信するステップ(S112)と、前記第2返答を受信した場合、前記第2ポート番号に対応したUPnPによるポートフォワーディングを用いて、前記通信システム(1)を構成する他のコンピュータ(10−3)と通信するステップとを含む。
前記の構成によれば、上述したプログラムと同様の作用効果を奏する。
〔ソフトウェアまたはハードウェアによる実現例〕
上述した実施形態および各変形例では、ユーザ端末10の機能構成が、ソフトウェアにより実現される例について説明した。すなわち、本発明の目的を達成するためにユーザ端末10によって実行されるプログラムが、図2に示したユーザ端末10の記憶部15に記憶され、ユーザ端末10のCPU11が当該プログラムを読み取って実行することにより、ユーザ端末10の機能構成が実現される。
なお、この場合、プログラムを記憶する記憶部15としては、「一時的でない有形の媒体」、例えば、ROM(Read Only Memory)等の他、テープ、ディスク、カード、半導体メモリ、プログラマブルな論理回路などを用いることができる。
また、プログラムは、該プログラムを伝送可能な任意の伝送媒体(通信ネットワークや放送波等)を介して前記コンピュータに供給されてもよい。また、本発明の一態様は、プログラムが電子的な伝送によって具現化された、搬送波に埋め込まれたデータ信号の形態でも実現され得る。
なお、ユーザ端末10の機能構成は、ソフトウェアによる実現に限らず、集積回路(ICチップ)等に形成された論理回路(ハードウェア)によって実現されてもよい。
本開示は上述した各実施形態に限定されるものではなく、請求項に示した範囲で種々の変更が可能であり、異なる実施形態にそれぞれ開示された技術的手段を適宜組み合わせて得られる実施形態についても本開示の技術的範囲に含まれる。さらに、各実施形態にそれぞれ開示された技術的手段を組み合わせることにより、新しい技術的特徴を形成できる。