代码之家  ›  专栏  ›  技术社区  ›  The Quantum Physicist

WebSocket是否保证单个消息的完整性?我应该实现自己的WebSocket消息头吗?

  •  2
  • The Quantum Physicist  · 技术社区  · 6 年前

    我在为C++中的Web应用编写一个后端(带有Boost兽),前端可能会使用SoCKE.IO。所以这个问题既适用于实现,也适用于WebSocket标准中是否有什么东西可以回答我的问题。

    我不确定要采取什么预防措施来保证消息的完整性。假设客户机发送一条100字节长的消息,Boost::Beast用 async_read 到A multi_buffer . 我能保证收到全部100字节吗?可能。但是如果消息是1 MB呢?

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   sehe    6 年前

    是的,这个问题很重要。

    幸运的是,答案是基本的: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库,并只使用它。