接前一篇文章:WebSocket入门到精通,就差这一篇了(1)
三、websocket通信原理
WebSocket协议本质上是⼀个基于TCP的协议。为了建⽴⼀个WebSocket连接,客户端浏览器首先要向服务器发起⼀个HTTP请求。这个请求和通常的HTTP请求不同,包含了⼀些附加头信息,通过这个附加头信息完成握手过程并升级协议的过程。
1. 建立连接
(1)客户端发起HTTP请求
客户端向服务器发起一个标准的HTTP请求,并在请求头中包含特定的WebSocket升级字段,以表明希望建立WebSocket连接。下面是一个http请求示例:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Version: 13
- “Upgrade: websocket”:请求升级到 WebSocket 协议。
- “Connection: Upgrade”:明确表示连接需要升级。
- “Sec-WebSocket-Key”:客户端生成的随机字符串,服务器通过它生成校验值。
- “Sec-WebSocket-Version”:协议版本(目前通常是 13)。
(2)服务器处理请求并响应
服务器收到HTTP请求后,验证请求是否满足WebSocket协议要求。若成功,服务器发送HTTP 101状态码作为响应,并包含必要的头部字段。下面是一个http应答示例:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
- “101 Switching Protocols”:表示协议已成功升级。
- “Upgrade: websocket”:确认协议升级到WebSocket。
- “Connection: Upgrade”:确认连接升级。
- “Sec-WebSocket-Accept”:基于客户端的 Sec-WebSocket-Key 和一个固定GUID,(258EAFA5-E914-47DA-95CA-C5AB0DC85B11) 计算的校验值,用于确认连接的安全性。
校验值计算过程:
1)将客户端的Sec-WebSocket-Key与固定 GUID 拼接。
2)对拼接后的字符串进行SHA-1哈希。
3)将哈希结果进行Base64编码,得到Sec-WebSocket-Accept。
(3)升级到WebSocket协议
握手成功后,客户端和服务器之间的连接从HTTP协议切换为WebSocket协议,开始使用 WebSocket帧进行双向通信。连接保持打开状态,直到显式关闭。通信过程中无需再发送HTTP头部,仅传输WebSocket帧,效率更高。
(4)双向通信
握手完成后,双方可以通过WebSocket数据帧进行双向实时通信,客户端可以发送消息到服务器。服务器也可以主动推送消息到客户端。如果连接失败情况,握手请求无效(如缺少必要头部字段),服务器会返回错误响应(如:400 Bad Request)。如果服务器不支持WebSocket协议,则不会进行升级。
更多内容请看下回。