



























今天打工,又被掉线的队友气到了。正好之前根据Nintendo Clients写了一个Wireshark的P2P协议解析插件,又抓过一些打工的网络数据,大概将打工模式的网络交互做了记录,可以做一些简单的分析。
整个打工的交互过程都是通过任天堂的SSL证书,和任天堂服务器分发的密钥进行加密的。想要拿到、或者修改具体在联机中传输了什么样的内容,必须破解Switch以绕过证书的验证,而这就违反了使用协议,会被封禁。我们在本文中使用的工具和方法,仅仅从公开内容出发,不涉及对Switch本身的破解。
这篇文章也是基于本人就网络流量观察的猜测,与任天堂没有任何关联,也不对其中的正确性做任何保证。读完这篇文章,你只能大概知道为什么你的队友/你会掉线,既不能解决队友/你掉线的问题,也不能让你上传说。
我们就游戏的几个阶段进行描述。
任天堂在本代采用了和怪物猎人相同的新一代NPLN服务器架构。据说是引入了微服务的概念,在各种效果上都有所提升。但很遗憾,除了一些少见的情形外,这对打工几乎没有任何帮助。
打洞与NAT类型检测
目前的网络基础架构使得设备往往都隐藏在路由器的NAT背后。在进行P2P联机之前,需要进行NAT打洞。
一个关于NAT打洞的比喻是,你告诉路由器,我现在去一个住东川路800号(IP地址)202室(端口号)的客人家里串门,他一会儿也来,帮我留个门。路由器里面的NAT表就是看门人,有的NAT啥也不管,有的NAT只放住东川路800号的人进来,有的NAT不仅要检查是不是住东川路800号,还要看房间号是不是202室才让进来。
A,B,C类型的网络,就对应了这三种看门人。两个人要联机,实际上是一个双向的交互过程。比如说,A要和C互相串门,作为中间人的任天堂只需要告诉C A住在哪一号哪一室,C去A那里串门之后,C家里的看门人就会给A留门。读者可以自己想一想A,B,C网络之间哪些可以互联,哪些不能互联。如果感兴趣的读者,可以进一步阅读NAT 类型。
游戏向nncs[1,2]-lp1.n.n.srv.nintendo.net所指向的几个服务器发三次三个内容分别为e,f或g的UDP包。服务器会返回9个包,但收得到几个取决于你的网络。包中记录了:
例如我是B类网络,只收回了6个包。

向游戏服务器发送你收到的IP地址和端口号,通知你准备参加打工了。
在匹配过程中,服务器会推送你的队友的IP地址和端口号信息。此时取决于你的网络,会使用Pia v11协议,发送目标变量ID、源变量ID、包ID均为0的一个握手包。这一过程也进行NAT打洞。
当收到这样的握手包之后,会回复一个只写入源变量ID,其他均为0的一个握手确认包。源变量ID和目标变量ID为随机变量,可能是匹配系统分配的编号。这个编号在一次匹配(就是排到的一组队友,包含“以相同队伍继续”的游戏)中是不变的,但在不同的匹配中不同。
当收到握手确认包之后,意味着握手方到被握手方建立了一个单向的连接。此后就会开始交换加密的游戏信息,表现为目标变量ID和源变量ID对应握手方和被握手方的变量ID,包ID从一个随机数递增。
如果没有收到握手确认,游戏会通知服务器无法连接到对方,此时可能匹配系统会重新匹配其他玩家,并告知对方无法匹配,不再发出对应的包。循环这一步骤,直到都能够互相连接。
这是一个传输过程的例子:

注意图中标为橙黄色,我与波兰IP的玩家联机的三个包。这就是一个握手,握手确认,开始传输加密信息的流程。黑底的三个ICMP包,则表明我的上级路由告诉我,无法连接到俄罗斯玩家,因此通知服务器,也不再向俄罗斯玩家发包了。
有一种情况,双方有一方无法连接到另一方,但运气好(我猜是你俩排位的契合程度,减去可能的延迟,再减去不能连接的扣分项,还是比重新找一个队友的代价高),任天堂会提供TURN协议的中转服务器。TURN协议原封不动地包装了待发送的Pia协议包,由任天堂的服务器提供中转,转发给对方。
TURN协议对于接收的一端是透明的。具体通讯模式可以参考下图。游戏仅会对一对用户某一个方向建立信道,数据在信道中是单向的。
注意下图中TURN包的的数据部分,以幻数32 ab 98 64开始,表明这是一个Pia协议包,也就是任天堂P2P协议包。

当所有队友均准备好之后,便会显示“打工的时间到了”,这时会与游戏服务器进行通信,开始本局打工。
这一步常出现的问题,大多是报错。有两种报错形式:游戏界面内的黑色错误框,和游戏模糊化作为背景,Switch系统的错误框。以下记为游戏框和系统框。
如果有任意一个队友与任天堂服务器间的网络连接较差,就会出现卡在“打工的时间到了”的界面。如果该队友此时与任天堂服务器断开连接,可能出现“发生连接错误”的游戏框,也有可能在直升机上蒸发。
与服务器通信
在整个打工的过程中,只有少数的动作会与游戏服务器通信。因为我无法得到具体的通信内容,这一步可能包括:
玩家间通信
其他的所有内容都是仅通过P2P通信完成的。每对玩家间的通信通过一来一回2个Pia协议的单向“通道”(表现为递增的包编号)进行,丢包不会重传。每秒钟向每个队友发送约15个包(和游戏的Tick Rate差不多),每个包的大小在约100B到约700B不等,结算时包的大小可能达到1KB。
P2P通信中分为普通事件和关键事件。移动、涂地等行为是普通事件,只要收到玩家发来的信息(比如移动),就会在游戏中发生。而成为游泳圈、复活、捡蛋是关键信息,只要整个游戏有一个人在关键事件上没有同步,就都认为关键事件未发生。
我根据游戏的掉线行为和向不同人发送的包的大小差别猜测,整局游戏中会按一定规则选取玩家作为同步基准(接下来称为房主),网络较好的玩家可能更容易被选为房主。

图中标为橙黄色的为一个通道,可以注意到包编号是递增的。另外也可以观察到,与一个人交换的数据普遍比其他玩家大,可能是负责同步的房主。图中粉色的条目则为与游戏服务器的通信。
掉线情况的处理有多种。
Read our privacy policy on how these personalized advertisements are delivered to you.
For your reading experience, we provide full-text RSS feeds. Although math formulas cannot be displayed well, the interface can be adjusted as you like and there are no ads.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。