webSocket基本知识

webSocket是基于TCP的一种协议,与HTTP一样是应用层协议。

webSocket有以下几个特点:

1. 基于TCP,服务端比较容易实现。
2. 与HTTP协议有着良好的兼容性。默认端口也是80或443。握手阶段使用http协议,因此握手不容易被屏蔽,
能通过各种HTTP代理服务器。
3. 数据格式轻量,性能开销小,通信高效。
4. 可发送文本,也可发送二进制数据。
5. 没有同源限制,客户端可以与任何服务器通信,可以同webSocket实现跨域通信
6. 协议标识符是ws(加密的话,则是wss),服务器网址就是URL

1. webSocket的握手

1.1 首先是TCP三次握手,略

1.2 发送http请求,携带升级头

GET /chat HTTP/1.1
Host: server.example.com
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com

有5项是webSocket的:

其中

Connection: Upgrade
Upgrade: websocket

表明协议升级,升级为websocket协议。

Sec-WebSocket-Key: key表示一个base64加密的密钥
Sec-WebSocket-Protocol: protocol表示客户端和服务端想使用哪种子协议
Sec-WebSocket-Version: version表示是websocket的哪个版本

1.3 服务器http响应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat

服务端的响应状态码是101,表示使用HTTP协议的101状态进行协议切换。

响应包含4个webSocket的头

其中同样包含连接升级2个头

Connection: Upgrade
Upgrade: websocket

Sec-WebSocket-Accept头表示服务接受升级,同意使用webSocket。

accept后面的key是客户端的key与一个固定的GUID拼接后,sha1哈希,再base64编码而来。
其中固定的GUID是一个Magic Sting。如下:

Base64(sha1(client Sec-WebSocket-key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))

客户端收到Sec-WebSocket-Accept后,将本地的Sec-WebSocket-Key进行同样的编码,然后比对,一致就开始通信。

原文地址:https://www.cnblogs.com/mengff/p/12905650.html