最新Python之WebSocket协议_python websocket onopen

本文介绍了WebSocket协议的数据帧格式,包括FIN、RSV、Opcode等字段,并详细阐述了客户端与服务器之间的掩码处理规则。同时,给出了Flask中应用WebSocket的示例,以及提供了一份涵盖编程语言、算法、大数据组件等全面知识体系的学习资料。
摘要由CSDN通过智能技术生成
    # 将 SHA-1 加密后的字符串再进行一次 base64 加密
    return base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
}

```
 如果加密算法错误,客户端在进行校检的时候会直接报错。如果握手成功,则客户端侧会出发onopen事件。
+ Sec-WebSocket-Protocol  
 表示客户端请求提供的可供选择的子协议,及服务器端选中的支持的子协议,“Origin”服务器端用于区分未授权的websocket浏览器
+ Sec-WebSocket-Version: 13  
 客户端在握手时的请求中携带,这样的版本标识,表示这个是一个升级版本,现在的浏览器都是使用的这个版本。
+ HTTP/1.1 101 Switching Protocols  
 101为服务器返回的状态码,所有非101的状态码都表示handshake并未完成。

Data Framing

Websocket协议通过序列化的数据帧传输数据。数据封包协议中定义了opcode、payload length、Payload data等字段。其中要求:

  1. 客户端向服务器传输的数据帧必须进行掩码处理:服务器若接收到未经过掩码处理的数据帧,则必须主动关闭连接。
  2. 服务器向客户端传输的数据帧一定不能进行掩码处理。客户端若接收到经过掩码处理的数据帧,则必须主动关闭连接。

针对上情况,发现错误的一方可向对方发送close帧(状态码是1002,表示协议错误),以关闭连接。
具体数据帧格式如下图所示:

  • FIN
    标识是否为此消息的最后一个数据包,占 1 bit
  • RSV1, RSV2, RSV3: 用于扩展协议,一般为0,各占1bit
  • Opcode
    数据包类型(frame type),占4bits
    0x0:标识一个中间数据包
    0x1:标识一个text类型数据包
    0x2:标识一个binary类型数据包
    0x3-7:保留
    0x8:标识一个断开连接类型数据包
    0x9:标识一个ping类型数据包
    0xA:表示一个pong类型数据包
    0xB-F:保留
  • MASK:占1bits
    用于标识PayloadData是否经过掩码处理。如果是1,Masking-key域的数据即是掩码密钥,用于解码PayloadData。客户端发出的数据帧需要进行掩码处理,所以此位是1。
  • Payload length

Payload data的长度,占7bits,7+16bits,7+64bits:

+ 如果其值在0-125,则是payload的真实长度。
+ 如果值是126,则后面2个字节形成的16bits无符号整型数的值是payload的真实长度。注意,网络字节序,需要转换。
+ 如果值是127,则后面8个字节形成的64bits无符号整型数的值是payload的真实长度。注意,网络字节序,需要转换。

这里的长度表示遵循一个原则,用最少的字节表示长度(尽量减少不必要的传输)。举例说,payload真实长度是124,在0-125之间,必须用前7位表示;不允许长度1是126或127,然后长度2是124,这样违反原则。

      • Payload data
        应用层数据
      server解析client端的数据

      接收到客户端数据后的解析规则如下:

      • 1byte

        • 1bit: frame-fin,x0表示该message后续还有frame;x1表示是message的最后一个frame
        • 3bit: 分别是frame-rsv1、frame-rsv2和frame-rsv3,通常都是x0
        • 4bit: frame-opcode,x0表示是延续frame࿱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值