空闲WebSockets的开销

Jac*_*cob 13 tcp keep-alive websocket node.js qtwebsockets

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

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

谢谢!

jos*_*736 28

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

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

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

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

然而...

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

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.