websocket学习笔记

5 阅读2分钟

websocket 是什么

websocket是一个用于客户端与服务端双工通信的、基于tcp传输的、处于应用层的网络协议。

websocket有以下几个主要部分:

  1. websocket建立连接
  2. websocket的帧构成
  3. 内容传输
  4. 保持连接/心跳
  5. masking key与sec-websocket-key、sec-websocket-accept

websocket 建立连接

websocket协议建立连接是依赖http协议进行的。这个动作叫做协议升级

  1. 首先客户端向服务端发送一个get请求。这个请求里有以下关键字段:

    1. connection: upgrade 表明是申请升级协议
    2. upgrade:websocket 表明升级为websocket协议
    3. sec-websocket-key:由客户端随机生成的16字节随机字符base64而来的随机key。
    4. sec-websocket-version:表示申请升级的websocket协议版本。
  2. 服务器同意升级,返回一个状态码为101的response。之后虽然保持tcp连接,但协议从http切换为websocket。

    1. 同时返回时在header中加入sec-websocket-accept。这个是由sec-websocket-key计算得到的。

帧构成

关键的帧有这么几个

  1. fin,用于控制帧传输是否完毕。
  2. opcode,用来表明内容格式。
  3. expend length:内容长度
  1. masking:是否被掩码,在客户端向服务端发送时,进行掩码操作,始终为1。服务端向客户端发送时为0
  2. masking key:客户端随机生成的掩码。

内容传输

内容传输时,由fin来标志帧传输是否完毕,如果是0表示还有后续帧,如果为1表示传输结束。

opcode来表明传输内容,如果是0x01表示是文本,如果是0x02表示是二进制帧。除第一个内容帧表明格式之外,其他帧都为0x00,表明这是一个连续帧。

0x08代表断开连接。

心跳/连接保持

保持连接是靠心跳来实现的。

一方向另一方发送ping,另一方返回pong来确定依然连接。

ping pong分别由opcode的0x09和0xA来表示。

masking key和sec-websocket-key、sec-websocket-accept

sec-websocket-key、sec-websocket-accept实际上是为了保证其他服务器有意或者无意的发送的websocket请求干扰,浪费服务器资源。

masking key实际上是为了防止代理缓存污染攻击。

代理缓存污染攻击是指,攻击者通过伪造host的方式在代理服务器中留存用户想要访问的websocket服务器的缓存。当用户发送某个请求时,代理服务器对比host和url之后,将被污染的内容返回给用户,因此客户端随机生成masking key。