websocket 版本13的 握手算法

来源:互联网 发布:软件项目里程碑计划 编辑:程序博客网 时间:2024/05/22 01:44
问题终于搞好了,因为我用的是 Chrome  16.0.912.63,这个版本实现的是最新的HTML5 Websocket草案10的协议。而上面websocket4j实现在还是以前版本的协议。下面是草案10的主要协议:

Chrome早就采用了websocket草案10的协议,很多以前支持websocket的代码突然之间都用不了了,很多作者也没空更新,索性自己看了下草案,自己实现了一套。

握手协议还是非常简单的,Chrome发过来的header大概是这样的:

1<span style="line-height:21px;">GET / HTTP/1.1
2Upgrade: websocket
3Connection: Upgrade
4Host: localhost:5555
5Origin: http://localhost:8080
6Sec-WebSocket-Key: qMqFlQcLvR7vHivCzUhEbQ==
7Sec-WebSocket-Version: 13</span>

要答复的头大概是这样的:

1HTTP/1.1101Switching Protocols
2Upgrade: websocket
3Connection: Upgrade
4Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

实际上这里要处理的就是算出这个Sec-WebSocket-Accept的值。这个非常简单,首先拿到Sec-WebSocket-Key,也就是dGhlIHNhbXBsZSBub25jZQ==,把它和字符串258EAFA5-E914-47DA-95CA-C5AB0DC85B11拼在一起作为一个key,然后对这个key做一个SHA-1的加密,对加密后的字符串再base64就可以了。





3、第三种是带一个安全key的请求,结果是先以“SHA-1”进行加密,再以base64的加密,结果放在Sec-WebSocket-Accept请求头中返回的方式:

浏览器请求:

[plain] view plaincopy
  1. GET /ls HTTP/1.1  
  2. Upgrade: websocket  
  3. Connection: Upgrade  
  4. Host: www.xx.com  
  5. Sec-WebSocket-Origin: http://www.xx.com  
  6. Sec-WebSocket-Key: 2SCVXUeP9cTjV+0mWB8J6A==  
  7. Sec-WebSocket-Version: 8  

服务器回应:
[plain] view plaincopy
  1. HTTP/1.1 101 Switching Protocols  
  2. Upgrade: websocket  
  3. Connection: Upgrade  
  4. Sec-WebSocket-Accept: mLDKNeBNWz6T9SxU+o0Fy/HgeSw=  


原理:   握手的实现,首先要获取到请求头中的Sec-WebSocket-Key的值,再把这一段GUID "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"加到获取到的Sec-WebSocket-Key的值的后面,然后拿这个字符串做SHA-1 hash计算,然后再把得到的结果通过base64加密,就得到了返回给客户端的Sec-WebSocket-Accept的http响应头的值。






接下来就是解析浏览器发来的数据了,这个相对来说要麻烦很多,相比草案7.6变得更复杂了。下图是数据传输的格式:

各个值的具体含义可以参考这个中文翻译:http://blog.csdn.net/fenglibing/article/details/6852497,英文原文在这里:http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-10#section-4.2
原创粉丝点击