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

Что значит:

Как работает у клиента

  1. Клиент подключается к https://example.com по HTTPS обычным путём (TCP + TLS 1.3 + HTTP/2).
  2. Первый ответ приходит с заголовком alt-svc: h3=":443".
  3. Клиент запоминает: «этот origin поддерживает HTTP/3».
  4. Следующие подключения — параллельно пробует и TCP+H2, и UDP+QUIC. Что установится быстрее (обычно QUIC) — используется.
  5. Если 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

Примеры реальных 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';

Тонкости

См. также