Прежде всего, давайте представим протокол передачи HTTP2.0. Протокол передачи HTTP2.0 значительно улучшает производительность HTTP1.x благодаря двоичной передаче, мультиплексированию, сжатию заголовков, отправке на сервер и другим функциям. Однако из-за передачи HTTP2.0 протокол реализован на основе протокола TCP, а характеристики самого TCP приводят к определенным узким местам и дефектам.
① Блокировка заголовка строки: несколько запросов протокола передачи HTTP2.0 выполняются в одном TCP-соединении. Если пакеты потеряны во время передачи TCP, весь TCP должен ожидать повторной передачи, что приведет к блокировке всех запросов в этом TCP-соединении.
Как видно из рисунка выше, отправитель отправил всего четыре пакета, из которых пакет 3 был потерян на сетевом уровне. Несмотря на то, что пакет 4 был получен ядром получателя, поскольку данные в ядре не были непрерывными, приложение уровня получателя не может быть прочитано, и прикладной уровень может прочитать данные из ядра только после повторной передачи пакета 3.
②Задержка рукопожатия TCP и TLS:
Протокол TCP должен установить TCP-соединение через трехстороннее рукопожатие, чтобы обеспечить надежность связи (1,5 RTT). Протокол отправляет запросы и получает ответы (1 RTT) по TCP и TLS.
Это означает, что если мы хотим получить доступ к серверу в Соединенных Штатах, когда RTT составляет около 250 мс, то время, затрачиваемое на HTTPS-запрос в это время, составляет около 1 с, что является относительно высоким показателем.
③Миграция подключения требует повторного подключения:
TCP-соединение определяется IP-адресом источника, портом источника, IP-адресом назначения и портом назначения. Это означает, что при изменении порта или IP-адреса соединения TCP и TLS необходимо переподключить. Это не подходит для сценариев, в которых устройства переключаются между сетями.
Вышеупомянутые три проблемы на самом деле являются неотъемлемыми проблемами протокола TCP. Независимо от того, как спроектирован прикладной уровень HTTP/2, эти дефекты нельзя изменить. Для решения фундаментальных проблем необходимо заменить протокол транспортного уровня TCP на UDP, а HTTP 3.0 Вот что он делает!
Мы знаем, что UDP — это простой и ненадежный транспортный протокол. Конечно, HTTP 3.0 не только заменяет транспортный протокол от TCP к UDP, но также реализует протокол под названием QUIC на прикладном уровне на основе UDP. Этот протокол имеет те же функции управления соединениями и контроля перегрузки, что и TCP, и может преобразовать UDP в «надежный».
① Нет блокировки в начале очереди:
Транспортным протоколом, используемым QUIC, является UDP, который не заботится о порядке пакетов или потере пакетов, но QUIC обеспечит надежность пакетов, каждый пакет будет иметь уникальный идентификатор при потере пакета потока. Другие пакеты этого потока, даже если они дойдут до HTTP, не будут прочитаны до тех пор, пока QUIC повторно не передаст потерянные данные.
В отличие от HTTP/2, это не влияет на другие потоки.
②Соединение устанавливается быстрее:
QUIC внутри включает TLS_V1.3, который переносит информацию в TLS во фрейме данных. А QUIC не требует рукопожатия TCP+TLS, как HTTP/2. Процесс рукопожатия требует только 1RTT. Целью рукопожатия является подтверждение идентификаторов соединения обеих сторон. Таким образом, QUIC может выполнить установку соединения и ключ шифрования одновременно только с одним RTT. Даже при втором подключении пакет данных приложения может быть отправлен вместе с информацией о рукопожатии QUIC для достижения эффекта 0-RTT.
③Поддержка переноса соединения:
Протокол QUIC не использует IP-адрес и порт для определения соединения, а использует идентификатор соединения для обозначения обоих концов соединения. Даже если IP-адрес изменится после изменения сети устройства, пока сохраняется контекстная информация (например, идентификатор соединения, информация TLS), исходное соединение можно беспрепятственно использовать повторно.
HTTP 3.0 использует QUIC в качестве базового протокола поддержки, который сочетает в себе скорость и производительность UDP с безопасностью и надежностью TCP, устраняет некоторые недостатки, появившиеся в HTTP 2.0, и оптимизирует передачу данных через Интернет. Я верю, что эра HTTP 3.0 наступит в будущем!