遊戲 Lag 白皮書 › 依症狀查找
瞬移:47 個原因與負責團隊
其他說法:瞬間移動、角色亂跳、停一下又突然跳走
在含圖解的完整版症狀辭典中開啟 →
角色沒有移動過程,一下子就出現在很遠的位置。
對方原本站在原地,突然出現在已經走遠的位置。
通常代表封包斷了一段時間。要查封包遺失、線路短暫中斷、伺服器停住、外插失敗。其他人都正常、只有一個人在跳的話,先懷疑那個人的線路。
造成這個症狀的原因
L1 用戶端遊戲程式
L2 用戶端 OS 與裝置
- 接收緩衝區溢位: 遊戲太忙,太晚從 socket(OS 提供的網路收送介面)取出封包時,OS 緩衝區就會溢位。 (遊戲開發團隊(用戶端開發))
- Wi-Fi 背景掃描: OS 為了尋找周圍的 Wi-Fi,會定期切換到其他頻道,這段期間通訊會短暫停止。 (外部(外部))
L3 家用網路
L4 網際網路線路
- 衛星網路(低軌/同步軌道): 衛星網路的電波必須往返太空。同步軌道衛星光是往返就超過 0.5 秒;Starlink 這類低軌衛星平時很快,但在重新分配路徑的瞬間延遲會忽高忽低,有時還會短暫中斷。 (外部(外部))
- 尖峰時段 peering 區段壅塞: 晚上 9~11 點左右影音流量暴增,電信業者之間的互連區段(peering)容易壅塞。 (基礎設施團隊(網路基礎設施))
- 海底電纜/國際線路故障: 海底電纜一旦斷裂,修復前的幾週(長則幾個月)流量都得繞遠路,剩下的線路也會壅塞。 (外部(外部))
- BGP 路由變更與收斂: 網際網路的路由資訊改變後重新收斂的幾秒到幾十秒(偶爾幾分鐘)之間,封包會遺失。 (基礎設施團隊(網路基礎設施))
- ECMP 其中一條路徑異常: 電信業者與資料中心會為同一個目的地準備多條路徑,並替每條連線指定其中一條傳送。只要其中一條路徑故障,被分配到那條路徑的人就會持續遇到 lag。 (基礎設施團隊(網路基礎設施))
- 電信業者限速與流量管理: 在用量超過上限或會管理特定流量的資費方案中,封包會被延後或丟棄。 (外部(外部))
- 國家/電信業者層級的 UDP 限制與封包檢測: 部分網路會封鎖特定 UDP 位址與 port,或限制 UDP 速度;封包檢測設備也會過濾掉無法辨識的協定。用 UDP 通訊的遊戲在這類網路上會連不上或經常斷線。 (外部(外部))
- 線路品質不良: 接頭接觸不良、老舊線路或數據機異常,會造成持續的封包遺失與週期性的線路中斷。 (外部(外部))
- DDoS 造成共用線路飽和: 針對遊戲公司,或同一網路上其他對象的大量攻擊,會塞滿共用的線路。 (基礎設施團隊(網路基礎設施))
- 經由 VPN/遊戲加速器: 開啟 VPN 或遊戲加速器後,封包會經過該公司的中繼伺服器。中繼伺服器很遠或壅塞時,反而會變慢。 (外部(外部))
L5 資料中心網路設備
- DDoS 防護導流與誤判: 為了擋下攻擊而把流量導向清洗中心時,路徑會變長,有時還會把正常使用者誤判為攻擊而封鎖。 (基礎設施團隊(網路基礎設施))
- 交換器 microburst: 多台伺服器在同一瞬間同時對數千人送出封包時,這些流量匯集的交換器 port 上的小緩衝區,不到 1ms 就會滿溢。 (遊戲開發團隊(伺服器開發))
- 資料中心線路飽和: 更新檔發布、log 傳送、備份與遊戲共用同一條線路時,線路會被塞滿。 (基礎設施團隊(網路基礎設施))
- 纜線不良與 port 錯誤: 光模組或纜線不良時,經過該路徑的封包會有一定比例損毀。 (基礎設施團隊(網路基礎設施))
L6 伺服器網路卡
- NIC 中斷集中在單一核心: NIC 只把封包到達的中斷(interrupt)送給一個 CPU 核心時,那個核心就會成為瓶頸。 (基礎設施團隊(伺服器基礎設施))
- Ring buffer 不足: NIC 暫存封包的 ring buffer 太小時,封包瞬間湧入就會讓緩衝區滿溢而被丟棄。 (基礎設施團隊(伺服器基礎設施))
- 超過雲端 PPS 上限: 雲端伺服器依類型各有每秒封包數與頻寬的上限,超過時會默默丟棄。 (基礎設施團隊(伺服器基礎設施))
- NIC 頻寬飽和: 把 1Gbps、10Gbps 網路卡用到極限時,傳送佇列會變長,最後封包被丟棄。 (遊戲開發團隊(伺服器開發))
- 雲端主機維護與即時遷移: 雲端供應商維護實體伺服器(主機)時,會把虛擬機器搬到其他主機(即時遷移),或暫時停住。這段期間整台伺服器都會停住,停住的時間一長,連線就會中斷。 (基礎設施團隊(伺服器基礎設施))
L7 伺服器 OS(kernel)
- Kernel socket 緩衝區不足: 傳送與接收緩衝區太小時,一遇到突發流量,UDP 收到的封包就會被丟棄,TCP 則因緩衝區沒有空間而無法傳送。 (基礎設施團隊(伺服器基礎設施))
- 伺服器 conntrack 表飽和: Linux 防火牆會把每條連線記錄在連線追蹤(conntrack)表中,這個表碰到上限時就會丟棄新封包。 (基礎設施團隊(伺服器基礎設施))
L8 Socket 與協定
L9 伺服器遊戲程式
- 廣播量暴增: 把一個人的移動送給所有看得到他的人時,要送出的狀態更新數量會是聚集人數的平方。 (遊戲開發團隊(伺服器開發))
- 更新改變了流量模式: 新內容、特效、同步項目讓封包變大、變頻繁時,原本運作正常的伺服器在更新後就會碰到 MTU、頻寬、封包數上限。 (遊戲開發團隊(伺服器開發))
同步設計
- 用戶端權威: 各自決定自己的結果時,自己的畫面很順暢,但結果會與其他人的畫面不一致,也容易被外掛利用。 (遊戲開發團隊(伺服器開發))
- Rollback netcode 預測失敗: 先預測對手的輸入並呈現出來,猜錯時就回溯重新計算。ping 越大,回溯的幅度越大。 (遊戲開發團隊(用戶端開發))
- 指令同步的路徑計算不一致: 只互傳「走到這裡」、路徑由兩邊各自計算時,計算只要有一點不同,角色或怪物就會走上不同的路徑,再被拉回原位。 (遊戲開發團隊(伺服器開發))
- 快照傳送頻率太低: 伺服器每秒只送幾次位置更新(快照)時,內插緩衝就得相應拉長,看到的其他角色會是更久以前的狀態。 (遊戲開發團隊(伺服器開發))
只有部分人遇到的問題
- 慢的人在別人畫面上快轉移動: 線路差的人,輸入會忽快忽慢、成批抵達伺服器。伺服器每個 tick 收到多少就套用多少時,在其他人眼中,那個角色會頓一下後一次走好幾步。 (遊戲開發團隊(伺服器開發))
- 怪物控制權在慢速用戶端上: 有些遊戲為了減輕伺服器負載,把怪物移動的計算交給附近某位玩家的用戶端。那個人線路差時,該怪物在所有人的畫面上都會動得很怪。 (遊戲開發團隊(伺服器開發))
- 基準快照遺失: 在伺服器只送「與上次不同的部分」的方式中,最初送一次的完整資訊(基準)遺失時,之後的變化量就無法套用。 (遊戲開發團隊(伺服器開發))
TCP 重傳的根本原因
- 無線區段的封包遺失: Wi-Fi 與行動網路在無線區段會先重傳幾次,仍然失敗就丟棄封包。被丟棄的封包,TCP 要過好一段時間才會重送。 (外部(外部))
- 突發傳送造成淺緩衝區溢位: 伺服器每個 tick 把數千人份的更新在一瞬間集中送出時,交換器的小緩衝區或雲端的瞬間上限不到 1ms 就會溢位,部分封包因此被丟棄。 (遊戲開發團隊(伺服器開發))
- Policer 丟棄超額流量: 電信業者的資費方案、雲端執行個體的上限、DDoS 防護設備,有時會把超過規定速度的封包直接丟棄,不放進佇列。 (基礎設施團隊(網路基礎設施))
- 實體層錯誤(線材、光模組、接頭不良): 纜線損壞、沾了灰塵的光纖接頭、壽命將盡的光模組會造成位元錯誤,損壞的封包會被設備默默丟棄。 (基礎設施團隊(網路基礎設施))
- 接收端伺服器主機丟棄封包: 封包已經到了伺服器,卻因 NIC 的 ring buffer(暫存剛抵達封包的緩衝區)溢位,或 kernel 負責接收處理的 CPU 核心滿載而被丟棄。 (基礎設施團隊(伺服器基礎設施))
- 中間設備超過處理上限(防火牆、IPS、DDoS 防護): 防火牆、入侵防禦設備(IPS)、DDoS 防護設備會逐一檢查經過的封包。從超過檢查能力的那一刻起,處理不了的封包就會被丟棄。 (基礎設施團隊(網路基礎設施))
- 路由變更、ECMP 不良路徑: 網際網路路由變更的那幾秒內,或是多條 ECMP 路徑中被分配到不良路徑的連線,會有封包消失。 (基礎設施團隊(網路基礎設施))
查看含圖解的完整版症狀辭典