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

คู่มือเกมแลค › L8 ซ็อกเก็ตและโปรโตคอล

TCP HOL blocking Head-of-line blocking

ID สาเหตุ sk-hol · ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)

เปิดการ์ดในฉบับหลักที่มีภาพและการทดลอง →

เพื่อรักษาลำดับข้อมูล TCP จะไม่ส่งแพ็กเก็ตที่มาถึงทีหลังให้เกม จนกว่าจะได้รับแพ็กเก็ตที่หายไปหนึ่งตัวนั้นอีกครั้ง

ทำไม แพ็กเก็ตหายไปหนึ่งตัว → ผลคือ แพ็กเก็ตที่ตามมามาถึงแล้ว แต่ต้องรออยู่ใน receive buffer → บนหน้าจอ ค้างไปก่อนแล้วปล่อยออกมารวดเดียวเป็นอาการกรอเร็ว

อาการ
ค้าง, กรอเร็ว
ปัจจัย
แพ็กเก็ตหาย, การหยุดชะงัก
ใครเจอ
เราคนเดียว
เกิดเมื่อไร
สุ่มเป็นครั้งคราว
ผู้รับผิดชอบ
ผู้รับผิดชอบหลัก พัฒนาเซิร์ฟเวอร์ (ทีมพัฒนาเกม) · ร่วมกับ พัฒนาไคลเอนต์ (ทีมพัฒนาเกม)
งานฝั่งทีมพัฒนาเกม
เซิร์ฟเวอร์: ส่งตำแหน่งแบบเรียลไทม์ทาง UDP, ใช้การส่งแบบ reliable เฉพาะข้อมูลที่จำเป็นจริง ๆ, แบ่งเป็นหลาย stream ไคลเอนต์: เปลี่ยนการจัดการเครือข่ายให้ตรงกับเซิร์ฟเวอร์ (UDP, แยกช่องทาง)
ตัวเลขที่ควรรู้
ถ้าแพ็กเก็ตหายหนึ่งตัว จะหยุดอย่างน้อยเท่ากับเวลาไปกลับ + α ถ้าแพ็กเก็ตที่ส่งซ้ำหายอีก จะหยุดหลายร้อย ms ถึงหลายวินาที
บนกราฟ
ขาดช่วงแล้วมารวดเดียว · ปริมาณข้อมูลที่รับต่อการเชื่อมต่อ, จำนวนการส่งซ้ำ
จุดที่ต้องดู
แพ็กเก็ตที่ส่งซ้ำและช่วงว่างก่อนและหลังแพ็กเก็ตนั้นในการเชื่อมต่อของผู้เล่นคนนั้น จาก packet capture ฝั่งเซิร์ฟเวอร์ (tcpdump, Wireshark) ส่วนทั้งเซิร์ฟเวอร์ดูค่าที่เพิ่มขึ้นของ TcpRetransSegs จาก nstat -az
สัญญาณว่าใช่
ช่วงที่หยุดเริ่มด้วยการส่งซ้ำของแพ็กเก็ตเดียว และทันทีที่แพ็กเก็ตที่ส่งซ้ำมาถึง ข้อมูลที่กองรอก็ถูกประมวลผลรวดเดียว (ปริมาณที่รับเป็น 0 แล้วพุ่ง)
สัญญาณว่าไม่ใช่
เกมที่สื่อสารทาง UDP: ไม่เกี่ยว ถ้าไม่มีการส่งซ้ำแต่ยังหยุด ให้ดูฝั่งทิกของเซิร์ฟเวอร์ (“ทิกเกินงบเวลา”)
วิธีตรวจ
ใช้เครื่องมือฝั่งอินฟรา (ไม่ต้องใช้โค้ดเกม)

แหล่งอ้างอิง

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    TCP เป็นบริการ byte stream ที่เชื่อถือได้และรักษาลำดับ
  2. RFC 5681: TCP Congestion Control IETF
    ตรวจพบแพ็กเก็ตหายจาก duplicate ACK 3 ตัวแล้วทำ fast retransmit ถ้าไม่ใช่ก็รอตัวจับเวลาส่งซ้ำ
  3. RFC 6298: Computing TCP's Retransmission Timer IETF
    backoff ที่เพิ่มเวลารอเป็นสองเท่าทุกครั้งที่ตัวจับเวลาส่งซ้ำหมดเวลา
  4. net/ipv4/proc.c (Linux v6.12) Linux kernel
    ชื่อตัวนับที่ nstat แสดง: RetransSegs (จำนวน segment ที่ส่งซ้ำ) ในกลุ่ม Tcp

สาเหตุที่ควรดูประกอบ

ชั้นเดียวกัน: L8 ซ็อกเก็ตและโปรโตคอล

สาเหตุจากชั้นอื่นที่ทำให้เกิดอาการเดียวกัน (ค้าง)

ดูการ์ดในฉบับหลักที่มีภาพและการทดลอง