Виноград Все видео: https://segmentfault.com/a/11
Определение HTTP
HTTP is based on client / server (C / s) architecture model. It exchanges information through a reliable link. It is a stateless request / response protocol.
Структура HTTP
В настоящее время мы используем большинство протоколов http 1. X. Мы знакомы как с заголовком, так и с телом. Так что же здесь поразительного? Начальная строка-это то, что мы называем строкой запроса или строкой состояния Get/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. Как изменилась версия 1.1 по сравнению с версией 1.0?
- HTTP добавлено поле хоста
- В HTTP 1.1 введено кодирование фрагментированной передачи для реализации непрерывной передачи запроса диапазона и точки останова (фактически, кодирование блочной передачи используется заголовком HTTP-сообщения для передачи тела сущности блок за блоком)
Согласно теории конвейерной обработки HTTP 1.1, клиенты могут отправлять несколько HTTP-запросов одновременно, вместо того, чтобы ждать ответа по одному
- Примечание: Эта конвейерная обработка ограничена только теоретическими сценариями. Большинство настольных браузеров по – прежнему предпочитают отключать конвейерную обработку HTTP по умолчанию!
- Таким образом, теперь можно открывать несколько TCP-соединений для приложений, использующих протокол HTTP 1.1!
HTTP1.1 дает базовое лечение, основанное на вышеупомянутой проблеме потребления ресурсов. В чем смысл длинной ссылки по умолчанию? Вместо того, чтобы устанавливать HTTP-соединения при каждом HTTP-запросе, для обработки нескольких запросов устанавливается только один TCP-канал. Конечно, каждый запрос здесь является последовательным, то есть просто нет необходимости устанавливать TCP-соединение, или он должен быть поставлен в очередь, и это может вызвать проблему блокировки заголовка строки (например, отправка 100 запросов, первый из которых заблокирован, в результате чего 99 запросов отстают). Режим работы HTTP1.1 по умолчанию показан на следующем рисунке:
Теперь давайте представим себе эту модель. В чем недостаток? Можно ли его оптимизировать? Кроме того, мы подняли два вопроса: 1. Нам нужно встать в очередь; 2. Это может привести к блокировке головки потока. Для первой проблемы HTTP1.1 уже дал решение, а именно pipline. В начале второй проблемы есть переходное решение, а именно протокол spdy (протокол для улучшения HTTP, запущенный Google, включающий мультиплексирование потоков данных, приоритет запроса и сжатие заголовка HTTP. Если вам интересно, вы можете изучить его), а затем перейти на http 2.0. Сначала давайте поговорим о конвейере. Конвейер-это технология, которая может записывать несколько HTTP-запросов в один и тот же сокет, не дожидаясь ответа. Только HTTP1.1 поддерживает конвейерную передачу HTTP, но 1.0 этого не делает. Что ты имеешь в виду? Мы видим, что приведенный выше рисунок находится в последовательной обработке TCP-соединения, поэтому при включении конвейера он станет следующим:
Мы видим, что отправка HTTP-запросов больше не заключается в том, чтобы сначала отправить, а затем дождаться ответа, а затем отправить следующий запрос. Таким образом, мы можем видеть, что все запросы начинаются единым образом. Но есть одна проблема. Конвейеризация HTTP на самом деле заключается в отправке нескольких HTTP-запросов один за другим в TCP-соединении, и в процессе отправки нет необходимости ждать ответа сервера на предыдущий запрос; только не после этого, клиенту все равно нужно получить ответ в порядке отправки запроса! Это приводит к тому, что, хотя он решает проблему очереди, он решает только проблему односторонней очереди и, наконец, принимает данные в соответствии с порядком запроса. Почему? Потому что они не знают, что первое, а что второе. Таким образом, также возникнет проблема блокировки головки провода. Подводя итог, когда http1.0 является сборочной линией, мы выполняем задачи одну за другой. Когда HTTP1.1-это время, когда способности наших работников улучшаются, мы можем отправить
http2.0
Далее идет наш http2.0, чтобы посмотреть, как он решает предыдущие проблемы. В http2.0 структура потока используется для решения проблемы блокировки заголовка строки, которую можно решить, присвоив каждому потоку метку streamid. Итак, где же http 2 является священным? Прежде всего, говоря о http 2, мы должны упомянуть HTTPS. Http 2-это протокол, основанный на HTTPS. Для HTTPS я нашел лучшую статью, Wireshark захватывает пакеты, чтобы понять процесс запроса HTTPS. В начале статьи мы сравнили структуру http1 и http2. Кажется, что они совершенно разные, но на самом деле это не так. Http2 принимает кадры в качестве минимальной единицы измерения. Глядя на рисунок ниже, мы видим, что http2 выполняет только инкапсуляцию слоев, но на самом деле это все еще заголовки и тело по сути. Только http 2 отображается в более расширенных функциях и другими способами.
http1.x против http2.0
Что касается преимуществ и недостатков http 2, мы должны начать с недостатков http 1, потому что только при наличии контраста это может повредить.
- Количество подключений http 1 ограничено. Для одного и того же доменного имени браузер может создавать только 6-8 TCP-соединений одновременно (разные браузеры разные). Чтобы решить проблему ограничения количества, появилась технология сегментации доменных имен, которая на самом деле является сегментацией ресурсов. Ресурсы размещаются под разными доменными именами (например, второстепенными именами поддоменов), чтобы можно было создавать соединения и отправлять запросы на разные доменные имена, которые могут быть взломаны удобным способом. Однако злоупотребление этой технологией также вызовет множество проблем, таких как каждое TCP-соединение само по себе должно проходить через DNS-запрос, трехэтапное рукопожатие, медленный запуск и т.д., Также занимают дополнительный процессор и память, для сервера слишком много соединений легко вызвать перегрузку сети, пробки на дорогах и т.д. Итак, что же делает http2? Http2 использует технологию мультиплексирования. При подключении по протоколу 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 подробное объяснение