通过 WS 与 Http 发送多个 5mb 二进制文件

Sending multiple 5mb binary files over WS vs Http

  1. 在发送大文件时,通过 websocket 发送大文件是否会“阻止”websocket 接收其他消息?

  2. 通过独立的 Http 请求发送文件而其他消息继续通过 WS 发送是否有任何明显的优势“保持 WS 畅通无阻”?

假设1个网卡。

  1. 如果 WebSocket 超过 HTTP/1.1,是的,上传大文件(以大型 WebSocket 消息的形式)会阻塞 WebSocket 连接。
    WebSocket over HTTP/2的情况下(如果客户端和服务器都支持),一个HTTP/2流将上传大文件,另一个HTTP/2流用于携带WebSocket消息。在这种情况下,问题就变成了HTTP/2流量控制window,可能会被大上传流耗尽,导致WebSocket消息流停顿(从而导致消息排队和延迟)。不幸的是,这个 queueing/delay 的细节取决于客户端和服务器实现,所以你必须尝试。
    通常实现在交错流方面做得很好,因此可能的停顿很少成为问题。
    对于 HTTP/1.1 上的 WebSocket,如果您打开多个 WebSocket 连接,您可以并行发送文件和消息,文件使用 N WebSocket 连接,文件使用 1 WebSocket 连接例如,对于消息。
    一些 non-browser 客户端允许您打开多个 HTTP/2 到同一域的连接,因此您将再次有机会并行发送文件和消息。然而,据我所知,浏览器不允许超过 1 个 HTTP/2 连接到同一域,因此存在并行性,但受到 HTTP/2 流控制 window.[=14 的限制=]

  2. 不确定“保持 WS 畅通”是什么意思,但是 HTTP/1.1 的工作方式与 WebSocket 相同,涉及其连接的使用。
    如果您处于浏览器环境中,浏览器允许到同一域的 6-8 个 HTTP 连接,并且通常无限制(或至少更多)WebSocket 连接。
    因此,如果您想发送 10 个大文件,其中 6-8 个将通过 HTTP 上传,但其余文件将排队等待其中一个 HTTP 连接完成上一次上传。
    同时,您可以使用WebSocket连接发送消息。
    在 HTTP/2 的情况下,浏览器仅打开 1 个连接,因此您可以使用 HTTP/2 流进行上传,并使用 WebSocket over HTTP/2 流进行消息,但它们将共享相同的 HTTP/2 流量控制 window,可能会互相拖延。

总而言之,WebSocket 并不是为大型上传而设计的。

如果您达到 WebSocket 消息大小限制,我不会感到惊讶,因为服务器不允许客户端上传任意大小的消息(因为它会炸毁服务器内存)。客户也是如此;浏览器通常对它们接收的 WebSocket 消息的大小有很小的限制,与使用 HTTP/1.1 还是 HTTP/2 无关。

如果您真的需要上传大文件,我认为通过 HTTP 上传(允许更大的文件,例如在使用 multipart/form-data 时)并通过 WebSocket 保持小消息的解决方案是最佳的。

使用HTTP/2可能达到HTTP/2流量控制window限制,但是你有6-8个连接的限制在 HTTP/1.1 中也是如此,所以你必须再次尝试查看 如果 你达到了任何限制,如果你达到了,在什么情况下是哪个限制。

使用 HTTP 进行上传可以降低您达到事先不知道的 WebSocket 消息大小限制的可能性,并且可能因客户端(浏览器到浏览器)而异,并且您不想实施自己的拆分和通过 WebSocket 合并大量上传以遵守这些限制。