PPSSPP-TIPS@wiki

ポートオフセットの仕組み

最終更新:

ppsspp-tips

- view
メンバー限定 登録/ログイン

トラブルシューティング/ポートオフセットの仕組み

使用するケース

  • 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)が必要になります(根拠)。こういった問題を回避するために、ポートオフセットを設定してポート番号をずらす必要があります。

screen-msg_failed-to-bind-port-on-android

上記の画像は、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に設定すると一体何が起こるのでしょうか?

port-offset_how-the-port-offset-behaves-when-ports-overflow

上記の計算式に当てはめると、10000 + 60000 = 70000になりますよね。しかし、ポート番号の上限は65535なので70000番のポート番号は存在しません。このように「実際に使用されるポート」がポート番号の上限を上回った場合は、「実際に使用されるポート番号」を「ポート番号の数(65536 個)」で「割ったあまり」が使用されます。上記の例だと、70000 % 65536 = 4464になります。

参考リンク

ポート番号

ポートオフセット

記事メニュー
ウィキ募集バナー