昨天 mojang 发布了 26.2-snapshot7 快照版本,新增了玩家之间直接联机游玩的功能。
出于对这块的好奇与探究,结合我现学现卖的部分,对这块写了个自己的学习心得。
鉴于本人水平有限,相关错误还请多多批评指正。
Minecraft 在最新版快照中引入了一个新的实时通信库(dev.onvoid.webrtc:webrtc-java:0.14.0)。
这个库的作用是让拥有正版账号的玩家可以跳过各种额外设置或者设备账户的购入,直接实现“点对点”的互联。
找人牵线:游戏首先会连接到 Mojang 的信令服务器(signaling-afd.franchise.minecraft-services.net)。你可以把它理解为一个“牵线人”,它不负责传输游戏数据,只负责帮两个想联机的玩家互相“打个招呼”。
交换信息:双方通过这个“牵线人”交换各自的网络地址信息。
寻找路径:双方会尝试寻找一条最快的连接路径。如果能直接连上,就直接传数据;如果网络环境太复杂(比如由于防火墙或路由器限制无法直连),就会申请由中转服务器帮忙转发数据。
保持联系:联机成功后,每隔 50 秒会发送一次“心跳包”,确保连接没有断开,也能在玩家网络地址变动时及时调整。

这套联机方案(技术上称为交互式连接建立)考虑得非常周全,它会按顺序尝试三种路径:
第一(内网直连):它会先检查你们是不是在同一个局域网(比如在你和你好兄弟在宿舍开黑)。如果是,数据直接在内网传输,延迟极低,几乎感觉不到卡顿。
第二(公网直连):如果不在一个地方,它会尝试进行“打洞”,绕过路由器和防火墙的阻碍,让两台电脑实现直接对话。这种情况除了刚开始连线时需要“牵线人”帮忙,之后的数据传输都是玩家之间直接进行的,延迟主要取决于你们物理距离的远近。
第三(中转兜底):如果前两种办法都失败了,那么数据就会交给微软 Azure 的中转服务器来转发。因为多了一个微软土豆服务器倒手,这种模式下延迟会明显变高。
我猜测,觉得丝滑的玩家大多成功实现了“公网直连”(哦,也可能是完全相反的情况);
而觉得卡顿的玩家,大概率是由于网络限制,被迫走到了最后一步——由微软的微软土豆服务器进行转发
shengzhou —— 快进到 MC 变成模拟飞行 2024,要等半小时才能进游戏shengzhou —— 也可能是彩虹六号:“你进了吗”,“没看到你”,“我退出重开一下”,“好了吗”,“还是没看到你“
可能有些术语解释的并不规范
P2P:点对点,也就是两个玩家的电脑直接说话,不需要中间服务器传话,速度最快。
RFC 8445:2018 年发布的一套互联网规则,规定了设备之间该如何寻找“最优通信路径”,是目前最先进的标准。
交互式连接 (ICE):一套自动寻找联网方案的机制,目标是无论网络多复杂,都要想办法让你们连上。
WebRTC:这是一个强大的开源技术框架,最初是为了网页视频通话设计的,现在被 Minecraft 用来实现这个直连联机。