2008-10-17 121 views
12

MMORPG客户端/服务器通信中使用的UDP和TCP协议如何?MMORPG客户端/服务器编码

例如:

客户是否广播(玩家位置等),通过UDP服务器?或相反亦然?

或者更像是在客户端请求服务器移动播放器时使用TCP。服务器收到请求后,移动播放器并将播放器返回给客户端,现在播放器位于xyz位置?

聊天频道必须使用TCP来实现吗?

有没有关于此的好文章/书籍?我发现了点点滴滴,但看起来真正的肉和土豆是从经验中获得的。

回答

1

你的问题的一半(使用传输层协议)可以通过安装wireshark并查看流量来应答。

0

除了作为玩家的观察,我不知道任何细节,但大多数游戏绝对不会等待服务器回复来移动角色,除非它是基于回合的角色,否则会杀死用户体验。看起来会发生什么是运动完成客户端并发送到服务器,然后将这些消息发送给其他玩家。至少在魔兽世界里,如果一名球员落后了,你可能会看到他们仍在向前移动,然后奇迹般地出现在另一个位置,这对我说,客户收到的不仅仅是位置数据,还包括他们正在移动以及他们移动的方向然后在没有更多数据的情况下推断运动。

0

你最好打赌的可能是看看Planeshift的网络代码,它是一个开源的MMO。我相信这是现场最发达的(最后我检查过)。

8

很多游戏使用UDP进行移动相关的活动 - 所以,就像你走路时一样,很可能会发送一堆UDP请求。服务器最终仍然控制着它是否有效,但是你不一定关心每个数据包是否都到达服务器。这就是为什么很多游戏客户也使用某种预测机制。

就你提到的第二点而言,是的,所有控制器都是由服务器管理的。您不希望客户将任何内容广播到服务器;你应该做错误和输入处理服务器端,以防止黑客攻击。您可能还会限制每秒输入。

无论如何,UDP和TCP的组合是合适的 - 你只需要问自己:“我想要可靠性还是速度?”

4

有许多不同的可能的实现,但大多数情况下,它们看起来像这样。游戏世界中的任何动作都会重复这种模式。

  1. 客户端与服务器通信,玩家想要移动。
  2. 客户端根据它认为应该发生的事情来显示播放器的移动。
  3. 鉴于玩家的位置,服务器验证移动是否可能发生。
  4. 服务器更新客户端,以确定玩家在服务器上的位置。
  5. 客户端更新玩家位置以反映服务器的世界状态。
1

您可能会感兴趣Project Darkstar。这是一个开源的MMO框架。

+0

我认为这是[RedDwarf Server](http://www.reddwarfserver.org/)。只是为了保持最新。 – 2012-05-29 20:14:56

4

你不能依靠客户端传递真实的信息。有人会破解协议和作弊。加密数据不会阻止这一点 - 只是让它难以做到。

客户端只应发送移动请求等,服务器需要检查请求以确保它们不违反游戏规则。服务器只应发回客户端绝对需要的数据 - 您不能依赖客户端获取大量世界数据,只能过滤掉玩家当前无法观察的所有内容。有人会获得额外的信息并利用它。

如果游戏需要'实时',那么客户端需要假定服务器将允许移动请求并相应地更新显示 - 如果服务器稍后进行了更正,则会回滚移动。在大多数情况下,客户端和服务器都会同意,一切都会顺利进行。当客户试图作弊时(这是他们的错误) - 或者由于连接不好导致客户严重滞后(对此可能没有太多可以做到)。

0

我不认为这个问题有一个简单的答案,它的范围相当广泛。还有几点:

  • 没有必要仅仅因为使用UDP而“广播”。根据我的经验,UDP大部分时间都是点对点的。
  • 完全可以通过UDP进行自己的“安全”通信,而不必使用TCP。这不是神奇的,只是......聪明而复杂。 :)但大多数情况下,正如你所暗示的那样,TCP不适用于游戏中的实时通信。
  • 有些方法可以使TCP更合适,例如搜索“Nagle算法”。
  • 如果你已经在自己的无损传输协议的基础上实现了,你可以通过UDP进行聊天。很多游戏都是这样的。

有关于Gamasutra网络的文章,但我现在没有任何链接。不知道他们是否仍然公开提供,对不起。

1

我想你可以通过阅读其他人如何实现这些类型的系统来学习很多。在这种徒劳的,我可以指出你的蒂姆·斯威尼工作的槌球协会

  1. Unrea Networking Architecture
  2. The Croquet Project

蒂姆·斯威尼的论文转化我想对编程的想法。我无法推荐他们。