Sebuah koneksi TCP dapat selesai bertukar data aplikasi tetapi masih meninggalkan catatan socket. State TIME_WAIT merupakan bagian dari mekanisme penutupan TCP, bukan tanda bahwa proses lupa menutup descriptor.

Endpoint yang melakukan active close biasanya masuk ke TIME_WAIT setelah closing handshake. Kernel mempertahankan state secukupnya selama interval terbatas agar segmen terlambat dari koneksi lama tidak tercampur dengan traffic dari koneksi baru yang memakai identitas endpoint yang sama.

Perilaku ini paling terlihat pada sistem yang membuat banyak koneksi berumur pendek. Jumlah TIME_WAIT yang besar dapat tampak mencolok pada daftar socket, tetapi state tersebut menjaga ketepatan protokol dan tidak berarti setiap entri masih memiliki proses aplikasi.

Byte stream yang ditutup dapat meninggalkan state kernel

TCP mengidentifikasi koneksi melalui kombinasi source address, source port, destination address, dan destination port. Selama koneksi aktif, segmen dengan identitas tersebut dapat tertunda, terduplikasi, atau tiba tidak berurutan di jaringan.

Menutup socket aplikasi tidak menghilangkan seluruh segmen yang sudah berada dalam perjalanan. Jika four-tuple yang sama langsung diberikan kepada koneksi baru, traffic yang sangat terlambat dari koneksi sebelumnya dapat tiba ketika koneksi baru sudah aktif.

TIME_WAIT memberi batas waktu antara dua generasi koneksi tersebut. Identitas koneksi lama tetap dapat dikenali selama periode terbatas, alih-alih langsung tersedia untuk penggunaan ulang tanpa batasan.

State ini berkaitan dengan riwayat protokol. Ia bukan antrean data aplikasi yang menunggu diproses dan tidak setara dengan koneksi established yang memakai worker atau thread.

Active closer biasanya masuk ke TIME_WAIT

Penutupan TCP konvensional memakai segmen FIN dan ACK pada kedua arah. Ketika satu endpoint memulai penutupan, endpoint tersebut pada akhirnya mengirim ACK untuk FIN dari peer. Endpoint inilah yang biasanya bertanggung jawab mempertahankan TIME_WAIT.

Karena itu, server dapat memiliki banyak entri TIME_WAIT ketika server aktif menutup banyak koneksi. Client dapat menunjukkan pola serupa ketika client yang memulai penutupan. Perannya ditentukan oleh perilaku close, bukan aturan tetap berdasarkan label client atau server.

Simultaneous close dan detail implementasi menambah beberapa kasus khusus, tetapi prinsip operasionalnya tetap sama: endpoint yang mempertahankan TIME_WAIT terkait dengan jalur teardown koneksi, bukan selalu mesin yang mula-mula menerima koneksi.

Perbedaan ini membantu saat membaca output ss. Jumlah yang tinggi pada sebuah host memberi informasi tentang turnover koneksi dan arah close baru-baru ini. Angka tersebut sendiri tidak membuktikan adanya leak.

TIME_WAIT melindungi ACK terakhir

State ini juga memberi TCP kesempatan untuk pulih ketika ACK terakhir pada closing handshake hilang. Peer dapat mengirim ulang FIN karena ACK tersebut tidak diterima.

Endpoint yang masih menyimpan state koneksi lama dapat mengenali FIN yang dikirim ulang dan mengirim ACK kembali. Tanpa konteks yang dipertahankan itu, endpoint memiliki lebih sedikit informasi mengenai pertukaran yang baru selesai.

Spesifikasi TCP secara tradisional menyatakan interval tunggu dalam kaitannya dengan maximum segment lifetime, sering dinyatakan sebagai dua kali masa tersebut. Timer konkret dan kebijakan reuse berbeda antar sistem operasi, sehingga satu durasi tetap tidak tepat untuk diasumsikan pada semua host.

Sifat pentingnya adalah retensi yang terbatas: identitas koneksi lama bertahan cukup lama untuk memisahkannya dari traffic terlambat yang masih masuk akal, lalu kedaluwarsa.

Koneksi berumur pendek membuat state ini terlihat jelas

