Приветствую всех вОблако Tencent + сообщество, получить больше крупной технической практики Tencent по галантерее~
Эта статья написанаmarioluОпубликован вКолонка «Облако + сообщество»
Преамбула
В настоящее время широко используется HTTP/2.0 (сокращенно h2) (по состоянию на август 2018 года среди 10 миллионов лучших веб-сайтов, ранжированных по популярности Alexa, на долю h2 приходилось около 29%,i3technolog.com/techno log IE…). Цель написания данной статьи такова: h2 является относительно новой технологией и постепенно занимает широкий круг.Хотя есть обновленный QUIC, идеи его реализации аналогичны h2. Подрывая предыдущий HTTP/1.x, креативная технология H2 достойна нашего тщательного вкуса. Эта статья, основанная на опыте и размышлениях автора в области разработки h2, знакомит вас со всесторонними знаниями, достоинствами и недостатками h2. Эта статья больше направлена на то, чтобы помочь читателям понять идеи дизайна h2, и ее также можно использовать в качестве руководства или сводки RFC.
Глава 1. Отслеживаемость
Рис. 1. Диаграмма ежегодного журнала HTTP
Еще в 1991 году, с появлением WWW, был предложен протокол HTTP/0.9. HTTP 0.9 — это простой и ограниченный по приложениям протокол. Он поддерживает переход к сетевому узлу для получения ресурсов соответствующего пути. Но расширенных атрибутов нет. Простота его протокола даже суммирует все HTTP/0.9 со следующим примером доступа к хосту Google. Как показано ниже, протокол поддерживает только GET, без заголовков http, ответ может быть только гипертекстовым.
telnet google.com 80
Connected to x.x.x.x
GET /about
(Hyper text)
(Conection closed)
HTTP/1.0 был предложен в 1996 году из-за стремления к мультимедийной информации и популярности браузеров. Многие функции HTTP/1.0 по-прежнему широко используются, но, как и в HTTP/0.9, TCP-соединение необходимо создавать один раз для каждого запроса. Всего через несколько лет HTTP/1.1 снова появился в виде стандарта RFC. В настоящее время в версии 1.1 протокола HTTP переработаны концепции длинного соединения, метода запроса параметров, заголовка кэша, заголовка обновления, заголовка диапазона, заголовка кодирования передачи и конвейера (по порядку).
И другие наши известные версии технологии HTTPS SSL/TLS постепенно предлагались в течение следующих десяти лет. Из соображений безопасности такие устройства, как коммутаторы маршрутизации брандмауэра между Интернет-коммуникациями, обычно имеют только ограниченные порты (например, 80 и 443). Различные версии протокола связи могут повторно использовать только эти порты. Порт 80 в HTTP1.1 предназначен для обновления заголовка запроса до протокола более высокого уровня, в то время как порт 443 использует технологию NPN/ALPN в процессе рукопожатия TLS, чтобы избежать использования большего количества сетевых RTT для поддержки одного и того же протокола на обоих концах соединения. CS непосредственно перед общением. NPN/ALPN — это расширение протокола TLS, где NPN предлагается Google для реализации spdy. Поддерживаемые протоколы предоставляются сервером на выбор клиента. ALPN ближе к способу HTTP-взаимодействия: клиент сначала отправляет запрос на использование определенного протокола, а сервер подтверждает, поддерживается ли этот протокол. ALPN проложил путь к рождению HTTP2.
Еще одна вещь, о которой следует упомянуть, — это протокол spdy. Spdy направлен на решение проблемы блокировки заголовка строки HTTP1.1 (подробно обсуждаемой в последующих главах) и был предложен Google в 2009 году. В то же время в 2012 году для реализации управления потоком был предложен spdy3.0, а в течение 2013-2014 годов были предложены такие концепции, как приоритет потока и проталкивание сервера. Смысл существования Spdy больше похож на службу опыта http2.0. Это проложило путь к дальнейшей эволюции HTTP.
Глава 2. Взаимодействие человека и компьютера
Ассемблер — один из самых эффективных языков, но также и один из самых малопонятных. А языки программирования, понятные человеческому мозгу, часто жертвуют производительностью ради компромисса. Проще говоря, протокол HTTP/1.x — это протокол, разработанный для человеческого языка, но его неэффективно преобразовывать в протокол, исполняемый машиной. Давайте рассмотрим процесс, который компьютер выполняет для разбора HTTP1.x.
GET / HTTP/1.1<crlf>
Host: xxx.aa.com<crlf>
<crlf>
Соответствующий псевдокод синтаксического анализа
loop
while(! CRLF)
read bytes
end while
if line 1:
parse line as Request-Line
else if empty line:
Break out and We have done
else If start with non-whitespace
parse header
else if space
continue with last heade
end if
end loop
Как вы можете видеть в процессе разбора псевдокода, очень трудоемко разобрать протокол, который невооруженным глазом выглядит лаконичным. А в HTTP-сервере тоже есть такая проблема: неизвестна длина байтовой строки, и неизвестно, сколько памяти выделено заранее.
HTTP/2.0 использует информацию в двоичном коде, которая понятна компьютерам, и должна быть совместима снизу вверх со значением HTTP. Посмотрим, как он это сделает. Как и в большинстве коммуникационных протоколов, кадр является наименьшей единицей передачи. Фреймы делятся на кадры данных и кадры управления. Кадр данных используется в качестве носителя данных для управления сигнализацией кадра управления. Общий формат кадра h2 — первые 9 байт + дополнительные символы. Как вы понимаете, первая часть фрейма описывает длину, вторая часть описывает тип фрейма, третья часть описывает флаг, а четвертая часть представляет собой уникальный серийный номер. Это общий заголовок для всех кадров. За общим заголовком следует сущность кадра. На рис. 4 показана структура кадра.
Рисунок 2. Формат общего фрейма
В чем преимущество этой конструкции. Взгляните еще раз на процесс синтаксического анализа кадра, и вы увидите, что он более лаконичен для компьютера.
loop
read 9 byte
payload_Length=first 3 bytes
read payload
swith type:
Take action
end loop
HTTP2.0 использует фрейм заголовка для выражения заголовка HTTP + строки запроса, а фрейм данных — для выражения тела. Кадр заголовка и кадр данных используют один и тот же идентификатор потока для формирования полного пакета HTTP-запроса/ответа. Поток здесь описывает запрос и ответ, что эквивалентно выполнению короткого запроса на соединение HTTP/1.x и ответа.
Глава 3. Параллелизм
В предыдущем разделе мы упомянули, что полностью выразили HTTP/1.x с помощью фрейма h2. Но амбиции протокола h2 выходят далеко за рамки этого. Его реальная цель — решить предыдущую проблему блокировки заголовка HTTP1.x, уменьшить задержку в сети и время загрузки страницы.
Мы знаем, что полная веб-страница содержит запрос домашней страницы и несколько или десятки подзапросов. HTTP/1.1 уже может выдавать все запросы параллельно, но HTTP сам по себе является протоколом без сохранения состояния, который полагается на порядок времени для определения прямого соответствия между запросами и ответами. Сначала нужно ответить на первый запрос. Затем, если последний ресурс ответа более важен для браузера, чтобы построить DOM или CSSOM. Затем он должен заблокировать ожидание завершения первого. Конечно, для нас это не сложно, мы можем открыть еще несколько соединений tcp (браузер указывает источник (протокол+хост+порт) максимум 6) или объединить ресурсы, чтобы уменьшить ненужную блокировку. Это дорого обходится. Во-первых, накладные расходы на установление tcp-соединения, по сути, истечение срока действия небольшого фрагмента подресурсов, вызванное объединенным ресурсом, приводит к истечению срока действия кеша всего объединенного ресурса. В связи с этим у h2 есть пакет решений, которые будут следовать одно за другим.
h2 создает несколько потоков в одном TCP-соединении. Каждый поток может иметь зависимости, такие как построение цепочки зависимостей на основе приоритетного порядка загрузки браузера (основной запрос > CSS > файлы JS, которые могут изменить структуру DOM > файлы ресурсов изображений и шрифтов). Веса можно задавать в зависимостях на том же уровне. Вес используется для распределения ресурсов канала передачи.
В примере на рисунке 6 показано, что имеется запрос домашней страницы index.html, main.css, jq.js и некоторые файлы изображений и файлы шрифтов qq.tff.
Рисунок 3. Дерево зависимостей запроса h2
HTML имеет наивысший приоритет, и никакие другие файлы не будут переданы, пока передача HTML не будет завершена. После того, как передача HTML завершена, JS и CSS распределяют ресурсы передачи информации в соответствии с назначенными им весами. Если передача CSS завершена, если TFF и PNG имеют одинаковый вес, то они будут занимать 1/4 ресурсов канала.
Здесь брошено 3 вопроса и ответа.
- Если CSS заблокирован, то JS получает коммуникационные ресурсы, принадлежащие CSS.
- Если передача CSS завершена, но не перемещена в дерево зависимостей, TFF и PNG наследуют коммуникационную долю CSS (при условии, что TFF и PNG имеют одинаковый вес, тогда каждый получает 1/4 коммуникационных ресурсов).
- Если убрать CSS из числа зависимостей, JS, TFF, PNG будут поровну делить коммуникационные ресурсы (при условии, что три веса одинаковы, тогда каждый из трех будет делить 1/3 коммуникационных ресурсов)
Глава 4, звезды держат луну
HTTP2 также разработал ряд схем для повышения производительности сети, включая управление потоком, сжатие HPack и Server Push.
Что вы говорите, что TCP уже имеет управление потоком, разве HTTP не излишен? Все верно, но внутри одного TCP нет управления потоками для отдельных потоков. Управление потоком использует кадр обновления для непрерывного информирования отправителя о размере окна обновления (верхний предел). Практическое использование управления потоком состоит в том, чтобы блокировать неважные запросы, чтобы высвободить больше коммуникационных ресурсов для важных запросов. Управление потоком нельзя отключить, а размер потока можно установить равным 2 в 31-й степени -1 (2 ГБ). Разные промежуточные сетевые устройства имеют разную пропускную способность. Другое использование управления потоком — синхронизация минимальных колпачков всех коммутаторов промежуточного ПО. Начальный размер окна потока равен 65535 (2 в 16-й степени -1).
Так же, как большая часть богатства в мире сосредоточена в руках немногих. В статистике из 48 452 989 запросов на следующие 11 заголовков приходилось 99% от общего числа в порядке убывания: пользовательский агент, acceptp-кодирование, accept-language, accept, referer, host, connection, cookie, origin, upgrade-inseure. -запрос, тип содержимого. Значения заголовков http тоже очень похожи, например "/index.html", "gzip, deflate". Файлы cookie также содержат избыточную информацию.
Все это составляет большой объем сжимаемого содержимого в заголовке http.
В запросе GET и ответе 304 или ответе с очень небольшой длиной содержимого эти заголовки занимают большой процент коммуникационных ресурсов. В отчете HTTP, опубликованном в 2016 году, заголовок запроса составляет около 460 байт, а для типичной веб-страницы будет в среднем 140 объектов запроса. Эти заголовки требуют в общей сложности 63 КБ. Эти объемы, вероятно, будут узким местом для оптимизации верхней части страницы и времени загрузки страницы.
Может быть, вы скажете, что эти заголовки запросов используются алгоритмами сжатия, такими как gzip, разве это не конец? Действительно, spdy делал это до тех пор, пока атака BREACH в 2013 году не выявила безопасность сжатия gzip в приложениях https, что упростило злоумышленникам получение таких данных, как файлы cookie сеанса. Отсюда и HPACK.
HPACK — это просто индексная таблица, включающая статические и динамические таблицы. Статическая таблица определяется RFC и никогда не изменяется Статическая таблица резервирует 62 записи. Стороны связи каждого соединения поддерживают динамическую таблицу.
Протокол H2 использует порядковый номер для представления имени, значения или имени-значения в http. Если предположить, что индексом является имя, а значение не имеет индекса, то значение также можно сжать с помощью кодирования Хаффмана.
- В предопределенной таблице статического сопоставления полей заголовка уже есть предопределенные значения имени заголовка и значения заголовка.Двоичный формат данных в настоящее время такой, как показано на рисунке 4, первый бит фиксируется на 1, а последние 7 битов значение индекса отображения. 83 на рис.
Рис. 4. Имя и значение индекса индекса
Рисунок 5. Схема захвата пакетов
- Заранее определенное поле заголовка имеет имя в таблице статического отображения, и необходимо установить новое значение. В примере, показанном на рис. 6, в заголовке, указывающем путь, первый символ — 44, а соответствующий двоичный бит — 0100 0100. Первые два символа — 01, а индекс — 4, что соответствует заголовку пути в таблице статического отображения. Второй символ — это двоичный бит 1001 0101, соответствующий 95, а длина значения, соответствующая исключению первого символа, равна 21 десятичному числу. То есть, считая 44, всего 23 символа для записи этой информации.
Рис. 6. Имя индекса индекса и пользовательское значение
Рисунок 7. Схема захвата пакетов
- В таблице статического сопоставления предварительно определенного поля заголовка нет имени, и необходимо установить новое имя и новое значение. Двоичное значение 40 — 0100 0000, двоичное значение 02 — 0000 0010, десятичное значение последних семи цифр — 2, двоичное значение 86 — 1000 0110, а десятичное значение последних семи цифр — 6.
Рис. 8. Пользовательское имя индекса индекса и пользовательское значение
Рисунок 9. Схема захвата пакетов
- Явно требовать, чтобы заголовок запроса не делал индекс hpack
Еще одним серьезным убийцей HTTP2.0 является Server Push. Server Push использует незанятые ресурсы полосы пропускания для предварительной отправки ключевых ресурсов, отображаемых на странице, в браузер. Server Push эффективно сокращает время загрузки страницы. За подробностями обращайтесь к другой статье автораcloud.Tencent.com/developer/ ах….
Глава 5, Паодин Цзе Ню
HTTP2 больше подходит для выполнения на компьютере, чем HTTP1. Но человеческому мозгу нелегко понять его бинарную природу. В этой статье мы поговорим конкретно об инструментах отладки для http2.
- Chrome (браузер qq) может нажать и удерживать F12 для просмотра протокола h2. На рис. 13 показана временная диаграмма сети браузера с указанием конкретных имен протоколов. Chrome также может ввести chrome://net-internals/#http2 в адресную строку, чтобы просмотреть сведения о протоколе h2, как показано на рис. 11. Щелкните соответствующий хост, чтобы увидеть процесс согласования h2, как показано на рис. 12.
Рисунок 10. Диаграмма сетевой последовательности браузера
chrome://net-internals/#http2
Рисунок 11. Отладка chrome h2
Рисунок 12. Процесс переговоров h2
- wireshark (для использования с chrome или firefox). Установите переменную среды SSLKEYLOGFILE=c:\temp\sslkeylog.log. Затем настройте путь, по которому находится ключ, в Wireshark->Preferences->Protocols->SSL.
Рисунок 13. Конфигурация Wireshark
Рисунок 14. Wireshark перехватывает пакеты h2
- Nghttp2 — это полный компонент реализации протокола http2. Автор также участвовал в реализации spdy. В настоящее время библиотека nghttp2 используется многими известными программами в качестве библиотеки реализации протокола h2. Кроме того, nghttp2 также поставляется с инструментом анализа для протокола h2. На рис. 18 показано обновление до h2c с использованием заголовка обновления в виде открытого текста. На рис. 19 показано обновление до h2 поверх https.
Рисунок 15. Состояние открытого текста обновляется до h2c с помощью заголовка обновления.
Рисунок 16, показывающий обновление до h2 на основе https
Опция Curl --http2 (должна быть скомпилирована с nghttp2)
Рисунок 17. Отладка клиента curl, поддерживающего h2
- На Github также есть несколько практических компонентов инструментов http2, таких как chrome-http2-log-parser, http2-push-manifest и др. Автор представит эти инструменты в следующих статьях. Для мобильной отладки ios может использовать charles proxy в качестве прокси-сервера, а android должен использовать chrome на мобильном устройстве в режиме разработчика.
Глава 6: Резной забор и нефрит
Как развернуть H2?В настоящее время основные серверы, такие как nginx и apache, уже поддерживают http2, а основной клиент curl и различные браузеры (включая mobile safari и chrome-android) в основном поддерживают http2. Прокси-серверы, такие как ATS, Varnish, Akamai, Tencent Cloud и другие службы CDN, также поддерживают http2. Итак, как развернуть набор веб-сайтов на h2. Или в чем разница между развертыванием веб-сайта h2 и предыдущего веб-сайта h1?
Если это ваш собственный исходный сайт, убедитесь, что сервер поддерживает TLS1.2 и набор шифров, требуемый RFC7540, а h2 должен убедиться, что он поддерживает alpn. Вы можете проверить с помощью таких сайтов, как ssllabs. Требование к серверу h2 состоит в том, что h2 должен понимать, как установить приоритет потока, а сервер h2 должен поддерживать push сервера. Клиент h2 должен отправить как можно больше запросов.
Если ваш сайт был перенесен с http1.x, оптимизации, сделанные ранее для http1.x, могут вообще не помочь или даже хуже. Объединение небольших файлов больше не требуется, так как дополнительные запросы небольших файлов являются лишь небольшими накладными расходами с точки зрения h2. И если локальное изменение большого файла делает недействительным весь кеш больших файлов. В эпоху http1.0 использование нескольких доменных имен для одновременных http-соединений не требуется в http2, потому что http2 по своей сути является параллельным. Оптимизация, сделанная http1.x, например, файл ресурсов изображения не использует файлы cookie для уменьшения размера запроса, а функция сжатия заголовков http2 также уменьшает этот эффект. Даже без этой оптимизации. Выгода от слияния CSS и небольших изображений также незначительна в http2.0.
Если на странице используются сторонние компоненты веб-сайта, используйте как можно меньше сторонних компонентов веб-сайта. Сторонние сайты не гарантируют поддержку h2, так что это может быть самым большим недостатком теории ствола.
С осторожностью используйте схему развертывания 2.0-1.x, преобразовывая потоки h2 в запросы h1. Потому что это не может воспроизводить производительность h2.
Рисунок 18. Схема развертывания 2.0-1.x
Поддержка h2 прокси-сервера CDN может блокировать прокси-сервер h2, принудительно используя TLS. Как показано на рис. 19, агент может разорвать TLS-соединение с клиентом и создать новое соединение с сервером в сетевой среде с клиентами с различными протоколами. Его также можно использовать в качестве балансировщика нагрузки, что эквивалентно прямой связи между пользователями HTTP2.0 и серверами HTTP2.x.
Рисунок 19. Прокси с функцией клиента tls
На рис. 20 показано, как обойти прокси-сервер для доступа к серверу h2. В настоящее время прокси-сервер эквивалентен устройству с функцией балансировки нагрузки переадресации tcp. Если прокси-сервер поддерживает протокол alpn TLS, он также может выбрать функцию прокси-сервера HTTP и установить зашифрованное соединение с сервером h2. Если не поддерживается ни alpn, ни переадресация tcp. Тогда прокси можно будет обновить только до протокола h2 с помощью upgrade.
Рисунок 20. Схема развертывания H2 через прокси-сервер
Глава 7, Совершенство и Девять Красоты
HTTP2.0 построен поверх TCP, поэтому у него есть все недостатки TCP, поэтому H2 может максимизировать производительность благодаря настроенному стеку протоколов tcp. Функция медленного старта TCP определяет, что одновременный трафик h2 не будет слишком большим в начале, а рукопожатие соединения TCP и SSL также замедлит время, необходимое для первого пакета h2. QUIC полностью отказывается от TCP и реализует ряд возможностей HTTP2 на основе UDP. В то же время гарантируется надежность прикладного уровня, такого как TCP. В то же время эти передачи TLS1.3 быстрее и лаконичнее. Все это дает некоторые идеи для эволюции HTTP2.0 в HTTP3.0.
Суммировать
Вышеприведенное содержание основано на практическом опыте автора и теоретическом резюме. Ограничения по пространству не могут охватить каждую деталь. Для получения дополнительной информации, пожалуйста, продолжайте обращаться к протоколам RFC7540 и RFC7541.
вопросы и ответы
Как реализовать URL без "http | https"?
Связанное Чтение
Как использовать go step by step, чтобы найти узкое место производительности при измерении стресса
Рекомендации по отправке серверов с помощью HTTP/2
Как достигается предельная частота сбоев ниже 0,01%?
[Рекомендация ежедневного курса] Доктор философии из Технологического университета Наньян, Сингапур, знакомит вас с технологией глубокого изучения НЛП.
Эта статья была разрешена автором для публикации в сообществе Tencent Cloud + Для получения дополнительных оригинальных текстов, пожалуйстанажмите
Найдите и подпишитесь на общедоступную учетную запись «Сообщество Yunjia», получите технические галантереи как можно скорее и ответьте на 1024 после подписки, чтобы отправить вам подарочный пакет технических курсов!
Огромный технический практический опыт, все вСообщество Юнцзя!