Alt-Svc
Alt-Svc (Alternative Services, RFC 7838) — заголовок ответа, которым сервер сообщает клиенту: «этот же сервис доступен также по другому протоколу / порту / хосту». Главное применение — переключение с HTTP/2 на HTTP/3 (QUIC).
Пример
HTTP/2 200 OK
alt-svc: h3=":443"; ma=86400, h3-29=":443"; ma=86400
Что значит:
- h3 — HTTP/3 (QUIC), финальная версия.
- ":443" — тот же хост, порт 443 (можно указать другой хост:
h3="alt.example.com:8443"). - ma=86400 — max-age, сколько секунд помнить эту альтернативу.
- h3-29 — draft-29, старая версия для совместимости (уже редкость).
Как работает у клиента
- Клиент подключается к
https://example.comпо HTTPS обычным путём (TCP + TLS 1.3 + HTTP/2). - Первый ответ приходит с заголовком
alt-svc: h3=":443". - Клиент запоминает: «этот origin поддерживает HTTP/3».
- Следующие подключения — параллельно пробует и TCP+H2, и UDP+QUIC. Что установится быстрее (обычно QUIC) — используется.
- Если QUIC не работает (UDP заблокирован, файрвол) — падает обратно на H2.
Почему нельзя сразу HTTP/3
Клиент не знает поддерживает ли сервер QUIC, пока не спросит. Спросить можно только через DNS или через первый HTTP-ответ. Так что первое подключение всегда через TCP, а дальше уже переключение.
Альтернатива через DNS — HTTPS-запись
Новый DNS-тип HTTPS (тип 65, RFC 9460) позволяет клиенту узнать про HTTP/3 сразу из DNS-запроса, без первого TCP-подключения:
example.com. IN HTTPS 1 . alpn="h3,h2" port=443 ipv4hint=1.2.3.4
Chrome/Firefox/Safari используют HTTPS-запись параллельно с A/AAAA. Ноль лишних RTT для дискаверинга HTTP/3.
Синтаксис Alt-Svc
- Protocol ID:
h3,h2,h3-Q046, любой ALPN-идентификатор. - Authority:
"host:port". Host пустой — тот же хост. Порт обязателен. - ma=N — max-age.
- persist=1 — сохранять между сессиями браузера.
- clear — специальное значение, стирает предыдущий cache:
Alt-Svc: clear.
Примеры реальных Alt-Svc
# Google
alt-svc: h3=":443"; ma=2592000, h3-29=":443"; ma=2592000
# Cloudflare
alt-svc: h3=":443"; ma=86400
# Facebook
alt-svc: h3-fb-05=":443"; ma=3600 (свой fork QUIC)
# NGINX по умолчанию не шлёт, нужно добавить:
add_header Alt-Svc 'h3=":443"; ma=86400';
Тонкости
- Race handshake. Chrome по умолчанию делает «happy eyeballs for h3»: параллельно TCP+H2 и UDP+QUIC. Что быстрее ответит — то и используется.
- Origin match. Alt-Svc обязан указывать на тот же origin с точки зрения безопасности — cert должен покрывать оба хоста, если разные.
- Reload сбрасывает. При жёстком reload Chrome может проигнорировать Alt-Svc и попробовать h2 сначала.