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进行同样的编码,然后比对,一致就开始通信。