Thuật toán Nagle (gom gói nhỏ lại để gửi) và delayed ACK (gửi ACK muộn) tác động chồng lên nhau, nên mỗi lần tách một message ra ghi nhiều lần là bị trễ 40–200 ms.
Vì sao Tách message nhỏ ra ghi nhiều lần mà không bật TCP_NODELAY → Dẫn đến Bên gửi chờ ACK, còn bên nhận thì gửi ACK muộn → Trên màn hình Ping đường truyền thấp nhưng mọi thao tác lúc nào cũng ì ạch như nhau, gây trễ thao tác
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp 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, gom message trong một tick rồi ghi một lần; đừng trông vào cách tắt delayed ACK ở bên nhận (TCP_QUICKACK của Linux chỉ giữ được trong chốc lát, Windows thì phải sửa registry trên từng PC) vì game không kiểm soát chắc chắn được. Client: bật TCP_NODELAY, gom message trong một khung hình rồi ghi một lần.
Con số tham khảo
Delayed ACK trên Linux thường là 40 ms (tùy tình huống, tối đa 200 ms). Windows bản cũ là 200 ms, bản hiện nay là 40 ms (template mặc định của Windows Server 2019 là 40 ms). Delayed ACK do OS bên nhận quyết định, nên nếu server bật Nagle mà tách message ra gửi nhiều lần, mỗi message có thể bị trễ 40–200 ms tùy PC bên nhận.
Trên đồ thị
Luôn cao ngay từ đầu · Thời gian phản hồi thao tác (RTT trong game)
Chỗ cần xem
Khoảng cách giữa yêu cầu và phản hồi trong bản bắt gói (packet capture) phía server (tcpdump, Wireshark); code server và client có bật TCP_NODELAY hay không
Đúng nếu
ping đường truyền thấp nhưng giữa các gói nhỏ liên tục có khoảng trống quanh 40 ms (Windows bản cũ là 200 ms), và mỗi khoảng trống kết thúc ngay sau khi ACK của bên kia đến. Bật TCP_NODELAY thì khoảng trống biến mất
Loại trừ nếu
khoảng cách phản hồi gần bằng ping đường truyền. Server game tạo phản hồi chậm → phía xử lý của server (“Hàng đợi message bị dồn ứ”)
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 9293: Transmission Control Protocol (TCP)IETF Nagle giữ lại dữ liệu nhỏ khi còn dữ liệu chưa nhận được ACK; phải tắt được theo từng kết nối; delayed ACK dưới 0,5 giây; vấn đề khi hai cơ chế tác động chồng lên nhau