我可以在我的websockets上进行流量控制吗?

dis*_*ted 10 browser tcp websocket

我正在使用websockets将来自服务器的视频图像传输到客户端,该客户端是一个HTML页面.我在下面分享的经验是Chrome.

我通过websocket的onmessage处理程序接收图像.在接收图像时,我可能需要异步完成许多任务才能显示图像.即使这些任务没有完成,另一个onmessage()可能会触发.我不想排队图像,因为此时我无法像服务器正在进行那样快速地进行,因为显示旧图像毫无意义.我也不想放弃这些图像,我根本不想接收它们.

如果客户端使用传统的TCP连接,它将停止从连接中读取.这将导致接收缓冲区被填充,接收窗口被关闭,并最终暂停在服务器上发送图像.一旦客户端开始读取,接收缓冲区将清空,接收窗口将打开,服务器将恢复传输.每次我的服务器开始发送图像时,它会选择最新鲜的图像.这种选择最新鲜的行为以及TCP的流量控制确保了在许多情况下的合理行为.

是否可以通过websockets获得TCP的流量控制功能,其中websockets基于?我特别感兴趣的是一个依赖于TCP流控制而没有应用程序级流控制的解决方案,因为这往往会产生不必要的额外延迟.

Sim*_*one 6

现在可以在 WebSocket 中使用流。Chrome 78 将附带一个新的 WebSocketStream API,它支持背压。

这是Chrome 平台状态的引述:

WebSocket API 为 RFC6455 WebSocket 协议提供了一个 JavaScript 接口。虽然它表现良好,但从人体工程学的角度来看它很尴尬,并且缺少背压的重要特征。WebSocketStream API 的目的是通过将流与 WebSocket API 集成来解决这些缺陷。

当前,WebSocket API 无法对接收到的消息应用背压。当消息到达的速度比页面可以处理它们的速度快时,渲染进程将填满缓冲这些消息的内存,或者由于 100% 的 CPU 使用率而变得无响应,或者两者兼而有之。

对发送的消息应用背压是可能的,但涉及轮询 bufferedAmount 属性,这是低效且不符合人体工程学的。

不幸的是,这是一个仅限 Chrome 的 API,在撰写本文时还没有网络标准。

有关更多信息,请参阅:


Rem*_*eau 5

我怀疑你所要求的是可能的。WebSocket API 规范中没有该功能的接口。然而,规范所概述的是要求在使用 WebSocket 的脚本之外的后台管理底层套接字连接,以便脚本不会被 WebSocket 操作阻止。当套接字接收到入站数据时,它会将数据包装在消息中并将其排队以供 WebSocket 脚本处理。当消息保留在队列中等待脚本处理它们时,没有什么可以阻止套接字读取更多数据。

您可以在 WebSocket 中实现的唯一真正的流控制是显式的。当消息到达时,发回一条消息以确认它。在发送下一条消息之前,让服务器等待接收该确认。

  • 作为WebRTC,这确实是有缺陷的。攻击者可以忽略数据包并尽可能快地发送数据包,从而使浏览器崩溃。我不知道为什么委员会忽略了这一点。流量控制和背压也应该由传输协议完成。在用户领域,这是非常复杂的。您应该根据网络情况优化缓冲区大小。他们应该直接使用 TCP 背压和流量控制。这样一来,websocket和WebRTC在安全性和稳定性上基本没用了。 (2认同)