Secara default, ketika keduanya tcp_tw_reuse
dan tcp_tw_recycle
dimatikan, kernel akan memastikan bahwa soket dalam TIME_WAIT
keadaan akan tetap dalam keadaan itu cukup lama - cukup lama untuk memastikan bahwa paket-paket milik koneksi masa depan tidak akan keliru untuk paket-paket akhir dari koneksi lama.
Ketika Anda mengaktifkan tcp_tw_reuse
, soket dalam TIME_WAIT
keadaan dapat digunakan sebelum kedaluwarsa, dan kernel akan mencoba memastikan bahwa tidak ada tabrakan mengenai nomor urut TCP. Jika Anda mengaktifkan tcp_timestamps
(alias PAWS, untuk Perlindungan Terhadap Nomor Urutan yang Dibungkus), itu akan memastikan bahwa tabrakan tersebut tidak dapat terjadi. Namun, Anda perlu cap waktu TCP diaktifkan di kedua ujungnya (setidaknya, itulah pemahaman saya). Lihat definisi tcp_twsk_unique untuk detail berdarah.
Ketika Anda mengaktifkan tcp_tw_recycle
, kernel menjadi jauh lebih agresif, dan akan membuat asumsi pada cap waktu yang digunakan oleh host jarak jauh. Ini akan melacak stempel waktu terakhir yang digunakan oleh setiap host jarak jauh yang memiliki koneksi dalam TIME_WAIT
keadaan), dan memungkinkan untuk menggunakan kembali soket jika stempel waktu telah meningkat dengan benar. Namun, jika stempel waktu yang digunakan oleh host berubah (mis. Warps back in time), SYN
paket akan secara diam-diam dijatuhkan, dan koneksi tidak akan terbentuk (Anda akan melihat kesalahan yang mirip dengan "connect timeout"). Jika Anda ingin menyelami kode kernel, definisi tcp_timewait_state_process mungkin merupakan titik awal yang baik.
Sekarang, cap waktu seharusnya tidak pernah mundur; kecuali kalau:
- host di-reboot (tetapi kemudian, pada saat itu muncul kembali,
TIME_WAIT
socket mungkin sudah kedaluwarsa, jadi itu bukan masalah);
- alamat IP dengan cepat digunakan kembali oleh sesuatu yang lain (
TIME_WAIT
koneksi akan tetap sedikit, tetapi koneksi lain mungkin akan terpukul oleh TCP RST
dan itu akan membebaskan beberapa ruang);
- terjemahan alamat jaringan (atau firewall smarty-pants) terlibat di tengah koneksi.
Dalam kasus terakhir, Anda dapat memiliki beberapa host di belakang alamat IP yang sama, dan oleh karena itu, urutan cap waktu yang berbeda (atau, kata cap waktu tersebut diacak pada setiap koneksi oleh firewall). Dalam hal ini, beberapa host tidak akan dapat terhubung secara acak, karena mereka dipetakan ke port yang TIME_WAIT
ember servernya memiliki stempel waktu yang lebih baru. Itu sebabnya dokumen memberi tahu Anda bahwa "Perangkat NAT atau load balancers dapat mulai menjatuhkan frame karena pengaturan".
Beberapa orang merekomendasikan untuk pergi tcp_tw_recycle
sendiri, tetapi memungkinkan tcp_tw_reuse
dan menurunkantcp_timewait_len
. Saya setuju :-)