WebSockets,UDP和基准测试

bob*_*bee 56 performance html5 udp websocket

HTML5 websockets目前使用TCP通信的形式.然而,对于实时游戏,TCP不会削减它(并且是使用其他平台的很好的理由,如本机).由于我可能需要UDP来继续项目,我想知道HTML6的规格是否支持UDP?

此外,是否有任何可靠的WebSockets基准测试可以将WS协议与低级直接套接字协议进行比较?

obe*_*tet 195

在LAN上,您可以通过WebSocket的消息获得200微秒(从浏览器JS到WebSocket服务器并返回)的往返时间,这类似于原始ICMP ping.在MAN上,它大约是10ms,WAN(通过住宅ADSL到同一国家的服务器)大约30ms,依此类推,大约120-200ms,通过3.5G.重点是:基于网络,WebSocket确实几乎没有为您获得的延迟添加延迟.

网页套接字的导线水平开销(相比于原始TCP)为2个八位位组(长度的未掩蔽有效载荷<126个八位字节)和14个八位位组(长度的掩蔽有效载荷>每个消息64K)之间(前数字假定该消息不分段为多个WebSocket框架).非常低.

有关WebSocket线路开销的更详细分析,请参阅此博客文章 - 这包括覆盖WebSocket之外的层的分析.

更使:用能够流传输处理的的WebSocket实现,可以(后初始的WebSocket握手),开始在每个方向上一个单一的WebSocket消息和帧,然后发送到2 ^ 63个八位位组,没有开销.从本质上讲,这使得WebSocket成为原始TCP的奇特前奏.警告:中间人可能会根据自己的决定分割流量.但是,如果您运行WSS(即安全WS = TLS),则没有中介可以干扰,并且您有:原始TCP,具有HTTP兼容的前奏(WS握手).

WebRTC使用RTP(=基于UDP)进行媒体传输,但另外还需要一个信令通道(也可以是WebSocket).RTP针对容错实时媒体传输进行了优化."实时游戏"通常意味着不是转移媒体,而是转移玩家的位置.WebSocket将为此工作.

注意:WebRTC传输可以通过RTP进行,也可以通过SRTP进行保护.请在此处查看"RTP配置文件" .

  • 我必须说,我在你写得很好的答案中学到了很多,并感谢你花在写作上的时间. (60认同)

kan*_*aka 39

我建议您使用本地有线网络上的WebSockets开发游戏,然后在WebRTC数据通道API可用后转移到WebRTC数据通道API.正如@oberstet正确指出的那样,WebSocket的平均延迟基本上等同于原始TCP或UDP,特别是在本地网络上,所以它应该适合您的开发阶段.WebRTC数据通道API的设计与WebSockets非常相似(一旦建立连接),因此一旦广泛可用,它就应该非常简单.

你的问题暗示UDP可能是你想要的低延迟游戏,而且事实也是如此.你可能已经意识到这一点,因为你正在编写一个游戏,但对于那些没有的游戏,这里有一个关于实时游戏的TCP与UDP快速入门:

TCP是一种有序,可靠的传输机制,UDP是最大努力的.TCP将提供发送的所有数据以及发送的顺序.UDP数据包在到达时发送,可能出现故障,并且可能存在间隙(在拥塞的网络上,UDP数据包在TCP数据包之前被丢弃).TCP听起来像是一个很大的改进,它适用于大多数类型的网络流量,但这些功能需要付出代价:延迟或丢弃的数据包会导致所有后续数据包延迟(以保证按顺序传送).

实时游戏通常不能容忍TCP套接字可能导致的延迟类型,因此它们对大多数游戏流量使用UDP,并且具有处理丢弃和无序数据的机制(例如,将序列号添加到有效载荷数据).如果你错过了敌方玩家的一个位置更新,这并不是什么大问题,因为几毫秒之后你会收到另一个位置更新(甚至可能不会注意到).但是如果你没有获得500ms的位置更新然后突然将它们全部拿出一次,那就会导致糟糕的游戏.

总而言之,在本地有线网络上,数据包几乎不会被延迟或丢弃,因此TCP作为初始开发目标是完美的.一旦WebRTC数据通道API可用,您可以考虑转向它.当前提案具有基于重试或计时器的可配置可靠性.

以下是一些参考:

  • 为了澄清,我认为WebSockets很棒,而且对于许多你想要基于浏览器的低延迟通信(包括游戏)的情况,它们都是正确的选择.但是有理由认为AAA实时游戏通常使用UDP而不是TCP(或混合).WebSockets基于TCP构建,具有与TCP相同的优点和缺点.工作组中已经要求UDP over WebSocket(用于实时游戏)和通过WebRTC的数据通道是给出的答案:http://lists.whatwg.org/htdig.cgi/help-whatwg.org/ 2011年八月/ 000920.html (7认同)
  • 应用程序可以在不可靠的传输之上构建可靠的有序通道,然后根据数据类型选择要使用的通道,但不能反过来.通常,关键信息仍由服务器维护(以避免欺骗和欺骗).我已经使用WebSockets(1110.n01se.net)构建了一个实时游戏,它运行良好(作为实验),但我已经看到了负载下的传输延迟的影响,可以通过不可靠的传输机制显着缓解. (3认同)

Ale*_*one 19

简而言之,如果你想将TCP用于多人游戏,你需要使用我们称之为自适应流媒体技术.换句话说,您需要确保在客户端之间发送以同步游戏世界的实时数据量受每个客户端当前可用带宽和延迟的控制.

动态限制,混合,增量传递和其他机制是自适应流技术,它们不会神奇地使TCP像UDP一样高效,但使其足以用于几种类型的游戏.

我试图在一篇文章中解释这些技巧:通过Web优化多人3D游戏同步(http://blog.lightstreamer.com/2013/10/optimizing-multiplayer-3d-game.html).

上个月我还在旧金山举行的HTML5开发者大会上就这一主题发表了演讲.该视频刚刚在YouTube上提供:http://www.youtube.com/watch?v = cSEx3mhsoHg


Tim*_*mmm 6

Websockets 没有 UDP 支持(确实应该有),但是您显然可以使用 WebRTC 的 RTCDataChannel API 进行类似 UDP 的通信。这里有一篇很好的文章:

http://www.html5rocks.com/en/tutorials/webrtc/datachannels/

RTCDataChannel 实际上使用了 SCTP,它具有可配置的可靠性和有序交付。您可以通过告诉它无序传递消息并将最大重传次数设置为 0 来使其像 UDP 一样工作。

我还没有尝试过这些。