空闲WebSockets的开销

时间:2014-10-14 07:30:37

标签: node.js tcp websocket keep-alive qtwebsockets

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

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

谢谢!

1 个答案:

答案 0 :(得分:28)

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

服务器客户端可以启用TCP keepalive。 keepalive是在设置ACK标志的情况下发送的零长度数据包,并且在线路上仅发送54个字节,另外54个用于响应。默认情况下,TCP keepalive每两个小时发送一次。换句话说,完全可以忽略不计。

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

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

然而...

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

每5分钟PING / PONG的费用为每小时1.5 - 4.4 kB(每位客户)。


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