【问题标题】:Overhead of Idle WebSockets空闲 WebSocket 的开销
【发布时间】:2014-12-08 21:48:21
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 您关心什么级别的带宽?这可能非常非常小 - 一天的时间比一张大尺寸的图片还少。
  • 它基本上是一个推送通知服务器。假设每天工作 8 小时。
  • 你没有回答我的问题。您是否担心 100kb 带宽、200MB 带宽、200GB 带宽?你的担忧程度在哪里?保持活动消息非常小,因此它们不会加起来很多。通常,更大的问题是移动设备的电池寿命。
  • 说 >5mb 是不需要的,>20mb 是不可接受的。

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


【解决方案1】:

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

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

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

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

不过……

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

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。

【讨论】:

  • 感谢您提供的信息丰富的回答! 5 分钟是否足以避免连接中断?
  • 完全取决于端点之间的设备,但 5 分钟应该绰绰有余。要真正了解,您必须与您的客户进行一些实验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 2019-07-02
  • 2013-01-12
相关资源
最近更新 更多