API 中的 WebSocket 帧碎片
WebSocket frame fragmentation in an API
在客户端公开 WebSocket 碎片是否有任何价值API?
阅读 RFC 6455 后,我确信非延续框架在语义方面并不能为您提供任何保证。人们不应该依赖框架边界。这太冒险了。规范明确解决了这个问题:
Unless specified otherwise by an extension, frames have no semantic
meaning. An intermediary might coalesce and/or split frames, if no
extensions were negotiated by the client and the server or if some
extensions were negotiated, but the intermediary understood all the
extensions negotiated and knows how to coalesce and/or split frames
in the presence of these extensions. One implication of this is that
in absence of extensions, senders and receivers must not depend on
the presence of specific frame boundaries.
因此,接收到二进制或文本类型的非连续帧并不意味着它是从通道的另一端发送的原子和有意义的东西。同样,连续帧序列并不意味着合并它们会产生有意义的消息。而更令人气愤的是,
单个非连续类型帧可能是合并许多其他帧的结果。
总而言之,只要字节顺序相同(当然在没有扩展的情况下,通过 WebSocket 发送的字节组几乎可以以任何方式重新组合).
如果是这样,那么引入这个概念到底有用吗?也许最好将它隐藏为实现的细节?我想知道 WebSocket 用户是否发现它在 Netty、Jetty、Grizzly 等产品中有用。谢谢。
碎片化不是任何事情的界限。
这只是实现根据内存、websocket 扩展、性能等自行处理的一种方式。
一个典型的场景是客户端端点发送文本,该文本通过 permessage-deflate 扩展传递,它将根据其 deflate 算法内存配置压缩和生成片段,将这些片段写入远程端点要写入的压缩数据缓冲区(某些实现仅在缓冲区已满或消息已收到其最后一个字节时才写入)
虽然在 API 中暴露了对片段的访问(Jetty 有 2 个核心 websocket APIs,都支持片段访问),但它只对那些想要较低级别控制的人有用在流媒体应用程序上。 (想一想你想要通过质量调整流式传输的视频/网络电话,如果需要则丢弃数据,不要写得太快等等......)
RFC关于未分片的消息似乎有些歧义,它们可以任意拆分或组合。但是,在故意将消息作为多个片段(总共 X 字节)发送的情况下,是否允许中介以 returns 不同数量(不同于 X 字节)的方式拆分其中一些帧在序列中?我不认为这是允许的,碎片化在这方面有一定的价值。这只是阅读 RFC,而不是查看实际实现。
The fragments of one message MUST NOT be interleaved between the
fragments of another message unless an extension has been
negotiated that can interpret the interleaving.
根据我的阅读,这意味着除非协商了一些允许它的扩展,否则来自不同消息的片段不能交错,这意味着虽然片段的数量可以改变,但确切的字节数(和字节数他们自己)不能。
应该支持控制碎片;我们有一个 C# 程序,它有意将大型 WebSocket 消息拆分成小片段,以便接收数据的小型嵌入式处理器可以一次处理小块。相反,它完全合并成一个大块,消耗了大部分可用内存。
我们不确定合并发生在哪里。也许是 C# 库。
在客户端公开 WebSocket 碎片是否有任何价值API?
阅读 RFC 6455 后,我确信非延续框架在语义方面并不能为您提供任何保证。人们不应该依赖框架边界。这太冒险了。规范明确解决了这个问题:
Unless specified otherwise by an extension, frames have no semantic
meaning. An intermediary might coalesce and/or split frames, if no
extensions were negotiated by the client and the server or if some
extensions were negotiated, but the intermediary understood all the
extensions negotiated and knows how to coalesce and/or split frames
in the presence of these extensions. One implication of this is that
in absence of extensions, senders and receivers must not depend on
the presence of specific frame boundaries.
因此,接收到二进制或文本类型的非连续帧并不意味着它是从通道的另一端发送的原子和有意义的东西。同样,连续帧序列并不意味着合并它们会产生有意义的消息。而更令人气愤的是, 单个非连续类型帧可能是合并许多其他帧的结果。
总而言之,只要字节顺序相同(当然在没有扩展的情况下,通过 WebSocket 发送的字节组几乎可以以任何方式重新组合).
如果是这样,那么引入这个概念到底有用吗?也许最好将它隐藏为实现的细节?我想知道 WebSocket 用户是否发现它在 Netty、Jetty、Grizzly 等产品中有用。谢谢。
碎片化不是任何事情的界限。
这只是实现根据内存、websocket 扩展、性能等自行处理的一种方式。
一个典型的场景是客户端端点发送文本,该文本通过 permessage-deflate 扩展传递,它将根据其 deflate 算法内存配置压缩和生成片段,将这些片段写入远程端点要写入的压缩数据缓冲区(某些实现仅在缓冲区已满或消息已收到其最后一个字节时才写入)
虽然在 API 中暴露了对片段的访问(Jetty 有 2 个核心 websocket APIs,都支持片段访问),但它只对那些想要较低级别控制的人有用在流媒体应用程序上。 (想一想你想要通过质量调整流式传输的视频/网络电话,如果需要则丢弃数据,不要写得太快等等......)
RFC关于未分片的消息似乎有些歧义,它们可以任意拆分或组合。但是,在故意将消息作为多个片段(总共 X 字节)发送的情况下,是否允许中介以 returns 不同数量(不同于 X 字节)的方式拆分其中一些帧在序列中?我不认为这是允许的,碎片化在这方面有一定的价值。这只是阅读 RFC,而不是查看实际实现。
The fragments of one message MUST NOT be interleaved between the fragments of another message unless an extension has been negotiated that can interpret the interleaving.
根据我的阅读,这意味着除非协商了一些允许它的扩展,否则来自不同消息的片段不能交错,这意味着虽然片段的数量可以改变,但确切的字节数(和字节数他们自己)不能。
应该支持控制碎片;我们有一个 C# 程序,它有意将大型 WebSocket 消息拆分成小片段,以便接收数据的小型嵌入式处理器可以一次处理小块。相反,它完全合并成一个大块,消耗了大部分可用内存。 我们不确定合并发生在哪里。也许是 C# 库。