写在前面
宇宙万法的那个源头,是 MC
虽然说追溯到从高考后开始学编程开始更合适一点,但一切的开始还是要从高一一个周末的下午说起,我照着 Minecraft wiki(因为年代久远具体 URL 和内容会有些变动,不过当时参考的应该就是这一篇)在自己的电脑上搭建了一个本地 MC 服务器,并一个人在里面玩了一会儿(然后我就又去玩我的单人存档了)。虽然还能追溯的更早,但我还是把这里当作是我迈向技术性玩家的第一步。
鲁迅曾说过:电子游戏是计算机技术进步的第一推动力。反正我当年捣鼓计算机的历程十有八九都和打游戏有关,这么多年来计算机网络的知识基本都是在解决联机问题(不只 MC)中学到的,以及少量的工程应用场景,比如借助校园网实现连接(我是真不明白在一个网络内为什么还要使用远程软件通过公网访问)。
这篇博客只是杂谈,聊一下我和小伙伴联机时的技术迭代过程,具体细节不会太详细,毕竟每一个方案都能单开一篇了。
明确问题
先考虑一个问题:MC 联机过程中需要提供哪些信息?
MC 的联机根据目标可以分为两种,通过局域网连接到其他人的存档,或者连接到专用服务器。前者涉及一套额外的东西,有空去抓包研究一下,这里先挖个坑。我们主要讨论后者。
连接到服务器需要提供一个叫服务器地址的东西,格式为 address[:port],具体含义不再赘述,有需要先去了解一下 IP 地址、域名和端口号。那么要实现联机就有一个很显然的前提条件,服务器地址对客户端来说是可达的。
服务端已经可以成功运行了,那么唯一的问题就是让其他小伙伴能够访问。然而家用计算机的 IP 地址通常为私有地址,不在同一子网内是不能直接连通的。那么我们的问题就是如何让服务端对客户端可见。
一路以来的历程
第一次尝试:端口映射
具体已经不太记得从哪里找的教程了,去在路由器上配置端口映射,本质就是手动网络地址转换(NAT),在当时似乎是可用的,不过很不稳定,遂直接弃用。
某联机平台
年代过于久远已经不记得当时用的哪个了,不过现在应该也用不了,没什么参考价值。当时受限于知识储备不太清楚原理,推测是基于 VLAN 和局域网发现(也就是前面提到的第一种连接目标)。专用服务器也能用,不过受限于 PC 性能的问题最终还是直接使用内置的对局域网开放功能了。
公网可访问的服务器
其实就是在专门的 MC 服务器平台租赁,算是非技术性玩家开服首选了,也是第一次拥有 24 小时开启的服务器。我也记不太清和上一条哪个更早,只是后来平台倒闭了。
从 MC 服务器平台到自建
重点来了,敲黑板,这绝对是我最头铁的一次。
从一开始已经过去了一坤年,高考后的暑假,我正在看视频学习 Java,第一次知道了 Linux,因为手痒就想试一下,然后就在我自己的 PC 上装了一个(没有 UEFI 的年代装双系统是真麻烦啊)。不过这些不重要,重要的是我脑子一热去阿里云租了个服务器,还是那篇教程。
为什么说头铁,当时可以说是一窍不通,操作服务器的时候命令都敲不利索,下载 JRE 都整了半天才整明白,更不要说网络配置了,纯靠阿里云的安全组,防火墙是没有的。
刚开始因为整不明白换了 Windows Server,但发现这玩意太卡了就又换回去了。
虽然过程磕磕绊绊,但服务器总算是跑起来了,也承包了我和小伙伴的半个暑假(因为暑假过了一半才搭好的)。因为服务器不对外公开(其实是因为早就停了,原因看下面就知道了),所以就不要问我要服务器地址了应该不会有人要吧。
服务器性能太差怎么办?得加钱 VLAN 会出手
有了真正属于自己的服务器是挺好,唯一的问题就是经常卡顿。自从我换了新电脑后就有了一个想法,能不能只让服务器进行数据交换,服务端程序还在本地运行。
一开始还头铁打算自己写一个(不过还没开始就放弃了),不过后来发现已经有了成熟的解决方案,即虚拟专用网络(VPN),更具体来说是虚拟局域网(VLAN)。最早用的 SoftEther,现在是 OpenVPN 我能说是因为 OpenVPN Connect 的 UI 更好看吗,切换主要是因为费用问题换了一台服务器(活动都过去一半了才发现,浪费了好多小钱钱),顺便搞了一套自己的 x509 证书链。
虽然由于一些众所周知的原因在国内直接搜会出现很多“无关”内容,但 VPN 的主要用途是企业搭建内部网络。不过搜索的时候添加“搭建”、“配置”等关键字还是能正常找到技术博客和教程的。
好像端口转发也可以
这个是在看 ssh 相关的内容时无意间看到的(好像是阿 B 给我推的?),偶尔也会用一下,好处是不需要客户端额外的配置,坏处就是我要改服务器防火墙。
试一下 IPv6
先说结论,这个没有成功实践过,因为我们校园网从外面连不进来,不确定是不是防火墙的问题,不过用手机热点的时候成功让在欧洲留学的哥们通过 IPv6 直接访问到我的PC了(只是 ping 通,没做进一步测试)。
理论上人人都可以有公网 IPv6,但好像有些游戏还不支持 IPv6 地址,不过这也容易解决,直接使用 PC 代替服务器作为虚拟交换机就好了,直接就省下一笔服务器的钱。
写在后面
这也算是我的第一篇博客了,因为没多少技术内容就归为杂谈。文笔不好还请见谅。