ping pong 是什么的格式

  • 币安的WebSocket是如何发送ping pong
  • ping pong的数据格式是什么样的
  • 币安的Websocket该如何做heartbeat

币安的WebSocket服务器采用标准的ping pong帧来做连接的检查。文档上面有提示,WebSocket服务器会每3分钟发送ping给客户端,接收方应该在收到后返回pong消息。 如果客户端在10分钟内没有返回pong消息,服务器会主动断开连接。

币安的发送的ping pong消息采用WebSocket协议的标准格式. ping 消息是一个包含 opcode 为0x9的数据帧. pong的opcode为0xA。而发送应用数据的帧的opcode为0x1(Text), 0x2(Binary). (币安只发送text格式的数据)。 这里你可以看到, ping, pong消息一种特殊的数据帧,按照标准协议的说法是控制帧(control frames)。

按照标准协议来实现的最大好处是,大多数开源的websocket 客户端的library都会有自带的方法。让使用者不需要自行实现一遍。直接调用内置方法就行。但是有的WebSocket的服务器没有按照标准协议来,给新用户带来很多困扰。

按照协议,任何一方收到ping,都需要尽快回复pong消息。利用这个机制,客户端可以定期的发送ping消息给服务器,币安的websocket服务端会立刻返回pong消息,用以提醒客户端连接是否正常。

  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 ...                |
 +---------------------------------------------------------------+