一、简析
WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成握手。
二、WebSocket和HTTP的关系
HTTP有1.1和1.0之说,也就是所谓的keep-alive,把多个HTTP请求合并为一个,但是Websocket其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充可以通过上图理解。
Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。。
三、WebSocket特点
1、HTTP简析
HTTP是一种非持久化连接,生命周期通过request和response来界定,且request=response。
2、WebSocket
WebSocket是持久化协议。
四、WebSocket握手过程:
Web客户端,请求HTTP Header信息:
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket # WebSocket 协议添加 Connection: Upgrade # WebSocket 协议添加 Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== # Base64 encode的值,这个是浏览器随机生成的,验证服务器是否支持WebSocket Sec-WebSocket-Protocol: chat, superchat # 用户定义的字符串,用来区分同URL下,不同的服务所需要的协议 Sec-WebSocket-Version: 13 #告诉服务器所使用的协议版本 Origin: http://example.com
Web服务端响应:
HTTP/1.1 101 Switching Protocols Upgrade: websocket #通知客户端,服务端已经切换协议 Connection: Upgrade #通知客户端,服务端已经切换协议 Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= #经服务器确认,且加密的Sec-WebSocket-Key Sec-WebSocket-Protocol: chat
五、WebSocket数据包分析
WebScoket协议中,数据以帧序列的形式传输。考虑到数据安全性,客户端向服务器传输的数据帧必须进行掩码处理。服务器若接收到未经过掩码处理的数据帧,则必须主动关闭连接。
服务器向客户端传输的数据帧一定不能进行掩码处理。客户端若接收到经过掩码处理的数据帧,则必须主动关闭连接。
针对上情况,发现错误的一方可向对方发送close帧(状态码是1002,表示协议错误),以关闭连接。
帧协议:
六、WebSocket消息分片
分片目的是发送长度未知的消息。如果不分片发送,即一帧,就需要缓存整个消息,计算其长度,构建frame并发送;使用分片的话,可使用一个大小合适的buffer,用消息内容填充buffer,填满即发送出去。
附加:
1、Websocket和Node.js内Socket.io的关系
Socket.IO封装了Websocket,同时包含了其它的连接方式,比如Ajax。
原因:在于不是所有的浏览器都支持websocket,通过socket.io的封装,你不用关心里面用了什么连接方式。你在任何浏览器里都可以使用socket.io来建立异步的连接。socket.io包含了服务端和客户端的库,如果在浏览器中使用了socket.io的js,服务端也必须同样适用。如果你很清楚你需要的就是websocket,那可以直接使用websocket。
2、目前支持WebSocket的浏览器
Hixie 75/76:
Chrome 4.0
Safari 5.0.2
iOS 4.2
Firefox 4.0
Opera 11
HyBi-07+:
Chrome 14.0
Firefox 6.0
IE9, IE10
Hybi-10:
Chrome 14
Firefox 7
IE 10
3、目前支持WebSocket的服务器开发语言
基本上都可以
参考链接:
https://www.zhihu.com/question/20215561/answer/40316953
http://www.cnblogs.com/caosiyang/archive/2012/08/14/2637721.html