Node.js 空闲WebSocket的开销

Node.js 空闲WebSocket的开销,node.js,tcp,websocket,keep-alive,qtwebsockets,Node.js,Tcp,Websocket,Keep Alive,Qtwebsockets,假设我有一个websocket,它可以随时接收事件,但大部分是空闲的,那么在初始连接之后,为了保持它的活动状态,会消耗多少带宽 值得一提的是,服务器是使用ws的NodeJS,客户端是使用QtWebSockets 谢谢 一旦建立(意味着三方握手完成),原始TCP连接将使用零带宽,除非: 您可以发送或接收数据 是显式启用的 服务器或客户端可以启用TCP保留。keepalive是使用ACK标志集发送的长度为零的数据包,在线路上仅发送54个字节,再加上54个响应字节。默认情况下,TCP keepal

假设我有一个websocket,它可以随时接收事件,但大部分是空闲的,那么在初始连接之后,为了保持它的活动状态,会消耗多少带宽

值得一提的是,服务器是使用
ws
的NodeJS,客户端是使用QtWebSockets

谢谢

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

  • 您可以发送或接收数据
  • 是显式启用的
服务器或客户端可以启用TCP保留。keepalive是使用
ACK
标志集发送的长度为零的数据包,在线路上仅发送54个字节,再加上54个响应字节。默认情况下,TCP keepalives每两小时发送一次。换句话说,完全可以忽略不计

WebSocket也有自己的keepalive机制(to)。服务器或客户端可能发送一个
PING
帧,另一端必须用
PONG
帧响应。虽然没有浏览器端JSAPI发送
PING
s,但节点服务器可能会发送它们,兼容的浏览器会自动响应。(QtWebSockets确实有要发送的API
PING
s)。默认情况下不会发生这种情况;你必须手动操作。WebSocket
PING
PONG
帧至少为7个字节,每个帧最多为131个字节(加上54个字节的TCP/IP开销)。因此,单个
PING
/
PONG
的开销在122到370字节之间

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

然而

Keepalives很重要,因为中间设备(即NAT路由器)将丢弃不活动的TCP连接。根据服务器和客户端之间的网络,这意味着如果没有任何keepalives,客户端将失去连接(可能是在不知道的情况下,这是不好的),并且必须重新启动WebSocket会话。就带宽而言,这可能比启用sane keepalives要昂贵得多

每5分钟一次
PING
/
PONG
的成本为每小时1.5-4.4KB(每个客户端)



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

您关心的带宽级别是什么?这很可能是非常非常小的,比一张大小合适的图片少一天,基本上是一个推送通知服务器。假设每天8小时,你没有回答我的问题。你担心100kb的带宽,200MB的带宽,200GB的带宽吗?你的担心程度在哪里?保持活动状态的消息非常小,因此它们加起来不会太多。通常,一个更大的问题是移动设备的电池寿命。不需要大于5mb,而大于20mb是不可接受的。感谢您提供的信息性答案!5分钟是否足以避免断开连接?完全取决于端点之间的设备,但5分钟应该足够了。要真正了解,你必须与你的客户进行一些实验。