惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
AI
AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
量子位
H
Help Net Security
Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
L
LINUX DO - 最新话题
A
Arctic Wolf
博客园_首页
S
Securelist
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
N
Netflix TechBlog - Medium
Cyberwarzone
Cyberwarzone
小众软件
小众软件
T
Threatpost
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
NISL@THU
NISL@THU
Forbes - Security
Forbes - Security
博客园 - 聂微东
F
Fortinet All Blogs
Simon Willison's Weblog
Simon Willison's Weblog
H
Heimdal Security Blog
罗磊的独立博客
S
Security @ Cisco Blogs
B
Blog
T
Troy Hunt's Blog
Engineering at Meta
Engineering at Meta
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
The Hacker News
The Hacker News
The Last Watchdog
The Last Watchdog
Hacker News - Newest:
Hacker News - Newest: "LLM"
I
Intezer
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
The Cloudflare Blog
S
Schneier on Security
月光博客
月光博客
L
LINUX DO - 热门话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org

鸦鸦的巢穴

母欲养而猫不待 - 鸦鸦的巢穴 又活半年 - 鸦鸦的巢穴 服务器廉价续费迁移教程 - 鸦鸦的巢穴 AD原理图添加ROOM及模块复制的方法(PCB更新不删除) - 鸦鸦的巢穴 2025幸福报告 - 鸦鸦的巢穴 NAS入坑笔记 | 网盘+相册+影视库+软路由 ALL IN ONE - 鸦鸦的巢穴 迄今为止最满意的GIF录屏软件 - 鸦鸦的巢穴 沃尔沃VOLVO工厂参观日记 - 鸦鸦的巢穴 Argon主题优化 | 将说说添加到RSS - 鸦鸦的巢穴 人物速写(三):表演型人格的底层逻辑 - 鸦鸦的巢穴 人物速写(二):采样心理学与宿命心理学 - 鸦鸦的巢穴 人物速写(一):自恋型人格障碍素材合辑 - 鸦鸦的巢穴 上班真是太爽了 - 鸦鸦的巢穴 九寨沟单人行 - 鸦鸦的巢穴 最喜欢的三款Typora主题 - 鸦鸦的巢穴 一个充电宝引发的争论:先有mAh还是先有Wh - 鸦鸦的巢穴 自建Meting API修复音乐播放器 - 鸦鸦的巢穴 Matlab求解函数solve、vpasolve和fsolve宠幸谁 - 鸦鸦的巢穴 PCB进阶指南 - 鸦鸦的巢穴 运算放大器&比较器应用指南 - 鸦鸦的巢穴 页面加载速度优化指南 - 鸦鸦的巢穴 教程 | 将博客朋友圈化——仅展示最近一个月动态 - 鸦鸦的巢穴 脑电波仅展示最近一个月动态,看到这条说明已经到底啦! - 鸦鸦的巢穴 PTC Mathcad 8.0 setup.exe 打不开/无反应解决办法 Word导出PDF图片模糊解决办法 & PPT制作海报导出图片分辨率不够解决办法 - 鸦鸦的巢穴 Microsoft Word 的文艺复兴 - 鸦鸦的巢穴 Zotero+阿里云盘WebDAV+公网访问≈无限空间+全平台 Altium Designer 重拾指南 | 菜鸟救星 - 鸦鸦的巢穴 Notion也可以有#文内标签# Matlab/Simulink批量运行仿真、参数寻优
P2P联机游戏加速之ZeroTier方案 - 鸦鸦的巢穴
鸦鸦 · 2024-03-08 · via 鸦鸦的巢穴

写在前面

首先要感谢我那爱吃茴香馅包子的朋友的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整的还挺有浪漫主义气质,官方的服务器叫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,注意引号"不要漏掉。

注意:此处需要在阿里云防火墙放行9993端口,至于端口类型,有人说UDP有人说TCP,反正都放了吧。

之后生成.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失败了,也可以试试其他软件。但我还没有测试过。