Alien Swarm: Reactive Drop

Alien Swarm: Reactive Drop

Not enough ratings
使用廉价云服务器+PC的开服教程
By 法克*尤尔*马泽尔
对于使用云服务器开服的服主而言,每月租赁服务器的费用通常比较高。而云服务器提供商给出的租赁套餐通常具有明显短板:要么廉价但性能低,要么性能高但价格昂贵。此外。而个人电脑虽然性能足够,但往往网络质量相对较差。本教程提供一种利用廉价云服务器+个人电脑开服的方法。
   
Award
Favorite
Favorited
Unfavorite
方案优势与不足
核心优势
  • 🌐完美结合云服务器优质网络与家用PC强大算力
  • 💰云服务器成本大幅度降低
  • 🚀突破云服务器CPU/内存性能瓶颈
  • 🛡️彻底规避家庭网络NAT类型问题
  • ⚡快速部署,无需复杂网络知识
注意事项
  • 🔌需长期运行的PC设备
  • ⚡额外的电费成本及硬件折旧(相较于云服务器的节约,额外电费和折旧可忽略)
  • 🖥️推荐使用Linux系统可获得更好网络性能(本教程为Windows版本,Linux类似)
关键技术解析
BGP多线接入原理
云服务商的网络通常比家庭宽带质量更好,带宽更高。来自不同运营商的玩家连接到云服务器的延迟也要低得多。这是由于云服务器提供商的机房大多是BGP机房,机房与主流网络运营商的骨干网络间使用光纤进行高速互连。与此同时,这些机房拥有高端企业路由器,基于BGP协议进行数据的路由选择与转发,往往具有极低网络延迟与极高的网络可靠性。

整体而言,云服务商通过BGP协议能够实现:
  • 智能选择最优运营商路径
  • 单IP多线接入(多运营商接入)
  • 99.9%网络可用性保障
  • <10ms骨干网延迟

可靠UDP协议(RUDP)
ASRD作为一款射击游戏,使用UDP进行通信。而UDP是一种不可靠的协议,协议设计指出就对数据在传输过程中的可靠性不做任何保证。在网络高峰期,为了保证TCP数据的可靠传输以及大客户的数据传输等,网络运营商可能会选择在骨干节点上主动丢弃UDP数据包以缓解网络拥堵。这就是为什么大多家庭宽带网络玩游戏在高峰时段出现卡顿、丢包的原因。这也是为什么使用家庭宽带开设服务器通常会遭到玩家抱怨网络质量差的原因。

为了解决UDP的不可靠问题,人们提出了RUDP的概念。RUDP协议通过在应用层增加一些特殊的处理机制(如数据校验、丢包重传等),既享受了UDP低延迟、快速传输的优势,又避免了UDP丢包带来的烦恼。
KCP协议
KCP协议是由开发者skywind3000创建的开源可靠UDP传输协议,专为实时应用设计。其核心特点为:
  1. 智能重传机制
    • 选择性重传:仅重传真正丢失的数据包(TCP会重传后续所有包)
    • 双重触发:同时支持超时重传与快速重传(收到3个重复ACK立即重传)
    • 动态RTT预测:实时计算网络往返时间,重传超时阈值比TCP缩短30%
  2. 流控与拥塞控制
    • 带宽自适应:根据丢包率动态调整发送速率(非TCP的"乘性减"模式)
    • 传输模式可选:提供普通/快速/极速三种模式,极速模式延迟比TCP低30%
  3. 前向纠错优化
    • 支持FEC编码:每发送N个数据包生成M个冗余包(如2:1配置可抵御30%丢包)
    • 数据包分片:自动拆分大包避免MTU限制,重组效率比传统UDP高40%
与TCP的典型对比:在20%丢包率环境下,KCP的有效吞吐量可达TCP的3倍,平均延迟降低60%,特别适合射击类游戏、实时音视频传输等高实时性场景。其协议头仅增加24字节开销,通过牺牲部分带宽效率换取传输实时性,是构建低成本高性能游戏服务器的理想选择。

KCP-Tube:基于KCP协议的双向透明转发开源软件
KCPTube 是由C++开发的的开源网络加速工具,基于 KCP 协议进行深度优化,专为解决 UDP 传输在复杂网络环境下的可靠性问题而设计。支持 Windows/Linux/macOS 多平台。KCP-Tube的Github页面[github.com]

