2016-01-20 36 views
5

Ho un server Apache in esecuzione su Ubuntu. Il cliente connette e scarica un'immagine. Devo estrarre le stime RTT per la connessione TCP sottostante. C'è un modo per fare questo? Forse qualcosa come eseguire il mio stack TCP in modalità di debug per farlo registrare da qualche parte queste informazioni?Estrai stime TCP round trip time (RTT) su linux

Nota che non voglio eseguire tcpdump ed estrarre RTT dalla traccia registrata! Ho bisogno delle stime RTT dello stack TCP (apparentemente questa è parte delle informazioni che puoi ottenere con l'opzione socket TCP_INFO). Fondamentalmente è necessario qualcosa come tcpprob (kprobe) per inserire un hook e registrare la RTT stimata della connessione TCP su ogni pacchetto in entrata (o su ogni cambiamento).

UPDATE:

ho trovato una soluzione. rtt, la finestra di congestione e altro possono essere registrati usando tcpprobe. Ho postato una risposta qui sotto.

+0

http://stackoverflow.com/questions/16231600/fetching -the-tcp-rtt-in-linux – indiv

+0

Grazie! Sì, ho familiarità con "ss", ma non è esattamente ciò di cui ho bisogno in quanto mi darà un campionamento molto approssimativo della RTT. Ho bisogno di qualcosa come tcpprob (kprobe) per inserire un hook e registrare la RTT stimata della connessione TCP su ogni pacchetto in entrata (o su ogni cambiamento). – kakhkAtion

+2

Hmm. Gli algoritmi di controllo della congestione di Linux sono moduli collegabili nella directory 'net/ipv4 /'. Ogni calcolo rtt in modo diverso (e [reno] (http://lxr.free-electrons.com/source/net/ipv4/tcp_cong.c) non lo computa affatto!), Quindi penso che tu devono collegarsi a una particolare implementazione. Vedo che hai taggato cubico, quindi è [tcp_cubic.c] (http://lxr.free-electrons.com/source/net/ipv4/tcp_cubic.c). Non penso che ci sia un metodo generico per ottenere il rtt, ma potrei sicuramente sbagliarmi ... – indiv

risposta

3

Questo può essere fatto utilizzando tcpprobe, che è un modulo che inserisce un gancio nel percorso di elaborazione tcp_recv utilizzando kprobe registra lo stato di una connessione TCP in risposta ai pacchetti in ingresso.

Diciamo che si desidera sondare connessione TCP sulla porta 443, è necessario effettuare le seguenti operazioni:

sudo modprobe tcp_probe port=443 full=1 
sudo chmod 444 /proc/net/tcpprobe 
cat /proc/net/tcpprobe > /tmp/output.out & 
pid=$! 

pieno = 1: log su ogni pacchetto ACK ricevuto

pieno = 0: accedere solo alle modifiche condominio (se si utilizza questo output potrebbe essere vuoto)

Ora pid è il processo che è lo colare la sonda. Per arrestare, uccidere semplicemente questo processo:

kill $pid 

Il formato di output.out (secondo il source alla riga 198):

[time][src][dst][length][snd_nxt][snd_una][snd_cwnd][ssthresh][snd_wnd][srtt][rcv_wnd]