gpt4 book ai didi

node.js - 空闲 WebSocket 的开销

转载 作者:IT老高 更新时间:2023-10-28 23:07:02 27 4
gpt4 key购买 nike

假设我有一个 websocket 可以随时接收事件,但大部分时间处于空闲状态,初始连接后将消耗多少带宽以使其保持事件状态?

不管怎样,服务器是使用 ws 的 NodeJS,而客户端使用的是 QtWebSockets。

谢谢!

最佳答案

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

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

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

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

不过……

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

每 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。

关于node.js - 空闲 WebSocket 的开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26355077/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com