开篇废话
最近被朋友拉去玩战锤,联机体验实在是差到飞起,打场仗三秒一停的,二十分钟的攻城战愣是打了三十分钟才结束,开了加速器都无解。
于是我猜测,这游戏应该是通过P2P联机的,但是由于我们两个的运营商不同,网络不互通,又没有公网IP,数据可能经由战锤官方的服务器进行中转了,所以丢包特别严重,如果能够构建虚拟局域网,应该能优化联机体验,于是我找到了个叫zerotier的软件,可以构建虚拟局域网,让我们在没有公网IP的情况下也能P2P联机,来优化联机的体验
准备条件
1.脑子和手
2.一台中国大陆vps
正式流程
创建zerotier网络
进入zerotier官网(ZeroTier Central),注册账号,创建一个网络

创建好后保留默认设置就好
这里记一下Network ID,等会要用到
搭建MOON服务器
zerotier的服务器都在海外,因此我们国内用户使用时可能会出现无法连通P2P的情况,这样会导致所有流量都经由zerotier官方服务器中转,延迟和丢包会非常严重
因此我们可以搭建一个moon服务器,moon服务器相当于一个中转服务器,可以保证我们能够顺畅打通P2P,保证低延迟和不丢包
因为moon服务器只起到一个握手的作用,在P2P打通后就没有moon服务器啥事了,因此不用担心moon服务器的延迟和宽带会影响联机体验,但是moon服务器务必位于国内,如果服务器位于海外的话,数据经由GFW出口,可能无法顺利打通P2P
至于服务商的选购,这里就不多叙述了,推荐一下阿里云和腾讯云的学生机,9元一个月,我这里用的是腾讯云的无忧服务器,15元一月,数据中心位于广州
ssh进vps后,输入以下命令来安装zerotier
curl -s https://install.zerotier.com/ | sudo bash
安装执行完成后,加入zerotier局域网
zerotier-cli join <network id>
生成配置文件
sudo chmod 777 /var/lib/zerotier-one
cd /var/lib/zerotier-one
sudo zerotier-idtool initmoon identity.public > moon.json
之后编辑moon.json
(vi编辑器的用法可自行上网搜索)
vi moon.json
修改内容如下,添加自己vps的公网IP
"stableEndpoints": [ "vps公网IP/9993" ]
之后生成moon配置文件
sudo zerotier-idtool genmoon moon.json
新建moons.d文件夹,并将生成的moon配置文件放进去(注意,每个人的moon配置文件文件名不一样,我这里的是0000001ae3f8ae77.moon,执行命令前请修改成你自己的配置文件的文件名)
mkdir moons.d
mv 0000001ae3f8ae77.moon moons.d/
之后重启zerotier就好了
sudo systemctl restart zerotier-one.service
重启好后,进入zerotier官网的网络配置,可以看到一个未验证设备接入,这个就是我们刚刚配置的moon服务器了,给前面的小框打勾,允许这个设备接入

至此,moon服务器配置好了,接下来来到客户端配置
客户端配置
注意,你和你一起联机的朋友都需要进行客户端配置
先在官网下载zerotier Windows端的安装包
下载安装好后,你会发现啥界面都没有,不要以为没安装上(我就是以为没安装上,重复安装了十几遍)
在Windows开始菜单搜索zerotier就能找到它了
双击启动后就会在任务栏里出现了
右键任务栏的zerotier,打开zerotier控制面板

在#######的框里输入你的Network ID来加入网络,加入成功后如图所示
然后在zerotier官网的网络配置里,允许这台设备的接入

之后进入C:\ProgramData\ZeroTier\One文件夹,新建moons.d
文件夹,并将之前在moon服务器生成的moon配置文件丢进去

之后打开任务管理器,转到【服务】选项卡,点击【打开服务】,重启一下zerotier

之后在命令终端里查看一下节点列表
zerotier-cli listpeers
出现moon服务器即为成功

ping一下延迟


只有20ms,P2P连接成功建立了
如果ping不通的话,打开Windows防火墙的【高级设置】

在入站规则里启用这两个规则就行

游戏体验
搭建了虚拟局域网,实现了P2P联机后,战锤的联机游戏体验明显好了很多,丢包变得少了很多,打仗不会出现三秒一停的情况了
理论上来说所有P2P游戏的联机都能这样优化,倘若是帝国霸业这样需要启动服务端的游戏,只要在多人游戏里连接主机端的内网IP即可