한국어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

Mất gói ở chặng không dây Wi-Fi / cellular link loss

ID nguyên nhân rt-wireless · Phụ trách chính Bên ngoài (Bên ngoài) · Phối hợp Hạ tầng server (Đội hạ tầng), Phát triển server (Đội phát triển game), Phát triển client (Đội phát triển game)

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

Wi-Fi và mạng di động tự truyền lại vài lần trên chặng không dây, nếu vẫn không được thì bỏ gói tin. Gói đã bị bỏ phải đợi khá lâu sau đó TCP mới gửi lại.

Vì sao Sóng yếu hoặc nhiễu mạnh khiến việc truyền trên chặng không dây thất bại liên tiếp → Dẫn đến Vượt giới hạn số lần thử lại của thiết bị không dây (thường từ vài lần đến hơn chục lần) thì gói tin bị bỏ → Trên màn hình Đứng hình trong lúc chờ TCP truyền lại, các gói phía sau nằm chờ trong bộ đệm nhận rồi tua nhanh

Triệu chứng
Đứng hình, Tua nhanh, Dịch chuyển tức thời
Yếu tố
Mất gói, Jitter
Ai gặp phải
Chỉ mình tôi, Cùng một nhà
Khi nào
Thỉnh thoảng bất chợt, Khi di chuyển hoặc chuyển bản đồ
Phụ trách
Phụ trách chính Bên ngoài (Bên ngoài) · Phối hợp Hạ tầng server (Đội hạ tầng), Phát triển server (Đội phát triển game), Phát triển client (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Server: bật TCP_NODELAY (nếu Nagle còn bật thì RACK không có gói đi sau để dựa vào khi xác định mất gói); trong lúc kết nối bị chặn vì truyền lại, không dồn các bản cập nhật trạng thái chờ gửi, chỉ gửi bản mới nhất (giới hạn lượng dữ liệu dồn trong kernel bằng TCP_NOTSENT_LOWAT). Client: bật TCP_NODELAY (gói mất ở chiều gửi input của người chơi do OS phía client phục hồi); khi mất gói dồn lại hoặc ping tăng vọt thì hiển thị trạng thái mạng trên màn hình.
Việc cần làm (Đội hạ tầng)
Dùng RACK-TLP để phục hồi mất gói nhanh hơn (server không thể ngăn mất gói không dây, chỉ có thể phục hồi nhanh hơn); kiểm tra các giá trị mặc định trên Linux mới là net.ipv4.tcp_recovery=1 (RACK) và net.ipv4.tcp_early_retrans=3 (TLP) chưa bị thay đổi.
Việc cần làm (Bên ngoài)
Hướng dẫn người chơi dùng mạng có dây, dùng băng tần 5 GHz hoặc 6 GHz, đổi vị trí hoặc kênh của router.
Con số tham khảo
Mất gói không dây 1% nghĩa là cứ 100 gói tin game thì mất 1 gói. Nếu nhận 10 gói trong 1 giây thì khoảng 10 giây lại khựng một lần. Nếu không có RACK-TLP, mỗi lần như vậy game đứng hình trong một khoảng bằng RTO (ping + 200 ms trở lên).
Trên đồ thị
Chỉ một phần cao · Tỷ lệ truyền lại theo từng kết nối, RTT (ping) theo từng kết nối
Chỗ cần xem
Từ PC của người chơi, ping vài trăm lần tới địa chỉ router (gateway) và tới server game rồi so sánh mức mất gói và biên độ dao động độ trễ; chuyển sang mạng có dây hoặc dữ liệu di động rồi đo lại. Trên server, xem retrans và rtt (trung bình/độ lệch) của kết nối người chơi đó bằng ss -ti
Đúng nếu
ping tới router đã thấy mất gói hoặc độ trễ thất thường, chuyển sang mạng có dây thì hết. Nhìn từ server, chỉ riêng kết nối của người chơi đó có retrans và độ lệch RTT lớn
Loại trừ nếu
chặng tới router vẫn sạch, mất gói bắt đầu từ phía sau router → phía nhà mạng hoặc tuyến đường (“Tràn hàng đợi ở điểm nghẽn”, “Đổi tuyến đường hoặc tuyến ECMP lỗi”). Nhiều người chơi cùng nhà mạng cùng lúc xấu đi thì xem chặng nhà mạng trước
Cách kiểm tra
Kiểm tra ở môi trường phía người chơi
Tìm hiểu thêm
Mỗi lần thiết bị không dây thử lại sẽ tạo ra jitter (vài ms mỗi lần), và chỉ những gói vượt giới hạn thử lại mới trở thành mất gói. Vì vậy sóng càng kém thì triệu chứng càng nặng theo thứ tự “jitter → thỉnh thoảng đứng hình → đứng hình thường xuyên”. Lúc thiết bị chuyển từ router (AP) này sang router khác (roaming), gói tin có thể mất liên tiếp trong vài chục ms đến vài giây. Mạng di động truyền lại nhiều ở chặng tới trạm phát sóng, nên vấn đề thường lộ ra thành độ trễ tăng vọt vài trăm ms nhiều hơn là thành mất gói.
Sự cố thực tế
Square Enix 2021: FINAL FANTASY XIV: tình trạng quá đông khi ra mắt bản mở rộng và lỗi hàng chờ đăng nhập

Nguồn

  1. net/wireless/core.c Linux kernel
    Giới hạn thử lại mặc định trong stack không dây của Linux: 7 lần với frame ngắn, 4 lần với frame dài (dot11ShortRetryLimit, dot11LongRetryLimit)
  2. RFC 3481: TCP over Second (2.5G) and Third (3G) Generation Wireless Networks IETF
    Mạng di động ít mất gói ở tầng IP nhờ truyền lại ở tầng liên kết (link layer), nhưng việc phục hồi đó lộ ra thành jitter và độ trễ tăng vọt
  3. Wi-Fi roaming support in Apple devices Apple
    Khi chuyển sang AP mới, thiết bị không gửi được dữ liệu cho đến khi xác thực với AP mới xong; trong môi trường 802.1X việc này có thể mất vài giây
  4. RFC 8985: The RACK-TLP Loss Detection Algorithm for TCP IETF
    Định nghĩa RACK (xác định mất gói dựa trên thời gian) và TLP (truyền lại gói cuối)
  5. IP Sysctl Linux kernel
    tcp_recovery mặc định 0x1 (RACK), tcp_early_retrans mặc định 3 (bật TLP); TCP_NOTSENT_LOWAT và tcp_notsent_lowat giới hạn lượng dữ liệu chưa gửi
  6. tcp(7) — Linux manual page Linux man-pages
    TCP_NODELAY tắt thuật toán Nagle để dữ liệu nhỏ cũng được gửi ngay
  7. include/net/tcp.h Linux kernel
    RTO tối thiểu TCP_RTO_MIN = 200 ms
  8. misc/ss.c iproute2
    ss -ti hiển thị retrans:số gói đang truyền lại/tổng số lần truyền lại và rtt:RTT/độ lệch RTT (rttvar)

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