WebSocket

1、WebSocket连接过程 
 发起握手通过Http连接格式如下:
 GET / HTTP/1.1
 Upgrade: websocket
 Connection: Upgrade
 Host: 10.10.51.47:10060
 Origin: http://10.10.51.60:8080
 Sec-WebSocket-Protocol: sip
 Pragma: no-cache
 Cache-Control: no-cache
 Sec-WebSocket-Key: 62J73FTC94EYNZxwzjRlsQ==
 Sec-WebSocket-Version: 13
 Sec-WebSocket-Extensions: x-webkit-deflate-frame
 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36

Sec-WebSocket-Key:客户端携带的凭证
Sec-WebSocket-Protocol:数据包内容

Server 返回101
 Sec-WebSocket-Accept通过如下方式计算:
 1、截取客户端Sec-WebSocket-Key并且加上一个自定义字符串(36),然后通过SHA-1算法加密,得到20字节二进制数据,在经过Base64生成,计算方式如下:
  SHA1 sha1 = new SHA1CryptoServiceProvider();
  byte[] bytes_sha1_in = Encoding.UTF8.GetBytes(request.SecWebSocketKey+ "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
  byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
  string str_sha1_out = Convert.ToBase64String(bytes_sha1_out);
  response.SecWebSocketAccept = str_sha1_out;
 返回应答示例如下:
 HTTP/1.1 101 Switching Protocols
 Upgrade: websocket
 Connection: Upgrade
 Sec-WebSocket-Accept: G4KcqL3ZrPKVHMR+XCb+kb9NzKE=
 Sec-WebSocket-Protocol: sip
 Sec-WebSocket-Version: 13
 Content-Length: 0
2、WebSocket数据长度获取方式
 1、客户端向服务器传输的数据帧必须进行掩码处理。服务器若接收到未经过掩码处理的数据帧,则必须主动关闭连接。
 2、服务器向客户端传输的数据帧一定不能进行掩码处理。客户端若接收到经过掩码处理的数据帧,则必须主动关闭连接。
 3、发现错误的一方可向对方发送close帧(状态码是1002,表示协议错误),以关闭连接。
3、帧协议
    WebSocket数据帧结构如下图所示:
      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 ...                |
     +---------------------------------------------------------------+

     FIN:1位 表示这是消息的最后一帧(结束帧),一个消息由一个或多个数据帧构成。若消息由一帧构成,起始帧即结束帧。
     RSV1,RSV2,RSV3:各1位 如果定义了扩展,即为非0值。如果接收的帧此处非0,扩展中却没有该值的定义,那么关闭连接
     OPCODE:4位 如果接收到未知的opcode,接收端必须关闭连接。值如下
 0x0表示附加数据帧
 0x1表示文本数据帧
 0x2表示二进制数据帧
 0x3-7暂时无定义,为以后的非控制帧保留
 0x8表示连接关闭
 0x9表示ping
 0xA表示pong
 0xB-F暂时无定义,为以后的控制帧保留
     MASK:1位 用于标识PayloadData是否经过掩码处理。如果是1,Masking-key域的数据即是掩码密钥,用于解码PayloadData。客户端发出的数据帧需要进行掩码处理,所以此位是1。
 数据解码方法 res = data[n]^mask[n%4] mask为数据的前4位
     Payload length:7位,7+16位,7+64位 PayloadData的长度(以字节为单位)。
 如果其值在0-125,则是payload的真实长度。
 如果值是126,则后面2个字节形成的16位无符号整型数的值是payload的真实长度。注意,网络字节序,需要转换。
 如果值是127,则后面8个字节形成的64位无符号整型数的值是payload的真实长度。注意,网络字节序,需要转换。
     WebSocket协议规定数据通过帧序列传输。
 客户端必须对其发送到服务器的所有帧进行掩码处理。
 服务器一旦收到无掩码帧,将关闭连接。服务器可能发送一个状态码是1002(表示协议错误)的Close帧。
 而服务器发送客户端的数据帧不做掩码处理,一旦客户端发现经过掩码处理的帧,将关闭连接。客户端可能使用状态


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值