假设我有一个可以在任何时间接收事件的websocket,但是大部分是空闲的,在初始连接之后将消耗多少带宽以保持活动?
对于它的价值,服务器是使用ws
的NodeJS,而客户端正在使用QtWebSockets。
谢谢!
答案 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 PING
和PONG
帧至少为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。