Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность
Эта статья приняла участие"Проект "Звезда раскопок"", чтобы выиграть творческий подарочный пакет и бросить вызов творческим поощрительным деньгам.
«Добро пожаловать для обсуждения в области комментариев, официальный представитель 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-миллион…
Самая популярная интерпретация, самая глубокая галантерея, самые краткие уроки и множество трюков, о которых вы не знаете, ждут вас!
Добро пожаловать, чтобы обратить внимание на мой официальный аккаунт: «Программируйте эти вещи», разбирайтесь в технологиях, лучше поймите себя!