← 中文资源

简体中文版本

用 websocat 检查 WebSocket 帧

用 websocat 连接线上 WebSocket 端点,手工发送帧、观察服务端推送,诊断浏览器开发者工具掩盖的协议层问题。

阅读英文原文

目标

浏览器工具能看 WebSocket 帧但不让你自己发,还把失败藏在一个红色图标后面。websocat 把终端变成原始客户端:你能看到握手过程、发送任意帧、并精确观察服务端何时推送了什么。当数据流停止更新时,一次连接就能回答到底是服务端沉默还是客户端停止处理。

步骤要点

  1. 用 websocat 连接带令牌的 wss 地址,观察握手日志确认会话建立;握手失败会立刻显示关闭码。
  2. 只观察不发送,静置 30 秒看服务端是否仍在推帧:有输出说明传输正常、问题在客户端处理;完全沉默则指向服务端或中间设备。
  3. 手工发送一条订阅帧(如 subscribe orders),读取回执与频道数据,证明服务端逻辑本身工作正常。
  4. 用 –ping-interval 25 每 25 秒发 ping 并观察连接是否越过 60 秒存活,据此判断是否有中间代理的空闲超时在杀连接。

排错提示

握手 401/403 多半是令牌过期或传递方式不符,需确认鉴权在查询串、请求头还是首帧里;连接总在整秒附近掉线(如 60 秒)基本是负载均衡的空闲超时,应缩短应用层或协议层 ping 间隔;收到二进制乱码说明服务端用 msgpack 或 protobuf 编码,加 –binary 并用对应工具解码。

适用边界

手工帧绕过了客户端序列化,客户端编码器的缺陷不会被这种方法暴露;依赖完整浏览器上下文的鉴权(如绑定 Cookie 的会话)在终端里较难复现。

代码示例

# Send one subscription frame, watch what comes back
echo '{"op":"subscribe","channel":"orders"}' | \
  websocat "wss://stream.example.com/ws?token=$TOKEN"

# Keep the link warm through a proxy idle timeout
websocat --ping-interval 25 "wss://stream.example.com/ws?token=$TOKEN"