头像

keeptpa

休个假,翻个身

3 3 0
文章 分类 评论
一块红石

博客点燃已有929 天。

标签云

当前位置:首页 » 默认分类 » 关于游戏服务的第三次更新

2020-03-08

80人围观

分类: 默认分类

标签:


前两天我为了让朋友们能够便捷地联机游戏,开始搭建虚拟局域网服务,截至目前为止,这项服务已经更新了两次,完美服务0次,首先很抱歉对让大家装了卸卸了装连了掉掉了连。面对以后可能时不时的缝缝补补,我觉得我有必要事先告诉大家我为什么这么难。  

  注意:我会尽量用通俗易懂和例子来让大家明白我在讲什么,另外,由于我也是半吊子,所以有可能会有错误。
  我写这篇文章是因为我睡不着。


  首先我们要了解互联网和局域网的区别。
  局域网是一种基础的网络结构,其通常规模很小,比如一个房间,一个宿舍;但是也存在很庞大的局域网,比如一个小区,甚至一个城市(请见ISP门头沟)。局域网把局域网内的各个设备连接起来,并通过一个专用连接(比如光猫),连接到其他的局域网(比如和你玩游戏的朋友家里)或者数据库、服务器进行访问,形成更大的信息交换系统。这个更大的信息交换系统,就是互联网。
  所以我们知道了局域网和互联网的区别,实际上就是规模和层级不同而已。
  现在大多数家庭都会有路由器这种东西吧,这个路由器起到一个网关的作用,将所有的家庭设备,都连接成一个局域网,通过LAN口的网线,通过光猫连接互联网。需要注意的是,如果有来自互联网的,针对在局域网(下称内网)的特殊访问,是会被路由器默认拦截下来的,这是路由器对内网设备的一种保护,而且并不是所有人都能解除这个保护(等下讲1),而且即便解除保护也不一定能联机游戏(等下讲2),当然,路由器组网也有另一种好处(还是等下讲3)。这也就是为什么我们不能直接联机游戏,而是要转诉一些工具,如对战平台,hamachi,或者steam的服务器做中介,又或者是我的阿里云服务器的原因。
  但是,如果在路由器配置了端口转发,DMZ转发一类的设置,路由器会将针对某个或多个内网设备的访问请求放行,这就是内网穿透。我所建立的服务器服务,虽然使用了物理服务器,但是并不是传统游戏意义上的P2S,而是一种内网穿透服务,因为我的服务器只起到传递数据的作用,并不承担游戏数据的运算。这里我们要提到这项伟大的发明:VPN。VPN,中文虚拟专用网络,是一种借用互联网的宽敞大道,以加密的形式创建的私人专用连接网络。由于他是加密保证安全,而非真正的专用,因此被冠以虚拟专用之名。
