3

我正在用 C++(使用 boost-beast)为 Web 应用程序编写后端,而前端可能会使用 socket.io。所以这个问题既适用于实现,也适用于 websocket 标准中是否有一些东西可以回答我的问题。

我不确定要采取哪些预防措施来保证消息的完整性。假设客户端发送一条 100 字节长的消息,boost::beast 将消息读取async_readmulti_buffer. 我能保证收到全部 100 个字节吗?大概。但是如果消息是 1 MB 怎么办?

为什么我认为这个问题很重要?因为这决定了我的通信协议有多简单。如果只发送和接收完整的消息,那么我不必实现带有决定消息大小的标头的中间件协议(这通常对于 TCP 是必需的,但在某些消息传递库中不是必需的像 ZeroMQ)。但是,如果不能保证消息在到达时是完整的,那么我应该实现一个协议来获取消息大小。类似(最简单的):6 个字节,包含消息大小 + 消息。然后我将其作为 FIFO 队列读取以处理消息的大小,然后读取消息。

我以错误的方式接近 websocket 吗?请指教。

4

1 回答 1

2

是的,这个问题很重要。

幸运的是,答案很简单: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 库并使用它。

于 2018-05-29T19:06:40.357 回答