分享

Websocket协议解析

 猎狐肥 2020-10-28

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.1
Connection:Upgrade
Host:127.0.0.1:8088
Origin:null
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==
Sec-WebSocket-Version:13
Upgrade:websocket

服务端返回内容:
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Server:beetle websocket server
Upgrade:WebSocket
Date:Mon, 26 Nov 2012 23:42:44 GMT
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:content-type
Sec-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 所代表的意思


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多