一次抓包定位问题的经历

作为一个android开发,经常要抓包定位问题,主要用到的工具有fiddles,charles,wireshark,像http、https的抓包用前2者比较方便,但是底层的包就必须用tcpdump+wireshark了,今天学习了wireshark抓包,在此小记。

准备工作

tcpdump的主要功能就是把网络日志记录在一个pcap文件内,在android上要用tcpdump,首先必须是root的手机,然后得把tcpdump安装好,具体方法可以参考这里。由于我的手机是aosp版本,所以自带root和tcpdump,一个字,爽。
另外我的电脑是mac,在mac上需要装一个wireshark来查看抓包日志。

抓包

连上手机之后,敲入以下三行命令就可以开始抓包,非常简单。

adb shell   #登入手机
su          #切换Root用户
tcpdump -p -vv -s 0 -w /sdcard/capture.pcap   #执行抓包命令,结果保存到capture.pcap文件中

之后我们要停止抓包,只要按下ctrl+c强行中止就可以了。此时我们可以找到capture.pcap文件,用adb把他pull出来就好了,然后在mac上我们用wireshark打开pcap文件查看日志。我遇到的问题是websocket连不上的问题,希望能通过抓包来定位问题。

wireshark 看日志

用wireshark打开pcap文件可以看到下图,里面用TCP、ARP、ICMP包。

enter description here

如果不过滤的话,日志会非常多,要学会用各种方法过滤。我抓包的是一个websocket的连接,我知道web服务器的端口是8092,所以我在过滤窗口输入tcp.port == 8092,如下所示

enter description here

一下子只剩下十几条日志了,如下所示

enter description here

可以看到非常清楚的看到了websocket的连接过程。
我们知道websocket是基于http的,在http的基础上upgrade,然后开始websocket层的数据传输。

三次握手(19,23,24)

从上图可以看到,一上来就是一个熟悉的tcp三次握手(19,23,24三个包)。可以看出我们的本地端口是36498,websocket服务器那边的端口是8092.
首先本地向服务器发一个SYN包(Seq=0),然后服务器回了SYN+ACK(seq=0,ack=1),接着本地回ACK(ack=1,seq=1),成功建立了一个TCP连接。

如下包是什么意思呢? [SYN,ACK]表示的是TCP包的flag里,SYN,ACK为1.后面的seq=0,ack=1表示的是seq和ack的序号。

enter description here

可以看到响应包的ack=请求包的seq+1,这个没错。但是seq不应该是随机的吗?为什么都是0开始的啊?这里的seq都是相对值而不是绝对值。

http upgrade(25)

在TCP连接之上,我们发了一个http请求(25号包),这个请求是用来协商升级即upgrade的,包体如下

enter description here
可以看出我们发的是一个get请求,Upgrade字段是websocket,Connection类型是Upgrade,还有host,user-agent,accept-encoding等熟悉的http头信息。

http回包(27)

客户端发送请求升级websocket的http包给服务器,服务器表示没问题,回了个http包(27号),内容为 HTTP/1.1 101 Switching Protocols.此时客户端和服务端之间的协议就升级为websocket了,之后都用websocket来交流

websocket包(29)

刚才协议升级完了,就可以用websocket通信了,客户端向服务器发了个29号包。主要内容为,这是我们的auth包,向服务器认证,是个json包。后面的内容就不能展示出来了。
{"gameId":2,"accid":25340,"rpcMethod":"/user/auth",。。。。}

这个包里有个FIN要注意了,这是websocket层的FIN,而不是TCP层请求断开的FIN,这个FIN的意思是服务器,你别等了,我这个包已经完整了(因为如果包太大了就会拆分成几个包)。

enter description here

其实我们可以看这个websocket对应的TCP包里面的flag就清楚了,如下所示flag只有PSH和ACK并没有FIN。

enter description here

这是websocket的FIN

enter description here

结束包(48号)

然后服务端忽然给客户端发了个48号包,这是个FIN包。

enter description here
好了。现在回头看看,我抓包的初衷,我以为websocket连不上,但是实际上是websocket已经连上了,然后客户端向服务端发了个AUTH包,服务端直接把tcp连接给断了。所以这个锅必须是服务器的!(真正原因,是服务器收到客户端的auth请求,认为客户端版本过低,没有给客户端回包,而是直接断开了tcp连接,实际上应该给客户端发一个auth失败的通知)。

总结

事实证明抓包还是很有用的,对定位问题很有帮助。

ref

http://www.cnblogs.com/findyou/p/3491014.html

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值