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)
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
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.
net/wireless/core.cLinux 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)
Wi-Fi roaming support in Apple devicesApple 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
IP SysctlLinux 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
tcp(7) — Linux manual pageLinux man-pages TCP_NODELAY tắt thuật toán Nagle để dữ liệu nhỏ cũng được gửi ngay