Flash 中的 WebSocket 与原始 TCP 套接字

Posted

技术标签:

【中文标题】Flash 中的 WebSocket 与原始 TCP 套接字【英文标题】:WebSockets vs raw TCP sockets in Flash 【发布时间】:2011-08-23 09:43:39 【问题描述】:

什么 WebSockets 添加到原始 TCP 连接? 为什么要使用 WebSockets?

我想听听这样的利弊:

很好:WebSockets 添加了一些有用的东西,比如自动重新连接、会话 ID 等。 不好:WebSockets 增加了很多开销

我只有 Flash 客户端,不需要支持 javascript 客户端。

【问题讨论】:

关于这个主题的好信息:lucumr.pocoo.org/2012/9/24/websockets-101 【参考方案1】:

您不能在浏览器中从 Web 应用程序执行原始套接字。甚至来自 Flash 的“原始”套接字连接也不是真正原始的,因为您必须回答策略文件请求才能获得 CORS 安全性(WebSockets 握手的部分原因)。

在最初的 WebSocket 握手之后,WebSocket 消息每帧有两个字节的帧开销(Hixie-* 有 '\x00...\xff' 而 HyBi-07 有两个字节的头),所以开销比较起来可以忽略不计到常规套接字。

WebSocket 握手是一个 HTTP 兼容的升级请求,因此很容易将 WebSockets 支持集成到现有的 Web 服务器中并使用现有的 Web 端口 (80/443),这意味着 WebSocket 连接也可以更容易地集成到现有的防火墙规则中。

与 HTTP 兼容的握手还意味着现有的 HTTP 身份验证机制可以透明地与 WebSocket 一起工作。此外,WebSocket 可以由现有的 Web 代理进行代理,只需很少或无需修改。

在 WebSockets 协议 rev (HyBi-07) 的下一个修订版中,它们使用客户端到服务器对负载数据进行 XOR 屏蔽来防止行为不端的 Web 中介。

WebSockets 中未定义自动重新连接、会话 ID 等内容,尽管一些基于 WebSockets 的 Javascript 框架都有此定义,例如 Socket.IO。如果您从 Flash 应用程序中使用 WebSockets,那么您需要进行自己的会话管理或将现有的会话管理库转换为使用 WebSockets 而不是 Flash 套接字(转换非常简单)。

更新

几个可能对您或其他登陆这里的人有用的链接:

AS3WebSocket:用于 Flash 应用程序的 WebSockets 客户端库。 web-socket-js:在 Flash 中为 Javascript 应用程序实现 WebSockets fallback/polyfill(为具有 Flash 但没有本机 WebSockets 的浏览器添加 WebSockets 支持)。

【讨论】:

关于开销,最小为 2 个字节,但通常更多。从客户端到服务器,掩码需要额外的 4 个字节。同样,当数据长于 126 字节时,您必须为 uint 添加另外 4 个字节作为长度。所以通常要发送大约 10 个字节的数据开销。但更重要的是,处理此标头并在服务器端为每条消息进行去掩码,因此您使用更多的 CPU 来处理数据。同样,如果您创建从数据直接到二进制的良好序列化,那么使用 utf8 消息作为 JSON 示例会好得多。对于 flash 使用 raw。 Maksims,HyBi 工作组非常有意选择哪种机制来屏蔽客户端 -> 服务器流量。因为掩码包含在帧中,所以不需要记住任何状态,并且运行的 4 字节 XOR 几乎是跨批次或架构的最快(和有效)流式操作。同样重要的是要注意服务器->客户端流量从未被屏蔽,大数据通常是服务器->客户端。此外,126 -> 65535 字节帧有 2 个字节额外而不是 4 个字节。超过 65535 是 8 个额外字节。此标头开销不会产生可衡量的现实世界差异。 那么怎么样:“每一项新技术都伴随着一系列新问题。在 WebSocket 的情况下,它与代理服务器的兼容性在大多数公司网络中调解 HTTP 连接。WebSocket 协议使用HTTP 升级系统(通常用于 HTTP/SSL)将 HTTP 连接“升级”为 WebSocket 连接。一些代理服务器不喜欢这样并且会丢弃连接。因此,即使给定的客户端使用 WebSocket 协议,可能无法建立连接。” - html5rocks.com/en/tutorials/websockets/basics 那么 Windows 8/Server 2012 的要求呢:***.com/a/16555158/88409 >>links to>> iis.net/learn/extensions/introduction-to-iis-express/… @Triynko,您链接到的 html5rocks 文章已有 3 年历史。提到的问题是错误,大多数已经或将在不久的将来修复。此外,Flash TCP 套接字的策略请求也存在类似问题,并且由于 Flash 被大多数开发人员视为遗留问题,因此不太可能得到解决。就 IIS Express 对 WebSockets 的支持而言,这很有趣,但它不会阻止您运行专用的 WebSocket 服务器,因此实际上情况与 Flash TCP 套接字没有什么不同(无论如何,在大多数情况下您将运行专用服务器) .

以上是关于Flash 中的 WebSocket 与原始 TCP 套接字的主要内容,如果未能解决你的问题,请参考以下文章

使用原始 WebSocket 时如何知道消息是不是已成功发送?

Android浏览器中的假websocket功能

FLASH中鼠标悬停在某按钮上显示某个图层内容,移开后该图层消失.

即使不涉及 Web 浏览器,也可以在原始 tcp 上使用 websocket:好主意吗?

使用 WebSocket 的原始 javascript GraphQL 订阅不起作用

从chrome扩展访问Websocket流量