トラブルシューティング/ポートオフセットの仕組み
使用するケース
- Android または 管理者権限のない Linux 上で PPSSPP を実行している。
- 以下のいずれか場合
- ゲームが「ウェルノウンポート番号」を使用している。
- ゲームが使用するポートがすでに他のプログラムに使用されている(競合している)。
注意点
- ポートオフセットは必ず相手と一致させる。
- 異なる値の場合、チャット欄に参加したことが表示されますが、ゲーム上ではお互いが表示されなくなります。この挙動は、パブリックサーバでのポートブロック問題と同じなので気をつけてください。
- 設定を変更したあとは、変更を適用するために PPSSPP を再起動する。
- PPSSPP を再起動するまで設定が適用されません。
概要
ポート番号とは?
よく IP アドレスは「マンションの住所」に、ポート番号は「部屋番号」に例えられます。IP アドレス(住所)によってパケット(荷物)が端末(マンション)に届いても、端末上ではたくさんのアプリケーション(人)が動作している(住んでいる)ため、どのアプリケーションにパケットを届ければいいかわかりません。そこでこのポート番号をアプリケーションに紐付け、パケットを届けるアプリケーションを特定します。アプリケーションは同時に複数以上のポート番号を使用できます。どのポート番号が使用されるかはアプリケーションによって予め決まっており、アプリケーションごとに異なります。
ポート番号には0–65535
までの合計 65536 個(2^16)のポートがあり、以下のように区分されています。
- ウェルノウンポート番号:
0–1023
- 予め用途やサービスが決められているポート番号。勝手に他の通信に使うことはできない。
- 登録済みポート番号:
1024–49151
- 特定のアプリケーションが通信に使用するポート番号。
- ダイナミックポート番号(プラットフォームによって異なる):
49152–65535(Windows)
、32768–60999 (Linux)
- ユーザーやアプリケーションが自由に使用しても良いポート番号。主にクライアント側の送信元ポートに割り当てられる。エイリアス(別名)として、エフェメラルポートやハイヤーポート、プライベートポート番号などがあります。
PSP ゲームの中には、ゲームの通信にウェルノウンポート番号を使用しているものもあります。PSP などの専用のゲームコンソールでは使用しても問題ないと思いますが、様々なプロセスやサービスが動作する Windows や Linux、Android といったプラットフォーム上では問題が発生する可能性があります。例えば、Linux ではウェルノウンポート番号を使うためには管理者権限(sudo
)が必要になります(根拠)。こういった問題を回避するために、ポートオフセットを設定してポート番号をずらす必要があります。
上記の画像は、Android で MGSPW のアドホック通信を行ったときに発生したエラーのスクリーンショットです。ポートオフセットは0
を使用しました。このように、プラットフォームによってはウェルノウンポートを使用することができません。
ポートオフセットの仕組み
ポートオフセットには、0–60000
までの値を設定できます。0
を指定すると、そのゲームがもともと使用するポート(以下、オリジナルポート)が使用されます。PSP 実機と通信を行う際は、互換性を保つために0
に設定する必要があります。
ポートオフセットを設定すると、オリジナルポートにポートオフセットを加算して、ポートオフセットの分だけポート番号をずらします。そして、そのずらしたポート番号が実際の通信で使用されます。平たく言えば、実際に使用するポート = オリジナルポート + ポートオフセット
になります。
以下、PPSSPP リポジトリのコラボレーターでもある ANR2NE 氏の発言を引用(引用元)
Port offset is just an addition to shift the original ports, the actual ports being used = original_port + port_offset, since different games uses different original_port the actual port being used will also be different on different games, thus some of them could bump into an already used port by android or other apps.
翻訳
ポートオフセットは、「オリジナルポート」をシフトする(ずらす)ための単なる加算です。実際に使用されるポート = オリジナルポート + ポートオフセット`になります。ゲームごとに異なる「オリジナルポート」を使うため、「実際に使用されるポート」もゲームごとに異なります。したがって、いくつかのゲームでは Android や他のアプリがすでに使用しているポートと衝突(競合)してしまう可能性があります。
ポート番号がオーバーフローしたときの振る舞い
ポート番号は0–65535
の 65536 個ありますが、PPSSPP では最大60000
までポートオフセットを設定できます。では、10000/UDP
を使うゲーム(例えば MHP2G/MHP3)でポートオフセットを60000
に設定すると一体何が起こるのでしょうか?
上記の計算式に当てはめると、10000 + 60000 = 70000
になりますよね。しかし、ポート番号の上限は65535
なので70000
番のポート番号は存在しません。このように「実際に使用されるポート」がポート番号の上限を上回った場合は、「実際に使用されるポート番号」を「ポート番号の数(65536 個)」で「割ったあまり」が使用されます。上記の例だと、70000 % 65536 = 4464
になります。
参考リンク
ポート番号
- 【図解】初心者にも分かる TCP/UDP 〜違いや共通点,使い分け,ポート番号,具体例について〜 | SE の道標
- TCP/IP - TCP とは | ネットワークエンジニアとして
- エフェメラルポート | 通信用語の基礎知識