16

假设我有一个 websocket 可能随时接收事件,但大部分时间是空闲的,在初始连接后将消耗多少带宽以使其保持活动状态?

值得一提的是,服务器是ws使用 NodeJS 的,而客户端使用的是 QtWebSockets。

谢谢!

4

1 回答 1

34

一旦建立(意味着三次握手完成),原始 TCP 连接使用零带宽,除非:

服务器客户端可以启用 TCP keepalives。一个keepalive是一个零长度的数据包,带有ACK标志集,在网络上只发送54个字节加上另外54个字节作为响应。默认情况下,TCP keepalive 每两小时发送一次。换句话说,完全可以忽略不计。

WebSockets 也有自己的 keepalive 机制(处理代理)。服务器客户端可以发送一个帧,而另一端必须用一个帧PING响应。PONG虽然没有浏览器端的 JS API 来发送PINGs,但节点服务器可能会发送它们,并且兼容的浏览器会自动响应。(QtWebSockets 确实有一个 API 来发送PINGs。)默认情况下不会发生这种情况;你必须手动完成。WebSocketPINGPONG帧每个至少 7 个字节,最多 131 个字节(加上 54 个字节的 TCP/IP 开销)。因此,单个PING/PONG成本在 122 到 370 个字节之间。

ws 不会自动执行任何保活,QtWebSockets 也不会。因此,为了回答您的问题,默认配置确实使用零带宽来维持 TCP 连接。

然而...

Keepalive 很重要,因为中间设备(即 NAT 路由器)会丢弃不活动的 TCP 连接。根据您的服务器和客户端之间的网络,这意味着如果您没有任何保活,您的客户端将失去连接(可能不知道,这很糟糕),并且必须重新建立 WebSocket 会话. 就带宽而言,这可能比启用理智的保活要昂贵得多。

A PING/PONG每 5 分钟花费 1.5 - 4.4 kB 每小时(每个客户端)。


注意:socket.io 有自己的 keepalive 机制(与 WebSockets 分开),默认启用。sio keepalive 由 sio 库管理,并发生在 WebSocket 数据通道上(与 WebSocket PING/PONG不同,它们是控制帧)。socket.io 服务器每 30 秒发送一个 8 字节(+开销)的 keepalive 消息,相当于每小时大约 15 kB。

于 2014-10-14T19:29:06.140 回答