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

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

Mất dữ liệu cuối do đóng cưỡng bức bằng RST SO_LINGER, abrupt RST

ID nguyên nhân sk-linger · Phụ trách chính Phát triển server (Đội phát triển game)

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

Khi server cắt kết nối đột ngột, thông báo cuối cùng hoặc tín hiệu đã lưu xong mà server vừa gửi sẽ bị mất.

Vì sao Server đóng kết nối kiểu cưỡng bức (RST). Xảy ra khi đặt SO_LINGER là 0 giây, hoặc khi đóng socket trước khi đọc hết dữ liệu đã nhận → Dẫn đến Lý do kick và dữ liệu cuối cùng còn đang trên đường gửi bị vứt bỏ → Trên màn hình Thông báo “Kết nối bị đóng do lỗi không xác định” mà không rõ lý do

Triệu chứng
Mất kết nối
Yếu tố
Mất gói
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)
Việc cần làm (Đội phát triển game)
Gửi lý do xong thì chỉ đóng chiều gửi trước (shutdown), đọc hết dữ liệu nhận được cho đến khi bên kia đóng rồi mới đóng socket, tránh SO_LINGER 0 giây.
Trên đồ thị
Thỉnh thoảng vọt lên bất chợt · Số kết nối kết thúc bằng RST
Chỗ cần xem
Mức tăng TcpExtTCPAbortOnData (đóng bằng RST khi vẫn còn dữ liệu cần gửi, SO_LINGER 0 giây) và TcpExtTCPAbortOnClose (đóng khi vẫn còn dữ liệu chưa đọc) trong nstat -az; trong bản bắt gói (packet capture) phía server lúc mất kết nối, xem có RST đi ra ở chỗ lẽ ra phải là FIN không
Đúng nếu
vào thời điểm người chơi báo “Kết nối bị đóng do lỗi không xác định”, server gửi RST, và AbortOnData, AbortOnClose tăng
Loại trừ nếu
server đã đóng bình thường bằng FIN mà vẫn không thấy lý do → xem phần xử lý đóng kết nối của client
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. closesocket function (winsock.h) Microsoft
    Bật SO_LINGER và đặt thời gian là 0 thì lệnh đóng trở thành đóng cưỡng bức, reset kết nối ngay lập tức, dữ liệu chưa gửi bị mất
  2. RFC 9293: Transmission Control Protocol (TCP) IETF
    Đóng khi vẫn còn dữ liệu đã nhận chưa đọc thì gửi RST để báo mất dữ liệu
  3. Graceful Shutdown, Linger Options, and Socket Closure Microsoft
    Trình tự: dùng shutdown đóng chiều gửi trước, nhận được thông báo đóng của bên kia rồi mới đóng socket
  4. SNMP counter Linux kernel
    TcpExtTCPAbortOnData: đóng bằng RST khi vẫn còn dữ liệu cần gửi (do SO_LINGER 0 giây, v.v.); TcpExtTCPAbortOnClose: đóng khi vẫn còn dữ liệu chưa đọc nên gửi RST

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

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