游戏客户端如何知道服务器正在其LAN上运行?


18

在许多多人游戏中,都有LAN播放选项。我的问题是,客户端如何知道服务器在局域网中的位置?

我能想到的唯一方法

  1. 通过广播地址发送广播。这样做的缺点是有时会被不同网络环境中的路由器或交换机过滤。
  2. 尝试连接到子网中每个IP上的服务器。这样做的缺点是速度较慢(特别是如果网络使用10.XXX.XXX.XXX作为IP地址)和小型ddos攻击,但不会被过滤。

尤其是在其他网络环境中,游戏如何做到这一点?

Answers:


32

对于具有LAN玩法的游戏,标准操作是让客户端将广播数据包发送到发现服务器。(客户端发送广播,服务器发送直接答复给客户端)

通常,客户端将发送三到五条广播消息,每条消息间隔大约一秒钟,然后,如果在这段时间内没有收到任何答复,则它将决定没有服务器。发送多个数据包会使服务发现的数据包丢失容忍度更高(尽管这在LAN上很少见),而且它们之间的时间间隔使它们不会过多地干扰其他网络流量。

(据我所知)没有人会执行您的选择2,因为这会降低LAN的性能(或者,如果您错开连接尝试,则将花费相当长的时间)。

但是,为了应对广播被本地LAN过滤的情况(这很不常见,但并非闻所未闻),大多数游戏将允许玩家直接输入要连接的IP地址。这样,处于这种情况的播放器就可以连接到已知服务器,即使他们无法广播也无法自动找到它。

对于通过Internet进行的游戏,客户端会将直接请求发送到静态元服务器,该服务器将返回已知当前服务器实例的地址。同样,服务器会与该元服务器联系,以通知它们自己的位置,以便可以将客户端定向到它们。但是,由于NAT的复杂性,这种方法通常不适用于LAN内托管的服务器。这就是为什么这种方法通常不用于LAN游戏的原因。

补充说明:网络游戏通常会先联系点服务器。点服务器告诉游戏它可以在哪个地址上找到元服务器,元服务器将告诉它可以在哪里找到服务器。点服务器通常(尽管不一定总是)实现为简单的Web服务器,并且是该系统中唯一具有硬编码到游戏中的地址的部分。这使游戏开发人员只需更新点服务器返回的地址,即可根据需要将其元服务器从一台计算机移动到另一台计算机。通过让点服务器根据服务器负载或地理位置,将用户发送到不同的元服务器,它还可用于实现负载平衡或区域切换的简单形式。


2
+1先生,这也回答了我的几个问题。
Raine

2
+1,广播是一种方法,因为它实际上是执行#2的正确方法,呵呵。这就是广播的目的,联系多个IP以查看是否有任何监听。
詹姆斯

是的,广播的唯一问题是某些LAN(尤其是大型公司)不会在所有LAN段之间传播广播。将来,多播可能会成为实现此目的的新方法,并且应该会自动在所有LAN网段上工作。但是现在,路由器对多播的适当支持仍然太参差不齐,不能依靠它来替代广播。再给它几年,情况可能最终会改善。
Trevor Powell

几次遇到不支持广播的公司网络时,我发现各种其他路由问题通常是由有缺陷的设备(有时是通过升级路由器的固件解决的)引起的。如果广播在本地LAN网段中不起作用,则不太可能是故意的。
兰道夫·理查森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.