Браузеры, поддерживающие SPDY или HTTP/2, используют расширение TLS (более старый NPN или новый ALPN) для согласования протокола, который они говорят по TLS.
Клиент отправляет список протоколов, которые он способен говорить в порядке предпочтения (например, h2,spdy/3.1,http/1.1
), а сервер выбирает один протокол среди тех, кто в этом списке, который также поддерживает (и которые соответствуют ограничениям безопасности).
Например, если у вас есть старый браузер, который не поддерживает h2
, он будет посылать spdy/3.1,http/1.1
, и сервер не будет забрать h2
(даже если он его поддерживает). Если сервер не поддерживает SPDY, единственная опция - http/1.1
, и это то, что составляет «изящную деградацию» HTTP/1.1.
Никогда не будет возможности, чтобы клиент попросил говорить SPDY (а не HTTP/2), сервер отвечает HTTP/2, если на сервере не возникли грубые ошибки реализации.
SPDY постепенно прекращается в пользу протокола HTTP/2. Например, последние версии Chrome don't support SPDY anymore.
Невозможно усложнить ситуацию, когда вы делаете запросы на разные домены, а серверы говорят по разным протоколам: это прозрачно обрабатывается браузерами.
Если ваш сервер может говорить SPDY и HTTP/1.1, а CDN может говорить по протоколу HTTP/2 и HTTP/1.1, вам необходимо использовать браузер, который поддерживает все 3 протокола, чтобы использовать преимущества SPDY и HTTP/2. Браузер может согласовывать SPDY с вашим сервером и согласовывать HTTP/2 с CDN и страницу, состоящую из ресурсов обоих источников.
Однако браузеры скоро упадут (или уже сброшены) SPDY, поэтому с помощью последних браузеров вы можете завершить HTTP/1.1 с вашим сервером и HTTP/2 с CDN, тем самым потеряв преимущества SPDY | HTTP/2 для ресурсов на вашем сервере.