Nilai default keepalive 2 jam TCP keepalive defaults
ID penyebab sk-keepalive · Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Pengembangan klien (Tim Pengembang Game), Infrastruktur server (Tim Infrastruktur)
Jika pihak lawan menghilang tanpa sinyal penutupan, TCP baru mendeteksinya lama kemudian. keepalive (fitur TCP untuk memeriksa apakah koneksi idle masih hidup) nonaktif secara default, dan walaupun diaktifkan, pemeriksaan baru dimulai setelah koneksi idle selama 2 jam.
Mengapa Klien menghilang tanpa sinyal penutupan karena perangkat mati atau koneksi putus → Akibatnya Server menganggap koneksi masih hidup (keepalive default 7.200 detik; jika ada data yang sedang dikirim, sekitar 15 menit sampai retransmisi menyerah) → Di layar Karakter hantu tertinggal, dan saat login ulang muncul error “Sudah terhubung”
Setelah lama diam, Tepat setelah login atau maintenance
Penanggung jawab
Penanggung jawab utama Pengembangan server (Tim Pengembang Game) · Turut terlibat Pengembangan klien (Tim Pengembang Game), Infrastruktur server (Tim Infrastruktur)
Tugas Tim Pengembang Game
Server: balas heartbeat dan putuskan koneksi lebih dulu jika tidak ada heartbeat dalam waktu tertentu (sesuaikan TCP_KEEPIDLE dan TCP_USER_TIMEOUT), saat pemain reconnect ganti sesi lama lewat token sesi agar sesi berlanjut. Klien: kirim heartbeat di level game dengan interval beberapa hingga puluhan detik (maksimal setengah dari idle timeout terpendek), reconnect otomatis jika terputus.
Tugas Tim Infrastruktur
Turunkan nilai default kernel (tcp_keepalive_time dan lainnya) untuk socket yang tidak mengaturnya sendiri di kode (hanya berlaku untuk socket yang mengaktifkan SO_KEEPALIVE).
Kisaran angka
Default Linux: pemeriksaan dimulai setelah koneksi idle 7.200 detik, probe dikirim 9 kali dengan interval 75 detik, dan jika sampai akhir tidak ada respons, koneksi diputus. Totalnya sekitar 2 jam 11 menit. Windows juga secara default baru memulai pemeriksaan setelah koneksi idle 2 jam.
Di grafik
Hanya sebagian yang tinggi · Waktu berlalu sejak data terakhir diterima per koneksi
Yang diperiksa
Periksa lastrcv (ms sejak data terakhir diterima) dan timer keepalive (timer:(keepalive,…)) per koneksi dengan ss -tnoi, lalu cocokkan dengan catatan penolakan “Sudah terhubung” di server game
Cocok jika
Masih ada koneksi ESTABLISHED dengan lastrcv beberapa menit hingga beberapa jam, dan reconnect akun tersebut ditolak dengan “Sudah terhubung”
Tidak cocok jika
Tidak ada koneksi yang lama diam tetapi “Sudah terhubung” tetap muncul: masalahnya di kode pembersihan sesi server game
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Sumber
tcp(7) — Linux manual pageLinux man-pages Setelah idle 7.200 detik, probe dikirim 9 kali dengan interval 75 detik (tambahan sekitar 11 menit); hanya berlaku untuk socket yang mengaktifkan SO_KEEPALIVE; TCP_KEEPIDLE dan TCP_USER_TIMEOUT