HTML5 websockets目前使用TCP通信的形式。然而,对于实时游戏,TCP不会削减它(并且是使用其他平台的很好理由,如本机)。由于我可能需要UDP来继续项目,我想知道HTML6或其他什么规格是否支持UDP?
此外,WebSockets是否有可靠的基准测试可以将WS协议与低级直接套接字协议进行比较?
答案 0 :(得分:190)
在局域网上,您可以通过WebSocket的消息获得200微秒(从浏览器JS到WebSocket服务器并返回)的往返时间,这与原始ICMP ping类似。在MAN上,它大约是10ms,WAN(通过住宅ADSL到同一国家的服务器)大约30ms,依此类推,大约120-200ms,通过3.5G。重点是:基于网络,WebSocket确实几乎没有为您获得的延迟添加延迟。
WebSocket的线路级开销(与原始TCP相比)在每个消息的2个八位字节(长度<126个八位字节的未屏蔽有效载荷)和14个八位字节(长度> 64k的屏蔽有效载荷)之间(前面的数字假设消息不会碎片化为多个WebSocket框架)。非常低。
有关WebSocket线级开销的更详细分析,请参阅此blog post - 这包括覆盖WebSocket之外的层的分析。
更多:使用能够进行流处理的WebSocket实现,您可以(在初始WebSocket握手之后),在每个方向上启动单个WebSocket消息和帧,然后发送最多2 ^ 63个八位字节,完全没有开销。从本质上讲,这使得WebSocket成为原始TCP的奇特前奏。警告:中间人可能会根据自己的决定分割流量。但是,如果您运行WSS(即安全WS = TLS),则没有中介可以干扰,并且您有:原始TCP,具有HTTP兼容的前奏(WS握手)。
WebRTC使用RTP(=基于UDP)进行媒体传输,但另外还需要信令信道(也可以是WebSocket)。 RTP针对容错实时媒体传输进行了优化。 “实时游戏”通常意味着不是转移媒体,而是转移玩家的位置。 WebSocket将适用于此。
注意:WebRTC传输可以通过RTP进行,也可以通过SRTP进行保护。请参阅“RTP配置文件”here。
答案 1 :(得分:37)
我建议您使用本地有线网络上的WebSockets开发游戏,然后在WebRTC数据通道API可用后转移到WebRTC数据通道API。正如@oberstet正确指出的那样,WebSocket的平均延迟基本上等同于原始TCP或UDP,特别是在本地网络上,因此对于您的开发阶段应该没问题。 WebRTC数据通道API的设计与WebSockets非常相似(一旦建立连接),因此一旦广泛可用,它就应该非常简单。
你的问题暗示UDP可能是你想要的低延迟游戏,而且事实也是如此。你可能已经意识到这一点,因为你正在编写一个游戏,但对于那些没有的游戏,这里有一个关于实时游戏的关于TCP与UDP的快速入门:
TCP是一种有序,可靠的传输机制,UDP是最大努力的。 TCP将提供发送的所有数据以及发送的顺序。 UDP数据包在到达时发送,可能出现故障,并且可能存在间隙(在拥塞的网络上,UDP数据包在TCP数据包之前被丢弃)。 TCP听起来像是一个很大的改进,它适用于大多数类型的网络流量,但这些功能需要付出代价:延迟或丢弃的数据包会导致所有后续数据包延迟(以保证按顺序传送)。 / p>
实时游戏通常不能容忍TCP套接字可能导致的延迟类型,因此它们对大多数游戏流量使用UDP,并且具有处理丢弃和无序数据的机制(例如,添加序列数字到有效载荷数据)。如果你错过了敌方玩家的一个位置更新,这并不是什么大问题,因为几毫秒之后你会收到另一个位置更新(甚至可能不会注意到)。但是如果你没有获得500ms的位置更新然后突然把它们全部拿出来,那就会导致糟糕的比赛。
所有这一切,在本地有线网络上,数据包几乎从不延迟或丢弃,因此TCP作为初始开发目标完全没问题。一旦WebRTC数据通道API可用,您可以考虑转向它。目前的提案具有基于重试或计时器的可配置可靠性。
以下是一些参考资料:
答案 2 :(得分:18)
总而言之,如果您想将TCP用于多人游戏,则需要使用我们称之为自适应流媒体技术的内容。换句话说,您需要确保在客户端之间发送以同步游戏世界的实时数据量受每个客户端当前可用带宽和延迟的控制。
动态限制,混淆,增量传递和其他机制是自适应流技术,它们不会神奇地使TCP像UDP一样高效,但使其足以用于几种类型的游戏。
我试图在一篇文章中解释这些技巧:通过网络优化多人3D游戏同步(http://blog.lightstreamer.com/2013/10/optimizing-multiplayer-3d-game.html)。
我上个月在旧金山举行的 HTML5开发者大会上也就此主题发表了演讲。该视频刚刚在YouTube上提供:http://www.youtube.com/watch?v=cSEx3mhsoHg
答案 3 :(得分:2)
Websockets没有UDP支持(确实应该有),但是你可以使用WebRTC的RTCDataChannel API进行类似UDP的通信。这里有一篇好文章:
http://www.html5rocks.com/en/tutorials/webrtc/datachannels/
RTCDataChannel实际上使用SCTP,它具有可配置的可靠性和有序传送。您可以通过告诉它传递无序消息并将最大重传次数设置为0来使其像UDP一样工作。
我还没有尝试过任何一种。
答案 4 :(得分:1)
我想知道HTML6或其他什么规格是否支持UDP?
WebSockets不会。 WebSockets的一个好处是它piggybacks the existing HTTP connection。这意味着对于代理和防火墙,WebSockets看起来像HTTP,因此它们不会被阻止。
由于security concerns,任意UDP连接都可能永远不会成为任何Web规范的一部分。与你所追求的最接近的东西很可能是WebRTC的一部分而且与JSEP protocol相关联。
是否有任何可靠的基准......将WS协议与低级直接套接字协议进行比较?
不是我知道的。我打算走出困境,预测WebSockets会慢一些;)