websocket是什么,websocket是基于tcp/ip协议封装的一套实现tcp连接的接口,或者说是工具。我们应该都知道他的业务应用逻辑。
1创建socket
2绑定
3监听
4等待数据
5接受数据
那么他和http之间有什么区别呢,websocket原理又是如何加密和解密的?
http协议:\r\n分割、请求头和请求体\r\n分割、无状态、短连接,属于超文本传输协议,对应于应用层,用于如何封装数据。
websocket协议:\r\n分割,创建连接后不断开、验证+数据加密,属于传输控制协议,对应于传输层,主要解决数据在网络中的传输。
websocket本质就是一个创建连接后不断开的socket,当连接成功之后,客户端会自动向服务端发送消息,包含: Sec-WebSocket-Key和magic_string。
什么是magic_string?
客户端向服务端发送消息时,会有一个’sec-websocket-key’和’magic string’的随机字符串(魔法字符串),
服务端接收到消息后会把他们连接成一个新的key串,进行编码、加密,确保信息的安全性。
所有服务端接收之后,会对该数据进行加密
事实上,我们第一次发送websocket请求也是一种http请求,我们只是把请求头Upgrade设置为websocket\r\n Connection: Upgrade\r\n,该字段用于改变 HTTP 协议版本或者是换用其他协议,对于Sec-WebSocket-Key 字段,它由客户端生成并发给服务端,用于证明服务端接收到的是一个可受信的连接握手,可以帮助服务端排除自身接收到的由非 WebSocket 客户端发起的连接,该值是一串随机经过 编码的字符串,服务端通过从客户端请求头中读取 Sec-WebSocket-Key 与一串全局唯一的标识字符串魔法字符串做拼接,生成长度为160位的 SHA-1 字符串,然后进行 编码,作为 Sec-WebSocket-Accept 的值回传给客户端。即解析头部构造字典、base64加密、构建响应头、发送、客户端校验,然后进行双工通道进行数据传输,这里借助其他博主的流程图帮助大家理解
发送的数据是加密,解密,根据payload_len的值进行处理:
-payload_len <= 125
-payload_len == 126
-payload_len == 127
获取内容:
-mask_key
数据
根据mask_key和数据进行位运算,就可以把值解析出来。
客户端通过ws.send()发送请求、服务器接收,并且send_msg加密发送
接收后解码指令如下例子