한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

遊戲 Lag 白皮書 › L2 用戶端 OS 與裝置

接收緩衝區溢位 Socket receive buffer overflow

原因 ID co-rcvbuf · 主要負責 遊戲開發團隊(用戶端開發)

在含圖解與實驗的完整版中開啟卡片 →

遊戲太忙,太晚從 socket(OS 提供的網路收送介面)取出封包時,OS 緩衝區就會溢位。

為什麼 畫格延誤,遊戲太晚讀取 socket → 於是 OS 接收緩衝區滿了,UDP 直接丟棄,TCP 則縮小接收視窗讓對方停止傳送 → 畫面上 瞬移(UDP)或快轉(TCP)

症狀
瞬移, 快轉
因素
遺失, 停滯
誰會遇到
只有我
何時
人潮湧入時
負責單位
主要負責 遊戲開發團隊(用戶端開發)
遊戲開發團隊要做的事
專用的接收執行緒、調整緩衝區大小(SO_RCVBUF)。
數值參考
預設接收緩衝區依 OS 與設定為數十~數百 KB。人多的地方,更新量有時每秒可達數百 KB。
圖表上
隨人數/負載上升 · UDP 接收緩衝區丟棄數、畫格時間
查看位置
把 Windows 效能監視器的 Microsoft Winsock BSP\Dropped Datagrams(因 socket 接收緩衝區不足而丟棄的 UDP 數)與 UDPv4\Datagrams Received Errors 跟畫格時間一起記錄,遊戲端則計算收到封包序號中的缺漏
符合的跡象
人多的地方或長畫格剛結束時 Dropped Datagrams 增加,同一瞬間遊戲序號出現缺漏。同一時間線路端沒有封包遺失
不符合的跡象
Dropped Datagrams 沒變、只有序號缺漏時,是傳輸路徑上的封包遺失
確認方式
在玩家端環境確認

出處

  1. socket(7) — Linux manual page Linux man-pages
    SO_RCVBUF 是 socket 接收緩衝區的最大大小,預設值由 rmem_default、最大值由 rmem_max 決定(Android 也是 Linux kernel)
  2. SOL_SOCKET Socket Options (Winsock2.h) Microsoft
    Windows SO_RCVBUF:每個 socket 保留給接收用的緩衝區空間
  3. RFC 9293: Transmission Control Protocol (TCP) IETF
    TCP 視窗欄位是接收端還能再收的位元組數;為 0 時,傳送端只送 zero window probe 並等待
  4. Low Latency Workloads Management and Operations Microsoft
    Microsoft Winsock BSP 計數器集的 Dropped Datagrams、Dropped Datagrams/sec:UDP 抵達速度快過 App 處理速度,或接收 socket 緩衝區不足而丟棄的數量
  5. Network-Related Performance Counters Microsoft
    UDPv4、UDPv6:Datagrams Received Errors;Microsoft Winsock BSP:Dropped Datagrams 計數器

相關原因

同一層:L2 用戶端 OS 與裝置

同一症狀(瞬移)在其他層的原因

查看含圖解與實驗的完整版卡片