WireShark是一个非常准确和稳定的tcp抓包工具,但看其40多m的安装包就可以想象其功能的强大,借助其功能强大的表达式筛选器,可以迅速的筛选出来我们所需要报文和记录,最近我就通过WireShark推断网络性能问题的故障点,收获颇丰。
最近客户提出app端load慢,尤其是在网络不好的地方,得好几分钟才能加载出数据,于是打算用抓包软件WireShark 看看http请求就用用了多长时间才传回来的,首先我用火狐浏览器访问了一下一个GET接口,监听结果如下
(我本机的端口是61281,但是抓包软件又抓出一个61282的端口,应该不是我的火狐浏览器的结果,下文忽略61282端口的消息)
从抓包结果来看,本次HTTP请求大体分为以下步骤
三次握手-->发送GET请求--->收到服务器返回json--->获取浏览器favicon.ico--->KEEP-ALIVE--->四次挥手
在介绍每个步骤的返回值之前,先介绍一下WireShark这个软件的简单用法
首先是我的过滤器设置:ip.addr == 122.248.245.191 含义是仅保留源ip地址和目标主机ip地址至少有一个为122.248.245.191,也就是项目服务器的地址,这样就可以筛选出所有的本机和122.248.245.191的收发报文
如果更改过滤器描述,比如ip.dst==122.248.245.191 andip.src==192.168.1.109(192.168.1.109是本机的ip)就可以查看所有从本机发往服务器的报文,如果把两个ip对换一下,就可以查看所有服务器发给本机的报文
如果写成ip.addr == 122.248.245.191 and tcp.srcport==61281(其中61281是本机的对外端口)就是查找所有源ip的端口为61281的报文,换句话说就是只显示本机发给服务器的报文,不同的条件可以用and连接,灵活处理。
再来说一下报文里面的基本信息
(一) 、ACK,FIN,PSH这三个是TCP请求的标志,本身并不是一个数,而是和另外五个这样的标志组成了一个长度为1字节(8位)的标志,用于标示出当前请求报文的类型,可以在WireShark 底下的FLAGS目录下查看,如果某一位设置为1则为Set,置0为Not set,一般我们只看置1的位,其中Acknowledgement = ACK,FIN = Fin,Push = Psh
(二)、seq,ack的含义,其中seq是Sequence number的简写,即序列号。Ack是Acknowledge number的简写,即应答码,用这两个数字可以观察相邻的几条报文的顺序。
好了现在我们可以开始按照步骤逐一分析了
第一阶段:三次握手
(本机ip是192.168.1.109:61281,服务器ip是:122.248.245.191:7033)
首先来回顾一下三次握手的过程