空闲WebSockets的开销

假设我有一个websocket可以在任何时候接收事件,但是大多数是闲置的,在初始连接之后会消耗多less带宽以保持活跃?

对于它的价值,服务器是使用ws NodeJS,客户端使用的是QtWebSockets。

谢谢!

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

  • 您发送或接收数据
  • TCP保持活动是显式启用的

服务器客户端可以启用TCP保持活动。 keepalive是一个零长度的数据包,带有ACK标志,只有54个字节被发送,另外还有54个字符用于响应。 默认情况下,TCP Keepalive每两小时发送一次。 换句话说,完全可以忽略不计。

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

ws不会自动执行任何keepalive,QtWebSockets也不会。 所以要回答你的问题,一个默认configuration确实使用零带宽来维持TCP连接。

然而…

Keepalive非常重要,因为中间设备(即NAT路由器)将丢弃不活动的TCP连接。 根据你的服务器和你的客户端之间的networking,这意味着如果你没有任何keepalive,你的客户将失去他们的连接(可能不知道,这是不好的),将不得不重新build立WebSocket会话。 就带宽而言,这可能会比启动健全的Keepalive昂贵得多。

每5分钟一次PING / PONG费用为每小时1.5-4.4 kB(每个客户端)。


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