Серия Netty: инкапсуляция netty сообщений http2

Java HTTP Netty

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность

Эта статья приняла участие"Проект "Звезда раскопок"", чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.

«Добро пожаловать для обсуждения в области комментариев, официальный представитель NuggetsПроект «Звезда раскопок»После мероприятия в комментариях будет разыграно 100 штук Наггетсов.Подробнее о лотерее читайте в статье о мероприятии».

Введение

Независимо от того, что это за протокол, если он действительно используется, его необходимо преобразовать в соответствующий язык для реального приложения.Эта статья начнется со структуры сообщения http2, обсудит инкапсуляцию сообщения http2 с помощью netty, и покажу вам, как должен работать настоящий фреймворк.

Структура сообщения http2

Разница между http2 и http1.1 заключается в том, что он использует новое двоичное кадрирование и устанавливает поток данных между клиентом и сервером для обмена сообщениями между клиентом и сервером. Поток данных — это двунаправленный поток байтов, используемый для отправки одного или нескольких сообщений.

Сообщение — это логически законченный фрагмент данных, отправляемый клиентом и сервером. В зависимости от размера данных сообщение можно разделить на разные кадры. То есть сообщение состоит из разных кадров.

Фрейм — это наименьшая единица связи в http 2. Согласно введению в предыдущем разделе, мы знаем, что существует несколько типов фреймов:

  • DATA frame
  • HEADERS frame
  • PRIORITY frame
  • RST_STREAM frame
  • SETTINGS acknowledgment frame
  • SETTINGS frame
  • PING frame
  • PING acknowledgment
  • PUSH_PROMISE frame
  • GO_AWAY frame
  • WINDOW_UPDATE frame
  • Unknown Frame

Давайте посмотрим на общую структуру потока и фрейма в http2:

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

Каждый кадр отмечен идентификатором потока, к которому он принадлежит.

С базовой концепцией http2, описанной выше, давайте посмотрим на инкапсуляцию http2 с помощью netty.

Инкапсуляция Netty http2

Http2Stream

Интерфейс Http2Stream, являющийся самым большим единичным потоком при TCP-соединении, предоставляется в netty. Обратите внимание, что Http2Stream — это интерфейс, который имеет два класса реализации: DefaultStream и ConnectionStream.

В Http2Stream есть два очень важных свойства, а именно id и state.

Идентификатор был введен ранее и является уникальной меткой потока. Здесь следует отметить, что идентификатор потока, установленный клиентом, должен быть нечетным числом, а идентификатор потока, установленный сервером, должен быть четным числом. Кроме того, поток, Stream ID которого равен 0, имеет специальную функцию, это CONNECTION_STREAM_ID, а 1 означает HTTP_UPGRADE_STREAM_ID.

Состояние представляет собой состояние потока. В частности, поток имеет следующие состояния:

        IDLE(false, false),
        RESERVED_LOCAL(false, false),
        RESERVED_REMOTE(false, false),
        OPEN(true, true),
        HALF_CLOSED_LOCAL(false, true),
        HALF_CLOSED_REMOTE(true, false),
        CLOSED(false, false);

Почему государству нужно различать местное и удаленное? Это связано с тем, что два конца потока соединены, поэтому на обоих концах есть состояние.

Состояние потока соответствует жизненному циклу http2. Netty предоставляет Http2LifecycleManager для представления управления жизненным циклом http2:

    void closeStreamLocal(Http2Stream stream, ChannelFuture future);
    void closeStreamRemote(Http2Stream stream, ChannelFuture future);
    void closeStream(Http2Stream stream, ChannelFuture future);
    ChannelFuture resetStream(ChannelHandlerContext ctx, int streamId, long errorCode,
            ChannelPromise promise);
    ChannelFuture goAway(ChannelHandlerContext ctx, int lastStreamId, long errorCode,
            ByteBuf debugData, ChannelPromise promise);
    void onError(ChannelHandlerContext ctx, boolean outbound, Throwable cause);

Они закрывают поток, сбрасывают поток, отказываются создавать новый поток: goAway и обрабатывают состояние ошибки.

Http2Frame

После потока это Http2Frame, который фактически несет сообщение http2. В netty интерфейс Http2Frame имеет множество конкретных реализаций.

Прямые подклассы Http2Frame включают HTTP2GoAwayFrame, HTTPPingFrame, Http2SettingsFrame и HTTP2SettingsAckFrame.

Где goAway означает не принимать новые потоки, а ping используется для обнаружения сердцебиения. НАСТРОЙКИ используются для изменения конфигурации соединения или потокового потока.

В netty есть специальный класс Http2Settings и его аналог.

В этом классе определены некоторые специальные имена параметров:

НАСТРОЙКИ название имея в виду
SETTINGS_HEADER_TABLE_SIZE Максимальный размер таблицы одноранговых индексов
SETTINGS_ENABLE_PUSH Включить ли функцию отправки сервера
SETTINGS_MAX_CONCURRENT_STREAMS Максимальное количество одновременных потоков, разрешенных получателем
SETTINGS_INITIAL_WINDOW_SIZE Размер окна отправителя, используемого для управления потоком на уровне потока.
SETTINGS_MAX_FRAME_SIZE Установить максимальный размер кадра
SETTINGS_MAX_HEADER_LIST_SIZE Максимальный размер индексной таблицы одноранговых заголовков

В дополнение к четырем фреймам, упомянутым выше, другие реализации фреймов наследуются от Http2StreamFrame, в частности PriorityFrame, ResetFrame, HeadersFrame, DataFrame, WindowUpdateFrame, PushPromiseFrame и UnknownFrame.

Каждый кадр представляет собой другую функцию. Самое главное здесь — это Http2HeadersFrame и Http2DataFrame.

Http2HeadersFrame — это в основном запрос http2, отправляемый клиентом на сервер.

В частности, в дополнение к стандартным заголовкам http1.1, http2 также поддерживает следующие заголовки:

      METHOD(":method", true),

        SCHEME(":scheme", true),

        AUTHORITY(":authority", true),

        PATH(":path", true),

        STATUS(":status", false),

        PROTOCOL(":protocol", true);

Для Http2DataFrame это сам ByteBufHolder, который используется для передачи определенной информации о данных. Полезная нагрузка фрейма данных хранится непосредственно в ByteBuf.

Суммировать

Выше приведена инкапсуляция сообщений http2 с помощью netty.

Примеры этой статьи могут относиться к:learn-netty4

Эта статья была включена вwoohoo.floydpress.com/28-Netty-миллион…

Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!

Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!