我在 Ubuntu 上运行了 apache 服务器。客户端连接并下载映像。我需要提取底层 TCP 连接的 RTT 估计值。有没有办法做到这一点?也许像在调试模式下运行我的 tcp 堆栈这样的事情让它在某处记录此信息?
请注意,我不想运行 tcpdump 并从记录的跟踪中提取 RTT!我需要 TCP 堆栈的 RTT 估计值(显然这是您可以通过套接字选项获得的信息的一部分TCP_INFO)。基本上需要像 tcpprob (kprobe) 这样的东西来插入一个钩子,并在每个传入数据包(或每次更改)上记录 TCP 连接的估计 RTT。
更新:
我找到了一个解决方案。 rtt,拥塞窗口等可以使用tcpprobe进行记录。我在下面发布了一个答案。
这可以在不需要任何其他内核模块的情况下使用 ss
命令(iproute
包的一部分)来完成,该命令可以提供有关开放套接字的详细信息。它不会为每个数据包显示它,但大部分信息都是通过多个数据包计算的。例如,列出当前打开的TCP(t
选项)套接字和相关的内部TCP信息(i
)信息 - 包括拥塞控制算法,rtt
,cwnd
等:
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
这可以使用 tcpprobe 来完成,tcpprobe 是一个模块,它使用 kprobe 记录 TCP 连接的状态以响应传入的数据包,将钩子插入tcp_recv处理路径中。
假设您要探测端口 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 行的源代码):
[time][src][dst][length][snd_nxt][snd_una][snd_cwnd][ssthresh][snd_wnd][srtt][rcv_wnd]