9

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

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

更新

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

4

2 回答 2

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]
于 2016-01-20T23:42:22.433 回答
2

这可以在不需要任何其他内核模块的情况下使用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
于 2019-09-09T15:58:17.683 回答