所以,我一直在研究在线游戏,我想知道他们是如何设法与服务器建立如此快速、看似持续的连接的。我已经尝试过只发送一堆XMLHttpRequest
s,但这些往往很慢。我也尝试过研究,但大多数关于该主题的文章都谈论 web sockets、tcp 和 udp 之类的东西,我根本不理解这些概念。我也在尝试在不从外部源导入代码的情况下完成这一切,这样我可以更好地理解它是如何工作的。如果可以的话请帮忙。谢谢!
1 回答
到目前为止,您的问题对于这个平台来说太宽泛了。
我会尽可能简短地回答。
阿贾克斯 /XMLHttpRequest
XMLHttpRequest
每次发送数据时,API 都会(通常)打开一个到主机的新连接。这是一项非常昂贵的操作,并且会损害性能。
要考虑的另一点是,anXMLHttpRequest
将始终发送身份验证和其他标头,从而在客户端和服务器上浪费带宽和 CPU 周期。
还有一个问题是这种方法通常基于轮询,因此即使没有更改或更新,数据也会被发送和处理。这不仅是一种浪费,而且可能会伤害正在等待更新的其他客户端。
最后,AJAX /XMLHttpRequest
将使用 TCP/IP 连接,如果您必须确保所有数据按顺序到达但会导致性能下降,这非常好。
网络套接字
WebSockets 是一种在流连接上运行的协议,例如 TCP/IP 连接(或管道或 unix 套接字)。
一旦建立连接,它就是持久的,它允许双向通信。这允许客户端和服务器在没有轮询和额外成本(标头、重新身份验证等)的情况下启动更新。
WebSockets 仍然位于流式套接字上,例如 TCP/IP 套接字,它会产生性能 const 以换取数据完整性(所有数据按顺序到达)。
TCP/IP 套接字
TCP/IP 是一种流协议,而不是基于消息的协议。出于这个原因,它经常与其他协议(例如 WebSockets 或自定义编写的协议)一起使用。
由于 WebSockets 将在 99.9% 的时间使用 TCP/IP(除非在同一台机器上或在定制的特殊场合),我为 WebSockets 描述的相同问题在这里适用。
但是,通过使用带有 TCP/IP 的自定义协议,可以实现一些性能优化(以与网络连接和中间干扰相关的代价)。
UDP(数据报)
许多游戏不需要数据完整性。丢包没关系,更重要的是最新的信息尽快到达。
这就是 UDP 套接字的用武之地。没有高成本的连接协商阶段(就往返而言,UDP 实际上是免费的),也没有可能阻止乱序到达的数据的数据完整性测试层。
由于这些原因,一些游戏需要 UDP 套接字来进行快速更新,同时仍然使用 TCP/IP 连接来获取必须安全到达的数据。