P2P联机游戏加速之ZeroTier方案

写在前面

首先要感谢我那爱吃茴香馅包子的朋友的push,不然就不会有这篇教程了,其次要感谢他的建设性误导意见,不然我早写完了。所以,在开始之前,请先把碍事的男人叉出去。

本教程适用于P2P联机的游戏,例如桌游模拟器(Tabletop Simulator, TTS)。至于如何判断你的游戏是不是P2P,靠猜。这种游戏的一项特征通常是以其中一台玩家的电脑作为主机。

不过有人说TTS不是标准的P2P,而是C/S模型,主机不是服务器,只是游戏中具有特殊能力的另一个客户端[1]。总之众说纷纭,但确实有玩家证实了ZeroTier对TTS具有降低延迟的效果[2]。虽然他结果是成功了,但是他配置错了,漏写了端口号。

本方案在阿里云服务器搭建了中转节点,但是没有服务器也可以,因为ZeroTier本身有它的官方服务器,但在海外,加个国内服务器只是为了加强连接的稳定性。没有服务器的小伙伴可以直接去下载它的客户端进行配置。它在全平台都有客户端,包括NAS,所以后期用来做NAS的内网穿透应该也很方便。

另外,不知道是不是长城宽带封锁P2P的原因,朋友的客户端并没有ping通,而我是电信,我的客户端能和服务器端ping通。网上也说有运营商封锁了ZeroTier,所以,本教程并不一定成功,可能还是和运营商有关。

概念解释与思路说明

因为我俩都是小白,所以在第一步选方案的时候就是个糊涂蛋,起初只是想利用服务器实现加速而已,具体怎么实现完全没有思绪。然后就被一团概念搞迷糊了,什么虚拟局域网?VPN?代理?乱七八糟搜到一堆squid、nginx代理的配置教程,后来一寻思这些好像是C/S的应用场景,也可能是B/S,反正好像没有人把它和P2P加速联系起来。

虽然迄今为止我也没有完全搞懂,但我有我的一套解释。下面先解决一连串概念问题。

P2P和C/S的区别?

  • P2P:Peer-to-Peer,点对点,也叫端到端。简言之不需要游戏服务器。
  • C/S:Client-Server,客户端-服务器。简言之,除了玩家之外,有Server这个重磅角色参与调度。
  • B/S:Browser-Server,浏览器-服务器。简言之,还是有Server这个角色参与,只不过客户端是浏览器,感觉和C/S的概念区别不是很大。

内网穿透是什么意思?

这个名字确实搞得挺高深莫测的,但其实就是把局域网里的设备挂载上网,大概就这么个意思吧,这样就可以通过网络远程访问家里的电脑或者存储空间啦。P2P联机的话,大概也是需要把主机玩家内网穿透的,这样另一个玩家才能访问到主机玩家的电脑。我的理解哈,可能有不对的地方。所以,核心思路就变成内网穿透啦。

内网穿透为什么能降低P2P游戏的延迟?

原生的Steam P2P或者游戏厂商官方的P2P可能是绕了太多弯路,然后借助咱自己搭的中转服务,玩家之间能找到一条更直的捷径。

1709831480888.png

内网穿透并不是一定可以优化延迟。两个节点之间的速度,最优的情况一般是P2P直连。 除非两个节点之间直连速度很差,这种情况需要一个对两端线路都友好的中转服务器,只有此时通过中转服务器建立的连接会比直连速度好。

组建虚拟局域网降低延迟的情况是游戏不能自己建立P2P连接,所以需要借助第三方工具完成。在国内网络情况下,组建虚拟局域网的内网穿透工具,都会优先尝试直连,包括UDP打洞、NAT转发、IPV6等办法,也就是帮游戏完成了P2P的工作,此时速度自然是好的。[3]

内网穿透工具有哪些?为什么选ZeroTier?

内网穿透工具超级多的啦,我找到了三款最主流的开源软件对比:[4]

frp

