Тяжелый — легкий корень, а тихий — порывистый король. - Лао-цзы
Серия Http (3) Http/Tcp трехстороннее рукопожатие и четырехсторонняя волна
Введение
Мультиплексирование заменяет исходную последовательность и механизм блокировки, и все запросы выполняются одновременно через TCP-соединение. В то же время это также решает проблему ограничения браузером количества запросов под одним и тем же доменным именем.
В HTTP/2 с двоичным кадрированием HTTP/2 больше не полагается на ссылки TCP для достижения многопотокового параллелизма.
- Вся связь под одним и тем же доменным именем выполняется в одном соединении, одно и то же доменное имя должно занимать только одно TCP-соединение и использовать одно соединение для параллельной отправки нескольких запросов и ответов..
- Одно соединение может передавать любое количество двунаправленных потоков данных, а запросы и ответы могут чередоваться параллельно в одном соединении, не мешая друг другу..
- Поток данных отправляется в виде сообщения, и сообщение состоит из одного или нескольких кадров.Множественные кадры могут быть отправлены не по порядку, поскольку их можно собрать заново в соответствии с идентификатором потока в заголовке кадра. Каждый запрос может иметь 31-битное значение приоритета, 0 означает наивысший приоритет, чем больше значение, тем ниже приоритет..
кадр и поток
В HTTP/2 есть два очень важных понятия: кадр и поток.
Рамка
В HTTP/2Наименьшая единица передачи данных, поэтому фрейм должен не только подразделять и выражать каждую часть в HTTP/1.x, но также оптимизировать места, где HTTP/1.x выражен не очень хорошо, а также увеличивает способ, которым HTTP/1.x не может выразить.
Каждый фрейм содержит несколько полей, в том числедлина, тип, флаги, идентификатор потока, полезная нагрузка кадраи т. д., где тип представляет собой тип фрейма, а в стандарте HTTP/2 определено 10 различных типов, включая фрейм HEADERS и фрейм DATA, упомянутые выше. Более того:PRIORITY
(установить приоритет потока)RST_STREAM
(завершить поток)SETTINGS
(установите параметры для этого подключения)PUSH_PROMISE
(серверный толчок)PING
(измерить RTT)GOAWAY
(Прекратить соединение)WINDOW_UPDATE
(управление потоком)CONTINUATION
(Продолжить передачу данных заголовка)
В HTTP 2.0 он делит две части дейтаграммы на кадр заголовка и кадр данных. То есть кадр заголовка и кадр тела данных.
поток
Поток: виртуальный канал, существующий в соединении. Потоки могут передавать двунаправленные сообщения, и каждый поток имеет уникальный целочисленный идентификатор. Пакеты данных в длинном соединении HTTP/2 не отправляются в порядке запрос-ответ, и полный запрос или ответ (называемый потоком данных, каждый поток данных имеет уникальный номер) может быть разделен на непоследовательные отправки. Он имеет следующие характеристики:
- Двунаправленность: в одном и том же потоке данные могут быть отправлены и получены одновременно..
- Упорядоченный: данные, передаваемые в потоке, представляют собой двоичный кадр. Кадры отправляются и принимаются в потоке по порядку..
- Параллелизм: все двоичные кадры в потоке передаются параллельно, нет необходимости ждать по порядку..
- Создание потока: потоки могут создаваться, использоваться или совместно использоваться клиентами или серверами в одностороннем порядке..
- Закрытие потоков: потоки также могут быть закрыты любой стороной..
- Кадр HEADERS предшествует кадру DATA.
- Идентификаторы потоков — все нечетные числа, указывающие на то, что они инициированы клиентом, что предусмотрено стандартом, тогда как инициированные сервером — четные числа..
путь развития
С Http/0.9 на Http/2 для отправки нескольких запросов, с Http/0.9 на Http/2Несколько соединений Tcp => keep-alive => конвейеризация => мультиплексированиеПостоянно уменьшайте потери производительности, вызванные множественным созданием Tcp и т. д.
Несколько соединений TCP
не в ближайшее времяkeep-alive
Можно создать только несколькоTcp
Подключиться, чтобы сделать несколько запросов. Эффект нескольких http-запросов показан на следующем рисунке:
После завершения запроса текущее Tcp-соединение будет закрыто, а следующему запросу придется повторно установить Tcp-соединение для завершения передачи данных, а затем закрыть его, что приведет к значительной потере производительности.
Keep-Alive
Keep-Alive
Решается основная проблема: в течение определенного периода времени то же самое имя доменных имен запрашивает данные несколько раз, только один запрос HTTP, другие запросы могут быть повторно использовать каждый из установленного канала подключения для достижения проблемы повышения эффективности запроса. Упомянутое здесь времяможно настроитьда, независимо от того, что вы используетеApache
ещеnginx
.
В прошлом браузер оценивал, были ли получены данные ответа, по тому, закрыто ли соединение. После использования постоянного соединения это невозможно сделать, что требует от сервера возврата заголовка ответа постоянного соединения.content-length
логотипbody的
Длина, чтобы браузер мог судить об ограничении. иногда,content-length
Метод не очень точный, вы можете использоватьTransfer-Encoding: chunked
Заголовок отправляет строку данных, и, наконец, длина равна 0.chunked
Конец логотипа.
Эффект нескольких http-запросов показан на следующем рисунке:
Вверху: установите Connection:Keep-Alive, чтобы соединение не отключалось в течение определенного периода времени.
Keep-Alive
Есть еще следующие проблемы:
- Последовательная передача файлов.
- Блокировка (6~8), вызванная лимитом параллельных запросов в одном домене
Конвейерная обработка
Конвейер HTTP может преодолевать заблокированные блоки ограничений параллельных запросов, он построенпостоянное соединениеВыше все запросы отправляются на сервер вместе, но сервер должен следоватьотвечайте один за другим, вместо ожидания ответа перед отправкой следующего запроса, что экономит много времени на запросы к серверу. Однако конвейерная обработка HTTPещеЕсть проблема с блокировкой, если последний ответ задерживается,следующий ответбудет заблокирован.
Вверху: Конвейерная обработка HTTP: Установление нескольких соединений
мультиплексирование
Мультиплексирование заменяет исходную последовательность и механизм блокировки. Все, что запрошено, делается одновременно по одному TCP-соединению. Поскольку все передачи основаны на основном тексте перед мультиплексированием, а мультиплексирование основано на передаче кадров двоичных данных, сообщений и потоков, может быть достигнута неупорядоченная передача. Мультиплексирование основано на потоках для всех запросов под одним и тем же доменным именем, поэтому параллельная блокировка в одном домене отсутствует. Множественные запросы выглядят следующим образом:
Вверху: мультиплексирование
Суммировать
В HTTP/2 есть две очень важные концепции: кадр и поток..
Кадр представляет собой наименьшую единицу данных, и каждый кадр определяет, к какому потоку он принадлежит.Поток — это поток данных, состоящий из нескольких кадров..
HTTP2 использует передачу кадра двоичных данных, заменяя текстовый формат HTTP1.x, а синтаксический анализ двоичного формата более эффективен..
Мультиплексирование заменяет HTTP1.xПоследовательность и механизмы блокировки, все запросы на одно и то же доменное имя проходят черезПараллельно с тем же TCP-соединениемЗаканчивать.Несколько запросов могут быть отправлены в одном и том же TCP, и одноранговый узел может узнать, какому запросу принадлежит через идентификатор в кадре. Благодаря этой технологии можно избежать проблемы блокировки очереди в старой версии HTTP и значительно повысить производительность передачи..