提取linux上的TCP往返时间(RTT)估计

时间:2016-01-20 18:25:57

标签: linux sockets tcp linux-kernel cubic

我在Ubuntu上运行apache服务器。客户端连接并下载图像。我需要提取底层TCP连接的RTT估计。有没有办法做到这一点?也许就像在调试模式下运行我的tcp堆栈,让它在某个地方记录这个信息?

请注意,我不想运行tcpdump并从记录的跟踪中提取RTT!我需要TCP堆栈的RTT估计(显然这是您可以通过TCP_INFO套接字选项获得的信息的一部分)。基本上需要像tcpprob(kprobe)之类的东西来插入一个钩子并记录每个传入数据包(或每次更改)上TCP连接的估计RTT。

更新

我找到了解决方案。 rtt,拥塞窗口等可以使用tcpprobe记录。我在下面发布了一个答案。

2 个答案:

答案 0 :(得分:3)

这可以使用tcpprobe来完成,source是一个模块,它使用 kprobe 记录TCP连接的状态以响应传入的数据包,将钩子插入tcp_recv处理路径。< / p>

假设您要在端口443上探测tcp连接,则需要执行以下操作:

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

full = 1 :登录收到的每个ack数据包

full = 0 :仅登录公寓更改(如果使用此公式,则输出可能为空)

现在 pid 是记录探针的过程。要停止,只需终止此过程:

kill $pid

output.out的格式(根据第198行的DEMO):

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

答案 1 :(得分:0)

可以使用ss命令(iproute包的一部分)来完成此操作,而无需任何其他内核模块,该命令可以提供有关打开套接字的详细信息。它不会为每个数据包都显示它,但是大多数此信息是根据许多数据包计算得出的。例如。要列出当前打开的TCP(t选项)套接字和相关的内部TCP信息(i)信息-包括拥塞控制算法,rttcwnd等:

ss -ti

以下是一些示例输出:

State       Recv-Q Send-Q        Local Address:Port        Peer Address:Port
ESTAB       0      0             192.168.56.102:ssh        192.168.56.1:46327
  cubic wscale:6,7 rto:201 rtt:0.242/0.055 ato:40 mss:1448 rcvmss:1392
advmss:1448 cwnd:10 bytes_acked:33169 bytes_received:6069 segs_out:134
segs_in:214 send 478.7Mbps lastsnd:5 lastrcv:6 lastack:5 
pacing_rate 955.4Mbps rcv_rtt:3 rcv_space:28960