什么';WebSocket碎片和TCP碎片的区别是什么?

什么';WebSocket碎片和TCP碎片的区别是什么?,tcp,websocket,protocols,network-protocols,Tcp,Websocket,Protocols,Network Protocols,我在读Websocket,我看到协议有一个数据碎片(frames),Websocket消息由一个或多个帧组成,但它不是TCP(数据碎片)所做的?我很困惑。在数据传输的上下文中,碎片化仅仅意味着将原始数据分割成更小的部分进行传输,然后再将这些片段组合起来(例如在接收方)以重新创建原始数据 如果底层无法处理较大的消息,或者较大的消息会导致性能问题,则通常会执行分段。这样的问题可能是因为如果一条大消息丢失并且需要重复而不是仅仅一个小片段,那么代价会更高。或者,如果一条大消息的传输会阻止较小消息的传递,

我在读Websocket,我看到协议有一个数据碎片(frames),Websocket消息由一个或多个帧组成,但它不是TCP(数据碎片)所做的?我很困惑。

在数据传输的上下文中,碎片化仅仅意味着将原始数据分割成更小的部分进行传输,然后再将这些片段组合起来(例如在接收方)以重新创建原始数据

如果底层无法处理较大的消息,或者较大的消息会导致性能问题,则通常会执行分段。这样的问题可能是因为如果一条大消息丢失并且需要重复而不是仅仅一个小片段,那么代价会更高。或者,如果一条大消息的传输会阻止较小消息的传递,那么这可能是一个性能问题。在这种情况下,将大消息拆分为片段并将这些消息片段与其他消息一起交付是很有用的,这样就不必等到大消息完成后再交付

WebSocket中的消息碎片只是在数据传输的不同层上存在的众多碎片类型之一,如:

  • IP消息可以在发送方或某个中间包处进行分段,并在最后重新组装
  • TCP是一种数据流。流的各个部分在不同的IP数据包中传输,并在接收方以正确的顺序重新组装
  • 像HTTP这样的应用层协议也可以有片段,例如HTTP中的分块传输编码模式或WebSocket中的片段
  • 在更高的层次上,可以有更多的片段,比如以前将一个大的ZIP文件分散到软盘上的多个部分,或者通过并行连接请求同一文件的不同部分,并在接收者处合并这些部分,从而加速下载

    • 我喜欢Steffen Ullrich的详细回答,但我想补充一些关于原始TCP/IP和添加的Websockets层之间差异的具体细节

      TCP/IP是一种流协议,这意味着应用程序在数据可用时将数据作为碎片接收,而不清楚碎片化的“数据包边界”或原始(非碎片化)数据结构

      Websocket协议是一种基于消息的协议,这意味着应用程序只有在所有碎片到达并重新组合后才能接收完整的Websocket消息

      作为一个非常简单的例子:

      TCP/IP:如果使用TCP发送50 Mb的文件,应用程序可能会一次收到一段文件,并且需要将该文件重新拼接在一起(可能会将每个文件保存到临时磁盘存储器中)

      Websocket:如果使用Websocket协议发送50 Mb的文件,应用程序将在一条消息中接收整个50 Mb的数据(所有数据、内存或磁盘的存储将由Websocket层而不是应用程序层决定)

      请注意,Websocket协议是TCP/IP协议上的一个附加层,因此数据通过TCP/IP进行流式传输,Websocket层在转发原始(整个)消息之前将各部分重新组合在一起。

      分段的第二个用例是多路复用,其中 对于一个逻辑通道上的大消息,不希望 垄断输出通道,因此多路复用需要免费 将消息拆分为更小的片段以更好地共享 输出通道。(请注意,多路复用扩展不可用。) 如本文件所述。)


      尽管它被列为次要原因,但我认为这并不是碎片特性的主要原因。想象一下,如果您尝试发送1GB大小的第一封邮件,并且在开始发送时立即发送1KB大小的第二封邮件。分帧允许应用程序在第一条消息的各个帧之间插入第二条消息,通过这种方式,接收器不需要等待1GB的数据传输,并将立即接收/处理1KB的第二条消息。

      Websocket是一个tcp连接,带有两台web服务器。我想知道数据碎片是否是tcp或Websocket协议的一项功能,或者两者都有不同的功能。据我所知。Websocket是浏览器和服务器本机支持的通信协议。Websocket内部可以使用任何协议进行通信,但根据标准,建议/首选tcp。所以一旦它使用tcp。碎片b/w之间不应该有任何区别。这两个碎片都是数据碎片,那么为什么要指定它呢?(在Websocket规范中)第一点不是严格正确的——IPv6数据包只能由发送方分割。