遊戲 Lag 白皮書 › 只有部分人遇到的問題
固定 UDP port 衝突 Two clients bound to the same local UDP port
原因 ID pt-port-collision · 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
在含圖解與實驗的完整版中開啟卡片 →
用戶端若設計成使用固定的本機 port,同一台電腦的第二個用戶端就無法使用該 port,或與第一個用戶端分食封包。
為什麼 兩個用戶端都要開同一個本機 UDP port(用重複使用選項硬是共用) → 於是 OS 只把進來的封包交給其中一個 socket,或不保證由哪一個接收。分享器與伺服器也把兩個用戶端看成同一個位址 → 畫面上 其中一邊收不到世界封包,看不見 NPC 與其他玩家,或斷線
- 症狀
- 看不見/幽靈物件, 斷線, 連不上/無限讀取
- 因素
- 遺失
- 誰會遇到
- 同一台電腦只有其中一個用戶端
- 何時
- 剛登入/維護剛結束, 一直都有
- 負責單位
- 主要負責 遊戲開發團隊(用戶端開發) · 協同 遊戲開發團隊(伺服器開發)
- 遊戲開發團隊要做的事
- 用戶端:本機 port 交由 OS 自動選擇(bind 到 0 號 port)。伺服器:以每條連線核發的 session token 區分連線。
- 圖表上
- 只有部分偏高 · 各用戶端的接收封包數
- 查看位置
- 在玩家電腦上開著兩個用戶端,於命令提示字元執行 netstat -ano -p udp,查看每個遊戲處理程序(PID)開啟的本機 UDP port。伺服器端則確認兩個 session 是否以同一個公用 IP、同一個 port 進來
- 符合的跡象
- 兩個遊戲處理程序綁在同一個本機 port,或伺服器看到兩個 session 是同一個 IP 與 port。只開一個就正常
- 不符合的跡象
- 兩個用戶端使用不同的本機 port 卻仍有一邊異常時,是以 IP/裝置區分 session 的 bug 或多開限制
- 確認方式
- 在玩家端環境確認
出處
- Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE Microsoft
用 SO_REUSEADDR 對同一個 port 進行第二次 bind 時會搶走該 port,無法得知由哪個 socket 接收封包 - bind function (winsock.h) Microsoft
以 port 0 進行 bind 時,會從動態 port 範圍(49152~65535)配置一個唯一的 port - netstat Microsoft
-a 顯示 TCP、UDP port,-n 顯示數字位址,-o 顯示處理程序 ID(PID),-p udp 只顯示 UDP
相關原因
同一層:只有部分人遇到的問題
同一症狀(看不見/幽靈物件)在其他層的原因
查看含圖解與實驗的完整版卡片