Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСети и протоколы

QUIC откатывается на TCP: как это выглядит в логах

hexdump
hexdump
Знаток
сообщений 940
с июн
15 марта, 14:02первое сообщение

Гоняю сбор через свой клиент, часть узлов отвечает по третьей версии протокола, часть внезапно валится обратно на вторую. В логе это видно как лишняя секунда на старте соединения, дальше всё едет ровно.

Хочу понять, где именно случается откат и как его поймать, не гадая по времени. Пока у меня только суммарный отклик, а что внутри него, непонятно.

rawsocket
rawsocket
Ветеран
сообщений 2290
с фев
22 августа, 17:19#2

Смотри на ALPN. Если в рукопожатии согласовался h2, третья версия даже не стартовала.

Покажи вывод curl с подробным флагом, там всё написано открытым текстом.

читаю байты, а потом уже документацию
tcpdump_fan
tcpdump_fan
Знаток
сообщений 1010
с июн
1 января, 08:36#3

Ещё проще зайти со стороны провода: проверь, уходят ли наружу пакеты по UDP на 443 порт.

проверка третьей версии
проверка третьей версии

Если ответа нет, клиент честно досиживает таймаут и уходит на TCP. Вот твоя лишняя секунда.

слушаю провод, а не догадки
hexdump
hexdump
Знаток
сообщений 940
с июн
8 июня, 11:53#4
tcpdump_fan: клиент честно досиживает таймаут

Так и вышло. UDP наружу режет наш собственный межсетевой экран, про него я и забыл. Открыли, откат пропал на трёх узлах из пяти. Два оставшихся третью версию просто не умеют.

rawsocket
rawsocket
Ветеран
сообщений 2290
с фев
15 ноября, 14:10#5

Раз тема пошла, добавлю про порядок, потому что он путает всех подряд.

Клиент почти никогда не начинает разговор сразу по третьей версии. Он идёт по TCP, получает от сервера заголовок Alt-Svc, где сказано, что тот же ресурс доступен по h3 на таком-то порту, и запоминает это на срок из поля ma. Следующее обращение к тому же имени уходит двумя дорогами: пробуется UDP и параллельно держится обычное соединение. Кто первым ответил, тот и везёт запрос.

Отсюда две вещи. На холодном старте отката ты не увидишь вовсе, потому что третьей версии там ещё и не было. И если ты сбрасываешь профиль перед каждым прогоном, кэш Alt-Svc уходит вместе с ним, каждый прогон начинается с TCP заново.

alt-svc: h3=":443"; ma=86400
читаю байты, а потом уже документацию
Женя Ковалёв
Женя Ковалёв
Новичок
сообщений 62
с авг, второй сезон
22 апреля, 17:27#6

а на винде это чем проверить? там nc нету

netmon
netmon
Знаток
сообщений 1350
с мая
1 сентября, 08:44#7

Женя, на Windows бери PowerShell и клиент UDP руками, Test-NetConnection тебе покажет только TCP.

$k = New-Object System.Net.Sockets.UdpClient
$k.Client.ReceiveTimeout = 3000
$k.Connect("example.org", 443)
$k.Send([byte[]]@(0), 1)

Тишина в ответ ещё ничего не доказывает, узел может молчать по правилам протокола. Смотри лучше сразу curl.

hexdump
hexdump
Знаток
сообщений 940
с июн
8 февраля, 11:01#8

В итоге оставил обе дороги включёнными. Где h3 поднимается, там выигрыш пара сотен миллисекунд на соединение, где нет, откат теперь мгновенный, без таймаута.

Спасибо, разобрались.