HTTP/3 - новая версия протокола
Что такое HTTP?HTTP (Hypertext Transfer Protocol) – универсальный протокол передачи гипертекста. Абсолютно все текстовые данные на всех сайтах в сети передаются через HTTP.
Более тридцати лет назад было выпущено версию HTTP/0.9. В ней использовался только GET-метод и не было служебных заголовков. В мае 1996 года появилась HTTP/1.0. В этой версии присутствовали новые методы, заголовки и кэширование.
HTTP/1.1 был представлен уже через три года в 1999. Протокол дополнили keep-alive и сделали главное и существенное изменение, которое повлияло на все развитие сети — заголовок Host. Благодаря этому сейчас мы можем позволить организовывать виртуальный хостинг, и размещать несколько доменов на одном IP.
В феврале 2015 года вышел новый стандарт протокола — HTTP/2, который был основан на протоколе прикладного уровня для передачи веб-контента SPDY. Протокол HTTP/2 стал бинарным, появилось сжатие заголовков (HPACK), мультиплексирование и приоритезация ресурсов, а также опция отмены загрузки и Server Push. Благодаря функции мультиплексирования появилась возможность отправлять несколько файлов за раз.
С момента выхода HTTP/2 все его пользователи ожидали существенных перемен в скорости работы сайтов, но на практике выяснилось, что большинство новшеств протокола были сделаны не совсем корректно. Управление потоками и приоритетами, и технология Server Push для отправки клиенту ресурсов на деле оказались не такими эффективными и продуктивными, как это хотели разработчики.
Какая разница между HTTP/3 и предшествующими протоколами HTTP/1.1 и HTTP/2?Разработка протокола HTTP/2 велась с целью максимального ускорения загрузки веб-ресурсов, прежде всего связанных с визуальным планом сайта. Протокол HTTP/3 существенно продвинулся дальше в этом направлении – он устанавливает соединение между сервером и клиентом еще быстрее за счет протокола QUIC. Суть последнего состоит в совмещенных в одно транспортного и криптографического «рукопожатий».
В итоге мы экономим цикл приема-передачи за счет чего быстрее устанавливается соединение и скорость загрузки элементов сайта повышается.
Различие HTTP/3 и предыдущих HTTP/1.1 и HTTP/2-версий?Протоколы HTTP/1.1 и HTTP/2 используют TCP-соединение, HTTP/3 же, в свою очередь, работает с помощью протокола QUIC, использующего UDP- соединение.
Какое же именно отличие между ними?TCP требует подтверждения доставки, а именно ответа от клиента, которому доставляется пакет данных. С этой целью нужно заранее установить соединение.
Для работы UDP предварительное соединение не нужно и пакеты с данными доставляются в разы быстрее.
За последнее время, TCP протокол практически не подвергался изменению. Мы имеем значительный прирост скорости передачи данных на физическом уровне, однако стабильность соединения это время не прибавилась. В поисках альтернативы разработчики остановили свое внимание на UDP. Для того, чтобы гарантировать и оптимизировать доставку пакетов, в TCP используется масса параметров, в то время как в UDP задействуется только порты получения и назначения, длина данных и контрольная сумма. Так же UDP не требует “рукопожатие” для установки соединения и в нем отсутствует эффект head-of-line, о котором речь пойдет ниже. То есть это более легкий и быстрый протокол в сравнении с TCP.
МультиплексированиеПри использовании HTTP/1.1 для каждого элемента сайта требуется отдельное соединение. Метод мультиплексирования в HTTP/2 позволяет загружать все элементы сайта с помощью всего одного соединения TCP между браузером и сервером.
HTTP/3 для еще большей скорости загрузки сайта также использует метод мультиплексирования используя протокол UDP. Он отправляет несколько потоков данных одновременно для компенсации потоков, которые были потеряны по пути к клиенту.
ЗаголовкиВ HTTP/2, по сравнению с HTTP/1.1, заголовки элементов страницы отправляются сжатыми. Это нужно для того, чтобы сетевой канал вмещал вспомогательную информацию при передаче.
В HTTP/3 для еще большей оптимизации, QUIC использует упрощенные заголовки и специализированные небольшие пакеты, чтобы передавать дополнительную информацию.
Повышенная безопасность для пользователейВ HTTP/3 отказались от определения открытого текста и встраивают протокол защиты TLS прямо в QUIC и благодаря этому данные всегда насквозь зашифрованы. Перехват данных в данном случае затруднен и практически не остается никаких шансов для этого.
Встроенное шифрование еще и ускоряет работу самого HTTP/3. В обычном HTTPS трехстороннее рукопожатие TCP должно завершиться на транспортном уровне, и произойти до момента, пока между клиентом и сервером отправятся реальные данные. QUIC же объединяет эти два рукопожатия таким образом, что они происходят одновременно. Клиент и сервер подтверждают, что соединение открыто, и одновременно генерируют ключи шифрования TLS.
ПриоритетностьЗначительный прирост скорости загрузки сайта для пользователей достигается за счет приоритетности загрузки контента. Отдельный поток существует со своим приоритетом, поэтому, в случае с длинной страницей, сначала будет загружаться верхний ее фрагмент.
Потеря пакетовОдна из современных проблем — потеря пакетов Packet Loss. Беспроводные технологии 3G, 4G, LTE — чаще используются на улице, где есть переотражения сигнала, что приводит к регулярной потере пакетов. Кроме того, нет никаких гарантий, что пакеты, посланные в определенном порядке, так и придут — они могут меняться местами на этапе получения.
Еще одна проблема передачи данных в беспроводных сетях — случайная задержка между пакетами. Из-за этих задержек страдает качество связи, и, возможна ситуация, когда клиент доподлинно не знает, получен ли пакет и из-за чего данные запрашиваются заново.
Все это порождает такое неприятное явления как блокировка начала очереди — head-of-line.
Например, мы посылаем в TCP-канал какие-то данные, и, если один пакет потерялся, на выходе мы ничего не получаем. В этом случае TCP либо перезапрашивает пакет, либо проходит какое-то время и данные посылаются снова. Однако, до тех пор, пока данные не будут повторно получены, мы не можем получить доступ к файлам, которые уже находятся в буфере на нашем компьютере.
Проблема head-of-line решается в QUIC следующим образом. В отличие от протокола TCP, где передача файлов идет одним потоком, в QUIC применяются отдельные потоки. Потеря отдельного пакета в TCP приводит к тому, что весь поток оказывается бесполезным и отбрасывается. В QUIC же, если какой-то отдельный пакет пропадет, на выходе мы все равно получим некоторое количество успешных потоков, с которыми можно работать (и один неполный поток, который можно запросить повторно отдельно).
Эффективность HTTP/3HTTP/3 заметно быстрее и позволяет использовать всю ширину канала связи. В обновленном протоколе меньше служебной информации и, соответственно, соединение работает быстрее. Это хорошо заметно при передаче большого количества мелких файлов. Как пример: Twitch, Youtube. Соединение более стабильное и не обрывается. Загрузка файлов через Wifi и мобильную сеть будет продолжаться при переподключении.
Недостатки тоже есть и заключаются в том, что вся реализация протокола выполнена не на уровне ядра, «железок» и сети, а на уровне User Space. Подвержен уязвимостям UDP-протокола к DDOS-атакам и различных флуд-атак.
Все эти перечисленные методы позволяют существенно экономить сетевые и серверные ресурсы, а также исключать задержки, необходимые при установке соединений при работе с сайтами.