遊戲 Lag 白皮書 › L8 Socket 與協定
UDP 封包的 IP 分段 IP fragmentation of large UDP
原因 ID sk-fragment · 主要負責 遊戲開發團隊(伺服器開發)
在含圖解與實驗的完整版中開啟卡片 →
超過 MTU(一次能傳送的最大大小)的 UDP 封包會在 IP 層被分段(fragmentation),只要遺失其中一個分段,整個封包就會被丟棄。
為什麼 人多之處的快照超過 1,500 位元組 → 於是 拆成多個分段傳送,只要遺失一個就整個丟棄 → 畫面上 封包越大,遺失率高出好幾倍。只在人多的地方出現瞬移
- 症狀
- 瞬移
- 因素
- 遺失
- 誰會遇到
- 特定地點/頻道, 特定地區/電信業者
- 何時
- 人潮湧入時
- 負責單位
- 主要負責 遊戲開發團隊(伺服器開發)
- 遊戲開發團隊要做的事
- 自行把封包切成 1,200 位元組以下、只傳送變更的部分。
- 數值參考
- 在遺失率 2% 的線路上,拆成 4 個分段的封包約有 8% 會消失。也有防火牆或電信業者會直接丟棄分段的封包,這些玩家就完全收不到大封包。
- 圖表上
- 隨人數/負載上升 · IP 分段數(IpFragCreates)、快照大小
- 查看位置
- 在伺服器上看 nstat -az 的 IpFragCreates(傳送時產生的分段數)增加量,接收端則看 IpReasmFails(重組失敗次數)。用遊戲伺服器 log 或封包擷取確認 UDP 封包大小的分布
- 符合的跡象
- 人潮聚集的地方 IpFragCreates 增加,出現超過 1,500 位元組的 UDP 封包,同時瞬移的回報也變多
- 不符合的跡象
- IpFragCreates 沒有增加時,伺服器傳送端沒有發生分段
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
出處
- RFC 8085: UDP Usage Guidelines IETF
遺失一個分段就無法重組,整個封包都會遺失;UDP 應用程式應避免 IP 分段 - RFC 8900: IP Fragmentation Considered Fragile IETF
防火牆與部分網路丟棄 IP 分段的案例 - net/ipv4/proc.c (Linux v6.12) Linux kernel
nstat 顯示的計數器名稱:Ip 群組的 FragCreates(產生的分段數)、ReasmFails(重組失敗次數)
相關原因
同一層:L8 Socket 與協定
同一症狀(瞬移)在其他層的原因
查看含圖解與實驗的完整版卡片