一、首先我们要了解 Websocket 握手的原理
请求头特征
-
HTTP Header 中 Connection 字段的值必须为 Upgrade
-
HTTP Header 中 Upgrade 字段必须为 websocket
-
Sec-WebSocket-Key 字段的值是采用 base64 编码的随机 16 字节字符串
-
Sec-WebSocket-Protocol 字段的值记录使用的子协议,比如 binary base64
Origin 表示请求来源
响应头特征
-
状态码是 101 表示 Switching Protocols
-
Upgrade / Connection / Sec-WebSocket-Protocol 和请求头一致
-
Sec-WebSocket-Accept 是通过请求头的 Sec-WebSocket-Key 生成
二、短连接轮询、长连接、Websocket 横向对比
1. 短连接轮询
-
且通过宏任务发起,受限于 Event Loop,无法保证及时性
2. 长连接
-
HTTP keep-alive 开启后虽然 TCP 可以复用,但是 Header 重复的问题并没有解决
-
同时 HTTP keep-alive 还有一个有效期,有效期结束后服务端会发侦查帧探查 TCP 是否有效
题外话:
HTTP keep-alive 的作用是,告知服务端持久化当前的 TCP 连接,不要立即断开,以便后续的 HTTP 请求复用它,也就是我们所说的「长连接」
HTTP 的 keep-alive 是为了让 TCP 活久一点,而 TCP