慕·露·雨

DirRain-一个野生创客的个人博客小站

0%

论某动漫游戏服务端通信流程与端口映射

现在Grasscutter服务器也出来这么久了,是时候跟大家说一说服务器怎么开放端口映射连接了。

重要提示!Grasscutter服务器仅供学习与研究,如果您喜欢GenshinimpactGame,请支持正版!

很多人都说开服需要使用ZeroTier或者RedminLan这样的VPN组网软件。实际上没有必要。我们完全可以直接使用端口映射软件进行开服。

先来了解一下服务端与客户端的通信流程。

通信流程

客户端与服务端通信示意图

服务端开启后,会先后分别开放两个端口。一个是TCP端口,一个是UDP端口。该游戏的主要通信基于KCP协议进行。而KCP的底层是UDP,所以开放的是UDP端口。TCP端口用于登录分发。用户首先通过TCP端口连接服务器并登录(这个TCP端口也就是我们常说的dispatch端口),然后服务端返回服务器地区(region)列表给客户端。如果列表中只有一个服务器,那么客户端将会直接进入该服务器,而不是显示服务器选择列表。也就是说,要想要显示服务器列表,服务端的配置文件中dispatch配置必须包含多个region配置。

这里有一点需要辨析。

游戏服务器UDP端口地址(这个UDP端口也就是我们常说的Game端口)是由客户端与服务端的TCP协议dispatch交换信息得到的。所以说,客户端拿到服务端给的Game端口地址后会直接尝试与该地址进行通信。也就是说,如果想在非公网条件下开服,服务器配置文件中的Game端口地址配置必须配置为公网能够直接访问的地址才能保证客户端不会抛出4206错误。

按照这个原理,我们只需要设置两条映射就可以让客户端与服务端顺利的通信了。一条为TCP协议,用作登录分发;另一条为UDP协议,用于游戏进行时的通信。

配置服务端

由于HTTPS协议配置起来较为繁杂,我们此处选择采用HTTP协议进行通信。

打开config文件配置服务端,我们先关闭SSL,让服务端使用HTTP模式。修改这段代码:

1
2
3
4
5
6
"encryption": {
"useEncryption": true,
"useInRouting": true,
"keystore": "./keystore.p12",
"keystorePassword": "123456"
},

       改为这样:

1
2
3
4
5
6
"encryption": {
"useEncryption": false,
"useInRouting": false,
"keystore": "./keystore.p12",
"keystorePassword": "123456"
},

接着修改开服IP地址。改这两个地方:

1
2
3
4
5
"http": {
"bindAddress": "0.0.0.0",
"bindPort": 443,
"accessAddress": "127.0.0.1",
"accessPort": 0,

bindPort为服务端TCP端口号,accessAddress为服务器dispatch开服IP地址。一般情况我们不会使用443作为dispatch端口号。

1
2
3
4
5
"game": {
"bindAddress": "0.0.0.0",
"bindPort": 22102,
"accessAddress": "127.0.0.1",
"accessPort": 0,

bindPort为服务端UDP端口号,accessAddress为服务器Game开服IP地址。一般情况我们不会使用22102作为Game端口号。

将开服IP改为服务器的局域网IP。dispatch端口号可以自定义。Game端口号将由端口映射软件分配到的公网端口号决定。具体如何获取局域网IP地址,可以参考我的另一篇文章:TP-LINK普联路由器一个设置解决父级局域网与子级局域网设备互访问题 | 慕·露·雨 (dansmartcloud.github.io)

端口映射配置

笔者推荐的端口映射软件是路由侠,这是笔者认为目前比较稳定的免费国内端口映射。附上官网地址:路由侠-局域网变公网 (luyouxia.com)

打开路由侠,注册登录,点击内网映射,点击右下角添加映射。

原生端口,直接点击开始创建。

按照图示分别更改设置。

创建TCP登录分发映射

创建UDP游戏KCP通信映射

UDP内网端口先随便填的原因是需要改为一会路由侠给的公网端口。

创建完成,打开映射列表。

公网地址一栏最后面的数字即为分配到的公网端口号。

选中刚刚创建的UDP映射,记住分配的公网端口号,点击左下角的编辑。

将内网端口号改为和公网端口号一致。

同样的,按照之前的方法,服务端配置文件也需要更改。比如,路由侠的公网UDP端口映射地址为:http://admin.example.com:55625,那么配置文件就应当这样改:

1
2
3
4
5
"game": {
"bindAddress": "0.0.0.0",
"bindPort": 55625,
"accessAddress": "admin.example.com",
"accessPort": 0,

值得注意的是,路由侠UDP端口内网地址无需更改,保持局域网IP地址即可。

至此,全部配置已经完成。在客户端的服务器连接地址输入路由侠提供的TCP公网地址即可正常连接!

好啦,就说这么多,拜拜┏(^0^)┛