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



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

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

更新:

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

这可以在不需要任何其他内核模块的情况下使用 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

这可以使用 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]

相关内容

  • 没有找到相关文章

最新更新