Cara membuat waktu soket TCP habis


20

Untuk simulasi bencana jaringan dari lingkungan server kami, kami sedang mencari cara untuk sengaja mematikan soket TCP. Apakah ada cara sederhana untuk soket yang ada? Juga, program kasus uji C kecil akan menjadi nilai tambah.

Kami telah mencoba meletakkan antarmuka jaringan selama membaca buffer TCP, dan membaca dari sumber yang terpasang terputus (samba).

Server uji keluar adalah Ubuntu 12.04.4.

Jawaban:


19

Untuk menyebabkan koneksi keluar ke batas waktu dapat Anda gunakan iptables. Cukup aktifkan DROPaturan pada port yang ingin Anda nonaktifkan. Jadi, untuk mensimulasikan batas waktu untuk server Samaba Anda, saat koneksi aktif sudah habis, jalankan yang berikut di server:

sudo iptables -A INPUT -p tcp --dport 445 -j DROP

The DROPTarget tidak akan membalas dengan RSTpaket atau ICMPkesalahan ke pengirim paket. Klien akan berhenti menerima paket dari server dan akhirnya kehabisan waktu.

Bergantung pada jika / bagaimana Anda telah iptablesmengkonfigurasi, Anda mungkin ingin memasukkan aturan yang lebih tinggi ke dalam INPUTruleset.


Mencoba ini menggunakan netcat (untuk mendengarkan / mengirim data) dan menunggu selamanya ... tidak ada batas waktu: / Dan saya dapat mengkonfirmasi data itu dijatuhkan. Saya bahkan berubah /proc/sys/net/ipv4/tcp_keepalive_timemenjadi angka yang sangat kecil
er453r

@ er453r coba aktifkan output verbose dengan ncat -vuntuk melihat apa yang sebenarnya ncatdilakukan. Butuh 2m7.291 detik di vanilla Ubuntu 12.04 instal ke timeout
Creek

benar - saya tidak mengirim apa pun melalui soket selama tes pertama itu. Saya akhirnya menguasai batas waktu dan menggambarkannya secara terperinci di bawah ini :)
er453r

16

Jawaban pertama benar, tetapi saya telah menemukan cara kerja timeout ini, sehingga Anda dapat mengamati dan mengujinya (jangan lupa untuk memblokir port!).

Ada 4 parameter kernel paling menarik yang berhubungan dengan timeout TCP:

/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_retries2

Sekarang ada 2 skenario:

  1. Soket dibuka dan mencoba mengirimkan - lalu (jika tidak ada respons dari sisi lain), sistem mencoba ulang tcp_retries2kali. Dengan nilai default pensiunan, dibutuhkan sekitar 2 menit dan waktu soket habis.

  2. Soket dibuka dan diam - kemudian batas keepalive menarik. Dengan sistem soket siaga akan menunggu beberapa tcp_keepalive_timedetik, dan setelah itu coba tcp_keepalive_probeswaktu untuk mengirim TCP KEEPALIVE dalam interval tcp_keepalive_intvldetik. Dan hanya setelah itu semua gagal soket mati.


1
Anda juga dapat memantau waktu tunggu ini menggunakannetstat -o
er453r
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.