首页/网络/抓包与流量分析速查/WebSocket 升级握手判读
应用层报文判读71 条

WebSocket 升级握手判读

Upgrade: websocket 与 101 响应完成协议切换:配对看 Upgrade/Connection 头与 Sec-WebSocket-Key 应答,缺失任一步骤都退化为普通 HTTP。

升级握手是怎么回事

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 过滤器会看到空结果,应按帧格式过滤。
升级后的长连接被中间设备按空闲超时切断是常见现象,业务侧需要依赖心跳维持连接存活。

易错点

  • 升级后继续用 HTTP 过滤器:会显示为空,误以为没有数据或抓包失败
  • 忽略代理是否透传升级声明:声明被剥离时握手失败并返回普通响应,问题却被归到服务端
  • 没有心跳机制就上长连接:中间设备的空闲超时会让连接被静默切断,表现为周期性重连
  • 只看响应码不看校验值:101 存在但校验值不匹配时,部分客户端仍会拒绝后续通信

数据来源与参考

  • RFC 6455(WebSocket)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