WebSocket协议

1.握手协议

  • 客户端的首行遵照 Request-Line 格式,例:GET /chat HTTP/1.1
  • 来自服务器的首行遵照 Status-Line 格式,例:HTTP/1.1 101 Switching Protocol   /* 101以外的任何状态码表示 WebSocket 握手没有完成且 HTTP 语义仍适用 */

1.1 握手请求

  • 必须包含Host头字段,其值包含/host/加上可选的“:”后跟/port/(当没用默认端口时),例:Host: 192.168.0.215:8002
  • 必须包含一个Upgrade头字段,其值必须包含“websocket”关键字,例:Upgrade: websocket
  • 必须包含一个Connection头字段,其值必须包含“Upgrade”标记,例:Connection: keep-alive, Upgrade
  • 必须包含一个名字为 Sec-WebSocket-Key的头字段,这个头字段的值必须是临时(nonce)组成的一个随机选择的已经base64编码的(参见[RFC4648]第4章)16位的值。 临时必须是为每个连接随机选择的,例:Sec-WebSocket-Key: n5pasMQsItEl/c2FMdokJg==
  • 必须包含一个名字为 Sec-WebSocket-Version 的头字段。该头字段的值必须是13,例:Sec-WebSocket-Version: 13
  • 可以包含一个名字为Sec-WebSocket-Protocol的头字段
  • 可以包含一个名字为Sec-WebSocket-Extensions的头字段
  • 可以包含任意其他头字段

1.2 握手响应

 

  • 如果收到的服务器的状态码不是101,客户端处理每个 HTTP[RFC2616] 程序的响应,例:
  • 如果响应缺少一个Upgrade头字段或Upgrade头字段包含的值不是一个不区分大小写的ASCII匹配值“websocket”,客户端必须将 WebSocket 连接当成失败,例:Upgrade: websocket
  • 如果想要缺少一个Connection头字段或Connection头字段不包含一个不区分大小的ASCII匹配值“Upgrade”符号,客户端必须将 WebSocket 连接当成失败,例:Connection: Upgrade
  • 如果想要缺少一个Sec-WebSocket-Accept头字段或Sec-WebSocket-Accept包含一个不是Sec-WebSocket-Key(一个字符串,不是base64编码的)与字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”但忽略任何前导和结尾空格相关联的,例:base64编码的SHA-1值,客户端必须将 WebSocket 连接当成失败,例:Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  • 如果响应包含一个Sec-WebSocket-Extensions头字段且此头字段表示使用一个扩展但没有出现在客户端握手中(服务器表示的一个扩展,不是客户端请求的),客户端必须将 WebSocket 连接当成失败
  • 如果响应包含一个Sec-WebSocket-Protocol头字段且该头字段表示使用一个子协议但没出现在客户端握手中(服务器表示的一个子协议,不是客户端请求的),客户端必须将 WebSocket 连接当成失败

2.帧数据类型

  • 文本数据类型:解释为UTF-8文本
  • 二进制数据类型:应用解释
  • 控制帧类型:不包含应用数据
  • 客户端必须掩码(mask)它发送到服务器的所有帧,当收到一个没有掩码的帧时,服务器必须关闭连接,发送一个状态码1002(协议错误)的Close帧
  • 服务器必须不掩码发送到客户端的所有帧。 如果客户端检测到掩码的帧,它必须关闭连接。 发送状态码1002(协议错误)

 

3.校验

  • 获取请求中的Sec-WebSocket-Key的值字段
  • 和“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”进行拼接,计算SHA-1值,使用base64编码
  • 作为Sec-WebSocket-Accept的值填写在响应消息中
posted @ 2016-07-21 10:51  wkccs  阅读(409)  评论(0编辑  收藏  举报