最近项目上被吐槽登录和断线重连太卡。为什么王者荣耀和乱世王者的重连瞬间就好了?这需要抓包看看他们重连都经历了什么。
1.准备工作
首先去官网下载wireshark,地址:https://www.wireshark.org/download.html
安装完wireshark,同时PC上安装android模拟器,同时模拟器中安装好游戏。最好安装一个可以控制网络连接/断开的模拟器。我用的是夜神模拟器:系统设置》属性设置》网络连接 来设置。
2.如何定位和手游的连接
打开wireshark运行并开始捕获协议时,会发现我们PC上在联网状态下,即使你什么都不做也是每秒产生大量的通信。那么如何快速定位你想观察的那款游戏的收发包?
1.首先推测协议类型,一般手游是tcp/ip的,所以看tcp/ip部分的变化
2.通过连接和断开的握手协议来区分。我们点击关掉游戏,一定会产生TCP关闭的握手,然后再点击进入游戏,会产生建立连接的握手。
关闭应用时:客户端向服务器发送[FIN ACK] 》服务端相应[FIN ACK] 》 客户端相应[ACK]
建立连接时:客户端向服务器发送[SYN] 》服务端相应[SYN ACK] 》 客户端相应[ACK]
上图满足特征,所以判断出服务器的端口号是12258。
所以上方绿色地址栏中的过滤表达式可以写成:tcp port eq 12258,即可过滤出和游戏服务器所有的手法协议。
3.分析比对和总结
原先我一直认为我们游戏的登陆协议设计太重,接口多且数据量大。但是抓包发现那款优质的竞品游戏重连时数据量是略大于我们的。区别是它们是大量的[PUSH ACK]推送,我们是50多次的request和response。竞品整个重连过程大概耗时不到一秒,但我们时把50多条协议串成一个队列,每次收到响应才发送下一条。相当于把网络延时放大了50多倍。这一块改好了,重连的压力也就不大了。
同时,wireshark对我们日常开发因为有很大帮助,尤其项目初期刚刚搭建联调网络的时候,前后端的打点都不可信,唯一可信的就是它了。抓个包,前后端再也不争吵协议到底发没发,发的格式对不对了。