上个帖子实在地解决了力法X丢判定的BUG
经过月与海,芸老师,黑羽,香香,十六,床等一众赛服力法检验证明确实有用,
目前仍存在压蹲不出球,偶尔龙牙会丢判定的BUG,但是比起X丢判定来说好太多了
问题解决了吗?好像是解决了,月与海在4V4又用起力法了,赛服力法群又开始活跃了。
但是BUG并没有被官方修复,修改注册表的方法在大赛中想必也不能使用。
而且不只是力法,公平PK场后各个职业都或多或少地出现了不寻常的丢判定现象,去PK吧搜索丢判定的关键词就会有一大堆的帖子。
【DNF国服的判定一定是哪里出现了系统性的问题】
带着这样的想法,我开始重新审视上个帖子。
【在windows注册表中禁用Nagle算法,减少ACK延迟,可以修复力法的判定】
这个结论回看是非常荒谬的。DNF这样的极端延迟敏感型实时格斗端游必须,也只能构建在UDP协议之上。而Nagle算法和ACK都是TCP才有的东西。我去修改TCP协议的参数为什么会影响到一个基于UDP的游戏的判定?
我的直觉告诉我,国服的游戏同步算法和之前不一样了,但是我不敢肯定。毕竟这个BUG是国服独有的,说不定是TP或者其他腾讯组件的锅呢?
于是我打开wireshark,瞄准DNF相关的所有组件的端口,开始抓包。
最先引起我注意的是一个名叫TencentDL的进程,他在游戏开始后会选择两到三个随机的IP地址发送大量的UDP包。百度后我发现这是腾讯的一个分布式下载服务,他利用你的带宽去加速别的玩家的下载速度,携带在所有的腾讯系软件内。会不会是他挤占了带宽,影响了游戏?不是。【1】这个流氓分布式下载服务存在很多年了,要出问题早就出问题了。【2】这个服务占的带宽实际并不多,现在家庭带宽都是100M起步,不足以产生影响。【3】这个服务是基于UDP的,我们是改了TCP协议的参数而改善判定的。
那UDP和TCP会相互影响吗?会,我甚至找到了一篇论文专门研究TCP和UDP相互的影响相互影响的论文。但是其中的实验条件,已经是将近20年以前了,那时候的外网带宽只有几兆,而现在的外网带宽动辄几百兆,除非是你满速迅雷下载的同时去PK(我相信没人会这样做),否则论文中的结论根本不适用。
到这里我开始愈发相信我的直觉了,DNF玩家间的UDP通信本身并没有任何问题。
【一定是国服改了底层的游戏同步算法导致了判定与TCP的耦合,而Nagle算法和延迟ACK导致了TCP的高时延】
于是我又打开wireshark,开始着重地对DNF的TCP连接进行抓包分析。这次我注意到了一个上海腾讯云服务器的14023端口。这个服务器的这个端口当且仅当我进入决斗场频道后才与我建立连接。并会在我游戏开始后与我进行大量的TCP通信。然后我又惊讶地发现,在这个TCP连接我向腾讯云的发包中出现了大量的TCP分片。这不正是典型的导致Nagle算法延迟过高的原因吗?网络中因为分片而出现大量的小包,windows启用Nagle算法对小包进行缓存,合并发送,而对端(腾讯服务器)出于带宽利用率的考量又开启延迟ACK,这样就出现了经典的40ms延迟现象,玩家在等服务器的ACK包,而服务器在等玩家的其余TCP分片。延迟就这样产生了。
但是但是但是与服务器的通信延迟为什么会影响到玩家的判定?这不是C/S架构游戏的问题吗?按道理DNF是P2P的,或者至少是在端口转发下的P2P才对不是吗?
不同与别的游戏,诸如英雄联盟所采取的C/S模式「对局玩家与一个服务器相连,战斗逻辑跑在服务器上」
DNF为了追求极致的低时延,采用了P2P模式「对局玩家直接互联,战斗逻辑跑在客户端上」
但这种模式有个致命的问题
【那就是无法防止作弊】
一场游戏,没有裁判,那自然就有人钻空子。
到这里我们再来总结一下现有的线索
1)在windows中禁用Nagle算法,减少ACK延迟,可以修复力法X丢判定的BUG。
2)丢失判定的问题在公平PK场更新后在各个职业中都或多或少的存在。
3)PK过程中我和腾讯的服务器存在大量的TCP通信,且我发给腾讯服务器的包存在大量的可导致Nagle算法延迟的分片后产生的小包。
4)国服PK场作弊问题非常严重(卡屏,掉线挂,外挂)
5)P2P模式无法防止作弊,C/S天然有着防作弊的优势。(服务器可以针对玩家的数据做校验)
以下纯属猜测。
DNF在公平PK场后,为了解决国服严重的作弊问题(卡屏,掉线挂),neople针对国服把一部分战斗逻辑从客户端转移到了服务器上。但是可能是neople懒,在这部分上,服务器与玩家之间的连接依旧沿用了TCP。进而导致在Nagle算法和延迟ACK的双重加持所造成的额外延迟下。一些延迟/判定敏感职业,如战斗法师。出现了大量的丢判定的现象。
假如我的猜测是正确的,这里提出一些可能的解决方案
1)采用成熟的rudp(如kcp)来替换玩家和服务器之间的TCP链接。
2)修复客户端部分的网络模块,避免TCP分片。
经过月与海,芸老师,黑羽,香香,十六,床等一众赛服力法检验证明确实有用,
目前仍存在压蹲不出球,偶尔龙牙会丢判定的BUG,但是比起X丢判定来说好太多了
问题解决了吗?好像是解决了,月与海在4V4又用起力法了,赛服力法群又开始活跃了。
但是BUG并没有被官方修复,修改注册表的方法在大赛中想必也不能使用。
而且不只是力法,公平PK场后各个职业都或多或少地出现了不寻常的丢判定现象,去PK吧搜索丢判定的关键词就会有一大堆的帖子。
【DNF国服的判定一定是哪里出现了系统性的问题】
带着这样的想法,我开始重新审视上个帖子。
【在windows注册表中禁用Nagle算法,减少ACK延迟,可以修复力法的判定】
这个结论回看是非常荒谬的。DNF这样的极端延迟敏感型实时格斗端游必须,也只能构建在UDP协议之上。而Nagle算法和ACK都是TCP才有的东西。我去修改TCP协议的参数为什么会影响到一个基于UDP的游戏的判定?
我的直觉告诉我,国服的游戏同步算法和之前不一样了,但是我不敢肯定。毕竟这个BUG是国服独有的,说不定是TP或者其他腾讯组件的锅呢?
于是我打开wireshark,瞄准DNF相关的所有组件的端口,开始抓包。
最先引起我注意的是一个名叫TencentDL的进程,他在游戏开始后会选择两到三个随机的IP地址发送大量的UDP包。百度后我发现这是腾讯的一个分布式下载服务,他利用你的带宽去加速别的玩家的下载速度,携带在所有的腾讯系软件内。会不会是他挤占了带宽,影响了游戏?不是。【1】这个流氓分布式下载服务存在很多年了,要出问题早就出问题了。【2】这个服务占的带宽实际并不多,现在家庭带宽都是100M起步,不足以产生影响。【3】这个服务是基于UDP的,我们是改了TCP协议的参数而改善判定的。
那UDP和TCP会相互影响吗?会,我甚至找到了一篇论文专门研究TCP和UDP相互的影响相互影响的论文。但是其中的实验条件,已经是将近20年以前了,那时候的外网带宽只有几兆,而现在的外网带宽动辄几百兆,除非是你满速迅雷下载的同时去PK(我相信没人会这样做),否则论文中的结论根本不适用。
到这里我开始愈发相信我的直觉了,DNF玩家间的UDP通信本身并没有任何问题。
【一定是国服改了底层的游戏同步算法导致了判定与TCP的耦合,而Nagle算法和延迟ACK导致了TCP的高时延】
于是我又打开wireshark,开始着重地对DNF的TCP连接进行抓包分析。这次我注意到了一个上海腾讯云服务器的14023端口。这个服务器的这个端口当且仅当我进入决斗场频道后才与我建立连接。并会在我游戏开始后与我进行大量的TCP通信。然后我又惊讶地发现,在这个TCP连接我向腾讯云的发包中出现了大量的TCP分片。这不正是典型的导致Nagle算法延迟过高的原因吗?网络中因为分片而出现大量的小包,windows启用Nagle算法对小包进行缓存,合并发送,而对端(腾讯服务器)出于带宽利用率的考量又开启延迟ACK,这样就出现了经典的40ms延迟现象,玩家在等服务器的ACK包,而服务器在等玩家的其余TCP分片。延迟就这样产生了。
但是但是但是与服务器的通信延迟为什么会影响到玩家的判定?这不是C/S架构游戏的问题吗?按道理DNF是P2P的,或者至少是在端口转发下的P2P才对不是吗?
不同与别的游戏,诸如英雄联盟所采取的C/S模式「对局玩家与一个服务器相连,战斗逻辑跑在服务器上」
DNF为了追求极致的低时延,采用了P2P模式「对局玩家直接互联,战斗逻辑跑在客户端上」
但这种模式有个致命的问题
【那就是无法防止作弊】
一场游戏,没有裁判,那自然就有人钻空子。
到这里我们再来总结一下现有的线索
1)在windows中禁用Nagle算法,减少ACK延迟,可以修复力法X丢判定的BUG。
2)丢失判定的问题在公平PK场更新后在各个职业中都或多或少的存在。
3)PK过程中我和腾讯的服务器存在大量的TCP通信,且我发给腾讯服务器的包存在大量的可导致Nagle算法延迟的分片后产生的小包。
4)国服PK场作弊问题非常严重(卡屏,掉线挂,外挂)
5)P2P模式无法防止作弊,C/S天然有着防作弊的优势。(服务器可以针对玩家的数据做校验)
以下纯属猜测。
DNF在公平PK场后,为了解决国服严重的作弊问题(卡屏,掉线挂),neople针对国服把一部分战斗逻辑从客户端转移到了服务器上。但是可能是neople懒,在这部分上,服务器与玩家之间的连接依旧沿用了TCP。进而导致在Nagle算法和延迟ACK的双重加持所造成的额外延迟下。一些延迟/判定敏感职业,如战斗法师。出现了大量的丢判定的现象。
假如我的猜测是正确的,这里提出一些可能的解决方案
1)采用成熟的rudp(如kcp)来替换玩家和服务器之间的TCP链接。
2)修复客户端部分的网络模块,避免TCP分片。