Come rendere scaduto un socket TCP


20

Per simulazioni di catastrofi di rete del nostro ambiente server, stiamo cercando un modo per timeout intenzionale di un socket TCP. Esistono modi semplici per le prese esistenti? Inoltre, un piccolo programma di test C sarebbe un vantaggio.

Abbiamo già provato a mettere giù le interfacce di rete durante la lettura del buffer TCP e la lettura da risorse montate disconnesse (samba).

Il nostro server di test è Ubuntu 12.04.4.

Risposte:


19

Per causare il timeout di una connessione in uscita è possibile utilizzare iptables. Basta abilitare una DROPregola sulla porta che si desidera disabilitare. Quindi, per simulare un timeout per il tuo server Samaba, mentre è attiva una connessione attiva, esegui quanto segue sul server:

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

Il DROPtarget non risponderà con un RSTpacchetto o ICMPerrore al mittente del pacchetto. Il client interromperà la ricezione dei pacchetti dal server e alla fine il timeout.

A seconda se / come è stato iptablesconfigurato, è possibile che si desideri inserire la regola più in alto nel INPUTset di regole.


Ho provato questo usando netcat (per ascoltare / inviare dati) e ho aspettato per sempre ... nessun timeout: / E posso confermare che i dati sono stati eliminati. Ho anche cambiato /proc/sys/net/ipv4/tcp_keepalive_timein un numero molto piccolo
er453r

@ er453r prova ad abilitare l'output dettagliato con ncat -vper vedere cosa ncatsta facendo esattamente . Mi ci sono voluti 2m7.291s su un'installazione Ubuntu 12.04 vanilla per il timeout
Creek

giusto - non stavo inviando nulla attraverso il socket durante quel primo test.
Alla

16

La prima risposta è corretta, ma ho scoperto come funzionano questi timeout, così puoi osservarli e testarli (non dimenticare di bloccare la porta!).

Esistono 4 parametri del kernel più interessanti che riguardano i 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

Ora ci sono 2 scenari:

  1. Il socket viene aperto e tenta di trasmettere - quindi (se non vi è risposta dall'altra parte), il sistema riprova i tcp_retries2tempi. Con il valore predefinito di pensionamento ci vogliono circa 2 minuti e il timeout del socket.

  2. Il socket è aperto e inattivo - quindi i limiti keepalive sono interessanti. Con un sistema di socket inattivo attenderà alcuni tcp_keepalive_timesecondi, dopodiché tenterà tcp_keepalive_probesdi inviare un KEEPALIVE TCP a intervalli di tcp_keepalive_intvlsecondi. E solo dopo tutto fallisce il timeout del socket.


1
inoltre, è possibile monitorare questi timeout utilizzandonetstat -o
er453r
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.