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

Buku Putih Lag Game › L8 Socket dan protokol

Algoritma Nagle + delayed ACK Nagle + delayed ACK (TCP_NODELAY off)

ID penyebab sk-nagle · Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Pengembangan klien (Tim Pengembang Game)

Buka kartu interaktif dengan gambar dan simulasi →

Algoritma Nagle yang mengumpulkan paket kecil sebelum dikirim dan delayed ACK yang menunda pengiriman ACK saling mengunci, sehingga setiap kali pesan ditulis terpisah-pisah terjadi keterlambatan 40–200 ms.

Mengapa Pesan kecil ditulis terpisah-pisah tanpa mengaktifkan TCP_NODELAY → Akibatnya Pengirim menunggu ACK, sedangkan penerima menunda pengiriman ACK → Di layar Ping koneksi rendah, tetapi semua aksi terasa lamban secara konsisten (input lag)

Gejala
Input lag
Faktor
Latensi
Siapa yang mengalami
Seluruh server, Hanya saya
Kapan
Selalu, Saat melakukan aksi tertentu
Penanggung jawab
Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Pengembangan klien (Tim Pengembang Game)
Tugas Tim Pengembang Game
Server: aktifkan TCP_NODELAY, kumpulkan pesan selama satu tick lalu tulis sekaligus, jangan mengandalkan cara mematikan delayed ACK di sisi penerima (TCP_QUICKACK di Linux hanya bertahan sebentar, di Windows registry harus diubah di setiap PC) karena game tidak bisa mengendalikannya dengan pasti. Klien: aktifkan TCP_NODELAY, kumpulkan pesan selama satu frame lalu tulis sekaligus.
Kisaran angka
Delayed ACK di Linux biasanya 40 ms (hingga 200 ms tergantung situasi). Di Windows, versi lama memakai 200 ms dan versi sekarang 40 ms (template default Windows Server 2019: 40 ms). Delayed ACK ditentukan oleh OS penerima, jadi jika server mengirim pesan terpisah-pisah dengan Nagle aktif, keterlambatannya bisa 40–200 ms tergantung PC penerimanya.
Di grafik
Selalu tinggi sejak awal · Waktu respons aksi (RTT di dalam game)
Yang diperiksa
Periksa jeda antara permintaan dan respons di packet capture sisi server (tcpdump, Wireshark), lalu pastikan kode server dan klien mengaktifkan TCP_NODELAY
Cocok jika
Ping koneksi rendah, tetapi jeda kosong sekitar 40 ms (200 ms di Windows versi lama) berulang di antara paket kecil, dan jeda itu berakhir tepat setelah ACK dari pihak lawan datang. Hilang setelah TCP_NODELAY diaktifkan
Tidak cocok jika
Jeda respons mirip dengan ping koneksi: bukan penyebab ini. Server game terlambat membuat respons: masalahnya di pemrosesan server (“Penumpukan antrean pesan”)
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)

Sumber

  1. RFC 9293: Transmission Control Protocol (TCP) IETF
    Nagle menahan data kecil selama masih ada data yang belum mendapat ACK; harus bisa dimatikan per koneksi; delayed ACK kurang dari 0,5 detik; masalah saat keduanya saling mengunci
  2. include/net/tcp.h (Linux v6.12) Linux kernel
    Delayed ACK di Linux minimal TCP_DELACK_MIN (HZ/25 = 40 ms), maksimal TCP_DELACK_MAX (HZ/5 = 200 ms)
  3. TCP improvements in the Windows network stack (IETF 98 TCPM) Microsoft
    Timeout delayed ACK default di Windows diubah menjadi 40 ms (diumumkan tahun 2017)
  4. TCP Templates for Windows Server 2019 – How to tune your Windows Server Transports (Advanced users only 😉) Microsoft
    Template Server 2019: DelayedAckTimeout 40 ms, MaxSynRetransmissions 2, InitialRto 3000 ms
  5. Design issues - Sending small data segments over TCP with Winsock Microsoft
    TCP Windows versi lama memasang timer delayed ACK 200 ms setiap kali menerima data, dan Nagle aktif secara default sehingga paket kecil menunggu ACK; diatasi dengan TCP_NODELAY

Lihat juga

Lapisan yang sama: L8 Socket dan protokol

Penyebab di lapisan lain dengan gejala yang sama (Input lag)

Lihat kartu interaktif dengan gambar dan simulasi