我读过Websocket,我看到协议有一个数据碎片(帧),一个WebSocket消息由一个或多个帧组成,但它不是TCP(数据碎片)的作用吗?我很困惑。
答案 0 :(得分:3)
数据传输环境中的碎片只是意味着将原始数据拆分为较小的部分以进行传输,并在以后(例如在收件人端)再次组合这些片段以重新创建原始数据。
如果底层无法处理较大的消息,或者较大的消息会导致性能问题,则通常会执行分段。这样的问题可能是因为如果一个大的消息丢失并且需要重复而不是仅仅是一个小片段,它就会更加昂贵。或者,如果传输一条大邮件会阻止较小邮件的传递,则可能是性能问题。在这种情况下,将大消息拆分成片段并将这些消息片段与其他消息一起传送是很有用的,这样在大消息完成之前,这些消息片段不必等待传递。
WebSockets中的消息碎片只是数据传输中各层存在的众多碎片类型之一,如:
答案 1 :(得分:1)
我喜欢Steffen Ullrich的详细答案,但我想补充一些有关原始TCP / IP与添加的Websockets图层之间差异的具体细节。
TCP / IP是一种流协议,这意味着应用程序会将数据作为碎片接收,因为数据可用,而没有明确指示碎片"数据包边界"或原始(非碎片)数据结构。
Websocket协议是一种基于消息的协议,这意味着一旦所有碎片到达并重新组合在一起,应用程序将只收到完整的Websocket消息。< / p>
作为一个非常简单的例子: TCP / IP :如果使用TCP发送50 Mb文件,应用程序可能会一次收到一个文件,并且需要将文件重新拼凑在一起(可能会保存)每件到临时磁盘存储器。) Websocket :如果使用Websocket协议发送50 Mb文件,应用程序将在一条消息中接收整个50Mb(并存储所有数据,内存或磁盘,将由Websocket层决定,而不是由应用层决定。 请注意,Websocket协议是TCP / IP协议的附加层,因此数据通过TCP / IP进行流式传输,Websocket层在转发原始(整个)消息之前将这些部分重新组合在一起。
答案 2 :(得分:0)
碎片的第二个用例是复用, 对于一个逻辑通道上的大消息, 独占输出通道,因此多路传输需要自由 将邮件拆分为较小的片段,以便更好地共享 输出通道。 (请注意,多路复用扩展名不是 在本文档中进行了介绍。)
即使它被列为次要原因,我也要说这不是该碎片功能的主要原因。想象一下,如果您尝试发送1GB大小的第一条消息,并且立即开始发送时,您也发送1KB大小的第二条消息。帧允许应用程序在第一条消息的各个帧之间插入第二条消息,这样接收方将无需等待1GB的传输,并且将立即接收/处理1KB的第二条消息。