升级握手是怎么回事
WebSocket 借 HTTP 完成协议切换:客户端在请求头里带上升级声明与随机校验串,服务端若同意就返回 101 切换协议,并在响应头里给出按规则计算出的应答值,此后这条连接上的数据不再有 HTTP 头部,而是按帧格式传输。任何一个环节缺失,升级都会失败并退化为普通 HTTP 交互,表现就是「连接建立不起来」或「不断重连」。
基本信息
| 适用平台 | Wireshark / tshark 解析的 HTTP/1.1 与 WebSocket 流量 |
|---|---|
| 过滤字段 | http.upgrade contains "websocket" |
| 关键报文 | 请求侧的升级声明与校验串、响应侧的 101 与应答值 |
| 后续解析 | 升级成功后按 WebSocket 帧解析,HTTP 过滤器不再适用 |
典型使用场景
- 页面长连接建立失败,确认是握手被拒还是后续被断
- 排查代理未透传升级声明导致的连接失败
- 验证升级成功后长连接是否被中间设备按空闲超时掐断
- 通过心跳报文存在与否判断保活机制是否正常
- 对比不同客户端与服务端组合的握手兼容性
- 为实时消息类业务的连接稳定性提供依据
观察要点
观察要点
http.upgrade contains "websocket"
# 客户端: 升级声明 + 连接声明 + 随机校验串
# 服务端: 101 Switching Protocols + 计算出的应答值
# 校验串与应答值按固定规则对应,不匹配说明中间设备改写过
# 之后帧不再有 HTTP 头,按 WebSocket 帧解析
websocket # 按帧查看后续数据观察项逐项读法
| 观察项 | 含义 | 异常表现 |
|---|---|---|
| 升级声明 | 请求协议切换 | 被代理剥离后握手必然失败 |
| 101 响应 | 服务端同意切换 | 返回 200 或 400 说明未完成升级 |
| 应答校验值 | 服务端按规则计算结果 | 缺失或不匹配多为中间设备改写 |
| 升级后的帧 | 实际业务数据 | 长期无帧说明连接已失效 |
| 心跳间隔 | 保活节奏 | 间隔大于中间设备空闲阈值会被掐断 |
升级完成后该连接上不再有 HTTP 头部,继续用 HTTP 过滤器会看到空结果,应按帧格式过滤。
升级后的长连接被中间设备按空闲超时切断是常见现象,业务侧需要依赖心跳维持连接存活。