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

遊戲 Lag 白皮書 › L8 Socket 與協定

RST 強制關閉造成最後的資料遺失 SO_LINGER, abrupt RST

原因 ID sk-linger · 主要負責 遊戲開發團隊(伺服器開發)

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

伺服器倉促切斷連線時,最後送出的通知或存檔完成訊號會消失。

為什麼 伺服器以強制關閉(RST)結束連線。把 SO_LINGER 設為 0 秒,或沒讀完收到的資料就關閉時會發生 → 於是 仍在傳送中的踢出原因與最後的資料被丟棄 → 畫面上 沒來由地出現「因不明錯誤中斷連線」

症狀
斷線
因素
遺失
誰會遇到
只有我
何時
偶爾隨機發生
負責單位
主要負責 遊戲開發團隊(伺服器開發)
遊戲開發團隊要做的事
送出原因後先只關閉傳送方向(shutdown),把收到的資料一直讀到對方關閉為止再關閉 socket;避免把 SO_LINGER 設為 0 秒。
圖表上
偶爾隨機飆高 · 以 RST 結束的連線數
查看位置
看 nstat -az 的 TcpExtTCPAbortOnData(還有資料要送就以 RST 關閉,SO_LINGER 0 秒)、TcpExtTCPAbortOnClose(還有未讀資料就關閉)增加量,並在斷線瞬間的伺服器端封包擷取中,看原本該送 FIN 的地方是否送出了 RST
符合的跡象
在「因不明錯誤中斷連線」的回報時間,伺服器送出 RST,且 AbortOnData、AbortOnClose 增加
不符合的跡象
伺服器以 FIN 正常關閉,原因卻沒有顯示時,要查用戶端的關閉處理
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. closesocket function (winsock.h) Microsoft
    開啟 SO_LINGER 並把時間設為 0,關閉就會變成立即重設連線的強制關閉,尚未送出的資料會消失
  2. RFC 9293: Transmission Control Protocol (TCP) IETF
    還有收到的資料沒讀就關閉時,會送出 RST 告知資料遺失
  3. Graceful Shutdown, Linger Options, and Socket Closure Microsoft
    先用 shutdown 只關閉傳送方向,收到對方的關閉通知後再關閉 socket 的順序
  4. SNMP counter Linux kernel
    TcpExtTCPAbortOnData:因 SO_LINGER 0 秒等原因,在還有資料要送時以 RST 關閉;TcpExtTCPAbortOnClose:在還有未讀資料時關閉並送出 RST

相關原因

同一層:L8 Socket 與協定

同一症狀(斷線)在其他層的原因

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