协议与握手
Upgrade 握手、帧、ping/pong、关闭码。
30 分钟
协议与握手
WebSocket 不是独立端口协议,而是 HTTP Upgrade 升级而来。Nginx 必须透传 Upgrade 头(ngx-proxy、ws-nginx)。
学习目标
- 读懂握手请求/响应
- 理解文本帧、二进制帧与 ping/pong
- 知道常见关闭码含义
握手(Opening Handshake)
客户端先发普通 HTTP 请求,带 Upgrade: websocket:
GET /ws HTTP/1.1
Host: coderoadmap.local
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
服务端 101 Switching Protocols 后,同一 TCP 连接切换为 WebSocket 帧协议,不再走 HTTP 语义。
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Spring Boot 内嵌 Tomcat 自动处理;自定义校验在 ws-auth。
帧与心跳
| 类型 | 用途 |
|---|---|
| 文本帧 | JSON 消息(STOMP 载荷) |
| 二进制帧 | 文件、Protobuf |
| ping / pong | 保活、检测半开连接 |
| close | 带 code + reason 优雅关闭 |
// 浏览器 API 自动处理 ping/pong;可监听 close
ws.onclose = (e) => console.log(e.code, e.reason);
常见关闭码:1000 正常结束;1006 异常断开(无 close 帧);1008 策略违规(如鉴权失败)。
与 HTTP/2、HTTP/3
浏览器里 WebSocket 仍常基于 HTTP/1.1 Upgrade。经 Nginx 反代时 proxy_http_version 1.1 必不可少。
练习
- 用浏览器 DevTools → Network → WS 查看握手头
- 解释
Sec-WebSocket-Accept如何由 Key 算出 - 对照 ws-client 看重连时是否收到 1006
小结
Upgrade 握手 + 帧 = WebSocket 全貌。 下一课 Spring 原生 WebSocketHandler。
加载本节练习…