在Linux上提取TCP往返时间(RTT)估计

10

我在Ubuntu上运行着Apache服务器。客户端连接并下载图像。我需要提取基础TCP连接的往返时延(RTT)估计值。有没有什么方法可以做到这一点?也许类似于在调试模式下运行我的TCP栈,以便将此信息记录在某个地方。

请注意,我不想运行tcpdump并从记录的跟踪中提取RTT!我需要TCP栈的RTT估计值(显然,这是使用TCP_INFO套接字选项获取的信息的一部分)。基本上需要像tcpprob(kprobe)这样的工具插入钩子,在每个传入数据包(或每个更改)上记录TCP连接的估计RTT。

更新:

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


https://dev59.com/u3HYa4cB1Zd3GeqPLW1W - indiv
谢谢!是的,我熟悉“ss”,但它并不完全符合我的需求,因为它会给我提供非常粗略的RTT采样。我需要像tcpprob(kprobe)这样的东西来插入钩子,并记录每个传入数据包(或每次更改)上TCP连接的估计RTT。 - kakhkAtion
2
嗯。好吧,Linux拥塞控制算法是可插拔模块,位于net/ipv4/目录中。每个模块都以不同的方式计算rtt(而reno根本不计算!),所以我认为您将不得不钩入特定的实现。我看到您标记了cubic,因此这是tcp_cubic.c。我不认为有一种通用方法来获取rtt,但我可能是错的... - indiv
感谢@indiv!是的,我还没有找到一种通用的方法来做到这一点,我可能需要亲自动手去做。我也正在尝试使用ss,看看它是否真正满足我的需求。我会随时向您报告的。 - kakhkAtion
哦,天啊!我简直不敢相信tcpprobe一直在为我做这件事,而我却错过了它!哈哈,我马上会发布一个答案。 - kakhkAtion
显示剩余2条评论
2个回答

4

使用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

SS文档中没有这些字段。例如,“rtt:x / y”是什么意思? - Alexander Gonchiy
1
有关字段的详细信息,请查看答案中链接到“ss”手册页的内容(某些发行版手册页似乎缺少此信息)。有关完整详情,请参阅源代码:https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/tree/misc/ss.c#n2468 - Pierz

3
使用tcpprobe模块可以实现此功能,该模块通过使用kprobe在tcp_recv处理路径中插入钩子以响应传入数据包并记录TCP连接状态。假设您想要探测端口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: 仅在condo更改时记录日志(如果使用此选项,则输出可能为空)

现在的pid是记录探测的进程。要停止,请简单地杀死此进程:

kill $pid

输出文件output.out的格式(根据源代码的第198行):
[time][src][dst][length][snd_nxt][snd_una][snd_cwnd][ssthresh][snd_wnd][srtt][rcv_wnd]

RTT以“毫秒”为单位。 - kakhkAtion
自至少5.1.x版本以来,似乎不再可用。您知道它是被删除了还是只是改名了吗? - MappaM
嗯...很遗憾我不知道,因为我已经有一段时间没有使用这个了。 - kakhkAtion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接