time 
设为首页】【收藏本站
当前位置: 主页 > WEB教程 > Html教程 > 详解HTML5的WebSocket数据包协议

详解HTML5的WebSocket数据包协议

时间:2012-12-12 23:10 点击:5995次 字体:[ ]




 其实我一直想不明白HTML5包装个应用层办议作为Socket通过基础目的是为了什么,其实直接支持Socket tcp相对来说更加简单灵活.既然标准已经制定而浏览器也支持那对于我们开发者来说只能用的分.最新版本的WebSocket协议于2011-12其标准规范已经明确下来,所以现在可以根据这标准进行相应的开发.详细参考http://datatracker.ietf.org/doc/rfc6455/?include_text=1

WebSocket协议主要分为两部分,第一部分是连接许可验证和验证后的数据交互.连接许可验证比较简单,由Client发送一个类似于HTTP的请求,服务端获取请求后根据请求的KEY生成对应的值并返回.

连接请求内容:

  1. GET / HTTP/1.1 
  2.  
  3. Connection:Upgrade 
  4.  
  5. Host:127.0.0.1:8088 
  6.  
  7. Origin:null 
  8.  
  9. Sec-WebSocket-Extensions:x-webkit-deflate-frame 
  10.  
  11. Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw== 
  12.  
  13. Sec-WebSocket-Version:13 
  14.  
  15. Upgrade:websocket 

服务端接收请求后主要是成针对Sec-WebSocket-Key生成对就Sec-WebSocket-Accept 的key,生成Sec-WebSocket-Accept 值比较简单就是Sha1(Sec-WebSocket-Key+258EAFA5-E914-47DA-95CA-C5AB0DC85B11)即可,C#代码如下:

  1. SHA1 sha1 = new SHA1CryptoServiceProvider(); 
  2.  
  3. byte[] bytes_sha1_in = Encoding.UTF8.GetBytes(request.SecWebSocketKey+ "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"); 
  4.  
  5. byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in); 
  6.  
  7. string str_sha1_out = Convert.ToBase64String(bytes_sha1_out); 
  8.  
  9. response.SecWebSocketAccept = str_sha1_out; 

服务端返回内容:

  1. HTTP/1.1 101 Switching Protocols 
  2.  
  3. Connection:Upgrade 
  4.  
  5. Server:beetle websocket server 
  6.  
  7. Upgrade:WebSocket 
  8.  
  9. Date:Mon, 26 Nov 2012 23:42:44 GMT 
  10.  
  11. Access-Control-Allow-Credentials:true 
  12.  
  13. Access-Control-Allow-Headers:content-type 
  14.  
  15. Sec-WebSocket-Accept:FCKgUr8c7OsDsLFeJTWrJw6WO8Q=  

 

经过服务器的返回处理后连接握手成功,后面就可以进行TCP通讯.WebSocket在握手后发送数据并象下层TCP协议那样由用户自定义,还是需要遵循对应的应用协议规范...这也是在文章之说没有直接基于Socket tcp方便的原因. 

 数据交互协议:

详解HTML5的WebSocket数据包协议_www.fengfly.com

这图有点难看懂...里面包括几种情况有掩码,数据长度小于126,小于UINT16和小于UINT64等几种情况.后面会慢慢详细说明.整个协议头大概分三部分组成,第一部分是描述消息结束情况和类型,第二部分是描述是否存在掩码长度,第三部分是扩展长度描述和掩码值.

从图中可以看到WebSocket协议数据主要通过头两个字节来描述数据包的情况

第一个字节

最高位用于描述消息是否结束,如果为1则该消息为消息尾部,如果为零则还有后续数据包;后面3位是用于扩展定义的,如果没有扩展约定的情况则必须为0.可以通过以下c#代码方式得到相应值

 

  1. mDataPackage.IsEof = (data[start] >> 7) > 0; 



本文地址 : http://www.fengfly.com/plus/view-210878-1.html
标签: HTML5 WebSocket
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: