HTTP2: как указать его поддержку? Существует ли альтернативный протокол для HTTP2?

Поэтому я только что обновился до nginx 1.9.5, который поддерживает HTTP2.

Я заменил все listen spdy на listen http2, удалил директиву spdy_headers_comp, а также удалил add_header Alternate-Protocol 443:npn-spdy/3;

Затем я открыл свой сайт в Firefox, открыл сетевой монитор и вуаля: Version: HTTP/2.0

Но как Firefox узнает, что мой сайт поддерживает HTTP2? Всегда ли он сначала пытается подключиться через HTTP2, прежде чем пытаться использовать HTTP1.1?


person Florian Schneider    schedule 22.09.2015    source источник


Ответы (1)


Сайты HTTP/2 развернуты поверх TLS.

Браузеры используют расширение TLS под названием ALPN, чтобы сообщить серверу, какие протоколы они могут использовать. Браузеры всегда отправляют это расширение TLS и всегда включают как HTTP/2, так и HTTP/1.1 (а также могут включать старый протокол SPDY).

Сервер получает список протоколов, по которым могут разговаривать браузеры, и если сервер поддерживает HTTP/2 (и если соблюдается ряд других условий — в частности, относительно версии протокола TLS и набора шифров), сервер принимает решение говорить по HTTP /2 с помощью браузера и отправляет выбранный протокол обратно в браузер, снова используя расширение ALPN.

Если сервер не поддерживает HTTP/2, он отправит браузеру сообщение о том, что он может говорить только по HTTP/1.1 через расширение ALPN.

Если сервер не поддерживает расширение ALPN, он не отправит его в браузер, и браузер по умолчанию будет говорить с этим сервером по протоколу HTTP/1.1.

person sbordet    schedule 22.09.2015
comment
Хорошо, но почему Google рекомендует добавлять заголовок Alternate-Protocol: 443:npn-spdy/3 при использовании SPDY? Почему бы не сделать это так же, как это делает HTTP2 (ALPN)? - person Florian Schneider; 22.09.2015
comment
Alternate-Protocol используется серверами, чтобы сообщить клиентам, где они могут подключиться напрямую с данным протоколом. В вашем примере просто говорится, что серверы Google поддерживают SPDY/3 (предшественник HTTP/2) через NPN (предшественник ALPN). Например, сервер HTTP/1.1 может ответить Alternate-Protocol: 8443:h2, чтобы указать клиенту подключиться к другому порту (8443) без использования ALPN, зная, что за этим портом находится сервер HTTP/2. Без этого заголовка клиент не знал бы, по какому протоколу говорить через порт 8443. Для сервера с поддержкой ALPN Alternate-Protocol просто информативен. - person sbordet; 22.09.2015