HTTP2

Времена HTTP/1.1 уже сочтены, уже давно стало ясно что он не соответствует запросам 21-го века. Существует множество давно известных проблем данного протокола, некоторые из них:

Часть этих проблем тем или иным образом решалась на уровне приложения, рассмотрим некоторые из них:
  1. Шардинг. В свое время был эффективным методом обхода лимита в 6-8 соединений на хост (домен). Размещение статики на разных доменах, обходило этот лимит. Но появлялась другая проблема - возрастало количество dns запросов (что частично решается с помощью dns prefetch).
  2. Домены без кук (сookieless домены). Все еще эффективный способ уменьшить общие сетевые издержки, путем уменьшения тела протокола (исключения кук для статики).
  3. Спрайты - для уменьшения количества запросов (и соответственно увеличения скорости загрузки). Но и ту есть обратная сторона медали - изменение одной картинки (части спрайта), приводит к тому что ее необходимо будет загружать снова.
  4. Конкатенация js и css - все еще актуальный способ увеличить скорость загрузки (вместо нескольких запросов проходит один), но и тут есть минусы. При изменениях в одном из соединяемых файлов, клиенту придется загружать крупный файл снова.

Итак, итоговые цели это:

  1. увеличить скорость отображения страниц
  2. уменьшить время отклика серверной части
  3. уменьшить объем вспомогательных данных

Для решения этих проблем, а также добавления некоторых дополнительных возможностей, был создан протокол SPDY. На момент написания поста существуют 4 версии spdy (первые две из них уже устарели), но остальные все также активно поддерживаются как на клиентской части (браузерами) так и в серверной (nginx, apache и другими).

Крупные всемирно известные системы уже давно используют протокол SPDY. Но есть то, что мешает массовому распространению данного протокола:

  1. обязательное шифрование (tls etc). Не сказал бы что это плохо, даже наоборот, для конечного пользователя это хоть какая то гарантия что его данные не будет просматривать (или продавать) все кому не лень.
  2. spdy создан Google. Таким образом одна корпорация может контролировать самый популярный протокол и самый популярный клиент, что может быть, не очень хорошо. Тем не менее в Google публично заявили о плане отказа от spdy и миграцию на http2 в ближайшем будущем.
Таким образом spdy стал витком эволюции протокола http, с учетом реальных данных были созданы как спецификации/драфты так и конкретные реализации http2. Рассмотрим кратко отличия протоколов.

http2 - бинарный протокол

Во первых, это значит что просмотреть запрос в текстовом виде или создать запрос скажем через telnet уже будет невозможно. Для отладки работы на уровне протокола нужно использовать такие инструменты как wireshark. С другой стороны это значительно уменьшает размеры служебной нагрузки (заголовков и служебных данных).
Скорость формирования пакета, как и его распознавания (в многих реализациях) увеличилась благодаря бинарному формата.

Данные передаются в бинарных фреймах

Все данные распределены по фреймам. Вероятно, наиболее важные из них это HEADERS и DATA для заголовков и данных соотвественно. Всего существует более дести типов фреймов (подробно можно ознакомится в документации)

Обмен в потоках

Каждый фрейм привязан к определенному потоку. Клиент и сервер обмениваются фреймами в рамках потоков. Поток может быть создан как на стороне клиента так и на стороне сервера, и таким образом обмениваются данными. Так же есть возможности по управлению потоками.
Стоимость как создания так и закрытия потока минимальная (в отличии от соединения).

Мультиплексирование потоков

Мультиплексирование означает что в рамках одного соединения смешано множество фреймов, которые собираются и разбираются по своим потокам, в порядке следования фреймов.

Приоритеты и зависимости потоков

Потоковые передачи могут быть зависимыми от других потоков, а так же иметь приоритет (приоритетные потоки передают-получают фреймы первыми в порядке приоритета).

Обязательное сжатие

http2 как и spdy использует сжатие HPAC фреймов (то есть заголовков и тела, на равне с другими фреймами). Это существенно уменьшает объем передаваемых данных. А благодаря тому что HPAC работает с минимальными затратами ресурсов, это еще и ускоряет обмен.

Server push

Если сервер (или код уровня приложения) предполагает что клиент после запроса "ресурса А" потребует "ресурс Б", то он может сразу отправить "ресурс Б" прямо в кеш клиенту без запроса со стороны клиента.

Расширения возможностей http2

Спецификацией протокола сказано, что получатель должен считывать и игнорировать все неизвестные ему типы фреймов. Данная возможность позволяет согласовать новый тип фреймов между участниками обмена.

Что же мы имеем в итоге? На данный момент преимущества http2 и spdy очевидны, но необходима реализация на уровне веб-серверов (nginx как и apache имеет в своем арсенале только поддержку spdy) и поддержка новых возможностей на уровне приложения (подходы которые были актуальны для http/1.1 уже не актуальны для новых клиентов). Но в целом, http2 будет отличной заменой старым протоколам, которая позволит ускорить работу всемирной паутины, и сделать этот мир на каплю лучше.

Комментарии