WebSocket和TCP分段的区别是什么?

3
我正在学习Websocket,发现该协议具有数据分段(帧)的功能,一个WebSocket消息由一个或多个帧组成,但这与TCP(数据分段)不同吗?我感到困惑。

Websocket是两个Web服务器之间的TCP连接。 - Mohan Ram
据我所知,Websocket是一种由浏览器和服务器本地支持的通信协议。Websocket在内部可以使用任何协议进行通信,但根据标准,推荐/首选使用tcp。因此,一旦它使用tcp,两者之间的分段不应有任何区别。 - Mohan Ram
那么为什么要这样规定呢?(在Websocket规范中) - Guilherme Oliveira
请在您发现分段问题的链接中更正您的问题。 - Mohan Ram
你的问题中哪一部分没有在5.4节中得到回答? - user207421
显示剩余3条评论
3个回答

6
我很喜欢Steffen Ullrich的详细答案,但我希望添加一些关于原始TCP/IP和添加Websockets层之间差异的特定细节。
TCP/IP是一种流协议,这意味着应用程序接收到数据片段时,会随着数据的可用性而不断地接收到这些片段,并没有明确指示片段的“包边界”或原始(非分段)数据结构。
Websocket协议是一种基于消息的协议,这意味着应用程序只有在所有分段片段都到达并重新组合后才能收到完整的Websocket消息。
一个非常简化的例子:
TCP/IP:如果使用TCP发送一个50 MB的文件,应用程序可能会一次接收到一部分文件,并需要将文件重新组合(可能将每个部分保存在临时磁盘存储中)。
Websocket:如果使用Websocket协议发送一个50 MB的文件,应用程序将在一条消息中收到全部50MB的数据(所有数据的存储,包括内存或磁盘,将由Websocket层而不是应用程序层决定)。
请注意,Websocket协议是TCP/IP协议上的一个附加层,因此数据通过TCP/IP传输,并且Websocket层会在转发原始(完整)消息之前将它们重新组合。

6
在数据传输的背景下,分片就是将原始数据拆分成较小的部分进行传输,然后在接收方重新组合这些片段(例如在接收方处),以重新创建原始数据。如果底层层次无法处理较大的消息或者较大的消息会导致性能问题,则通常会进行分片。这样做可能会产生问题,因为如果一个大的消息丢失并需要重复发送,那么这将更加昂贵,而不仅仅是一个小片段。或者,如果传输一个大的消息会阻塞较小消息的传递,这也可能会导致性能问题。在这种情况下,将大的消息分成片段,并将这些消息片段与其他消息一起传递,使得这些消息不必等待大的消息完成后才能被传递,这是非常有用的。
WebSocket 中的消息分片只是存在于数据传输的许多分片类型中的一种,例如:
- IP 消息可以在发送方或某个中间盒子上进行分片,并在最终端点上重新组装。 - TCP 是一个数据流。流的各个部分以不同的 IP 数据包传输,并在接收方按正确顺序重新组装。 - 应用层协议如 HTTP 也可以有片段,例如 HTTP 中的块传输编码模式或 WebSocket 中的片段。 - 在更高的层次上,可能会有更多的片段,例如以前将单个大型 ZIP 文件分成多个部分放在软盘上或通过并行连接请求同一文件的不同部分来加速下载,并在接收方组合这些内容。

第一点并不完全正确 - IPv6数据包只能由发送方进行分段。 - tambre

4

5.4. 分段

分段的另一个用途是多路复用,当一个逻辑通道上的大消息垄断了输出通道时,为了更好地共享输出通道,多路复用需要自由地将消息拆分成较小的片段。(请注意,本文档未描述多路复用扩展。)

虽然它被列为次要原因,但我认为这是分段功能的主要原因。想象一下,如果您尝试发送1GB大小的第一条消息,并且在开始发送时立即发送了1KB大小的第二条消息。帧允许应用程序在第一条消息的各个帧之间注入第二条消息,这样接收器将不需要等待传输1GB并将立即接收/处理1KB的第二条消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接