1*387f9dfdSAndroid Build Coastguard WorkerDemonstrations of tcpretrans, the Linux eBPF/bcc version. 2*387f9dfdSAndroid Build Coastguard Worker 3*387f9dfdSAndroid Build Coastguard Worker 4*387f9dfdSAndroid Build Coastguard WorkerThis tool traces the kernel TCP retransmit function to show details of these 5*387f9dfdSAndroid Build Coastguard Workerretransmits. For example: 6*387f9dfdSAndroid Build Coastguard Worker 7*387f9dfdSAndroid Build Coastguard Worker# ./tcpretrans 8*387f9dfdSAndroid Build Coastguard WorkerTIME PID IP LADDR:LPORT T> RADDR:RPORT STATE 9*387f9dfdSAndroid Build Coastguard Worker01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 ESTABLISHED 10*387f9dfdSAndroid Build Coastguard Worker01:55:05 0 4 10.153.223.157:22 R> 69.53.245.40:34619 ESTABLISHED 11*387f9dfdSAndroid Build Coastguard Worker01:55:17 0 4 10.153.223.157:22 R> 69.53.245.40:22957 ESTABLISHED 12*387f9dfdSAndroid Build Coastguard Worker[...] 13*387f9dfdSAndroid Build Coastguard Worker 14*387f9dfdSAndroid Build Coastguard WorkerThis output shows three TCP retransmits, the first two were for an IPv4 15*387f9dfdSAndroid Build Coastguard Workerconnection from 10.153.223.157 port 22 to 69.53.245.40 port 34619. The TCP 16*387f9dfdSAndroid Build Coastguard Workerstate was "ESTABLISHED" at the time of the retransmit. The on-CPU PID at the 17*387f9dfdSAndroid Build Coastguard Workertime of the retransmit is printed, in this case 0 (the kernel, which will 18*387f9dfdSAndroid Build Coastguard Workerbe the case most of the time). 19*387f9dfdSAndroid Build Coastguard Worker 20*387f9dfdSAndroid Build Coastguard WorkerRetransmits are usually a sign of poor network health, and this tool is 21*387f9dfdSAndroid Build Coastguard Workeruseful for their investigation. Unlike using tcpdump, this tool has very 22*387f9dfdSAndroid Build Coastguard Workerlow overhead, as it only traces the retransmit function. It also prints 23*387f9dfdSAndroid Build Coastguard Workeradditional kernel details: the state of the TCP session at the time of the 24*387f9dfdSAndroid Build Coastguard Workerretransmit. 25*387f9dfdSAndroid Build Coastguard Worker 26*387f9dfdSAndroid Build Coastguard Worker 27*387f9dfdSAndroid Build Coastguard WorkerA -l option will include TCP tail loss probe attempts: 28*387f9dfdSAndroid Build Coastguard Worker 29*387f9dfdSAndroid Build Coastguard Worker# ./tcpretrans -l 30*387f9dfdSAndroid Build Coastguard WorkerTIME PID IP LADDR:LPORT T> RADDR:RPORT STATE 31*387f9dfdSAndroid Build Coastguard Worker01:55:45 0 4 10.153.223.157:22 R> 69.53.245.40:51601 ESTABLISHED 32*387f9dfdSAndroid Build Coastguard Worker01:55:46 0 4 10.153.223.157:22 R> 69.53.245.40:51601 ESTABLISHED 33*387f9dfdSAndroid Build Coastguard Worker01:55:46 0 4 10.153.223.157:22 R> 69.53.245.40:51601 ESTABLISHED 34*387f9dfdSAndroid Build Coastguard Worker01:55:53 0 4 10.153.223.157:22 L> 69.53.245.40:46444 ESTABLISHED 35*387f9dfdSAndroid Build Coastguard Worker01:56:06 0 4 10.153.223.157:22 R> 69.53.245.40:46444 ESTABLISHED 36*387f9dfdSAndroid Build Coastguard Worker01:56:06 0 4 10.153.223.157:22 R> 69.53.245.40:46444 ESTABLISHED 37*387f9dfdSAndroid Build Coastguard Worker01:56:08 0 4 10.153.223.157:22 R> 69.53.245.40:46444 ESTABLISHED 38*387f9dfdSAndroid Build Coastguard Worker01:56:08 0 4 10.153.223.157:22 R> 69.53.245.40:46444 ESTABLISHED 39*387f9dfdSAndroid Build Coastguard Worker01:56:08 1938 4 10.153.223.157:22 R> 69.53.245.40:46444 ESTABLISHED 40*387f9dfdSAndroid Build Coastguard Worker01:56:08 0 4 10.153.223.157:22 R> 69.53.245.40:46444 ESTABLISHED 41*387f9dfdSAndroid Build Coastguard Worker01:56:08 0 4 10.153.223.157:22 R> 69.53.245.40:46444 ESTABLISHED 42*387f9dfdSAndroid Build Coastguard Worker[...] 43*387f9dfdSAndroid Build Coastguard Worker 44*387f9dfdSAndroid Build Coastguard WorkerSee the "L>" in the "T>" column. These are attempts: the kernel probably 45*387f9dfdSAndroid Build Coastguard Workersent a TLP, but in some cases it might not have been ultimately sent. 46*387f9dfdSAndroid Build Coastguard Worker 47*387f9dfdSAndroid Build Coastguard WorkerTo spot heavily retransmitting flows quickly one can use the -c flag. It will 48*387f9dfdSAndroid Build Coastguard Workercount occurring retransmits per flow. 49*387f9dfdSAndroid Build Coastguard Worker 50*387f9dfdSAndroid Build Coastguard Worker# ./tcpretrans.py -c 51*387f9dfdSAndroid Build Coastguard WorkerTracing retransmits ... Hit Ctrl-C to end 52*387f9dfdSAndroid Build Coastguard Worker^C 53*387f9dfdSAndroid Build Coastguard WorkerLADDR:LPORT RADDR:RPORT RETRANSMITS 54*387f9dfdSAndroid Build Coastguard Worker192.168.10.50:60366 <-> 172.217.21.194:443 700 55*387f9dfdSAndroid Build Coastguard Worker192.168.10.50:666 <-> 172.213.11.195:443 345 56*387f9dfdSAndroid Build Coastguard Worker192.168.10.50:366 <-> 172.212.22.194:443 211 57*387f9dfdSAndroid Build Coastguard Worker[...] 58*387f9dfdSAndroid Build Coastguard Worker 59*387f9dfdSAndroid Build Coastguard WorkerThis can ease to quickly isolate congested or otherwise awry network paths 60*387f9dfdSAndroid Build Coastguard Workerresponsible for clamping tcp performance. 61*387f9dfdSAndroid Build Coastguard Worker 62*387f9dfdSAndroid Build Coastguard WorkerTCP sequence numbers can be included via -s, except in count mode. These numbers 63*387f9dfdSAndroid Build Coastguard Workerare useful for identifying specific retransmissions in large packet caputes. 64*387f9dfdSAndroid Build Coastguard WorkerNote, lossprobe -l output will display 0 for the sequence number for L type. 65*387f9dfdSAndroid Build Coastguard Worker 66*387f9dfdSAndroid Build Coastguard Worker# ./tcpretrans.py -s 67*387f9dfdSAndroid Build Coastguard WorkerTIME PID IP LADDR:LPORT T> RADDR:RPORT STATE SEQ 68*387f9dfdSAndroid Build Coastguard Worker18:03:46 0 4 192.168.10.50:41976 R> 172.217.21.194:443 SYN_SENT 2879306108 69*387f9dfdSAndroid Build Coastguard Worker18:03:49 0 4 192.168.10.50:41976 R> 172.217.21.194:443 SYN_SENT 2879306108 70*387f9dfdSAndroid Build Coastguard Worker 71*387f9dfdSAndroid Build Coastguard WorkerUSAGE message: 72*387f9dfdSAndroid Build Coastguard Worker 73*387f9dfdSAndroid Build Coastguard Worker# ./tcpretrans -h 74*387f9dfdSAndroid Build Coastguard Workerusage: tcpretrans.py [-h] [-s] [-l] [-c] [-4 | -6] 75*387f9dfdSAndroid Build Coastguard Worker 76*387f9dfdSAndroid Build Coastguard WorkerTrace TCP retransmits 77*387f9dfdSAndroid Build Coastguard Worker 78*387f9dfdSAndroid Build Coastguard Workeroptional arguments: 79*387f9dfdSAndroid Build Coastguard Worker -h, --help show this help message and exit 80*387f9dfdSAndroid Build Coastguard Worker -s, --sequence display TCP sequence numbers 81*387f9dfdSAndroid Build Coastguard Worker -l, --lossprobe include tail loss probe attempts 82*387f9dfdSAndroid Build Coastguard Worker -c, --count count occurred retransmits per flow 83*387f9dfdSAndroid Build Coastguard Worker -4, --ipv4 trace IPv4 family only 84*387f9dfdSAndroid Build Coastguard Worker -6, --ipv6 trace IPv6 family only 85*387f9dfdSAndroid Build Coastguard Worker 86*387f9dfdSAndroid Build Coastguard Workerexamples: 87*387f9dfdSAndroid Build Coastguard Worker ./tcpretrans # trace TCP retransmits 88*387f9dfdSAndroid Build Coastguard Worker ./tcpretrans -l # include TLP attempts 89*387f9dfdSAndroid Build Coastguard Worker ./tcpretrans -4 # trace IPv4 family only 90*387f9dfdSAndroid Build Coastguard Worker ./tcpretrans -6 # trace IPv6 family only 91