FRP使用 Go 语言开发,可以支持 Windows、Linux、macOS、ARM 等多平台部署。frp内网穿透无需多复杂的配置就可以达到比较好的穿透效果,具有较强的扩展性,支持tcp, udp, http, https 协议,并且 web 服务支持根据域名进行路由转发。此外,FRP 提供了一种新的代理类型 XTCP ,可以在传输大量数据时让流量不经过服务器中转,用于实现点对点穿透,当然,此功能并不能保证在你的网络环境 100% 可用,成功率较低,而且还要求访问端也得运行 FRP 客户端 (目前手机端ios没有frp客户端软件)。由于实现条件较多,所以有文件传输需求的朋友但必须用frp的朋友还是建议买带宽稍大一点的 VPS 会比较省心。frp适合有linux基础的个人,且需要自购一个云主机做中转,企业追求稳定可以考虑其他方式。

ngrok

ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道。ngrok可捕获和分析所有通道上的流量,便于后期分析与响应。主要用途是给网站或者安装开发提供部署环境,但是也同样可以用来进行端口转发。ngrok适合有linux基础的个人,和frp类似,但比frp配置稍复杂,且需要自购一个云主机做中转,企业追求稳定可以考虑其他方式。

zerotier

ZeroTier官方解释为将整个世界转变为单个数据中心或云区域,将所有设备,虚拟机和应用程序联接起来,就像在同一个交换机接入所有设备一样。zerotier类似VPN,为内网服务器所在NAT网络和客户机所在NAT网络各虚拟出一个VLAN,这样俩个VLAN就可以通过ZeroTier建立连接,在通过UDP打洞技术就可以实现内网服务器和内网客户机直接交互数据。目前ZeroTier提供的点对点穿透技术成功率还是比较高的,可以应付大多数网络,国内长城宽带无法点对点穿透。而zerotier因为是国外的项目,官方提供的中转服务器在国外,国内连接延迟高甚至连不上,所以官方给出了moons概念,可以自己搭建中转服务器。另外ZeroTier 支持 Windows、macOS、Linux 三大主流平台,iOS、Android 两大移动平台,以及 QNAP(威连通)、Synology(群晖)、Western Digital MyCloud NAS(西部数据)三个 NAS 平台,还支持 LEDE 开源路由器项目,支持客户端真的很多。zerotier适合有linux基础的个人,一般用于NAS,为了稳定性需要自购一个云主机做中转,服务器和客户机都需要安装zerotier,企业追求稳定可以考虑其他方式。

结论就是ZeroTier地表最强,P2P成功率高且支持的客户端最多。而且看了一个V2EX的帖子[5],更加坚定了我的信心。于是我就闭着眼睛选了ZeroTier,但是万万没想到,朋友的网络还真是长城宽带。。。虽然他组网失败了,但是这不影响我们教程的继续。

内网穿透等于P2P吗?

不等于,因为ngrok这款内网穿透软件就不支持P2P,所以肯定是两个概念。

ZeroTier使用教程

先说一下ZeroTier的一些名词概念:

ZeroTier整的还挺有浪漫主义气质,官方的服务器叫PLANET,用户自己建立的中转服务器叫MOON。

MOON服务器只起到一个握手的作用,在P2P打通后就没有MOON服务器啥事了,因此不用担心MOON服务器的延迟和宽带会影响联机体验,但是MOON服务器务必位于国内,如果服务器位于海外的话,数据经由GFW出口,可能无法顺利打通P2P。[6]

1. 官网注册并创建一个网络

官网地址:ZeroTier Central

创建完后如图。

1709837556154.png

我的NETWORK ID272f5eae16764cfa

2. 服务器端操作(非必须)

如果你的服务器是CentOS系统,作为Linux发行版的一种,可以直接通过SSH运行Linux命令安装ZeroTier的Linux客户端:

curl -s https://install.zerotier.com/ | sudo bash

安装执行完成后,加入zerotier局域网:

zerotier-cli join 272f5eae16764cfa

