假设我有一个 websocket 可能随时接收事件,但大部分时间是空闲的,在初始连接后将消耗多少带宽以使其保持活动状态?
值得一提的是,服务器是ws
使用 NodeJS 的,而客户端使用的是 QtWebSockets。
谢谢!
假设我有一个 websocket 可能随时接收事件,但大部分时间是空闲的,在初始连接后将消耗多少带宽以使其保持活动状态?
值得一提的是,服务器是ws
使用 NodeJS 的,而客户端使用的是 QtWebSockets。
谢谢!
一旦建立(意味着三次握手完成),原始 TCP 连接使用零带宽,除非:
服务器或客户端可以启用 TCP keepalives。一个keepalive是一个零长度的数据包,带有ACK
标志集,在网络上只发送54个字节加上另外54个字节作为响应。默认情况下,TCP keepalive 每两小时发送一次。换句话说,完全可以忽略不计。
WebSockets 也有自己的 keepalive 机制(处理代理)。服务器或客户端可以发送一个帧,而另一端必须用一个帧PING
响应。PONG
虽然没有浏览器端的 JS API 来发送PING
s,但节点服务器可能会发送它们,并且兼容的浏览器会自动响应。(QtWebSockets 确实有一个 API 来发送PING
s。)默认情况下不会发生这种情况;你必须手动完成。WebSocketPING
和PONG
帧每个至少 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。