Websocket协议解析
Html5引入webSocket来实现数据的实时交互。 要想自己编写个webSocket服务器,必须对webSocket协议有所了解才行。
WebSocket协议主要分为两部分:连接许可验证 和验证后的数据交互。
连接许可验证就是进行一次握手操作,由Client发送一个类似于HTTP的请求,服务端获取请求后 将发送过来的数据中的 Sec-WebSocket-Key 解析出来,然后按照把“Sec-WebSocket-Key”加上一个魔幻字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”。使用SHA-1加密,之后进行BASE-64编码,将结果做为“Sec-WebSocket-Accept”头的值,返回给客户端。
连接请求内容:
GET / HTTP/1.1Connection:UpgradeHost:127.0.0.1:8088Origin:nullSec-WebSocket-Extensions:x-webkit-deflate-frameSec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==Sec-WebSocket-Version:13Upgrade:websocket
服务端返回内容:
HTTP/1.1 101 Switching ProtocolsConnection:UpgradeServer:beetle websocket serverUpgrade:WebSocketDate:Mon, 26 Nov 2012 23:42:44 GMTAccess-Control-Allow-Credentials:trueAccess-Control-Allow-Headers:content-typeSec-WebSocket-Accept:FCKgUr8c7OsDsLFeJTWrJw6WO8Q=
经过服务器的返回处理后连接成功,后面就可以进行TCP通讯.WebSocket在握手后发送数据并象下层TCP协议那样由用户自定义,还是需要遵循对应的应用协议规范。
数据交互格式如下:
各字段的解释:
FIN 1bit 表示信息是否结束, 如果为1则该消息为消息尾部,如果为零则还有后续数据包;
RSV 1-3 1bit 备用字段 默认都为 0
Opcode 4bit 消息类型,消息类型暂定有15种,其中有几种是预留设置。
Mask 1bit 掩码,是否加密数据,(客户端发送给后端时,mask必须为1,否则close连接;服务器发送给前端时,mask必须为0,否则断开连接)
Payload len 7bit 数据的长度,当这个7 bit的数据 == 126 时,后面的2 个字节表示数据长度,当它 == 127 时,后面的 8 个字节表示数据长度
Masking-key 0/32 bit 掩码值( Mask为1时才有)
Payload data 长度为Payload len的数据,如果有掩码 需要用mask-Key来异或 才能得到
下图为opcode 所代表的意思