前言
刚好公司有个项目出现客户端访问服务器提示连接超时的情况,具体log信息显示如下:
[21:29:48(1518)]*[TestService]*[getDeviceInfoFromCloud->onFailure: java.net.SocketTimeoutException: failed to connect to mapi.yunovo.cn/47.98.17.161 (port 80) after 10000ms]
[21:29:51(1518)]*[TestService]*[getDeviceInfoFromCloud->onFailure: java.net.SocketTimeoutException: failed to connect to mapi.yunovo.cn/47.98.17.161 (port 80) after 10000ms]
[21:30:09(1518)]*[TestService]*[getDeviceInfoFromCloud->onFailure: java.net.SocketTimeoutException: failed to connect to mapi.yunovo.cn/47.98.17.161 (port 80) after 10000ms]
一、思路分析
出现以上异常信息无非就以下几种可能:
1、设备发送消息给服务器,服务器有接收到信息但没有反馈给设备??
2、设备发送消息给服务器,服务器没有接收到信息??
3、设备没有把信息发送到服务器??
4、设备与服务器通讯期间数据有丢失??
解决方案:
1、通过tcpdump进行对设备抓包,抓取TCP的全部信息
2、结合wireshark工具进行分析TCP的连接过程
3、通过分析抓取的包信息来总结问题所在
二、抓包过程
1、把tcpdump脚本通过如下指令发送到设备端的/data/local/,进入设备的/data/local/路径下修改文件权限
adb push tcpdump /data/local/ #传到指定路径
chmod 777 tcpdump #修改权限
2、执行抓包指令
tcpdump -p -vv -s 0 -C 100 -w /sdcard/xxx.pcap #相关参数请自行查找
3、当抓取的文件过多时,可以进入wireshark安装目录执行如下指令进行合并多个文件(比如有3个文件名为test.pcap\test_1.pcap\test_2.pcap)
mergecap.exe -w test.pcap test_*.pcap #第一个为你要保持的路径和文件名,后缀必须以.pcap结尾,第二个为需要合并的文件
三、TCP握手和断开过程
完成的交互过程就是一个典型的HTTP协议的应用过程。
HTTP是基于T CP的连接,因此,建立HTTP连接必须经过TCP的过程,TCP的建立过程是3次握手的过程。然后就是HTTP过程,HTTP只有两种报文,请求和应答报文。完成http过程后,3次断开tcp连接。
第一次握手连接
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图
![](https://img.haomeiwen.com/i6424670/2202ebe629282ddc.png)
第二次握手的数据包
服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图
![](https://img.haomeiwen.com/i6424670/73b311329fb1d24d.png)
第三次握手的数据包
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:
![](https://img.haomeiwen.com/i6424670/6df54ba0b52e8408.png)
结束请求
tcp三次握手结束之后就是HTTP请求
![](https://img.haomeiwen.com/i6424670/fea5634649747c7d.png)
四、针对抓取的包进行分析
1、通过打印的日志找到服务器IP地址
2、把抓取的数据包用wireshark工具打开,输入过滤条件,如下图
![](https://img.haomeiwen.com/i6424670/026deb33a70e239b.png)
3、分别核对查看TCP的三次握手请求是否正常,如下图
![](https://img.haomeiwen.com/i6424670/5f45c5dd7ae2f0c8.png)
![](https://img.haomeiwen.com/i6424670/d945384b707f80d1.png)
4、结论
1、从TCP握手连接过程来看,第二次握手连接不成功(即服务器可能存在没有接收到消息或者接收到消息后没有返回给客服端),接下来就得分析服务器端的日志信息了
2、从服务端分析的原因为:服务器刚好在释放资源时,客户端发来请求,导致服务器没有及时做处理导致出现超时等异常。
网友评论