tcp - 基于 Websocket 框架
问题描述
我从这里读到Websocket 是基于帧的协议,而不是基于流的协议。但它也说明了为什么 WebSockets 是基于帧而不是基于流的?我不知道,就像你一样,我很想了解更多,所以如果你有想法,请随时在下面的回复中添加评论和资源。
谁能解释在 Websocket 中使用基于帧的协议有什么好处?
解决方案
也许这个预先存在的答案将有助于为讨论提供一些参考。
通过利用帧和基于消息的协议(相对于基于流的协议),它可以更轻松地编写面向 Web 的应用程序。
发送 JSON 数据等常见操作变得更加容易,并且不需要每个应用程序都为碎片消息实现网络数据缓冲/缓存层。
编辑(回答评论)
TCP/IP 层保证网络数据包的传递和排序,但没有数据长度的概念——它是一个流协议,它承诺流将按顺序到达,仅此而已。
如果任何数据无序到达,TCP/IP 协议层将对数据重新排序。这可能需要一个内部缓存/缓冲区,在等待丢失数据的同时保留现有数据。
相比之下,WebSocket 是基于消息的,并且知道消息数据的长度。
WebSocket 帧使用具有数据长度(全部/部分)的标头,以允许 WebSocket 协议层将所有数据连接为一个单元,即使它分布在多个 TCP/IP 数据包或(甚至)WebSocket 帧中。
这要求协议层将数据保存在内部缓冲区中,直到消息中的所有预期数据都到达。WebSocket 协议只有在其全部数据到达时才会将消息转发给应用程序。
为了从流中提取消息“单元”而“保留数据”是我所指的缓存/缓冲元素。
推荐阅读
- c# - CRLF 注入问题(使用 cookie)
- ruby - 如何在 Vim 上对齐 ruby 方法调用的元素
- python - 根据值组合列表字典
- r - R中的特定序列创建
- javascript - 上传文件时检索 e.target.File 时未定义
- c# - 在 asp .net 应用程序中向 google 注册(通用视图)
- openlayers - 打开图层“instanceof”替换“getZIndex”。替代品如何达到同样的目的
- eclipse - 当我使用 eclipse STS 工具生成 Spring starter 项目时,pom.xml 第一行出现错误。但我在 pom.xml 中没有发现错误
- amazon-s3 - AWS 存储桶不可删除
- csv - 设置间隙公差和运行时间限制