Simula pacchetti ritardati e rilasciati su Linux

Vorrei simulare il ritardo e la perdita di pacchetti per UDP e TCP su Linux per misurare le prestazioni di un’applicazione. C’è un modo semplice per fare questo?

netem sfrutta le funzionalità già integrate in Linux e le utilità userspace per simulare le reti. Questo è in realtà a cui si riferisce la risposta di Marco, con un nome diverso.

Gli esempi nella loro home page mostrano già come puoi ottenere ciò che hai chiesto:

Esempi

Emulazione di ritardi della rete geografica

Questo è l’esempio più semplice, aggiunge solo una quantità fissa di ritardo a tutti i pacchetti che escono dall’Ethernet locale.

 # tc qdisc add dev eth0 root netem delay 100ms 

Ora un semplice test ping per l’hosting sulla rete locale dovrebbe mostrare un aumento di 100 millisecondi. Il ritardo è limitato dalla risoluzione del clock del kernel (Hz). Sulla maggior parte dei sistemi 2.4, l’orologio di sistema funziona a 100 Hz, il che consente ritardi con incrementi di 10 ms. Con 2.6, il valore è un parametro di configurazione da 1000 a 100 Hz.

Gli esempi successivi cambiano semplicemente i parametri senza ricaricare il qdisc

Le reti reali su vasta area mostrano variabilità, quindi è ansible aggiungere variazioni casuali.

 # tc qdisc change dev eth0 root netem delay 100ms 10ms 

Ciò fa sì che il ritardo aggiunto sia 100 ± 10 ms. La variazione del ritardo di rete non è puramente casuale, quindi per emulare che esiste anche un valore di correlazione.

 # tc qdisc change dev eth0 root netem delay 100ms 10ms 25% 

Ciò fa sì che il ritardo aggiunto sia 100 ± 10 ms con il successivo elemento casuale che dipende dal 25% dell’ultimo elemento. Questa non è la vera correlazione statistica, ma un’approssimazione.

Ritarda la distribuzione

In genere, il ritardo in una rete non è uniforms. È più comune utilizzare qualcosa di simile a una distribuzione normale per descrivere la variazione di ritardo. La disciplina netem può prendere una tabella per specificare una distribuzione non uniforms.

 # tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal 

Le tabelle attuali (normale, pareto, paretonormale) sono generate come parte della compilation iproute2 e collocate in / usr / lib / tc; quindi è ansible con qualche sforzo rendere la propria distribuzione basata su dati sperimentali.

Perdita di pacchetti

La perdita di pacchetti casuali è specificata nel comando ‘tc’ in percentuale. Il valore non zero più piccolo ansible è:

2 -32 = 0,0000000232%

 # tc qdisc change dev eth0 root netem loss 0.1% 

Ciò causa la caduta casuale di 1/10 di un percento (cioè 1 su 1000) pacchetti.

Può anche essere aggiunta una correlazione facoltativa. Ciò fa sì che il generatore di numeri casuali sia meno casuale e può essere utilizzato per emulare le perdite di burst dei pacchetti.

 # tc qdisc change dev eth0 root netem loss 0.3% 25% 

Ciò causerà la perdita dello 0,3% dei pacchetti e ogni probabilità successiva dipende da un quarto sull’ultimo.

Prob n = 0,25 × Prob n-1 + 0,75 × Casuale

Nota che dovresti usare tc qdisc add se non hai regole per quell’interfaccia o tc qdisc change se hai già regole per quell’interfaccia. Il tentativo di utilizzare la tc qdisc change su un’interfaccia senza regole darà l’errore RTNETLINK answers: No such file or directory .

Per pacchetti scartati, utilizzerei semplicemente iptables e il modulo statistico .

 iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP 

Sopra lascerà cadere un pacchetto in arrivo con una probabilità dell’1%. Fai attenzione, qualsiasi valore superiore a 0.14 e la maggior parte delle tue connessioni TCP si bloccherà molto probabilmente.

Dai un’occhiata a man iptables e cerca “statistica” per maggiori informazioni.

Uno dei miei colleghi usa TC per farlo. Fare riferimento alla pagina man per ulteriori informazioni. Puoi vedere un esempio del suo utilizzo qui .

iptables (8) ha un modulo di statistiche che può essere usato per abbinare ogni ennesimo pacchetto. Per eliminare questo pacchetto, aggiungi append -j DROP .

Questo tutorial sulle simulazioni di fisica di rete contiene una class C ++ nel codice di esempio per simulare la latenza e la perdita di pacchetti in una connessione UDP e può essere di orientamento. Vedere le variabili public latency e packetLoss della class Connection che si trova nel file Connection.h del codice sorgente scaricabile .

Non l’ho provato da solo, ma questa pagina ha un elenco di moduli plug-in che girano nel sistema di filtraggio IP iptables di Linux. Uno dei moduli è chiamato “nth” e ti permette di impostare una regola che lascerà cadere una velocità configurabile dei pacchetti. Potrebbe essere un buon punto di partenza, almeno.

Puoi provare http://snad.ncsl.nist.gov/nistnet/ È un vecchio progetto NIST (ultima versione 2005), ma funziona per me.

Saboteur è uno strumento facile da utilizzare per l’errore di rete. Può simulare:

  • Total network partizione
  • Servizio remoto guasto (non in ascolto sulla porta prevista)
  • ritardi
  • Perdita di pacchetti – Timeout della connessione TCP (come spesso accade quando due sistemi sono separati da un firewall con stato)

Uno degli strumenti più utilizzati nella comunità scientifica a tale scopo è DummyNet . Una volta installato il modulo del kernel ipfw , per introdurre un ritardo di propagazione di 50 ms tra due macchine è sufficiente eseguire questi comandi:

 ./ipfw pipe 1 config delay 50ms ./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2 

Per poter introdurre anche il 50% delle perdite di pacchetti, è necessario eseguire:

 ./ipfw pipe 1 config plr 0.5 

Qui maggiori dettagli.