这里的272f5eae16764cfa换成你自己的NETWORK ID

生成卫星服务器的配置文件moon.json

sudo chmod 777 /var/lib/zerotier-one
cd /var/lib/zerotier-one
sudo zerotier-idtool initmoon identity.public > moon.json

修改moon.json,我是直接用宝塔面板文件管理修改的(建议新开一个标签页,不要关闭SSH)。

文件地址就在/var/lib/zerotier-one

修改内容如下,写上自己服务器的公网IP:

"stableEndpoints": [ "139.224.16.2/9993" ]

其中139.224.16.2换成你自己服务器的公网IP,注意引号"不要漏掉。

之后生成.moon配置文件:

sudo zerotier-idtool genmoon moon.json

新建moons.d文件夹,并将生成的moon配置文件放进去:(也可以通过宝塔面板文件管理操作)

mkdir moons.d
mv 00000050cc09d260.moon moons.d/  

其中00000050cc09d260.moon换成你自己生成的文件名,每个人生成的文件名不一样。这个文件需要下载保存,后面还会用到。

之后重启zerotier就好了:

sudo systemctl restart zerotier-one.service

重启好后,进入zerotier官网的网络配置,可以看到一个未验证设备接入,这个就是我们刚刚配置的moon服务器了,给前面的小框打勾,允许这个设备接入。

1709866662853.png

允许接入后可能要稍微等一段时间才会刷新出物理地址。

3. 客户端操作

凡是进行联机的玩家都需要进行客户端配置,包括你自己和你朋友。

先在官网下载ZeroTier Windows端的安装包。下载安装好后,在Windows开始菜单搜索zerotier启动。

1709866065218.png

然后输入Network ID来加入网络,并且在zerotier官网的网络配置里,允许这台设备的接入。

1709866426561.png

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

1709866955008.png

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

1709869308440.png

之后打开命令终端(管理员)查看一下节点列表:

zerotier-cli listpeers
1709867866741.png

出现MOON服务器的IP地址,且不显示-1,即为连接成功。

除此之外可以看到还有四个官方的PLANET服务器也连接成功了。所以MOON服务器并不是必须项,饱和式救援而已。

LEAF是叶子节点,别的玩家会标记为LEAF。

ping一下MOON服务器的延迟(虚拟局域网IP在官网可以找到):

ping 10.147.17.244
1709868463498.png

最短延时是15ms,再次验证了连接成功。如果是三四百毫秒以上且丢包严重,那应该是有问题。

如果ping不通的话,可以关闭Windows的防火墙试试。开始菜单搜索防火墙打开控制面板。

如果不想完全关闭防火墙,可以在防火墙的高级设置-入站规则里启用这几个规则。

1709868852262.png

其他方法

如果ZeroTier失败了,也可以试试其他软件。但我还没有测试过。

小提示:您还可以点击下方 [ 标签 ] 阅读相关文章。您可以通过 RSS 订阅本站文章更新,订阅地址:https://crowya.com/feed

评论

  1. Android Chrome
    福建省福州市 电信
    1 月前
    2024-3-23 18:01:20

    之前自己搭过zerotier的planet,但是感觉区别不大,能不能打通还是和运营商有很大关系(广电和联通打通之后,速率有5MB/s),移动设备与电脑之间一般无法打通P2P,这时候就要看planet的带宽和连接稳定性了,之前想用阿里云香港30Mbps的服务器来做planet,但是因为一些原因没尝试

  2. Windows Chrome
    广东省广州市 联通
    1 月前
    2024-3-22 22:48:03

    可恶,为什么ipv6还没有普及

  3. MatrixCore
    Windows Edge
    北京市 电信/IDC机房
    2 月前
    2024-3-10 19:27:20

    之前和同学steam饥荒联机的时候用的还是radminlan这个方案,体验似乎也不错。

  4. 鸦鸦的爱慕者
    iPhone Safari
    北京市丰台区 联通
    2 月前
    2024-3-09 14:51:27

    鸦鸦宠幸谁

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