Ánh xạ NAT hoặc bộ cân bằng tải hết hạn giữa chừng kết nối NAT / load balancer mapping expired mid-connection
ID nguyên nhân rt-mapping · Phụ trách chính Phát triển client (Đội phát triển game) · Phối hợp Phát triển server (Đội phát triển game), Hạ tầng mạng (Đội hạ tầng), Hạ tầng server (Đội hạ tầng)
Nếu thiết bị trung gian xóa ánh xạ (mapping: mục ghi lại kết nối này cần được chuyển tới đâu) của một kết nối nhàn rỗi, gói gửi tiếp theo sẽ không được chuyển đi. Bên gửi chỉ truyền lại liên tục rồi mất kết nối, hoặc thiết bị gửi trả gói từ chối kết nối (RST) khiến kết nối đứt ngay.
Vì sao Kết nối không có gói nào đi lại trong một thời gian (người chơi rời máy, đứng ở sảnh chờ) → Dẫn đến NAT của router, CGNAT của nhà mạng, tường lửa, bộ cân bằng tải hoặc security group của cloud xóa ánh xạ nhàn rỗi → Trên màn hình Lúc hoạt động trở lại thì truyền lại liên tiếp rồi mất kết nối, hoặc mất kết nối ngay
Phụ trách chính Phát triển client (Đội phát triển game) · Phối hợp Phát triển server (Đội phát triển game), Hạ tầng mạng (Đội hạ tầng), Hạ tầng server (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Client: gửi heartbeat với khoảng cách không quá một nửa idle timeout ngắn nhất (ánh xạ trên router của người chơi và CGNAT của nhà mạng chỉ được làm mới chắc chắn bằng gói đi từ trong ra, và chúng ta không đổi được timeout của các thiết bị đó, nên client phải gửi), tự động kết nối lại khi bị ngắt. Server: phản hồi heartbeat, không nhận được trong một khoảng thời gian thì chủ động dọn kết nối (rút ngắn khoảng keepalive TCP bằng các tùy chọn socket như TCP_KEEPIDLE, phát hiện sớm bằng TCP_USER_TIMEOUT), nối tiếp phiên bằng session token.
Việc cần làm (Đội hạ tầng)
Mạng: thu thập idle timeout của tường lửa và bộ cân bằng tải trên tuyến đường rồi chia sẻ cho đội phát triển game, tăng timeout trên tường lửa và bộ cân bằng tải của mình nếu cần. Thiết bị server·OS: kiểm tra thời gian theo dõi kết nối của security group trên cloud rồi chia sẻ cho đội phát triển game.
Con số tham khảo
Thời gian giữ ánh xạ TCP khác nhau tùy thiết bị, từ vài phút đến vài giờ. Nếu security group của cloud được cấu hình theo dõi kết nối, loại instance AWS Nitro v6 mặc định xóa mục theo dõi sau 350 giây (các loại khác là 5 ngày, xem mục “Hết hạn theo dõi kết nối của security group trên cloud”). TCP keepalive của Linux có giá trị mặc định là “kiểm tra sau 2 giờ nhàn rỗi” nên muộn hơn hầu hết các thiết bị.
Trên đồ thị
Rớt kết nối hàng loạt · Số lần mất kết nối, thời gian nhàn rỗi trước khi bị ngắt
Chỗ cần xem
Vài phút cuối của kết nối bị đứt, qua bản bắt gói phía server; với kết nối còn sống, xem thời gian nhàn rỗi qua lastsnd và lastrcv của ss -ti (số ms đã trôi qua từ lần gửi và nhận cuối). Xem kèm TcpExtTCPAbortOnTimeout trong nstat (số kết nối bị bỏ vì timer hết hạn)
Đúng nếu
mỗi kết nối bị đứt đều có thời gian nhàn rỗi ngay trước đó vượt một giá trị gần giống nhau (idle timeout của thiết bị trên tuyến đường, ví dụ 350 giây của security group trên instance AWS Nitro v6); từ gói đầu tiên sau khoảng nhàn rỗi chỉ có truyền lại mà không có ACK rồi bỏ cuộc, hoặc RST trả về ngay
Loại trừ nếu
đang chơi cũng bị mất kết nối, không liên quan thời gian nhàn rỗi → nguyên nhân khác (“Đổi tuyến đường hoặc tuyến ECMP lỗi”, “Tường lửa và theo dõi kết nối bỏ gói”). Kết nối có heartbeat qua lại với khoảng cách không quá một nửa idle timeout ngắn nhất → loại nguyên nhân này
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)
Nguồn
RFC 5382: NAT Behavioral Requirements for TCPIETF Khuyến nghị idle timeout của kết nối TCP qua NAT phải từ 2 giờ 4 phút trở lên (với tiền đề là thiết bị có thể xóa phiên nhàn rỗi trước)
Amazon EC2 security group connection trackingAWS Idle timeout theo dõi TCP mặc định với loại instance Nitro v6 là 350 giây, với các loại khác là 432.000 giây (5 ngày). Khuyến nghị keepalive với khoảng cách ngắn hơn 5 phút
IP SysctlLinux kernel tcp_keepalive_time mặc định 2 giờ
tcp(7) — Linux manual pageLinux man-pages TCP_KEEPIDLE (thời gian nhàn rỗi trước khi bắt đầu keepalive), TCP_USER_TIMEOUT (thời gian chờ dữ liệu chưa được xác nhận trước khi đóng kết nối)