原文由 碧晓寒枫 发表于 TesterHome 社区,点击原文链接可与作者间接交换。
什么是游戏协定?
协定是网络游戏前后端交互的实现形式。
游戏中协定的收发过程是怎么的?
当咱们在进行游戏的时候,咱们点击了某个按钮进行某一种游戏行为,这个时候,客户端会依照跟服务器约定好的一些规定,将咱们的游戏行为对应的申请和参数通过网络封包发送给服务器,服务端在收到这个申请后会对申请内容进行解析,以确定客户端进行的是什么游戏行为,并获取到对应的申请参数,之后服务端会依据代码逻辑来对这些数据进行相应的解决,并将处理结果同样以封包的模式返回给客户端,客户端在接管到封包之后,也会依照约定好的规定进行解析,并将解析后的后果展现给玩家。
不同的游戏有不同的协定类型和实现形式,有可能客户端发送的申请服务器并不会响应(有效申请),也有可能服务器会被动推送协定给客户端(如整点流动的开启)
常见协定
1.TCP 协定(传输控制协议)
市面上大部分的游戏都是应用的 TCP 协定,当游戏不须要十分强的实时性,可能容忍肯定水平提早的时候,举荐应用 TCP 协定,但如果是强实时性的游戏(如 moba 和 fps 类型的游戏),就须要应用 UDP 协定来尽量减少提早
长处:面向连贯(一对一,相似于打电话),传输牢靠(可能保证数据的正确性),有序(能保证数据的程序),能够传输大量数据(流模式),简略间接,无需再次开发
毛病:对系统资源的要求多,程序结构较简单,丢包重传时提早较大
2.UDP 协定(用户数据报协定)
下面讲到了,一些实时性强的竞技类游戏,个别是应用 UDP 协定
长处:速度快,对系统资源的要求少,程序结构简略,反对一对一,一对多和多对多的交互通信
毛病:传输不牢靠(可能丢包)、无序(不能保证数据的程序),传输数据量小,可能须要二次开发来保障实时性
3.websocket 协定
websocket 是基于 HTML5 语言而诞生的一种协定,websocket 跟 socket 不同,websocket 是一个残缺的应用层协定,蕴含一套规范的 API,多利用于 H5 和微信小游戏
而 socket 是对 TCP/IP 协定的封装和利用,它并不是一种协定,而是为了不便大家间接应用更底层协定而存在的一个形象层,将应用层之间的网络通信简单化,当 socket 连贯创立时,通过参数指定应用的传输层协定类型,当应用 TCP 协定进行连贯时,该 socket 就是一个 TCP 连贯
在 websocket 中,须要服务器和客户端(或浏览器)通过 http 协定进行一次握手动作,而后独自创立一条 TCP 通信通道进行数据传输
PS:如果不须要写机器人的话,其实不太须要关怀协定的实现形式,不论是 TCP 协定,还是 websocket 等等,咱们须要关注的其实是服务器对协定参数的验证。
常见的游戏协定封包形成
一般来说,一个通过 socket 传输的残缺的游戏协定封包,通常由包长、协定号、验证码、协定参数形成(具体我的项目可能实现形式略有不同,具体可跟开发人员求证)
包长 :以后封包的字节流长度,用来判断收到的字节流是否是一个残缺的封包
协定号 :客户端与服务端之间定义的具体的事件编号,通过协定号,咱们能够晓得客户端是进行了哪种操作
验证码 :客户端跟服务端之间定义的一套封包有效性验证机制
协定参数:客户端与服务端进行协定传输的时候附带的理论协定内容,是某种游戏行为的具体实现,协定参数又分为多种类型,有 int 型,str 型,list 型,甚至是某种自定义的对象,这个个别须要参照具体的游戏协定文档。
ps:因为 TCP 非凡的流模式,某些状况下,咱们收到的封包可能是由多个封包黏连在一起的,那么在进行封包解决的时候如何判断是否是一个残缺的封包呢?就须要通过包长来判断,如果以后封包的长度等于包长的值,那么就是一个残缺的封包,否则就须要对封包进行截取拆分
为什么要测协定?
游戏中很多行为限度,是在客户端层面的,在咱们进行某些非正常游戏行为的时候,客户端曾经在逻辑层面阻止了咱们的这种行为(比方,在金钱有余的时候我去买一件物品,客户端会判断你的钱是否足够买这件物品,如果有余则会提醒金钱有余,并阻止你这次行为),但之前咱们讲了,客户端与服务端之间是通过协定封包来进行交互的,客户端阻止你的行为,只是阻止客户端本人来发送这个行为封包,那么服务端对于这种非正常状况是否有做判断呢?如果我伪造一个这样的封包,或者在网络不顺畅的时候,屡次点击购买来反复发送封包,是否能够在金钱有余的时候购买胜利呢?是否存在刷钱刷道具的破绽呢?
这个就是咱们进行协定测试的目标:验证服务器逻辑的正确性!
抓包和发包
1. 抓包
既然要剖析协定,那么首先就须要看到协定,看到协定那么就须要监听服务端与客户端之间的通信,并抓取游戏封包
市面上目前有很多抓包工具,罕用的游戏抓包神器 WPE、其余的还有 fiddler、wireshark 等,应用办法这里不做过多介绍,网上很多应用教程。
2. 发包
以 WPE 为例,在咱们抓到包之后,右键其中的一条封包抉择发送,就能够在新弹出来的界面批改封包内容,在批改好对应的参数之后,点击发送按钮,这条批改后的封包就会发送给服务端了。
开发人员个别也会留一个 GM 指令的接口或者其余的发包形式,通过预留接口也能够实现对服务器进行发包测试。
但一般来讲,WPE 的可读性太差,GM 指令的操作便利性也比拟差,倡议有能力的测试人员或开发人员,能本人写一套发包工具(相似下图),不便进行协定测试。
如何剖析协定?
咱们在协定测试的时候,次要是针对客户端对服务端发送的协定进行测试,因为游戏数据的解决大部分都是在服务器上进行的,咱们须要验证的是服务器的逻辑解决环节,而服务器返回的封包,是曾经在服务器逻辑解决实现之后的,咱们就算对这些封包进行了批改,也只是批改了客户端的显示而已,并不会对服务器的数据造成任何影响。
那么怎么样去剖析呢?请看上面这张图:
咱们玩游戏时进行的游戏行为,都是具备行为前置条件的,比方咱们买货色,那么就须要有足够的钱,想要挑战某个正本,就须要有足够的等级和挑战次数,咱们要做的,就是颠覆前置条件,在条件不满足的状况下,来发送一个失常的游戏封包。前置条件大略整顿了以下几种类型:
1. 等级有效
对于某些具备等级限度的玩法,在等级有余的时候进行发包验证
2. 工夫有效
对于某些具备时效性的玩法,在工夫范畴之外进行发包验证
3. 货币有效
对于须要耗费货币的玩法,在货币数量有余的时候发包验证(这里的货币指的是狭义的货币,不单指金钱,还包含正本次数等等)
4. 次数有效
这里指的是一些有次数限度的玩法,在次数有余的时候发包验证,如某个流动处分,每个角色只能支付 1 次,那么在支付完处分之后,再发送一次支付处分的封包,看服务器的解决逻辑
5. 前置条件有效
这个比拟非凡,举个例子:帮派每日礼包,帮派成员每日能够支付 1 次,前置条件就是角色必须曾经退出帮派成为帮派成员,在角色未退出帮派的时候,这个处分通过发包是否能够支付?
6. 参数范畴有效
这个也有点非凡,还是通过一个例子来阐明:游戏内的 7 天登录协定,协定参数为对应处分的天数,如玩家要支付第一天的处分,在发送协定的时候参数为 1,第二天为 2……第七天为 7,那么 0 和 8 就是范畴外的有效参数
7. 非凡限度
未在上述条件中的可能存在的一些其余的限度,如在跟 NPC 提交工作和支付处分的时候,须要在一个无效交互范畴之内,在这里非凡限度就是交互间隔
协定测试用例设计
测试用例并没有一个固定的格局,看集体爱好,但倡议蕴含协定信息以及无效有效条件等,下图是个示例,供参考:
写在最初
协定的剖析与测试,到这里就讲的差不多了,不过还有一点须要关注的,就是协定的 有效性 和冗余性,这个不属于单条协定测试的领域,但却是游戏体验和性能方面很重要的一个方向。
咱们游戏的协定是通过网络模式发送的,网络是有流量老本和传输压力的,缩小有效协定和反复协定、缩小非必要的协定参数,在肯定水平上可能进步协定的传输效率,给游戏带来更好的体验。
有些公司还须要负值校验(将参数批改为正数),以及不残缺封包校验(删除局部字段),因为咱们公司后端在这块验证做的比较完善,所以我没有写,感兴趣的同学能够跟后端开发人员确认一下。
原文由 碧晓寒枫 发表于 TesterHome 社区,点击原文链接可与作者间接交换。
今日份的常识已摄入!想要学习更多干货常识、结识品质行业大牛和业界精英?
第十届中国互联网测试开发大会理解下 >>