网络通信流程
玩 家 -->| 连接 | Cloud[云服务器:27050] 云服务器 -->|KCP隧道 | HomePC[家用PC:30000] 家用PC -->|本地转发| GameServer[ASRD服务:27050]
由于云服务器和家用PC的数据包转发是双向的,该转发对与ASRD服务器和玩家而言都是透明的。在ASRD服务器看来,它接受的时来自本地局域网的玩家连接。而对玩家来说,他们连接的是云服务器。
详细搭建指南
0.找一台闲置的电脑
你需要一台闲置的个人电脑,哪怕是数年前的个人电脑,其性能通常也比云服务商提供的廉价套餐的高。如果你不介意,也可以用主力电脑。

请注意,ASRD服务器和KCP-Tube服务器需要运行在该电脑上。因此做好24小时开机的准备。

请注意,你的家庭宽带需要具有公网IPv4地址,也就是说,互联网上的用户需要能够直接访问到你的电脑或路由器。如果没有,请联系你的网络运营商,向他们申请一个(通常是免费的)。

请记录下你的家庭宽带的公网IPv4地址,记为IP1(这里假设是1.1.1.1)。这在后续步骤中非常关键。

1.在个人电脑上配置并运行KCP-Tube服务器
你需要从Github上下载KCP-Tube软件[github.com]。它支持Windows、Linux和MacOS,也具有Docker镜像,你可以根据需要自行下载。它具有详细的配置说明,强烈建议仔细阅读并按照说明进行配置。如果你懒得阅读,这里提供了一个简易的配置步骤(Windows,原谅我对Linux和MacOs不熟悉)。

  1. 将下载下来的文件解压缩到某个文件夹,例如\Desktop\kcptube,解压完成后,该文件夹内应该有一个名为kcptube.exe的可执行文件。
  2. 在该文件内新建一个txt文件,打开并编辑它。在其中输入如下内容:
    mode=server kcp=fast2 inbound_bandwidth=300M outbound_bandwidth=30M listen_port=30000 destination_port=27050 destination_address=192.168.1.103 encryption_algorithm=none ipv4_only=true blast=1 fec=1:1 log_path=./
    简要说明一下每一行的含义:
    1. mode代表软件运行在服务器模式,kcp表示的是内部的参数,详见Github说明。
    2. inbound_bandwidth表示你从互联网下载文件的带宽,outbound_bandwidth代表的是你向互联网上传文件的带宽,300M代表300Mbps。这两个数值不能超出实际的带宽。你需要根据你的实际情况修改这些数值
    3. listen_port、destination_address和destination_port代表的是KCP-Tube服务器监听互联网发送到你的电脑30000端口的UDP数据,并将它们转发到你本机(这里假设你的本局域网IP是192.168.1.103)的27050端口。你需要根据你的实际情况修改这些数值
    4. encryption_algorithm表示不加密流量,游戏数据没有加密的必要,而且解解密会增加额外的性能开销
    5. ipv4_only表示只使用ipv4进行通信。你可以尝试启用ipv6,我没试过,可能会有问题。
    6. blast表示爆发传输模式,会将数据包尽可能快的发出去
    7. fec表示前向纠错。在数据包里增加额外纠错信息,在丢失少量数据包的情况下,可以通过已经收到的数据包恢复出丢失的数据,避免重传带来的延迟。本质是通过额外增加一些流量消耗,降低丢包时重传的概率,进而降低延迟。1:1表示每发送一个数据包,就额外发送一个纠错包。游戏属于小流量但对延迟较敏感的应用,因此选择通过增加流量消耗,尽可能减少延迟。
    8. log_path表示日志存储的目录
  3. 将文件保存,并重命名为server.conf。
  4. 新建一个txt文件,打开并编辑它。在其中输入如下内容:
    kcptube.exe server.conf pause
  5. 将文件保存,并重命名为start-server.bat。
  6. 双击运行start-server.bat,如果之前的步骤没有出错,你应该看到如下内容:
    kcptube version ******* Error Found in Configuration File(s): No Servers: 1 Relays: 0 Clients: 0 kcptube is running in server mode

2.在你的家庭路由器上映射端口
如果你的电脑位于家庭局域网内(通常你会看到类似192.168.*.*的IP地址)。你需要在你的家庭路由器上配置端口转发,将互联网发送到你路由器30000端口的UDP数据转发到你的电脑对应的端口上。如果你在第1步里,没有获得公网IPv4地址,那么可以尝试在配置文件里配置UDP打洞服务器来建立透明转发隧道。具体配置方法需要你仔细阅读Github上的配置说明。