Workload yang berulang kali membuka dan menutup koneksi TCP dapat menghasilkan populasi socket TIME_WAIT yang stabil. Traffic HTTP tanpa reuse koneksi yang efektif, health check yang sering, proxy, RPC client, dan load generator dapat menghasilkan pola ini.

Jumlah entri mencerminkan connection rate dikalikan interval retensi. Walaupun setiap entri akan hilang otomatis, laju pembuatan koneksi yang cukup tinggi dapat menjaga populasi sesaat tetap besar.

Kondisi ini berbeda dari kebocoran file descriptor pada aplikasi. Sebuah proses dapat menutup descriptor sementara kernel tetap mempertahankan state protokol. Tool seperti ss -tan state time-wait menampilkan state TCP di kernel, bukan daftar descriptor yang masih dimiliki kode user-space.

Reuse koneksi melalui sesi persisten atau pooling dapat mengurangi churn karena lebih banyak request memakai koneksi TCP yang sudah ada. Dampaknya dapat mengurangi overhead handshake sekaligus jumlah identitas koneksi yang baru ditutup dan masih disimpan kernel.

Ephemeral port dapat menjadi batas praktis

Koneksi keluar umumnya memakai ephemeral local port yang dipilih sistem operasi. Ketika workload membuat koneksi dengan sangat cepat menuju remote endpoint yang sama, banyak four-tuple yang baru dipakai dapat berada dalam TIME_WAIT secara bersamaan.

Ruang tuple yang tersedia bergantung pada lebih dari sekadar jumlah local port. Local address, remote address, remote port, aturan alokasi kernel, dan kebijakan reuse ikut menentukan apakah koneksi berikutnya dapat dibuat.

Karena itu, kegagalan koneksi saat churn ekstrem perlu diperiksa pada tingkat tuple dan kebijakan socket, bukan dengan menganggap setiap entri TIME_WAIT sebagai sampah yang harus dibuang. Memperluas rentang ephemeral port dapat menambah kapasitas pada lingkungan tertentu, sedangkan penambahan source address atau pengurangan turnover koneksi mengubah bagian lain dari batas yang sama.

Kontrol reuse pada kernel perlu diperlakukan dengan hati-hati. Pengaturan yang mengizinkan reuse dalam kondisi tertentu tidak sama dengan menghapus perlindungan TCP terhadap segmen lama.

Menghentikan aplikasi tidak menghapus riwayat protokol

Karena TIME_WAIT merupakan state teardown TCP di kernel, menghentikan proses yang membuat koneksi tidak selalu membuat entrinya langsung hilang. Proses tersebut mungkin sudah melepaskan socket descriptor.

Hal ini juga menjelaskan alasan pencarian process ID pada setiap entri TIME_WAIT dapat menyesatkan. Bisa jadi tidak ada pemilik user-space yang masih aktif. Kernel mempertahankan identitas koneksi sampai timer dan aturan reuse mengizinkannya hilang.

Dalam analisis insiden, established socket, listening socket, jumlah descriptor, connection rate, ketersediaan ephemeral port, dan jumlah TIME_WAIT menjawab pertanyaan yang berbeda. Menggabungkan metrik tersebut memberi gambaran yang lebih tepat daripada memperlakukan seluruh jumlah socket sebagai satu resource.

TIME_WAIT menjadi batas antargenerasi koneksi

Model yang tepat adalah catatan berumur pendek untuk satu generasi koneksi. TCP telah menyelesaikan hubungan byte stream, tetapi jaringan masih dapat membawa sisa dari hubungan tersebut.

Mempertahankan identitas memberi pemisah antara generasi lama dan koneksi mendatang yang dapat terlihat identik pada tingkat address dan port. State tersebut juga mendukung pengiriman ulang ACK terakhir ketika packet teardown hilang.

Pada host yang sibuk, populasi besar tetap dapat memperlihatkan batas kapasitas atau churn koneksi yang tidak efisien. Penanganannya bergantung pada bottleneck yang nyata: connection pooling, perilaku close aplikasi, kapasitas ephemeral port, rancangan source address, atau kebijakan kernel yang dipilih secara hati-hati dapat berpengaruh. Keberadaan TIME_WAIT sendiri bukan sebuah fault.