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

Extract TCP round trip time (RTT) estimations on linux

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

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

更新:

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

这可以使用 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: log on every ack packet received

full=0:仅登录公寓变更(如果您使用它,您的输出可能为空)

现在 pid 是正在记录探测的进程。要停止,只需终止此进程:

kill $pid

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

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

这可以在不需要任何额外内核模块的情况下使用 ss command (part of the 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