Image
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. Image
    Az
    Android Chrome
    法国 法国计算机科学大学
    1 年前
    2025-3-16 12:37:31

    其实联机的话可以用bug侠搞的easyn2n,超级方便搭建虚拟局域网(跟zero类似但是却简易很多)

  2. Image
    worst
    Windows Edge
    广西百色市 电信
    2 年前
    2024-12-08 19:11:12

    为什么按照方法设置后,我的服务器显示是leaf节点

  3. Image
    Android Chrome
    福建省福州市 电信
    2 年前
    2024-3-23 18:01:20

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

  4. Image
    Windows Chrome
    广东省广州市 联通
    2 年前
    2024-3-22 22:48:03

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

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

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

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

    鸦鸦宠幸谁

发送评论 编辑评论

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