为何MOBA、“吃鸡”游戏不推荐用tcp协议——实测数据

欢迎你们前往云加社区,获取更多腾讯海量技术实践干货哦~html

做者:腾讯云游戏行业资深架构师 余国良linux

MOBA类和“吃鸡”游戏为何对网络延迟要求高?

咱们知道,不一样类型的游戏由于玩法、竞技程度不同,采用的同步算法不同,对网络延迟的要求也不同。例如,MOBA类游戏多使用帧同步为主要同步算法,竞技性也较高,不管从流畅性,仍是从公平性要求来讲,对响应延迟的要求都最高,根据业内经验,当客户端与服务器的网络延迟超过150ms时,会开始出现卡顿,当延迟超过250ms时,会对玩家操做形成较大影响,游戏没法公平进行。相似地,“吃鸡”游戏(如《绝地求生》)玩法对玩家坐标、动做的同步要求极高,延迟稍大致使的数据不一致对体验都会形成较大影响,其实时性要求接近MOBA类游戏。而对于传统mmorpg来讲,多采用状态同步算法,以属性养成和装备获取为关注点,也有必定竞技性,出于对游戏流畅性的要求,对延迟也有必定要求,同步算法的优化程度不同,这一要求也不同,通常状况下为保证游戏正常进行,须要响应延迟保持在300ms如下。相比之下,对于炉石传说、斗地主、梦幻西游等回合制游戏来讲,同时只有一个玩家在操做双方数据,无数据竞争,且时间粒度较粗,甚至可经过特效掩盖延迟,所以对网络延迟的要求不高,即使延迟达到500ms~1000ms,游戏也能正常进行。这里,咱们不对同步算法作进一步说明,重点说一下协议的问题。git

传输层协议和延迟

不一样传输层协议在可靠性、流量控制等方面都有差异,而这些技术细节会对延迟形成影响。tcp追求的是彻底可靠性和顺序性,丢包后会持续重传直至该包被确认,不然后续包也不会被上层接收,且重传采用指数避让策略,决定重传时间间隔的RTO(retransmission timeout)不可控制,linux内核实现中最低值为200ms,这样的机制会致使丢包率短暂升高的状况下应用层消息响应延迟急剧提升,并不适合实时性高、网络环境复杂的游戏。github

加速方案

基于udp定制传输层协议,引入顺序性和适当程度或者可调节程度的可靠性,修改流控算法。适当放弃重传,如:设置最大重传次数,即便重传失败,也不须要从新创建链接。比较知名的tcp加速开源方案有:quic、enet、kcp、udt。其中,quic是源自google的tcp替代方案,其主要目的是为了整合TCP协议的可靠性和udp协议的速度和效率,其主要特性包括:避免前序包阻塞、减小数据包、向前纠错、会话重启和并行下载等,然而QUIC对标的是TCP+TLS+SPDY,相比其余方案更重,目前国内用于网络游戏较少。kcp的做者是国内优秀开发者,社区也发展良好,kcp的做者和社区开发者对enet、kcp、udt作了性能测试,详情可参见:https://github.com/skywind3000/kcp/wiki/KCP-Benchmark, 从测试状况能够看到,kcp表现不错,其次是enet,表现最差的是udt。不过,这里也提出一个问题,原始enet保留了tcp重传的指数避让特性,每次重传间隔仍是乘以2,默认rto也较高,这多是测试中enet表现不如kcp的主要缘由,若是对enet代码稍做调整,结果又当如何?这里,咱们先排除传输性能,从其余方面对enet和kcp作一对比(满分5分):算法

 

咱们对libenet略微作一些调整——默认rtt从500ms调整成50ms, 去除超时重传的指数避让策略。Linux下用TC命令模拟网络延迟和丢包率,控制延迟分别为30ms, 50ms, 70ms,控制丢包率分别为1%, 3%, 5%, 7%, 10%,在模拟出的不一样网络环境下,对tcp, 原始enet和改进后的enet进行了对比测试。安全

测试中考察两个性能指标:服务器

1)平均响应时间;网络

2)响应时间超过300ms的包的比例。架构

libenet的代码调整:tcp

图 1 调整默认RTT为50ms

图 2 取消指数避让

tc命令以下:

模拟延迟100ms(rtt为200ms): tc qdisc add dev eth0 root netem delay 100ms

模拟1%丢包率:tc qdisc add dev eth0 root netem loss 1%

对比结果数据以下:

 

图 3 不一样丢包率和网络延迟下TCP协议、ENET、优化后ENET的平均响应时间对比

 

图 4 不一样丢包率和网络延迟下TCP协议、ENET、优化后ENET的超时响应比例对比

从图中可见,在平均响应方面,TCP协议的劣势不明显,在延迟为30ms,丢包率为1%时,改进后的ENET平均RTT为69ms, 原始ENET平均RTT为67ms, TCP平均RTT为67ms;可是从响应时间超过300ms的比例看,在延迟为30ms,丢包率为1%时,改进后的ENET RTT超过300ms的包为0,而TCP RTT超过300ms的比例则超过了2%,若是是在游戏中,这个表现已经能明显影响游戏体验了。结果代表,TCP在网络稍不稳定的状况下就已经有比较大的问题了,改进后的ENET有明显优点。

总结

测试结果符合预期,在实时性方面,TCP协议的网络抗性欠佳,对MOBA类或其余实时性要求较高的游戏,咱们不建议使用TCP做为协议载体。事实上,王者荣耀,乱斗西游的通讯协议也确实是基于UDP封装的,别问我是怎么知道的。

后话

对于开发人员来讲,优化协议和同步算法是在已有网络环境下提高用户体验的可用方法,也是较平民化的方法,在网络抖动有限、丢包并不频繁、网络环境不至于太差的状况下,的确能有效提升游戏体验;然而这种方法也存在局限性,在网络环境超出可控范围,如在地铁上、商场里等人潮拥挤、存在网络热点,延迟或丢包率极高的环境中,仍是没法解决问题,所谓“巧妇难为无米之炊”,再牛X的协议和算法,也没法点石成金,要从根本上解决问题,最终仍是要回到网络质量上。和平民化方法相比,改变网络质量须要在资源和底层调度策略上的积累,如何优化遍及全国各地乃至全球各地的玩家网络接入点到服务器端的网络链路?如何优化玩家客户端最后一千米即客户端到无线基站的接入QoS (Quality of Service)?这种方法能够称之为高富帅方法,而有这种大规模需求,又能采用这种方法的,放眼望去,恐怕只能看到一家公司了:腾讯。好消息是,腾讯已经将这种能力在腾讯云开放了,称之为:智营网优。如今申请,免费试用!https://cloud.tencent.com/product/ino

想了解更多有关游戏加速方案和案例,当即报名1月19日腾讯云GAME-TECH沙龙杭州站,咱们一块儿探讨:https://cloud.tencent.com/act/event/game-tech-hz.html

直播连接: http://www.itdks.com/eventlist/detail/1885

相关阅读

「腾讯云游戏开发者技术沙龙」1月19日杭州站报名开启啦~畅谈游戏加速

经典游戏服务器端架构概述 (1)

阻击外挂:《龙之谷手游》安全测试的那点事


此文已由做者受权云加社区发布,转载请注明原文出处

相关文章
相关标签/搜索