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

Á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)

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

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

Triệu chứng
Mất kết nối, Đứng hình
Yếu tố
Mất gói
Ai gặp phải
Chỉ mình tôi, Một khu vực hoặc nhà mạng
Khi nào
Sau khi để yên một lúc
Phụ trách
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

  1. RFC 5382: NAT Behavioral Requirements for TCP IETF
    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)
  2. RFC 4787: Network Address Translation (NAT) Behavioral Requirements for Unicast UDP IETF
    Ánh xạ NAT phải được làm mới bằng gói đi từ trong ra (REQ-6), còn làm mới bằng gói từ ngoài vào là tùy chọn (áp dụng cho UDP)
  3. Amazon EC2 security group connection tracking AWS
    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
  4. IP Sysctl Linux kernel
    tcp_keepalive_time mặc định 2 giờ
  5. tcp(7) — Linux manual page Linux 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)
  6. RFC 5482: TCP User Timeout Option IETF
    TCP user timeout: dữ liệu đã gửi chưa được xác nhận trong bao lâu thì đóng kết nối
  7. ss(8) — Linux manual page iproute2
    lastsnd, lastrcv trong ss -i: thời gian đã trôi qua từ lần gửi và nhận cuối (ms)
  8. SNMP counter Linux kernel
    TcpExtTCPAbortOnTimeout: số kết nối TCP bị bỏ mà không gửi RST vì timer hết hạn

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 (Mất kết nối)

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