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

遊戲 Lag 白皮書 › TCP 重傳的根本原因

封包亂序造成的不必要快速重傳 Reordering triggers spurious fast retransmit

原因 ID rt-reorder · 主要負責 基礎設施團隊(網路基礎設施) · 協同 基礎設施團隊(伺服器基礎設施)

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

封包經過多條路徑或聚合鏈路時順序被打亂,接收端會以重複 ACK 告知「有封包缺漏」,傳送端就把其實已正常送達的封包再送一次。

為什麼 依封包分配路徑的設備、依封包分散傳送的 LAG(鏈路聚合)、路由切換的瞬間,都會打亂封包順序 → 於是 後面的封包先到,累積 3 個重複 ACK → 快速重傳 → 畫面上 零星往來的遊戲封包幾乎不受影響。人多處的大型狀態更新與更新檔下載會變慢,偶爾出現卡頓

症狀
卡頓, 輸入延遲
因素
抖動
誰會遇到
特定地區/電信業者, 整個伺服器
何時
一直都有, 人潮湧入時
負責單位
主要負責 基礎設施團隊(網路基礎設施) · 協同 基礎設施團隊(伺服器基礎設施)
基礎設施團隊要做的事
網路:改以連線為單位分散,不再以封包為單位分散(ECMP、LAG 依位址與 port 雜湊)。伺服器設備/OS:使用 RACK(以時間判斷遺失,對亂序的容忍度高;透過 DSACK 偵測到不必要的重傳時,會自動放寬亂序容許範圍)、確認 Linux 對每條連線自動估計的亂序程度(ss -ti 的 reordering 值,起始值為 tcp_reordering=3)。
圖表上
一開始就一直偏高 · 亂序偵測次數、DSACK 接收數
查看位置
查看 nstat 的 TcpExtTCPSACKReorder、TcpExtTCPTSReorder(偵測到亂序的次數)與 TcpExtTCPDSACKRecv,各連線則看 ss -ti 的 reordering(值不為 3 時才顯示)與 reord_seen。封包擷取則用 Wireshark 篩選條件 tcp.analysis.out_of_order
符合的跡象
亂序計數器與 DSACK 不分時段持續上升,經過特定路徑或設備的連線 reordering 值大於 3。接收端的封包擷取中,後面的封包先到,前面的封包也隨即抵達
不符合的跡象
亂序計數器沒有變化、TcpExtTCPLostRetransmit 增加時,是實際遺失。只在 RTT 飆高的瞬間 DSACK 增加時,是「延遲飆升造成的不必要重傳」
確認方式
用基礎設施工具確認(不需要遊戲程式碼)

出處

  1. RFC 2991: Multipath Issues in Unicast and Multicast Next-Hop Selection IETF
    依封包分配路徑會使順序改變,後面的封包有 3 個以上先到時,TCP 就會進行不必要的快速重傳
  2. RFC 2992: Analysis of an Equal-Cost Multi-Path Algorithm IETF
    以區分流的標頭欄位雜湊值選擇路徑的 ECMP(以流為單位分散)
  3. RFC 5681: TCP Congestion Control IETF
    在第三個重複 ACK 時進行快速重傳
  4. RFC 8985: The RACK-TLP Loss Detection Algorithm for TCP IETF
    RACK 以時間判斷遺失,因此對亂序的容忍度高;收到 DSACK 時會放寬亂序容許時間(reo_wnd)
  5. IP Sysctl Linux kernel
    tcp_reordering 起始值 3(每條連線自動調整,最高到 tcp_max_reordering)、tcp_recovery 的 RACK 設定
  6. misc/ss.c iproute2
    ss -ti 在連線的 reordering 值與預設值 3 不同時顯示 reordering:值,曾發生過亂序時顯示 reord_seen:次數
  7. SNMP counter Linux kernel
    TcpExtTCPSACKReorder、TcpExtTCPTSReorder(偵測到亂序)、TcpExtTCPDSACKRecv(收到的 DSACK 數)、TcpExtTCPLostRetransmit(重送的封包再次遺失)
  8. include/uapi/linux/tcp.h Linux kernel
    tcp_info 的 tcpi_reord_seen:連線遇到亂序的次數
  9. Display Filter Reference: Transmission Control Protocol Wireshark
    tcp.analysis.out_of_order 顯示篩選條件

相關原因

同一層:TCP 重傳的根本原因

同一症狀(卡頓)在其他層的原因

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