Flash中的WebSockets和原始TCP sockets比较

21

WebSockets是在原始TCP连接的基础上新增了什么?为什么应该使用WebSockets?

我想了解它们的优缺点,例如:

  • 优点:WebSockets添加了一些有用的功能,如自动重连、会话ID等。
  • 缺点:WebSockets增加了很多开销。

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


这个主题有很好的信息:http://lucumr.pocoo.org/2012/9/24/websockets-101/ - tybro0103
1个回答

18

在浏览器的 Web 应用程序中,您无法使用原始套接字。即使是来自 Flash 的“原始”套接字连接也不真正是原始的,因为您必须回答策略文件请求以获得CORS安全(这是 WebSockets 握手的一部分原因)。

在初始 WebSocket 握手之后,WebSocket 消息每帧有两个字节的框架开销(Hixie-* 有 '\x00...\xff',而 HyBi-07 有两个字节的头文件),因此与常规套接字相比,开销非常小。

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

HTTP 兼容的握手还意味着现有的 HTTP 身份验证机制可以透明地与 WebSockets 一起使用。此外,WebSockets 可以通过现有的网络代理进行代理,几乎不需要修改。

在 WebSockets 协议 rev(HyBi-07)的下一个版本中,对于恶意的 Web 中介机构,采用客户端对服务器 XOR 掩码对有效载荷数据进行保护。

像自动重新连接、会话 ID 等类似的事情在 WebSockets 中并没有定义,尽管基于 WebSockets 构建的几个 JavaScript 框架有这些功能,例如Socket.IO。如果您正在从 Flash 应用程序中使用 WebSockets,则需要进行自己的会话管理或将现有的会话管理库转换为使用 WebSockets 而不是 Flash 套接字(这应该是很容易转换的)。

更新:

以下是对您或其他来此处的人有用的一些链接:

  • AS3WebSocket:用于Flash应用程序的WebSockets客户端库。
  • web-socket-js:在Flash中实现的WebSockets回退/填充,用于JavaScript应用程序(为没有本地WebSockets支持但具有Flash的浏览器添加WebSockets支持)。

关于开销,它最少是2个字节,但通常更多。从客户端到服务器,需要额外4个字节的掩码。当数据长度超过126个字节时,您还必须为长度添加另外4个字节的uint。因此,发送数据的开销通常约为10个字节。但更重要的是,在服务器端处理此标头并对每条消息进行解除掩码,因此您需要使用更多CPU来处理数据。如果您直接将数据序列化为二进制,则比使用utf8消息(例如JSON)要好得多。对于Flash,请使用原始格式。 - moka
1
Maksims,HyBi 工作组在选择掩码客户端->服务器流量的机制时非常有意识。因为掩码包含在帧中,所以没有需要记住的状态,并且运行 4 字节 XOR 几乎是跨许多架构的最快(和高效)的流操作。还要注意的重要一点是,服务器->客户端流量从不被掩码,大数据通常是服务器->客户端。此外,126->65535 字节帧有额外的 2 个字节而不是 4 个字节。超过 65535 是额外的 8 个字节。这个头部开销不会产生可测量的现实差异。 - kanaka
每一项新技术都伴随着一套新的问题。在WebSocket的情况下,它与大多数公司网络中介HTTP连接的代理服务器的兼容性是一个问题。WebSocket协议使用HTTP升级系统(通常用于HTTP/SSL)将HTTP连接“升级”为WebSocket连接。某些代理服务器不喜欢这样做,并会断开连接。因此,即使给定的客户端使用了WebSocket协议,也可能无法建立连接。 - Triynko
那么Windows 8/Server 2012的要求怎么样?https://dev59.com/3WYq5IYBdhLWcg3w30Xc#16555158 >>链接到>> http://www.iis.net/learn/extensions/introduction-to-iis-express/iis-80-express-readme#KnownIssues - Triynko
@Triynko,你链接的html5rocks文章已经有3年了。提到的问题都是一些bug,大多数已经或将在不久的将来得到解决。此外,Flash TCP套接字的策略请求也存在类似的问题,并且由于大多数开发人员认为Flash已经过时,因此不太可能得到解决。就IIS Express对WebSockets的支持而言,这很有趣,但它并不会阻止你运行一个专用的WebSocket服务器,所以实际上情况与Flash TCP套接字没有什么区别(在大多数情况下,你都需要运行一个专用服务器)。 - kanaka
显示剩余2条评论

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