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)
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
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
include/net/tcp.hLinux kernel RTO đầu tiên TCP_TIMEOUT_INIT = 1 giây (giá trị khởi đầu của RFC 6298)
IP SysctlLinux 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
tcp: make the first N SYN RTO backoffs linearLinux 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)
Android common kernelsAndroid (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
TcpMaxConnectRetransmissionsMicrosoft 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)