实际上它使用的还是互联网的公用链路。由VPN构建出来的通讯通道,会直接连接装载了VPN客户端的设备,并和VPN服务器进行通信,由VPN服务器进行转发。这让我们绕过了路由器的拦截,实现穿透。我们虽然远在天边,但我们的设备近在眼前。只要我们玩的游戏,支持从VPN虚拟的网卡进行通信,我们就能通过这个网卡联机玩游戏。
  说回1:为什么不是所有人都能解除这个保护,因为就算你让路由器暂停对内网设备的保护,你的ISP(运营商)还是会给你背后来一刀。通常情况下(尤其是近年来),ISP会将一个小区之类的区域划分为一个“局域网”,并在交换机安装NAT服务。这项服务会将交换机分给你家的IP转化为真正的公网IP,再进行通讯。为啥?因为地球上的IPv4地址不够用啦!要被人类毛光啦。这么做,ISP实际上只需要给这个交换机分配一个公网IP,而这个交换机下的千百用户,都是由交换机分配IP,可以说是“不关地球的事”了。你穿透了路由器,没想到还有个交换机。
  你以为你在局域网,我在公网,实际上你是在局域网里的局域网,我在你局域网外的局域网外的局域网里的局域网。这波是标准套娃。
  说2:解除了保护和交换机还是不能联机,为什么?简单,因为辣鸡的服务器(50382)或者不支持直连的游戏。不过,50382是一种p2s游戏模式,这种游戏并不需要你解除保护,做穿透之类的,因此不谈。我们说说不支持直连的游戏,这些游戏可能是因为各种各样的原因没有提供这项服务,比如程序员去打双尸祭天了。手机上的元气骑士,这玩意我挺喜欢玩的。他只能局域网连接,而不能通过互联网进行IP直连游戏,没这个功能。
  说说3:其实在1里面就讲完了。路由器组网,是省地址数量了。运营商只需要给交换机/路由器分配IP地址,交换机通过DHCP服务(你可以理解为老师拿着一篮子棒棒糖,小朋友先到先得)发给挨家挨户。


  说完这个网的区别,我们来讲讲一些游戏联机方式。拿我们都熟的Minecraft举例子吧。  
  Minecraft有两种联机方式,一种是p2p,即peep-to-peer,个人对个人、和一种p2s,即peer-to-server,个人到服务器模式。个人到个人很好理解,从玩家A发送的游戏数据,直接通过互联网结构传输到玩家B的游戏中。另外一种p2s,则是将玩家A的数据,先上传到游戏服务器,游戏服务器再将游戏数据传输给其他玩家。
  不难理解,在同等网络,一般条件下,p2p总是有着比p2s更低的延迟,而且显著地,p2p并不需要额外的服务器物理设备。在p2s游戏里,服务器搭建了游戏服务,涉及对游戏的部分或者完全处理,比如卡普空要发布游戏内活动却不会计算哪局游戏的怪物部位破坏 ,MC服务器却会运行几乎整个MC。
  现在我们就知道了,我们难以联机的游戏主要就是p2s游戏,这些游戏指定的服务器,对我们来说,连接不一定快。掉线掉包十有八九(再次50382),我的服务搭建初衷就是为了解决这种问题。但是,我不能强制游戏将本该发往指定服务器的数据重定向到我的服务器(这就是游戏私服),而只能转而求其次,通过VPN组建虚拟局域网的方式,让游戏以为我们都在同一个局域网,进行局域网游戏。这需要游戏本身支持局域网游戏。这局域网游戏就是一种p2p。
  但是这种方式有一个致命的缺点,那就是对于UDP广播的处理。局域网内部的游戏,我们拿魔兽争霸举例子,当局域网内一台主机建立了一个游戏房间,这台主机就会通过UDP协议,向整个局域网的6102端口(好像是吧,我记不太清了)发包。这个包包括了这台主机的IP地址,游戏内容,玩家人数等等。收到这个UDP包的设备们,他们的游戏列表就会出现这个游戏大厅。而Minecraft不太一样,Minecraft的服务器搜寻是由客户端进行的,而非主机端。Minecraft客户端会向整个局域网发送一枚UDP包,服务器接受到UDP包后返回IP地址,游戏内容如此。然后再通过TCP协议进行联机。
  不难看出,无论是客户端主动还是服务端主动,UDP的收发都是双方能够联机的先决条件,然而很遗憾,我们目前使用的VPN并不能转发UDP包——他只能转发TCP包。这也就是为什么在ARK中,搜索不到本地局域网游戏,而只能从Steam官方加入的原因。但是如果另一方的服务器位于VPN的IP,那么在游戏过程中,我们的TCP连接走的就是VPN通道了。这就是为什么在某次ARK游戏中,我证实了VPN确实在发挥作用。


  接下来的事情比较难办,并没有什么好的方法能让我转发UDP包,虽然有UDP-broadcast-relay这样帮你转发包的程序,但是他只能转发一个端口上的UDP包,而我们的游戏有那么多种,更何况我还不知道他们在哪一个端口收发,我现在并没有什么好的头绪。我只能寄希望于2层网桥,虽然它可能带来许多缺点,但是我有一点可以肯定,使用网桥,而不是VPN,我们的延迟会更低,我服务器的负载会更低。
  See you later.


作者:

丨随风飘着,不也挺好。