Гарантирует ли websocket полноту одного сообщения?Должен ли я реализовать свой собственный заголовок для сообщений websocket? - PullRequest
0 голосов
/ 29 мая 2018

Я пишу бэкэнд для веб-приложения на C ++ (с boost-beast), а внешний интерфейс, вероятно, будет использовать socket.io.Поэтому этот вопрос относится как к реализации, так и к тому, есть ли в стандарте веб-сокета что-то, отвечающее на мой вопрос.

Я не уверен, какие меры предосторожности следует предпринять, чтобы гарантировать полноту сообщения.Скажем, клиент отправляет сообщение длиной 100 байт, а boost :: beast читает сообщение с async_read до multi_buffer.Я гарантированно получу все 100 байтов?Наверное.Но что, если сообщение имеет размер 1 МБ?

Почему я считаю этот вопрос важным? Потому что это определяет, насколько простым будет мой протокол связи.Если нужно отправлять и получать только полные сообщения, мне не нужно реализовывать промежуточный протокол с заголовком, который определяет размер сообщения (что в целом необходимо для TCP, но не обязательно в некоторых библиотеках обмена сообщениями).как ZeroMQ).Однако, если нет никакой гарантии, что сообщения будут завершены по прибытии, тогда я должен внедрить протокол, чтобы получить размер сообщения.Нечто подобное (максимально простое): 6 байтов, которые содержат размер сообщения + сообщение.Затем я читаю это как очередь FIFO для обработки размера сообщения, а затем читаю сообщение.

Неправильно ли я подхожу к веб-сокету?Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 29 мая 2018

Да, вопрос важен.

К счастью, ответ элементарен: websocket не является протоколом на основе потоков, как TCP, он основан на сообщениях.

RFC включает следующую диаграмму

+-+-+-+-+-------+-+-------------+-------------------------------+
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               | Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+

Таким образом, создание является частью протокола websocket.Я думаю, это выглядит как отличный справочный материал, если вы хотите понять его детали: http://lucumr.pocoo.org/2012/9/24/websockets-101/

Однако на практике вы будете использовать высокоуровневую библиотеку Websockets и просто использовать ее.

...