Рубрики
Uncategorized

Основные принципы [Бизнес-обучения] 2019-05-09 http 1.1-2.0

Автор оригинала: David Wong.

Виноград Все видео: https://segmentfault.com/a/11…

Определение HTTP

HTTP is a stateless request/response protocol, which is based on client/server (C/S) architecture model and exchanges information through a reliable link.

Структура HTTP

Протокол Http 1.x является наиболее широко используемым протоколом в настоящее время. Заголовок и тело нам не незнакомы. Так что же здесь поразительного? Начальная строка-это то, что мы называем request_line или status_line. ПОЛУЧИТЕ/HTTP/1.1 или HTTP/1.1 200 полей OK. Прежде чем описывать различные способы работы http, давайте ознакомимся с моделью TCP/IP:

Разработка http:

http1.0

Http1.0: http1.0 по умолчанию не поддерживается. При запросе данных процесс обработки ниже уровня приложения перейдет на уровень приложения. Здесь мы говорим только о транспортном уровне и прикладном уровне. В http1.0 каждый запрос устанавливает TCP-соединение (три рукопожатия), а затем выполняет HTTP-запрос, поэтому каждый раз. Для взаимодействия с сервером требуется открыть новое соединение! Ссылки на запросы для каждой из наших ссылок показаны на следующем рисунке:

Представьте, сколько ресурсов было бы израсходовано, если бы каждый запрос проходил такой длительный процесс.

http1.1

Основываясь на этом вопросе, наш HTTP открыл версию 1.1 http. Какие изменения были внесены в версию 1.1 по сравнению с версией 1.0?

  • HTTP добавляет поле хоста
  • В HTTP 1.1 вводится фрагментированное кодирование передачи, выполняется запрос диапазона, реализуется продолжение точки останова (фактически, кодирование передачи блоков используется заголовком HTTP для передачи тела сущности в блоках)
  • Теория конвейерной обработки HTTP 1.1 позволяет клиентам отправлять несколько HTTP-запросов одновременно, вместо того, чтобы ждать ответа.

    • Примечание: Эта конвейерная обработка ограничена теоретическими сценариями, и большинство настольных браузеров по-прежнему предпочитают отключать конвейерную обработку HTTP по умолчанию!
    • Таким образом, приложения, использующие протокол HTTP 1.1, могут иметь несколько TCP-соединений!

Http1.1 основываясь на вышеуказанных ресурсоемких проблемах, чтобы дать фундаментальное лечение, длинные ссылки по умолчанию, что это значит? Вместо того, чтобы устанавливать HTTP-соединение каждый раз при выполнении HTTP-запроса, для обработки нескольких запросов устанавливается только одно TCP-соединение. Конечно, каждый запрос здесь последовательный, то есть нет необходимости устанавливать TCP-соединение или очередь, и это может привести к блокировке заголовка (например, отправка 100 запросов, первый из которых заблокирован). Это приводит к 99 вопросам, которые нельзя задавать). Режим работы по умолчанию для HTTP1.1 выглядит следующим образом:

Итак, давайте представим себе эту модель, хорошо? В чем недостаток? Можем ли мы его оптимизировать? Исходя из этого, мы исключили две проблемы: 1. Необходима очередь; 2. Это может привести к блокировке линии. Для первой проблемы HTTP 1.1 предоставил решение, pipline, в то время как вторая проблема только начала иметь переходное решение, то есть протокол spdy (протокол, запущенный Google для улучшения http, который включает мультиплексирование потоков данных, приоритет запросов и сжатие заголовков HTTP, которые можно интересно изучить). А затем перейдем к http 2.0. Сначала давайте поговорим о том, что такое конвейер. Конвейер-это технология, которая реализует несколько HTTP-запросов, но может выполнять запись в один и тот же сокет, не дожидаясь ответа. Только спецификация HTTP 1.1 поддерживает конвейерную обработку HTTP, но 1.0 этого не делает. Что это значит? Давайте посмотрим, что на рисунке выше показана последовательная обработка TCP-соединения. Когда конвейер включен, он будет выглядеть следующим образом:

Мы видим, что отправка HTTP-запросов больше не сводится к отправке сначала, а затем к ожиданию ответа для отправки следующего запроса, поэтому мы видим, что все запросы запускаются единым способом, но проблема в том, что конвейерная обработка HTTP фактически отправляет несколько HTTP-запросов один за другим в TCP-соединении, что не требуется в процессе отправки. Подождите, пока сервер ответит на предыдущий запрос; однако клиенту все равно необходимо получить ответ в том порядке, в котором отправляется запрос! Это приводит к тому, что, хотя он решает проблему очереди, он решает только проблему односторонней очереди и, наконец, принимает данные в порядке запросов. Почему? Потому что они не знают, что первое, а что второе. Также возникнет проблема закупорки головки провода. Подводя итог, можно сказать, что в http 1.0 мы находимся на конвейере, выполняя задачи одну за другой. В http 1.1 возможности наших работников были улучшены, и одновременно можно отправлять несколько заявок на работу.