到这一步,你已经启动了KCP-Tube服务器,完成了端口转发。理论上,互联网上任何用户向你的IP1的30000端口发送的UDP数据包,都将被路由器转发到你局域网的个人电脑192.168.1.103的30000端口上,进而被KCP-Tube接收并进一步转发到本机的27050端口上。但实际上,由于互联网用户发送的数据包不符合KCP协议,数据包会被KCP-Tube丢弃。

3.租赁云服务器
云服务器上只需要运行一个极低负载的软件,因此对性能没有任何要求,在带宽满足要求的情况下选择最廉价的即可。你需要进行如下操作:

  • 记录你的云服务器的IP地址 IP2。这里以2.2.2.2为例。
  • 在你的服务器管理页面里,选择防火墙(或者安全组,或者其他类似的设置页面),开放一个端口的UDP通信:PORT1(这里以27050为例,玩家将会连接到该端口)
4.在云服务器上配置并运行KCP-Tube客户端
通过远程桌面或SSH等方法登录你的云服务器。与之前类似的,你需要进行如下步骤:
  1. 将下载下来的文件解压缩到某个文件夹,例如\Desktop\kcptube,解压完成后,该文件夹内应该有一个名为kcptube.exe的可执行文件。
  2. 在该文件内新建一个txt文件,打开并编辑它。在其中输入如下内容:
    mode=client kcp=fast2 inbound_bandwidth=200M outbound_bandwidth=200M listen_port=27050 destination_port=30000 destination_address=1.1.1.1 encryption_algorithm=none ipv4_only=true blast=1 fec=1:1 log_path=./
    各行的含义和之前类似,但是需要注意:
    1. mode代表软件运行在客户端模式,kcp的值必须和之前那相同。
    2. listen_port、destination_address和destination_port代表的是KCP-Tube客户端监听互联网发送到云服务器的27050端口的UDP数据,并将它们转发到你的个人电脑或路由器的IP1(这里是1.1.1.1)的30000端口。你需要根据你的实际情况修改这些数值
    3. encryption_algorithm、ipv4_only、blast、fec必须和之前的相同。
  3. 将文件保存,并重命名为client.conf。
  4. 新建一个txt文件,打开并编辑它。在其中输入如下内容:
    kcptube.exe client.conf pause
  5. 将文件保存,并重命名为start-client.bat。
  6. 双击运行start-client.bat,如果之前的步骤没有出错,你应该看到如下内容:
    kcptube version ******* Error Found in Configuration File(s): No Servers: 0 Relays: 0 Clients: 1 kcptube is running in client mode

到此,所有访问你的云服务器IP2:27050的流量将被透明转发到你的个人电脑的27050端口。

5.在个人电脑上运行ASRD服务器
这一步是标准的开服流程。我就不在多说了。唯一需要注意的是,需要在ASRD服务器的启动参数中增加一个参数 -hostip 2.2.2.2 ,这个参数表示,srcds在向Steam报告它的IP时候,不会报告它的实际IP,而是报告你设定的2.2.2.2这个IP,也就是云服务器的IP2。因此,当用户通过Steam连接服务器的时候,会连接2.2.2.2:27050。下面是市里的启动参数:
srcds.exe -appid 582400 -ip 0.0.0.0 -port 27050 -hostip 2.2.2.2 -game reactivedrop -maxplayers 12 +exec server.cfg +map lobby

如果你使用的是SrcdsGuardian来启动服务器,对应的示例参数为:
SrcdsGuardian.exe -appid 582400 -ip 0.0.0.0 -port 27050 -hostip 2.2.2.2 -game reactivedrop -maxplayers 20 +exec server.cfg +map lobby
3 Comments
法克*尤尔*马泽尔  [author] 11 Apr @ 11:28am 
ip显示这个,可能受到网络环境影响,情况比较复杂
小菜姬 10 Apr @ 9:17pm 
控制台看到reserve,想到了求生之路开多人服也有类似问题,找到解决方法了,服务器必须使用下面这个参数,把他写进server.cfg。
sv_allow_lobby_connect_only 0
不过服务器列表还是显示宽带的IP,
要想通过云服务器中转连接,还得通过connect命令才行,connect 云服务器IP:端口,
例如 conect 2.2.2.2:27050
小菜姬 10 Apr @ 7:49pm 
大佬,用你的方法测试了下不管用,服务器列表显示服务器的IP还是家庭宽带的IP,连上服务器的延迟是直连的延迟,kcptube控制台也没有流量,关闭kcptube游戏也不会断开连接。然后尝试用connect命令连接云服务器,不让进服务器,但服务器的控制台跟游戏的控制台会提示Reservation cookie,kcptube控制台也会有对应的流量跟延迟。