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

Truyền lại yêu cầu kết nối (SYN) SYN retransmission on connect

ID nguyên nhân rt-syn · Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng server (Đội hạ tầng), Hạ tầng mạng (Đội hạ tầng), 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 →

Khi yêu cầu kết nối biến mất do hàng đợi kết nối (backlog) bị tràn hoặc bị tường lửa chặn, OS phía client sẽ gửi lại, bắt đầu sau 1 giây và giãn dần khoảng cách.

Vì sao Ngay sau bảo trì, lượng kết nối dồn vào làm tràn hàng đợi kết nối của server, hoặc tường lửa hay hệ thống chống DDoS bỏ SYN → Dẫn đến OS phía client truyền lại SYN theo khoảng cách định sẵn, bắt đầu sau 1 giây (Linux đời cũ là 1 giây → 2 giây → 4 giây) → Trên màn hình Sau khi bấm nút kết nối, thời gian trễ tròn đúng từng giây như 1 giây, 3 giây; thất bại liên tục thì không vào được game hoặc kẹt loading

Triệu chứng
Không vào được·kẹt loading
Yếu tố
Mất gói
Ai gặp phải
Cả server, Một khu vực hoặc nhà mạng
Khi nào
Ngay sau đăng nhập hoặc bảo trì
Phụ trách
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng server (Đội hạ tầng), Hạ tầng mạng (Đội hạ tầng), Phát triển client (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Server: tăng tham số backlog của listen (cùng với somaxconn), bảo đảm server game gọi accept kịp thời, dùng hệ thống hàng chờ đăng nhập. Client: giãn khoảng cách thử kết nối lại (rải ngẫu nhiên).
Việc cần làm (Đội hạ tầng)
Thiết bị server·OS: kiểm tra tràn hàng đợi kết nối của server qua TcpExtListenOverflows, TcpExtListenDrops trong nstat và cảnh báo “Possible SYN flooding” trong log, tăng somaxconn (cùng với tham số của listen), dùng SYN cookie. Mạng: nới giới hạn SYN của tường lửa và hệ thống chống DDoS.
Con số tham khảo
Trên Linux (kể cả Android), SYN được truyền lại lần đầu sau 1 giây. Kernel đời cũ sau đó tăng gấp đôi khoảng chờ mỗi lần và gửi lại ở giây thứ 1, 3, 7, 15 …, còn từ 6.5 trở lên thì gửi lại 5 lần ở giây thứ 1, 2, 3, 4, 5 rồi mới tăng gấp đôi (7, 11, 19 giây …) (tcp_syn_linear_timeouts=4). Điện thoại Android thường vẫn dùng kernel lúc xuất xưởng dù đã cập nhật OS, nên cùng phiên bản Android mà mỗi máy có thể khác nhau. Dù theo cách nào, thất bại hết thì khoảng 2 phút sau sẽ bỏ cuộc. Windows bắt đầu giãn từ 1 giây hoặc 3 giây tùy phiên bản và cấu hình, số lần gửi lại là 2–4 nên bỏ cuộc sau 20–30 giây (giá trị trên PC đó xem ở Max SYN Retransmissions trong netsh int tcp show global).
Trên đồ thị
Tăng vọt ngay sau đăng nhập hoặc bảo trì · Số lần thử kết nối, số lần tràn hàng đợi kết nối
Chỗ cần xem
TcpExtListenOverflows và TcpExtListenDrops trong nstat của server, cảnh báo “Possible SYN flooding on port” trong dmesg; dùng ss -lnt xem Recv-Q (số kết nối đang chờ accept) của socket đang lắng nghe có chạm Send-Q (giới hạn backlog) không. Dùng bản bắt gói phía server để xác nhận SYN có đến không và server có trả SYN-ACK không
Đúng nếu
khi lượng kết nối dồn vào ngay sau bảo trì, TcpExtListenOverflows tăng và Recv-Q dính sát Send-Q. Trong bản bắt gói, SYN của cùng một client đến lại cách nhau từng giây mà server không phản hồi
Loại trừ nếu
SYN không tới được server và counter của server cũng không đổi → tường lửa hoặc hệ thống chống DDoS phía trước đã bỏ gói, xem giới hạn SYN và log drop của thiết bị đó. Server đã gửi SYN-ACK mà kết nối vẫn chậm → mất gói ở chiều về
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. include/net/tcp.h Linux kernel
    RTO đầu tiên TCP_TIMEOUT_INIT = 1 giây (giá trị khởi đầu của RFC 6298)
  2. RFC 6298: Computing TCP's Retransmission Timer IETF
    RTO khởi đầu 1 giây, tăng gấp đôi mỗi lần truyền lại
  3. IP Sysctl Linux kernel
    tcp_syn_retries mặc định 6, tcp_syn_linear_timeouts mặc định 4 (SYN RTO 1, 1, 1, 1, 1, 2, 4 …), lần truyền lại cuối ở giây thứ 67 và bỏ cuộc ở giây thứ 131, somaxconn mặc định 4096, tcp_syncookies mặc định 1
  4. tcp: make the first N SYN RTO backoffs linear Linux kernel
    Commit đổi phần đầu của chuỗi truyền lại SYN sang khoảng cách cố định, từ Linux 6.5 (mặc định 4 theo cách của macOS và iOS)
  5. Android common kernels Android (Google)
    Các kernel chung 5.10–6.18 được hỗ trợ song song, và kernel dành cho nền tảng trước (ví dụ android14-6.1) có thể dùng khi ra mắt hoặc nâng cấp thiết bị Android mới
  6. TcpMaxConnectRetransmissions Microsoft
    Mặc định của Windows đời cũ: truyền lại SYN 2 lần, chờ lần đầu 3 giây rồi tăng gấp đôi, sau lần cuối chờ thêm gấp đôi rồi bỏ cuộc (3+6+12=21 giây)
  7. TCP/IP connectivity issues troubleshooting Microsoft
    Số lần truyền lại SYN khác nhau tùy OS, xem bằng Max SYN Retransmissions trong netsh int tcp show global
  8. listen(2) — Linux manual page Linux man-pages
    Tham số backlog của listen bị cắt theo somaxconn (từ Linux 5.4 mặc định 4096, trước đó 128)
  9. SNMP counter Linux kernel
    Khi hàng đợi accept đầy thì SYN bị bỏ và TcpExtListenOverflows, TcpExtListenDrops cùng tăng; TcpExtTCPSynRetrans
  10. net/ipv4/tcp_input.c Linux kernel
    Thông điệp log “Possible SYN flooding on port …”
  11. net/ipv4/tcp_diag.c Linux kernel
    Với socket đang lắng nghe, Recv-Q trong ss là số kết nối đang chờ accept, Send-Q là giới hạn backlog

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 (Không vào được·kẹt loading)

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