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

Sách trắng lag game › Nguyên nhân gốc của truyền lại TCP

Thiết bị trung gian xóa tùy chọn TCP Middlebox strips TCP options

ID nguyên nhân rt-sack-stripped · Phụ trách chính Hạ tầng mạng (Đội hạ tầng) · Phối hợp Hạ tầng server (Đội hạ tầng)

Mở thẻ gốc có hình minh họa và thí nghiệm →

Nếu một số tường lửa hoặc thiết bị tăng tốc xóa hay sửa tùy chọn TCP, khi mất nhiều gói thì mỗi vòng khứ hồi chỉ phục hồi được một gói, hoặc cửa sổ (lượng dữ liệu gửi được trong một lần) bị thu nhỏ, khiến kết nối chậm đi.

Vì sao “Chuẩn hóa TCP” (TCP normalization) của tường lửa hoặc thiết bị tăng tốc đời cũ xóa các tùy chọn SACK, timestamp, window scale → Dẫn đến Mất nhiều gói thì mỗi vòng khứ hồi chỉ phục hồi một gói, cửa sổ bị giới hạn ở 64 KB → Trên màn hình Mỗi lần mất gói, thời gian đứng hình dài hơn nhiều (không có SACK thì cũng không dùng được RACK-TLP), thông rồi thì tua nhanh. Truyền dữ liệu dung lượng lớn như tải bản cập nhật cũng chậm

Triệu chứng
Đứng hình, Tua nhanh
Yếu tố
Ngưng trệ, Độ trễ
Ai gặp phải
Một khu vực hoặc nhà mạng, Cả server
Khi nào
Luôn luôn
Phụ trách
Phụ trách chính Hạ tầng mạng (Đội hạ tầng) · Phối hợp Hạ tầng server (Đội hạ tầng)
Việc cần làm (Đội hạ tầng)
Mạng: tắt cấu hình chuẩn hóa TCP trên thiết bị đó, kiểm tra cả tính năng ngẫu nhiên hóa số thứ tự của tường lửa, bắt gói ở cả hai đầu để so sánh tùy chọn trong SYN. Thiết bị server·OS: kiểm tra xem các kết nối thiếu sack, wscale trong ss -ti có tập trung ở một tuyến nhất định không (PC Windows có thể không dùng ts tùy cấu hình, nên chỉ thiếu ts có thể vẫn là bình thường), kiểm tra net.ipv4.tcp_sack của server có bằng 1 không.
Trên đồ thị
Luôn cao ngay từ đầu · Số lần phục hồi bắt đầu mà không có SACK (TcpExtTCPRenoRecovery)
Chỗ cần xem
Có hay không sack và wscale ở từng kết nối trong ss -ti; tỷ lệ giữa TcpExtTCPRenoRecovery (phục hồi bắt đầu không có SACK) và TcpExtTCPSackRecovery, cùng TcpExtTCPSACKDiscard (số khối SACK bị bỏ vì không khớp) trong nstat. Với tuyến bị nghi ngờ, bắt SYN ở cả hai đầu để so sánh tùy chọn (tcp.options.sack_perm… trong Wireshark)
Đúng nếu
chỉ những kết nối đi qua một tuyến hoặc thiết bị nhất định thiếu sack, wscale và tỷ trọng TcpExtTCPRenoRecovery cao. Tùy chọn cho phép SACK có trong SYN phía gửi nhưng không còn trong SYN phía nhận. Nếu nguyên nhân là ngẫu nhiên hóa số thứ tự thì tùy chọn vẫn còn nhưng TcpExtTCPSACKDiscard tăng
Loại trừ nếu
mọi kết nối đều thiếu sack → kiểm tra giá trị net.ipv4.tcp_sack của server trước. Tùy chọn còn nguyên và TcpExtTCPSACKDiscard không đổi → phục hồi chậm vì lý do khác (“Thin stream phục hồi chậm”)
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Tìm hiểu thêm
Tùy chọn vẫn còn mà SACK vẫn có thể hỏng. Nếu tính năng ngẫu nhiên hóa số thứ tự (sequence randomization) của tường lửa chỉ đổi số thứ tự trong header mà giữ nguyên các số bên trong SACK, bên gửi sẽ bỏ các SACK không khớp. Trường hợp server đã tắt SACK bằng tcp_sack=0 hồi xảy ra lỗ hổng bảo mật SACK năm 2019 rồi quên bật lại cũng cho kết quả tương tự.

Nguồn

  1. RFC 2018: TCP Selective Acknowledgment Options IETF
    Không có SACK, chỉ với ACK tích lũy thì mỗi vòng khứ hồi chỉ biết được một gói bị mất
  2. RFC 7323: TCP Extensions for High Performance IETF
    Không có tùy chọn window scale thì cửa sổ tối đa là 2^16 = 64 KiB
  3. RFC 8985: The RACK-TLP Loss Detection Algorithm for TCP IETF
    RACK-TLP bắt buộc phải dùng SACK
  4. net/ipv4/tcp_output.c Linux kernel
    TLP trên Linux chỉ được lên lịch trên kết nối có dùng SACK
  5. IP Sysctl Linux kernel
    tcp_sack mặc định 1 (bật)
  6. misc/ss.c iproute2
    ss -ti hiển thị ts, sack, wscale:gửi,nhận tùy theo tùy chọn kết nối đang dùng
  7. tcp: limit payload size of sacked skbs Linux kernel
    Commit sửa lỗ hổng xử lý SACK năm 2019 (CVE-2019-11477)
  8. Linux and FreeBSD Kernel: Multiple TCP-based remote denial of service vulnerabilities (NFLX-2019-001) Netflix
    Hồi đó tcp_sack=0 (tắt xử lý SACK) được hướng dẫn như biện pháp tạm thời
  9. SNMP counter Linux kernel
    TcpExtTCPRenoRecovery (bắt đầu phục hồi không có SACK), TcpExtTCPSackRecovery (bắt đầu phục hồi bằng SACK), TcpExtTCPSACKDiscard (số khối SACK không hợp lệ)
  10. Display Filter Reference: Transmission Control Protocol Wireshark
    Bộ lọc hiển thị tcp.options.sack_perm (tùy chọn cho phép SACK trong SYN)

Nguyên nhân nên xem cùng

Cùng tầng: Nguyên nhân gốc của truyền lại TCP

Nguyên nhân ở tầng khác gây cùng triệu chứng (Đứng hình)

Xem thẻ gốc có hình minh họa và thí nghiệm