한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L8 Socket và giao thức

TCP HOL blocking Head-of-line blocking

ID nguyên nhân sk-hol · 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)

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

Để giữ đúng thứ tự, TCP không giao cho game các gói đến sau cho tới khi nhận lại được gói bị mất đó.

Vì sao Một gói tin bị mất → Dẫn đến Các gói phía sau đã đến nhưng phải nằm chờ trong bộ đệm nhận → Trên màn hình Game đứng hình rồi dữ liệu ùa ra cùng một lúc, gây tua nhanh

Triệu chứng
Đứng hình, Tua nhanh
Yếu tố
Mất gói, Ngưng trệ
Ai gặp phải
Chỉ mình tôi
Khi nào
Thỉnh thoảng bất chợt
Phụ trách
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: gửi vị trí thời gian thực bằng UDP, chỉ truyền tin cậy những gì thật sự cần, chia thành nhiều stream. Client: đổi cách xử lý mạng theo cùng cách với server (UDP, tách kênh).
Con số tham khảo
Mất một gói là kết nối đứng ít nhất một thời gian khứ hồi cộng thêm một chút; nếu gói truyền lại cũng mất thì đứng từ vài trăm ms đến vài giây.
Trên đồ thị
Đứt quãng rồi dồn về · Lượng dữ liệu nhận theo từng kết nối, số lần truyền lại
Chỗ cần xem
Gói truyền lại và khoảng trống trước sau nó trên kết nối của người chơi đó, xem bằng bản bắt gói (packet capture) phía server (tcpdump, Wireshark); với cả server, xem mức tăng TcpRetransSegs trong nstat -az
Đúng nếu
mỗi đoạn đứng bắt đầu bằng việc truyền lại một gói, và ngay sau khi gói truyền lại đến, dữ liệu bị dồn được xử lý cùng một lúc (lượng nhận đang ở 0 rồi vọt lên)
Loại trừ nếu
game giao tiếp bằng UDP (nguyên nhân này không áp dụng). Không có truyền lại mà vẫn đứng → xem phía tick của server (“Vượt tick budget”)
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 9293: Transmission Control Protocol (TCP) IETF
    TCP là dịch vụ luồng byte tin cậy và giữ đúng thứ tự
  2. RFC 5681: TCP Congestion Control IETF
    Phát hiện mất gói qua 3 ACK trùng lặp thì truyền lại nhanh, nếu không thì chờ timer truyền lại
  3. RFC 6298: Computing TCP's Retransmission Timer IETF
    Backoff nhân đôi thời gian chờ mỗi lần timer truyền lại hết hạn
  4. net/ipv4/proc.c (Linux v6.12) Linux kernel
    Tên bộ đếm mà nstat hiển thị: RetransSegs (số segment đã truyền lại) trong nhóm Tcp

Nguyên nhân nên xem cùng

Cùng tầng: L8 Socket và giao thức

Nguyên nhân ở tầng khác gây cùng triệu chứng (Đứng hình)

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