http2.0

Далее следует наш HTTP 2.0, чтобы посмотреть, как он решает предыдущую проблему. Для решения проблемы блокировки заголовка строки в http 2.0 используется структура потока, и проблему блокировки заголовка строки можно решить, присвоив каждому потоку метку StreamID. Итак, где же http 2 является священным? Прежде всего, говоря о http 2, мы должны упомянуть https. http 2-это протокол, основанный на https. Для https я нашел статью получше. Wireshark захватывает пакет и понимает процесс запроса HTTPS. В начале статьи мы сравним структуру http1 и http2. Это кажется совершенно другим, но на самом деле это не так. http 2 использует фрейм в качестве наименьшей единицы измерения. Глядя на рисунок ниже, мы видим, что http 2-это всего лишь инкапсуляция уровня. На самом деле суть http 2-это заголовки и тело, но http 2 имеет более продвинутые функции. Отобразится модель.

http1.x против http2.0

Что касается того, что хорошо в http2, мы должны начать с основы http1, потому что сравнения вредны.

  • Количество подключений http 1 ограничено. Для одного и того же доменного имени браузеры могут создавать от 6 до 8 TCP-соединений одновременно (разные браузеры разные). Чтобы решить проблему ограничения количества, появилась технология фрагментации доменных имен. По сути, это подрайон ресурсов. Размещение ресурсов под разными доменными именами (например, второстепенными именами поддоменов) может создавать соединения и запросы для разных доменных имен и лестно преодолевать ограничения. Однако злоупотребление этой технологией также может вызвать множество проблем, таких как имя каждого поддомена. Каждое TCP-соединение само по себе требует DNS-запроса, трехэтапного рукопожатия, медленного запуска и так далее. Это также занимает дополнительный процессор и память. Для сервера слишком большое количество подключений легко может привести к перегрузке сети, перегрузке трафика и так далее. Так что же делает http2? Http 2 использует технологию мультиплексирования. При подключении по протоколу TCP мы можем непрерывно отправлять кадры друг другу. Идентификатор потока каждого кадра указывает, какой
  • Заголовок содержит много содержимого, и заголовок не будет слишком сильно меняться при каждом запросе, поэтому соответствующей схемы оптимизации передачи сжатия не существует. Http 2 использует алгоритм hpack для сжатия длины заголовка. Его принцип заключается в сохранении индексного пространства статической таблицы индексов и динамической таблицы индексов. принцип hpack заключается в том, чтобы соответствовать индексному пространству текущего соединения. Если значение ключа уже существует, оно заменяет запись заголовка соответствующим индексом, например “: метод: GET” может совпадать с записью заголовка. Индекс 2 в статическом индексе должен передавать только байт, содержащий 2 при передаче; если пространство индекса не существует, оно может быть передано с помощью кодировки символов. Кодировка символов может выбрать кодировку Хаффмана, а затем решить, нужно ли ее хранить в таблице динамических индексов в зависимости от ситуации, что экономит много места.
  • Передача открытого текста небезопасна. Http 1 использует передачу обычного текста и не является безопасным. Затем http 2 использует уровень двоичного кадрирования для решения этой проблемы. Кадр-это наименьшая единица передачи данных. Вместо передачи в виде открытого текста используется двоичная передача. Исходное сообщение разделено на более мелкие фреймы данных.
  • Чтобы свести к минимуму количество запросов, нам необходимо выполнить некоторые работы по оптимизации, такие как объединение файлов, диаграммы спрайтов, вставка ресурсов и т.д. Но это, несомненно, вызывает проблему большого содержимого одного запроса и высокой задержки, а встроенные ресурсы не могут эффективно использовать механизм кэширования. В этом случае http2 запустил push на стороне сервера. Браузер отправляет запрос, и сервер активно передает браузеру ресурсы, связанные с запросом, так что браузеру не нужно инициировать последующие запросы, в основном для оптимизации встраивания ресурсов.
  • Для HTTP/1 флаг сброса в сегменте TCP установлен для уведомления о сквозном закрытии соединения. Таким образом, соединение будет отключено напрямую, и должен быть подключен следующий запрос. HTTP/2 вводит фрейм типа RST_STREAM, который может отменить поток запроса при условии непрерывного открытого соединения и работает лучше.

расширять

Мы так много говорили об http. Если вы хотите узнать об этом больше, вы можете использовать Wireshark, чтобы захватить свой собственный пакет. Рекомендуется использовать два лучших инструмента для захвата пакетов: Wireshark и charles.

Справочная статья:

  • Анализ протокола HTTP (2)
  • HTTP2 подробное объяснение