我正在用C ++(使用boost-beast)编写Web应用程序的后端,而前端可能会使用socket.io。所以这个问题既适用于实现,也适用于websocket标准中的某些内容,可以回答我的问题。
我不确定采取什么预防措施来保证邮件的完整性。假设客户端发送一个100字节长的消息,并且boost :: beast将async_read
的消息读取到multi_buffer
。我保证收到整个100字节吗?大概。但是如果消息是1 MB呢?
为什么我认为这个问题很重要?因为这决定了我的通信协议的简单程度。如果只发送和接收完整的消息,那么我不必实现具有确定消息大小的标头的中间件协议(这通常是TCP所必需的,但在某些情况下不是必需的)消息库,如ZeroMQ)。但是,如果不能保证消息在到达时完整,那么我应该实现一个协议来获取消息大小。像(最简单)的东西:6个字节,包含消息大小+消息。然后我将其读作FIFO队列来处理消息的大小,然后读取消息。
我是否以错误的方式接近websocket?请指教。
答案 0 :(得分: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库并使用它。