一、前言
Steam P2P联机总是失败,试了各种“解决方案”却完全感受不到效果,怎么办?
很多时候,问题在于调了也不知道有没有用,还有可能被一些无效信息干扰。
比如开了游戏加速器,到底有没有真的优化到Steam SDR?改NAT、开UPnP、换DNS,到底有没有变化?现在走的是直连、打洞,还是relay?延迟到底是哪里变高的?是自己网络问题,还是对方网络问题?
这些东西如果只靠进游戏试其实很难判断,因为实际游戏很复杂,有游戏本身卡顿,队友网络,还有外部错综复杂的网络环境的干扰。你以为按网上说的开了UPnP之后游戏真的变快了,实际可能只是运营商的队列不再拥塞了。
所以,这个文章会给你提供一个工具,帮你分析到底是什么出了问题,以及你的方法是否有效。
在分析之前,你需要知道:Steam P2P连接到有三种候选地址连接到对方:host, srflx和relay。
host一般是局域网、IPv6或同网段等能够直接建立连接的情况;
srflx是大家常说的NAT打洞;
relay/SDR是无法直连时,由SDR(Steam数据中继)负责转发数据。
对于走中继和不走中继,优化的思路不太一样。而且对于走中继的情况,你可以自己优化,不用找人联机测试。因此下面的叙述分为了两部分:
单机测试只需要你自己打开工具;联机测试要求你有一个爱折腾的好朋友,或者另一台设备和steam账号。
二、与中继服务器(SDR)连接的优化思路
最近由于某个问题,很多游戏在野排环境下,host/srflx的成功率已经几乎为0。 也就是说,现在很多Steam联机游戏,决定体验的是你到SDR的连接质量。
而这里又会出现一个非常有意思的现象:并不是所有中国玩家都应该走香港节点。也并不一定裸连香港/东京最快所以加速之后会更快。加速器并不是让某个节点本身变快,而是通过整体改变你出口的路由路径,从而改变你到SDR节点的网络路径质量。
因此更合理的方式是在多个可选的节点,或不同网络环境,比如校园网/流量/家宽下做对比测试,而不是默认香港一定最好。此外,高峰期和不同中继的路由路径上的压力也可能会不同。
在过去,测试的方法是,通常只能通过开启加速器后,在实际对局中感觉,看游戏内的统计数据,或者依赖Steam自带的面板查看。这种方式一方面测试比较麻烦,另一方面干扰因素较多,不太容易反映出自己与所有SDR中继之间的网络质量,也不容易看到SDR服务器的ip和端口号。
我之前研究的时候做了一个小工具,现在分享给大家(本质上是一个调用SteamAPI的游戏)。
这个小工具可以通过导出的日志,来查看自己到各个SDR节点的真实连接情况,包括东京、香港、首尔等区域节点的延迟、以及Steam给节点打的分数。
它不仅可以帮助确认自己更适合哪个节点,还可以用于验证加速器是否有效,比如开加速器前后分别测试一次,就能很直观地看出它到底有没有真的优化SDR的路径,而且工具比较轻量级,不用反复开深岩银河测试。举个例子:
无代理:

全局代理

上面这张图里面用的不是游戏专用的加速器,所以效果不太好。
不开代理的时候,到*节点只有36+3,甚至首尔也只有71+7/66+3。而开了代理之后,*节点直接变成了117+17,反而*节点成为了最优解。所以开加速器之后检查自己的和中继的连接质量是很有必要的,否则就变成了负优化。
三、联机测试
以上的功能不需要和别人联机就能测试。其实,这个工具不是为输出延迟打造的,更多是为了调查联机问题出现在哪一步。很多时候打洞连接失败而使用SDR,但实际游戏中steam产生的日志不方便看到,也不容易判断原因。这时候可以双方在steam用这个工具游戏联机,可以通过日志看到为什么连接失败。
(注:如果想测试SDR但是走的是“直连”,可以先把steamwebrtc64. dll删掉 ,这样ICE就会不起作用)
方法如下:
双方(或更多人)都运行这个程序后,需要当主机的一方输入create并回车创建房间。
在Steam好友聊天界面中右键好友头像,此时游戏名应显示为Spacewar,选择“邀请加入游戏”(需要先 create 后才能发送邀请)。 另一方接受邀请后即可建立连接。
连接成功后,输入:info可以查看当前联机状态,包括连接类型、延迟、路由、收发包情况以及Steam Networking的基础统计信息。程序默认还会输出steam提供的所有调试信息。
输入stress unreliable 5000 250 10进行一个简易压力测试,来模拟实际游戏中的丢包/延迟。这条命令会以10ms间隔发送5000个250字节的非可靠包,其速率与包大小参考了《深岩银河》实际四人对局中测得的客机发包峰值频率与包大小,可用于粗略测试链路稳定性、突发丢包以及路由质量。
压力测试过程中,可以观察是否出现明显丢包,是否存在长时间卡顿或瞬时延迟抖动。需要注意的是,unreliable本身就是允许丢包,因此测试过程中出现少量丢包是正常现象。测试结束后,程序会输出统计结果,同时生成日志文件,方便后续进一步分析。
四、工具链接
以下是工具,已经帮大家编译了一份现成的~
https://github.com/rsj001/SteamP2PTest/releases