0%

为1M小水管的Minecraft服务器加速的各种尝试

遇到的问题

阿里云的学生机,10块钱一个月的那种,只有1Mbps的带宽。1Mbps是什么概念呢?就是公网下行带宽最大是1×1024÷8 = 128 kb/s,每秒最多128kb的速度,开mc服务器基本顶不住。一个只有三人的私人服务器,差不多两人就能把带宽占满,三人就开始卡,如何解决呢?

首先从Minecraft服务器的设置出发

Minecraft维基百科上关于服务器的设置文件server.properties讲的非常清楚,其中有两处地方可以大大减少服务器的带宽,他们分别是:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

其中network-compression-threshold与数据包的压缩有关,他的本质就是拿CPU资源去换带宽资源,我的设置是0,即压缩全部数据包。

view-distance是玩家的视野距离,我一直开着1(最低配置),不过玩家几乎是感觉不到它的存在的,可以放心调低。

而第三个是Linux专用的,可以优化数据包的收发。

通过这两个配置,我的Minecraft服务器已经基本够3人玩了,但是3人的时候还是会轮流变卡,一看阿里云后台的公网出口带宽,都是全满的。还是需要解决问题!

在本机运行Minecraft服务器,使用阿里云的服务器做中转?

用frp进行端口映射,把本地的25565端口映射到云端上,这样用本机的CPU就会好一些,并且frp可以做压缩。

最终效果:比直接开在云端还慢,因为公网下行数据实际上更多了,阿里云需要在我的电脑和朋友的电脑之间做数据中转。效果很差,放弃了,强烈不推荐。

P2P的Minecraft服务器?

既然做中转会受到阿里云的带宽限制,那如果我们使用P2P呢?直接在两台电脑直接建立对等连接,而云服务器只在一开始负责帮两台电脑建立连接,等到连接建立后,数据是不经过阿里云做中转的,直接在我的朋友的电脑直接流通。

于是我开始着手寻找能够进行P2P打洞的软件,刚开始用了frp的一个P2P打洞功能,叫做XTCP,服务端配置是这样的:

1
2
3
[common]
bind_port = 7000
bind_udp_port = 7001

我的电脑客户端配置是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# frpc.ini
[common]
# 你的frp服务器的公网ip
server_addr = xx.xx.xx.xxx
# 你的frp服务器的默认端口
server_port = 7000

[mc]
type = xtcp
# 只有 sk 一致的用户才能访问到此服务
sk = oc7D!PgY&guFBPwoEfKq
local_ip = 127.0.0.1
# 远程桌面的本地端口号
local_port = 25565

朋友的电脑客户端的配置是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# frpc.ini
[common]
# 你的frp服务器的公网ip
server_addr = xx.xx.xx.xx
# 你的frp服务器的默认端口
server_port = 7000

[mc_visitor]
type = xtcp
# stcp 的访问者
role = visitor
# 要访问的 stcp 代理的名字
server_name = mc
# 只有 sk 一致的用户才能访问到此服务
sk = oc7D!PgY&guFBPwoEfKq
# 绑定本地端口用于访问 远程桌面 服务
bind_addr = 127.0.0.1
bind_port = 6000

这样,(理论上)只要朋友访问127.0.0.1:6000就能访问到我的电脑上的Minecraft服务器了。然而最终失败了,连接不能顺利地建立。本来frp的打洞功能也非常不成熟,受到NAT类型的影响。

然后我又开始寻找其他的P2P解决方案,最终找到了NPS

和frp一样,也是Github上开源的项目,也都是用Go语言写的。

https://github.com/ehang-io/nps

于是开始了我的部署之路,安装过程只要照着(官方教程)[https://ehang-io.github.io/nps/#/install]来就行了。最终登陆管理面板是这样的:

管理面板

然后照着官方教程,创建一个客户端:

新建客户端

参数可以随便填,然后复制最下面红色的那行命令:

复制

然后下载nps的客户端到我运行Minecraft服务器的本机电脑,打开cmd切换到客户端exe所在的目录下,把命令复制进去运行。注意这里不能使用PowerShell,否则会连接不上。如果cmd显示无法运行,就把那行命令前面的./去掉。

之后去创建一个P2P连接,客户端ID要和上面我们创建的客户端的ID一致。

P2P连接

然后像前面一样,复制最下面的命令:

复制命令

其中那个“唯一表示密钥”是自动生成的。然后同理让朋友在他自己电脑上下载nps的客户端并cmd运行命令。之后朋友只要在mc服务器的地址填上”127.0.0.1:2000”(默认端口是2000,可以自己换),就能访问到我本机开在127.0.0.1:25565的Minecraft服务器了。

现在带宽已经没问题了,但是朋友还是反馈很卡,也找不出原因,所以就暂时放弃了这个方案。

阿里云不同实例内网互联+另一台服务器流量转发?

因为阿里云所谓的1Mbps的带宽限制,只是公网下行带宽的限制,对其他带宽(比如上行带宽、或者内网带宽)是没有限制的。我和同学在不同的阿里云账号下各拥有一台阿里云服务器,并且在同地域(这意味着内网互联是免费的)。于是我就有了另一个思路,依然把Minecraft服务器开在一台云服务器上,但是一部分玩家的流量直连云服务器,另一部分玩家通过连接另一台闲置的云服务器,然后由闲置的云服务器把流量转发到Minecraft服务器。这样带宽就变成两台服务器加起来2Mbps了。

首先是探索了半天阿里云的内网互联,由于阿里云的业务一直变化,所以网上找到的教程全都过期了,只好去看阿里云官方的文档。

首先你要在专有网络–快速链接–高速通道,找到云企业网,然后创建云企业网实例。

云企业网

先把你自己账号下的实例绑定进去,之后照着阿里云文档操作。

阿里云帮助文档

然后登陆同学的账号,进行企业网授权,详情查看搜索阿里云文档关于授权部分内容。之后再登陆你的账户把同学的实例加入企业网,这样两个实例就可以通网了。

之后,使用frp,把Minecraft服务器的25565端口映射到另一台服务器上(记得ip不要填公网ip,要填内网ip,这样才不会占用公网下行带宽),就可以了,具体不再赘述。你也可以配置服务器的防火墙规则或者使用Nginx做端口转发,也是可以的。

用frp的优点是他可以进行数据压缩,进一步减少了带宽。

总的来说,这个方案的效果还不错。

本文地址: https://www.chimaoshu.top/为1M小水管的Minecraft服务器加速/
版权声明:本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议,转载请注明出处。

Welcome to my other publishing channels