我们有一个 SPA,在客户端和服务器(NodeJs)端都运行 SockJs。对于 Windows 工作站,我们可以毫无问题地维护与部署在 Windows Azure 中的服务器的 Web 套接字连接。但对于一些使用 Mac OS X 工作站的同事来说,他们最近几周经常遇到 Web 套接字随机断开的情况。Chrome 和 Firefox 都会发生这种情况,因此这似乎是较低操作系统级别的问题。
据他们所知,OS X 没有任何可能影响网络堆栈的更新。似乎也没有发现 SockJs 有任何问题。有针对 OS X 的故障排除技巧吗?
答案1
因此我设法借了一位同事的 Macbook,并在上面安装了 Wireshark。
监控 HTTP 流量,我看到预期的 websocket 升级交换正在进行,进而,我注意到服务器发送了 TCP 级 RST 重置数据包。随后,客户端工作站必须再次启动全新的 HTTP 连接和 websocket 升级。最终导致服务器再次发送 RST。
在尝试比较我的 Windows 工作站上的情况时,我发现网络堆栈每 3-5 秒自动向服务器发送保持活动的 ACK 数据包。看来 Mac OS 网络堆栈没有意识到现有的 HTTP 连接已经升级到 websocket,因此不会费心发送必要的 ACK 数据包来通知服务器它仍然有效。
为了在 Mac 上解决这个问题,我们编写了客户端来定期发送“ping”数据以维持 websocket 连接。