NOTE

2.2 WebSocket

1. WebSocket是什么 WebSocket与Http一样,也是一种协议 2. 为什么需要WebSocket 为了解决Http的一个缺点:服务器有数据要通知给用户的时候无法主动推送/通信仅能由客户端发起 3. WebSocket作用 - 实时获取服务器数据 websocket之前只能使用aja

计算机网络创建于 更新于 historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. WebSocket是什么

WebSocket与Http一样,也是一种协议

2. 为什么需要WebSocket

为了解决Http的一个缺点:服务器有数据要通知给用户的时候无法主动推送/通信仅能由客户端发起

3. WebSocket作用

  • 实时获取服务器数据 websocket之前只能使用ajax轮询或者long poll,前者每隔一段时间请求服务器获取数据【即同步非阻塞】,后者请求时如果没有数据一直阻塞到有数据返回【即同步阻塞】
  • 持久链接减少了请求头的开销 Http的keep alive,每个Http Transaction都需要传输header信息,开销大

4. Http与WebSocket的关系

WebSocket借用了Http完成握手 握手过程如下:

  1. 客户端发起request header
    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket//通知服务器表示发起的是websocket协议
    Connection: Upgrade//通知服务器表示发起的是websocket协议
    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==//用于验证服务器是否支持websocket
    Sec-WebSocket-Protocol: chat, superchat//需要使用服务器的什么服务
    Sec-WebSocket-Version: 13//使用的版本
    Origin: http://example.com
  2. 服务器返回response header
    HTTP/1.1 101 Switching Protocols
    Upgrade: websocket
    Connection: Upgrade//升级到了wbesocket
    Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=//与Sec-WebSocket-Key:对应
    Sec-WebSocket-Protocol: chat//最后使用的服务

5. WebSocket报文格式

  1. FIN 1个bit位,用来标记当前数据帧是不是最后一个数据帧,因为一个消息可能会分成多个数据帧来传递,当然,如果只需要一个数据帧的话,第一个数据帧也就是最后一个。
  2. RSV1, RSV2, RSV3 这三个,各占用一个bit位,根据RFC的介绍,这三个bit位是用做扩展用途,没有这个需求的话设置位0。
  3. Opcode 故名思议,操作码,占用4个bit位,也就是一个16进制数,它用来描述要传递的数据是什么或者用来干嘛的,只能为下面这些值:
  • 0x0 denotes a continuation frame 标示当前数据帧为分片的数据帧,也就是当一个消息需要分成多个数据帧来传送的时候,需要将opcode设置位0x0。
  • 0x1 denotes a text frame 标示当前数据帧传递的内容是文本
  • 0x2 denotes a binary frame 标示当前数据帧传递的是二进制内容,不要转换成字符串
  • 0x8 denotes a connection close 标示请求关闭连接
  • 0x9 denotes a ping 标示Ping请求
  • 0xA denotes a pong 标示Pong数据包,当收到Ping请求时自动给回一个Pong 目前协议中就规定了这么多,0x30x7以及0xB0xF都是预留作为其它用途的。
  1. MASK 占用一个bit位,标示数据有没有使用掩码,RFC中有说明,服务端发送给客户端的数据帧不能使用掩码,客户端发送给服务端的数据帧必须使用掩码。 如果一个帧的数据使用了掩码,那么在Maksing-key部分必须是一个32个bit位的掩码,用来给服务端解码数据。
  2. Payload len 数据的长度,默认位7个bit位。 如果数据的长度小于125个字节(注意:是字节)则用默认的7个bit来标示数据的长度。 如果数据的长度为126个字节,则用后面相邻的2个字节来保存一个16bit位的无符号整数作为数据的长度。 如果数据的长度大于126个字节,则用后面相邻的8个字节来保存一个64bit位的无符号整数作为数据的长度。
  3. Masking-key 数据掩码,如果MASK设置位0,则该部分可以省略,如果MASK设置位1,怎Masking-key位一个32位的掩码。用来解码客户端发送给服务端的数据帧。
  4. Payload data 该部分,也是最后一部分,是帧真正要发送的数据,可以是任意长度。

6. 参考