HTTP2
15.03.2015Времена HTTP/1.1 уже сочтены, уже давно стало ясно что он не соответствует запросам 21-го века. Существует множество давно известных проблем данного протокола, некоторые из них:
- архитектурных проблем уровня протокола. К примеру, конвеерная передача HTTP "http-pipelining", которая все же уменьшает время отклика, но не решает всех проблем
- проблем спецификаций. Заголовки уровня приложения передаются вместе с служебными заголовками, образуя некоторую смесь. Это не фатально, и многие использует свои "префиксы", но все же это недостаток.
- типичные проблемы прикладного уровня которые не учтены в протоколе. Любой протокол прикладного уровня (в том числе http1) был создан чтобы решать "прикладные задачи". В свое время протокол с этим справлялся, но со временем системы эволюционировали и появились новые запросы. К примеру загрузка главной страницы среднего веб-сайта может привести к сотням запросов на загрузку вспомогательных ресурсов (картинок, скриптов и так далее).
- Шардинг. В свое время был эффективным методом обхода лимита в 6-8 соединений на хост (домен). Размещение статики на разных доменах, обходило этот лимит. Но появлялась другая проблема - возрастало количество dns запросов (что частично решается с помощью dns prefetch).
- Домены без кук (сookieless домены). Все еще эффективный способ уменьшить общие сетевые издержки, путем уменьшения тела протокола (исключения кук для статики).
- Спрайты - для уменьшения количества запросов (и соответственно увеличения скорости загрузки). Но и ту есть обратная сторона медали - изменение одной картинки (части спрайта), приводит к тому что ее необходимо будет загружать снова.
- Конкатенация js и css - все еще актуальный способ увеличить скорость загрузки (вместо нескольких запросов проходит один), но и тут есть минусы. При изменениях в одном из соединяемых файлов, клиенту придется загружать крупный файл снова.
Итак, итоговые цели это:
- увеличить скорость отображения страниц
- уменьшить время отклика серверной части
- уменьшить объем вспомогательных данных
Для решения этих проблем, а также добавления некоторых дополнительных возможностей, был создан протокол SPDY. На момент написания поста существуют 4 версии spdy (первые две из них уже устарели), но остальные все также активно поддерживаются как на клиентской части (браузерами) так и в серверной (nginx, apache и другими).
Крупные всемирно известные системы уже давно используют протокол SPDY. Но есть то, что мешает массовому распространению данного протокола:
- обязательное шифрование (tls etc). Не сказал бы что это плохо, даже наоборот, для конечного пользователя это хоть какая то гарантия что его данные не будет просматривать (или продавать) все кому не лень.
- spdy создан Google. Таким образом одна корпорация может контролировать самый популярный протокол и самый популярный клиент, что может быть, не очень хорошо. Тем не менее в Google публично заявили о плане отказа от spdy и миграцию на http2 в ближайшем будущем.
http2 - бинарный протокол
Скорость формирования пакета, как и его распознавания (в многих реализациях) увеличилась благодаря бинарному формата.
Данные передаются в бинарных фреймах
Все данные распределены по фреймам. Вероятно, наиболее важные из них это HEADERS и DATA для заголовков и данных соотвественно. Всего существует более дести типов фреймов (подробно можно ознакомится в документации)
Обмен в потоках
Каждый фрейм привязан к определенному потоку. Клиент и сервер обмениваются фреймами в рамках потоков. Поток может быть создан как на стороне клиента так и на стороне сервера, и таким образом обмениваются данными. Так же есть возможности по управлению потоками.
Стоимость как создания так и закрытия потока минимальная (в отличии от соединения).
Мультиплексирование потоков
Мультиплексирование означает что в рамках одного соединения смешано множество фреймов, которые собираются и разбираются по своим потокам, в порядке следования фреймов.
Приоритеты и зависимости потоков
Обязательное сжатие
Server push
Расширения возможностей http2
Что же мы имеем в итоге? На данный момент преимущества http2 и spdy очевидны, но необходима реализация на уровне веб-серверов (nginx как и apache имеет в своем арсенале только поддержку spdy) и поддержка новых возможностей на уровне приложения (подходы которые были актуальны для http/1.1 уже не актуальны для новых клиентов). Но в целом, http2 будет отличной заменой старым протоколам, которая позволит ускорить работу всемирной паутины, и сделать этот мир на каплю лучше.
Комментарии