Извлечь оценки времени прохождения TCP (RTT) на Linux

У меня есть сервер Apache, работающий на Ubuntu. Клиент подключается и загружает изображение. Мне нужно извлечь оценки RTT для основного соединения TCP. Есть ли способ сделать это? Может быть, что-то вроде запуска моего tcp-стека в режиме отладки, чтобы он где-нибудь записывал эту информацию?

Обратите внимание, что я не хочу запускать tcpdump и извлекать RTT из записанной трассы! Мне нужны оценки RTT стека TCP (очевидно, это часть информации, которую вы можете получить с опцией сокета TCP_INFO). В основном нужно что-то вроде tcpprob (kprobe), чтобы вставить ловушку и записать приблизительный RTT TCP-соединения для каждого входящего пакета (или для каждого изменения).

ОБНОВЛЕНИЕ:

Я нашел решение. RTT, окно перегрузки и многое другое может быть зарегистрировано с помощью tcpprobe. Я разместил ответ ниже.

1 ответ

Решение

Это можно сделать с помощью tcpprobe, который является модулем, который вставляет ловушку в путь обработки tcp_recv, используя kprobe, записывает состояние TCP-соединения в ответ на входящие пакеты.

Допустим, вы хотите проверить соединение TCP по порту 443, вам нужно сделать следующее:

sudo modprobe tcp_probe port=443 full=1
sudo chmod 444 /proc/net/tcpprobe
cat /proc/net/tcpprobe > /tmp/output.out &
pid=$!

full = 1: войти в каждый полученный пакет подтверждения

full = 0: входить только изменения кондо (если вы используете это, ваш вывод может быть пустым)

Теперь pid - это процесс, который регистрирует зонд. Чтобы остановить, просто убейте этот процесс:

kill $pid

Формат output.out (согласно источнику в строке 198):

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

Это можно сделать без дополнительных модулей ядра, используя ss команда (часть iproute package), который может предоставить подробную информацию об открытых сокетах. Он не будет отображать это для каждого пакета, но большая часть этой информации рассчитывается по количеству пакетов. Например, чтобы вывести список открытых в данный момент TCP (t option) сокеты и связанная внутренняя информация 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
Другие вопросы по тегам