2016-01-20 10 views
5

Ich habe Apache Server unter Ubuntu ausgeführt. Der Client verbindet und lädt ein Image herunter. Ich muss RTT-Schätzungen für die zugrunde liegende TCP-Verbindung extrahieren. Gibt es eine Möglichkeit, dies zu tun? Vielleicht etwas wie meinen tcp-Stack im Debug-Modus laufen zu lassen, um diese Informationen irgendwo zu protokollieren?Extract TCP Round Trip Time (RTT) Schätzungen unter Linux

Beachten Sie, dass ich tcpdump nicht ausführen und RTTs aus der aufgezeichneten Spur extrahieren möchte! Ich brauche die RTT-Schätzungen des TCP-Stacks (anscheinend ist das ein Teil der Informationen, die man mit der TCP_INFO-Socket-Option erhalten kann). Im Grunde braucht man so etwas wie tcpprob (kprobe), um einen Haken einzufügen und die geschätzte RTT der TCP-Verbindung auf jedem eingehenden Paket (oder bei jeder Änderung) aufzuzeichnen.

UPDATE:

fand ich eine Lösung. rtt, Staufenster und mehr können mit tcpprobe protokolliert werden. Ich habe unten eine Antwort geschrieben. Verwendung kprobe zeichnet den Zustand einer TCP-Verbindung in Reaktion auf die ankommenden Pakete

+0

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

+0

Danke! Ja, ich bin vertraut mit "ss", aber es ist nicht genau das, was ich brauche, da es mir eine sehr grobe Abtastung der RTT geben wird. Ich brauche etwas wie tcpprob (kprobe), um einen Haken einzufügen und die geschätzte RTT der TCP-Verbindung auf jedem eingehenden Paket (oder bei jeder Änderung) aufzuzeichnen. – kakhkAtion

+2

Hmm. Nun, Linux Stausteuerungsalgorithmen sind steckbare Module im 'net/ipv4 /' Verzeichnis. Jeder berechnet rtt anders (und [reno] (http://lxr.free-electronics.com/source/net/ipv4/tcp_cong.c) berechnet es überhaupt nicht!), Also denke ich, dass du es tust müssen sich in eine bestimmte Implementierung einklinken. Ich sehe, dass du mit kubisch markiert bist, also [tcp_cubic.c] (http://lxr.free-electron.com/source/net/ipv4/tcp_cubic.c). Ich denke nicht, dass es eine generische Methode gibt, das rtt zu bekommen, aber ich könnte sicherlich falsch liegen ... – indiv

Antwort

3

dies mit tcpprobe getan werden kann, die ein Modul ist, das einen Haken in den Verarbeitungsweg tcp_recv einfügt.

Angenommen, Sie TCP-Verbindung auf Port 443 sondieren wollen, müssen Sie folgendes tun:

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

full = 1: log auf jedem ack-Paket empfangen

full = 0: Anmelden nur Wohnung ändert sich (wenn Sie dies verwenden Ihre Ausgabe möglicherweise leer)

Jetzt pid ist der Prozess, der lo ist an der Sonde ansetzen. Zu stoppen, töten einfach diesen Prozess:

kill $pid 

Das Format output.out (entsprechend der source an Leitung 198):

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