遊戲 Lag 白皮書 › L5 資料中心網路設備
MTU 不一致(只有大封包消失) MTU black hole
原因 ID dc-mtu · 主要負責 基礎設施團隊(網路基礎設施) · 協同 基礎設施團隊(伺服器基礎設施), 遊戲開發團隊(伺服器開發)
在含圖解與實驗的完整版中開啟卡片 →
中途區段的 MTU(一次能傳送的大小)變小,而大小超過的通知又被擋掉時,只有大封包會一直消失。
為什麼 在通道或 VPN 區段中 MTU 變小 → 於是 大小超過的通知(ICMP)被防火牆擋下,傳送端不知道 → 畫面上 只有打開背包、角色清單這類大畫面時,畫面會停住,接著斷線
- 症狀
- 定格, 斷線, 連不上/無限讀取
- 因素
- 遺失
- 誰會遇到
- 特定地區/電信業者, 只有我
- 何時
- 做特定動作時, 剛登入/維護剛結束
- 負責單位
- 主要負責 基礎設施團隊(網路基礎設施) · 協同 基礎設施團隊(伺服器基礎設施), 遊戲開發團隊(伺服器開發)
- 遊戲開發團隊要做的事
- 要在伺服器端直接調低,須設定 socket 的最大區段大小 TCP_MAXSEG(光在遊戲程式碼裡把訊息切小是擋不住的),UDP 封包維持在 1,200 位元組以下。
- 基礎設施團隊要做的事
- 網路:在通道區段縮小 TCP 封包大小(MSS 調整),在防火牆與雲端網路 ACL 允許大小超過的通知(ICMP)。伺服器設備/OS:在伺服器防火牆與雲端安全群組也允許大小超過的通知(ICMP),開啟伺服器 kernel 的 MTU 探索 tcp_mtu_probing=1(這是要停住幾秒後才會作動的最後一道防線)。
- 數值參考
- 一般為 1,500 位元組,經過通道後會縮小到 1,400 左右。
- 圖表上
- 只有部分偏高 · 各地區/電信業者的斷線、大型回應失敗
- 查看位置
- 從問題玩家的電腦對伺服器送出開啟禁止分段旗標(DF)的 ping,並改變大小。Windows 用 ping /f /l 1472 SERVER_IP,Linux 用 ping -M do -s 1472 SERVER_IP(1,472 是 MTU 1,500 減去 IP 標頭 20 位元組與 ICMP 標頭 8 位元組的值)。逐步縮小大小找出能通過的最大值,並確認伺服器端安全群組與防火牆是否允許 ICMP 大小超過通知(Fragmentation Needed)
- 符合的跡象
- 小的 ping 能通,1,472 位元組的 DF ping 卻失敗(沒有回應,或出現需要分段的錯誤),能通過的最大值只有 1,400 左右。同一地區的玩家只有在打開大畫面時畫面停住
- 不符合的跡象
- 1,472 位元組的 DF ping 也能順利通過時,就不是路徑 MTU 的問題。連小的 ping 都不通時,是 ICMP 本身被擋,無法用這個方法判斷
- 確認方式
- 在玩家端環境確認
出處
- RFC 2923: TCP Problems with Path MTU Discovery IETF
防火牆擋掉 ICMP(Fragmentation Needed)時,路徑 MTU 探索會失敗,只有大封包一直消失(黑洞),ping 與小型通訊正常,因此難以診斷 - Maximum transmission unit and maximum segment size Cloudflare
網際網路路徑 MTU 1,500,經過 GRE 通道後為 1,476,建議把 TCP MSS 限制在 1,436 以下 - IP Sysctl Linux kernel
tcp_mtu_probing=1 平時關閉,偵測到 ICMP 黑洞時才開啟 TCP 路徑 MTU 探索 - ping(8) — Linux manual page iputils
-M do 開啟 DF 旗標並拒絕大於路徑 MTU 的封包,-s 指定資料大小(預設 56 位元組,另加 ICMP 標頭 8 位元組) - ping Microsoft
/f 開啟 DF 旗標,用來找出路徑 MTU 問題,/l 指定資料大小
相關原因
同一層:L5 資料中心網路設備
同一症狀(定格)在其他層的原因
查看含圖解與實驗的完整版卡片