遊戲 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 增加時,是「延遲飆升造成的不必要重傳」
- 確認方式
- 用基礎設施工具確認(不需要遊戲程式碼)
出處
- RFC 2991: Multipath Issues in Unicast and Multicast Next-Hop Selection IETF
依封包分配路徑會使順序改變,後面的封包有 3 個以上先到時,TCP 就會進行不必要的快速重傳 - RFC 2992: Analysis of an Equal-Cost Multi-Path Algorithm IETF
以區分流的標頭欄位雜湊值選擇路徑的 ECMP(以流為單位分散) - RFC 5681: TCP Congestion Control IETF
在第三個重複 ACK 時進行快速重傳 - RFC 8985: The RACK-TLP Loss Detection Algorithm for TCP IETF
RACK 以時間判斷遺失,因此對亂序的容忍度高;收到 DSACK 時會放寬亂序容許時間(reo_wnd) - IP Sysctl Linux kernel
tcp_reordering 起始值 3(每條連線自動調整,最高到 tcp_max_reordering)、tcp_recovery 的 RACK 設定 - misc/ss.c iproute2
ss -ti 在連線的 reordering 值與預設值 3 不同時顯示 reordering:值,曾發生過亂序時顯示 reord_seen:次數 - SNMP counter Linux kernel
TcpExtTCPSACKReorder、TcpExtTCPTSReorder(偵測到亂序)、TcpExtTCPDSACKRecv(收到的 DSACK 數)、TcpExtTCPLostRetransmit(重送的封包再次遺失) - include/uapi/linux/tcp.h Linux kernel
tcp_info 的 tcpi_reord_seen:連線遇到亂序的次數 - Display Filter Reference: Transmission Control Protocol Wireshark
tcp.analysis.out_of_order 顯示篩選條件
相關原因
同一層:TCP 重傳的根本原因
同一症狀(卡頓)在其他層的原因
查看含圖解與實驗的完整版卡片