Как сериализован заголовок блока? - PullRequest
0 голосов
/ 23 января 2019

Я реализую свой собственный сервер HTTP / 2.Прочитайте RFC 7540, часть содержимого о фрейме заголовка HTTP меня запутала:

https://tools.ietf.org/html/rfc7540#section-4.3

Списки заголовков - это наборы из нуля или более полей заголовка.Когда
передается по соединению, список заголовков сериализуется в блок заголовка
с использованием сжатия заголовка HTTP [COMPRESSION].Затем сериализованный заголовочный блок
делится на один или несколько октетов
последовательностей, называемых фрагментами блока заголовка

Так что, на мой взгляд, процесс будет выглядеть следующим образом:

+-------------------+    +-------------------+    +------------------+    +---------+
|    Header List    |    |    Header Block   |    | Block Fragment 1 | -> | Frame 1 | 
+-------------------+    +-------------------+    +------------------+    +---------+
| :method = POST    |    | Header 1 Bin Data |    | Block Fragment 2 | -> | Frame 2 |
| :path = /resource | -> | Header 2 Bin Data | -> +------------------+    +---------+ 
| :scheme = https   |    | Header 3 Bin Data |    | Block Fragment 3 | -> | Frame 3 |
| .....             |    | Header 4 Bin ...  |    +------------------+    +---------+
+-------------------+    +-------------------+    ...                     ...

Но как разделить сериализованный блок заголовка в разделе не упоминается.

Так что мой вопрос: Возможно ли разделить / разделить один заголовок HTTP на несколько фрагментов блока заголовка? Например, часть данных бина заголовка 1 переносится фрагментом блока 1 , а остальная часть переносится фрагментом блока 2 .

Спасибо!

1 Ответ

0 голосов
/ 23 января 2019

Да, можно разбить байты, соответствующие одному HTTP-заголовку, на 2 (или более) кадра.

Вы кодируете заголовки HTTP в байты через HPACK, так что теперь у вас есть только byte[]. Давайте предположим, что byte[] имеет длину 23.

Вы можете создать кадр HEADERS с флагами end_headers=false и поместить в него, например, 13 из 23 байтов. Затем вы создаете кадр CONTINUATION с флагами end_headers=true и помещаете в него оставшиеся 10 байтов.

Это совершенно непрозрачно, когда вы разделяете byte[].

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

Принимающая сторона увидит кадр HEADERS с end_headers=false, извлечет 13 байтов и отложит их в сторону, ожидая кадра CONTINUATION. Когда приходит кадр CONTINUATION, принимающая сторона извлекает 10 байтов, объединяет их с предыдущими 13, чтобы получить копию исходных 23 байтов, которые теперь могут быть декодированы через HPACK, с получением оригинальных заголовков HTTP.

...