WebSockets,UDP和基准
HTML5 websockets目前使用一种TCP通信forms。 但是,对于实时游戏而言,TCP并不会削减它(这也是使用其他平台的原因)。 因为我可能需要UDP来继续一个项目,我想知道是否HTML6的规格或任何将支持UDP?
另外,WebSockets是否有可靠的基准testing,将WS协议与低级别的直接套接字协议进行比较?
在局域网上,你可以通过200微秒的WebSocket(从浏览器JS到WebSocket服务器,返回)获得消息的往返时间,这与原始ICMP坪相似。 在城域网上,大约是10ms,广域网(在同一个国家的住宅ADSL到服务器)在30ms左右,等等,通过3.5G达到120-200ms左右。 重点是:基于networking,WebSocket实际上不会增加您将获得的延迟。
WebSocket(与原始TCP相比)的线级开销在每个消息的2个八位组(长度<126个八比特组的未掩码有效载荷)和14个八位组(掩码有效载荷长度> 64k)之间(前面的数字假设消息不被分成多个WebSocket框架)。 非常低。
有关WebSocket线级开销的更详细分析,请参阅此博客post – 这也包括分析覆盖WebSocket之外的层次。
更重要的是,通过一个能够进行stream处理的WebSocket实现,您可以(在初始WebSocket握手之后),在每个方向上启动一个WebSocket消息和帧,然后发送最多2 ^ 63个八位字节,而没有任何开销。 从本质上讲,这使得WebSocket成为原始TCP的奇妙前奏。 注意:中介机构可能会根据自己的决定对stream量进行细分。 但是,如果运行WSS(即安全的WS = TLS),则没有中间人可以干涉,并且您是:原始TCP,具有HTTP兼容前奏(WS握手)。
WebRTC使用RTP(=基于UDP)进行媒体传输,但是另外需要一个信令通道(可以是WebSocket ie)。 RTP针对丢失容忍的实时媒体传输进行了优化。 “实时游戏”往往意味着转移媒体,而不是玩家的位置。 WebSocket将为此工作。
注意:WebRTC传输可以通过RTP传输,也可以通过SRTP传输。 请参阅此处的 “RTPconfiguration文件”。
我build议在本地有线networking上使用WebSocket开发游戏,然后在WebRTC数据通道API可用时移动到WebRTC数据通道API。 正如@oberstet正确指出的那样,WebSocket平均延迟基本上等同于原始的TCP或UDP,尤其是在本地networking上,所以对于您的开发阶段来说应该没问题。 WebRTC数据通道API被devise成与WebSockets非常相似(一旦连接build立),所以一旦它被广泛使用,集成应该相当简单。
你的问题意味着UDP可能是你想要的一个低延迟游戏,这是有道理的。 你可能已经意识到这一点,因为你正在写一个游戏,但对于那些没有,这里是实时游戏的TCP与UDP快速入门 :
TCP是一个有序的,可靠的传输机制,UDP是尽力而为的。 TCP将按照发送的顺序发送所有发送的数据。 UDP数据包在到达时发送,可能无序,并且可能有间隙(在拥塞的networking上,UDP数据包在TCP数据包之前被丢弃)。 TCP听起来像是一个很大的改进,对于大多数types的networkingstream量来说,但是这些特性是以牺牲成本为代价的:延迟或丢弃的数据包导致所有后续数据包也被延迟(以保证按顺序传送)。
实时游戏通常不能容忍TCP套接字可能导致的延迟types,因此他们使用UDP来处理大部分游戏stream量,并具有处理丢失和乱序数据的机制(例如,将序列号添加到有效载荷数据)。 如果你错过了一名敌方玩家的位置更新,这不是什么大不了的事情,因为几毫秒后你将会得到另一个位置更新(甚至可能不会注意到)。 但是如果你没有获得500ms的位置更新,然后突然把它们全部拿出来,那就会导致可怕的游戏。
总之,在本地有线networking中,数据包几乎不会被延迟或丢失,所以TCP作为最初的开发目标是完全正确的。 一旦WebRTC数据通道API可用,那么你可能会考虑转向。 目前的scheme基于重试或定时器具有可configuration的可靠性。
这里有一些参考:
- WebRTC介绍
- WebRTC常见问题
- WebRTC数据通道build议
长话短说,如果你想使用TCP进行多人游戏,你需要使用我们所说的自适应stream媒体技术 。 换句话说,您需要确保在客户端之间发送的用于同步游戏世界的实时数据量由每个客户端当前可用的带宽和延迟来决定。
dynamic节stream,合并,增量传送和其他机制是自适应stream技术,它不会像UDP那样神奇地使TCP效率高,但是使其足够用于多种types的游戏。
我试图在一篇文章中解释这些技巧: 通过Web优化多人3D游戏同步 ( http://blog.lightstreamer.com/2013/10/optimizing-multiplayer-3d-game.html )。
上个月在旧金山的HTML5开发者大会上 ,我也谈到了这个话题。 该video刚刚在YouTube上提供: http : //www.youtube.com/watch?v = cSEx3mhsoHg
没有对Websockets的UDP支持(实际上应该是这样),但是显然可以使用WebRTC的RTCDataChannel API进行类似于UDP的通信。 这里有一篇很好的文章:
http://www.html5rocks.com/en/tutorials/webrtc/datachannels/
RTCDataChannel实际上使用具有可configuration可靠性和有序传送的SCTP。 你可以通过告诉它传递消息无序,并把最大重发次数设置为0,来使它像UDP一样行事。
我还没有尝试过这个。
我想知道HTML6的规格是否支持UDP?
WebSockets不会。 WebSockets的好处之一是它搭载了现有的HTTP连接 。 这意味着代理和防火墙WebSockets看起来像HTTP,所以他们不会被阻止。
由于安全考虑,任意UDP连接可能永远不会成为任何Web规范的一部分。 最接近你以后的事情可能会成为WebRTC的一部分,它与JSEP协议相关联。
有没有可靠的基准…比较WS协议和低级的直接套接字协议?
不是我所知道的。 我打算出去,并预测WebSockets将会变慢;)