使用Fiddler抓包、wireshark抓包分析(三次握手、四次挥手深入理解)
==================Fiddler抓包==================
Fiddler支持代理的功能,也就是说你所有的http请求都可以通过它来转发,Fiddler代理默认使用端口8888,不知道的同学有可能因此无法使用FQ,因为端口冲突。
利用这点,我们可以在手机端设置http代理为Fiddler的代理服务器,使得手机应用的请求都通过Fiddler来转发,从而实现查看手机端页面请求的功能。
1. 下载安装
https://pc.qq.com/detail/10/detail_3330.html
下载之后正常安装即可。
启动之后主界面如下:
1. Statistic。
关于HTTP请求的性能和其他数据分析
2.Inspectors。
分为上下两个部分,上半部分是请求头部分,下半部分是响应头部分。对于每一部分,提供了多种不同格式查看每个请求和响应的内容。JPG 格式使用 ImageView 就可以看到图片,HTML/JS/CSS 使用 TextView 可以看到响应的内容。Raw标签可以查看原始的符合HTTP标准的请求和响应头。Auth则可以查看授权Proxy-Authorization 和 Authorization的相关信息。Cookies标签可以看到请求的cookie和响应的set-cookie头信息。
3. AutoResponder
Fiddler比较重要且比较强大的功能之一。可用于拦截某一请求,并重定向到本地的资源,或者使用Fiddler的内置响应。可用于调试服务器端代码而无需修改服务器端的代码和配置,因为拦截和重定向后,实际上访问的是本地的文件或者得到的是Fiddler的内置响应。
4. Composer。
可以构建相应的请求,有两种常用的方式构建请求:
(1)Parsed 输入请求的url之后executed即可,也可以修改相应的头信息(如添加常用的accept, host, referrer, cookie,cache-control等头部)后execute
(2)Raw。使用HTTP头部信息构建http请求。
5. Filter
Fiddler另一个比较强大的功能。Fiddler提供了多维度的过滤规则,足以满足日常开发调试的需求。也可以对ajax请求、get、post请求打断点。
2. 抓PC端包以及发送请求
0.访问前先清除所有的访问
点击: Edit->remove->all sessions即可清除所有记录
1.首先我们启动一个web服务,端口是8088,并在浏览器访问首页
2. 查看fiddle记录
如上:可以看到发出的请求,包括JS\CSS\静态图片等:
JS和CSS可以直接查看内容,图片也可以直接查看图片,如下:
3. 通过find按钮查找并过滤localhost:8088请求
4. 通过过滤器指定localhost:8088请求
5. 查看ajax请求
查看ajax请求
6. Composer模拟发送请求(也可以发送文件)
GET请求参数写在URL,POST请求写在RequestBody中:
补充:如果需要传递参数,需要在请求头中声明content-Type属性,否则参数不会传递到后台,普通的表单传递参数需要设置为:
Content-Type: application/x-www-form-urlencoded
请求体中参数为username=xxx&password=xxx的形式。
2. 抓取手机端发出的请求
(1)配置Fiddler允许监听https (可以省略)
打开Fiddler菜单项Tools->Options,选中decrypt https traffic和ignore server certificate errors两项,如下图:
第一次会提示是否信任fiddler证书及安全提醒,选择yes,之后也可以在系统的证书管理中进行管理
(2)配置Fiddler允许远程连接
如上图的菜单中点击connections,选中allow remote computers to connect,默认监听端口为8888,若被占用也可以设置,配置好后需要重启Fiddler,如下图
(3)配置手机端:
本电脑的IP为:192.168.3.7
设置手机的代理为本机IP,端口为8888(需要在同一网络内)
通过手浏览器或者app访问即可抓包:
==================wireshark抓包==================
wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。使用wireshark的人必须了解网络协议,否则就看不懂wireshark了。为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。
wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容,总结,如果是处理HTTP,HTTPS 还是用Fiddler, 其他协议比如TCP,UDP 就用wireshark.
1. 开始抓包
wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。
点击捕获选项-》选择网卡之后点击开始,. 出现下面对话框,选择正确的网卡。然后点击"开始"按钮, 开始抓包
1. 窗口介绍:
主要有:
1. Display Filter(显示过滤器), 用于过滤
2. Packet List Pane(封包列表), 显示捕获到的封包, 有源地址和目标地址,端口号
3. Packet Details Pane(封包详细信息), 显示封包中的字段
4. Dissector Pane(16进制数据)
5. Miscellanous(地址栏,杂项)
2. 过滤器
过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。过滤器有两种,
一种是显示过滤器,就是主界面上那个,用来在捕获的记录中找到所需要的记录
一种是捕获过滤器,用来过滤捕获的封包,以免捕获太多的记录。 在Capture -> Capture Filters 中设置。
补充:自定义过滤器的方法如下:
点击过滤器右边的+号,然后输入标签和过滤器保存之后会在右边出现一个按钮,可以快速使用
过滤表达式的规则
表达式规则
1. 协议过滤
TCP,只显示TCP协议。
2. IP 过滤
ip.src ==192.168.1.102 显示源地址为192.168.1.102,
ip.dst==192.168.1.102, 目标地址为192.168.1.102
3. 端口过滤
tcp.port ==80, 端口为80的
tcp.srcport == 80, 只显示TCP协议的源端口为80的。
4. Http模式过滤
http.request.method=="GET", 只显示HTTP GET方法的。
5. 逻辑运算符为 AND/ OR
3. 封包列表(Packet List Pane)
封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 你可以看到不同的协议用了不同的颜色显示。
你可以在 视图->着色规则 查看颜色规则,当然可以修改,也可以修改日期显示格式等。
4. 封包详细信息 (Packet Details Pane)
这个面板用来查看协议中的每个字段。各行信息如下:
Frame:物理层的数据帧情况
Ethernet II: 数据链路层以太网帧头部信息
Internet Protocol Version 4: 互联网层IP包头部信息
Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
补充:在进行通信开发的过程中,我们往往会把本机既作为客户端又作为服务器端来调试代码,使得本机自己和自己通信。但是wireshark此时是无法抓取到数据包的,需要通过简单的设置才可以。
因为wireshark在windows系统上默认使用的是WinPcap来抓包的,现在可以用Npcap来替换掉WinPcap,Npcap是基于WinPcap 4.1.3开发的,api兼容WinPcap。
1.下载安装
下载地址:https://github.com/nmap/npcap/releases
2.下载安装后启动wireshark会多出一项:(我们选择Npcap即可)
3. 访问本地进行测试:
2. wireshark分析TCP连接三次握手
TCP连接的建立(三次握手):首先,客户端与服务器均处于未连接状态,并且是客户端主动向服务器请求建立连接:
客户端将报文段中的SYN=1(同步位),并选择一个seq=x,(即该请求报文的序号为x) 将这个报文发送到服务器。此时,客户端进入同步已发送状态(SYN-SEND).SYN报文段不能携带数据,但是要消耗掉一个序号。
服务器收到请求报文后,若同意建立连接,则回复报文中,SYN=1,ACK=1,并选择一个seq = y,且报文中确认号为x+1,序号为y .此时服务器进入同步已接收状态(SYN-RCVD)
客户端收到服务器的同步确认后,对服务器发送确认的确认。将ACK=1,确认号为y+1,而报文首部的序号为x+1,将该报文发出后,客户端进入已连接状态(ESTABLISHED)。
服务器收到客户端的确认后,也进入已连接状态。
一张图理解上述过程:(SYN表示同步位,用于建立连接。ACK表示确认位,seq表示序号,是本报文段所发送的数据的第一个字节的序号,ack:确认号,表示期望收到的下一个报文段的第一个数据字节的序号。)
用wireshark查看三次握手:
(1) 打开wireshark,浏览器中输入:http://127.0.0.1:8088/weixin/test/index.html
(2)选中GET /weixin/test/index.html 那一条数据,右击->追踪流->TCP流
(3) 然后弹出如下页面:
看到过滤条件自动加上 tcp.stream eq 3 ,实际上tcp.stream是wireshark自动加的一个属性,每个TCP请求都加的,如下:
(4)分析上面的三次握手:10、11、12
第一次握手数据包:客户端发送一个SYN报文(同步位SYC=1),并将自己的报文序号Seq设为X(这里X取0,第一个报文所以是0).(见上图No10)
第二次握手的数据包:客户端发送一个SYN+ACK(SYC=1,ACK=1)报文,并将自己的报文序号Seq设为Y(此处取0,第一个报文所以是0),Ack(确认号)设为上面X+1(上面X=0)(见上图No11)
第三次握手的数据包:客户端再次发送确认报文(ACK=1) ,并将自己的报文序号Seq置为X+1(X为0),确认号Ack = Y+1 (上面Y = 0)(见上图No12)
就这样通过了TCP三次握手,建立了连接
3.wireshark分析四次挥手
连接的释放较连接的建立复杂。假设客户端与服务器均处于连接建立状态,客户端主动断开连接:(实际上双方都可以请求释放连接)
1.客户端向服务器发送FIN报文:FIN=1,序号seq=上一个最后传输的字节序号+1=u,发送后,客户端进入FIN-WAIT-1状态。
2.服务器接收到该报文后,发送一个确认报文:令ACK=1,确认序号ack = u+1,自己的报文序号seq=v,发送后,服务器进入CLOSE-WAIT状态。
3.此时TCP连接进入连接半关闭状态,服务器可能还会向客户端发送一些数据。
4.客户端收到来自服务器的确认之后,进入FIN-WAIT-2状态。等待服务器发送连接释放报文。
5.如果服务器已经没有要发送的数据,则释放TCP连接,向客户端发送报文:令FIN=1,ACK=1,确认号ack =u+1,自己的序号seq = w(w可能等于v也可能大于v),服务器进入LAST-ACK状态。
6.客户端收到服务器的连接释放报文后,对该报文发出确认,令ACK=1,确认号ack=w+1,自己的序号seq=u+1,发送此报文后,等待2个msl时间后,进入CLOSED状态。
7.服务器收到客户端的确认后,也进入CLOSED状态并撤销传输控制块。
一张图理解四次挥手(也可以看做两个二次握手):FIN表示终止(FINAl),用于释放一个连接
还是以上面的图理解四次挥手:
如最后的:538、539、626、627就是四次挥手,可以看出是8088服务器向客户端先发起挥手
(1)第一次挥手(上面的No538)
服务端向客户端发送FIN报文+ACK报文(FIN=1,ACK=1):自己的报文序号Seq=u(5839),Ack = Z(3419)
(2)第二次挥手(上面的No539)
客户端接收到该报文后,发送一个确认报文(ACK=1):自己的报文序号Seq=Z(3419),确认序号Ack = u+1 = 5840
(3)第三次挥手:(上面的No626,这里发送的报文序号Seq和Ack确认号与539相同,是因为客户端连着两次向服务器发送报文且未接到过服务器的报文)
客户端向服务器发送FIN报文+ACK报文(FIN=1,ACK=1):自己的报文序号Seq=X(3419),确认序号Ack = Y = 5840
(4)第四次挥手(上面No627)
服务端向客户端发送ACK确认报文(ACK=1):自己的报文序号Seq=Y(5840),确认序号Ack=X+1(3420)
注意:Seq是数据包本身的序列号;Ack是期望对方继续发送的那个数据包的序列号。第一个报文从0开始。
4. wireshark分析长连接
我们知道 HTTP 协议采用“请求-应答”模式,当使用普通模式,即非 Keep-Alive 模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用 Keep-Alive 模式(又称持久连接、连接重用)时,Keep-Alive 功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive 功能避免了建立或者重新建立连接。当客户端发送另外一个请求时,就使用这条已经建立的连接。
HTTP Keep-Alive 简单说就是保持当前的TCP连接,避免了重新建立连接。
HTTP 长连接不可能一直保持,例如响应头中的Keep-Alive: timeout=5, max=100,表示这个TCP通道可以保持5秒,max=100,表示这个长连接最多接收100次请求就断开。
(1)对于Http1.0
使用HTTP/1.0的客户端在首部中加上”Connection:Keep-Alive”,请求服务端将一条连接保持在打开状态。服务端如果愿意将这条连接保持在打开状态,就会在响应中包含同样的首部。如果响应中没有包含”Connection:Keep-Alive”首部,则客户端会认为服务端不支持keep-alive,会在发送完响应报文之后关闭掉当前连接。
(2)对于Http 1.1
HTTP/1.1采取持久连接的方式替代了Keep-Alive。HTTP/1.1的连接默认情况下都是持久连接。如果要显式关闭,需要在报文中加上Connection:Close首部。
即在HTTP/1.1中,所有的连接都进行了复用。
1. 默认的长连接分析
后台代码:
@RequestMapping("/index") @ResponseBody public String index(HttpServletRequest request, HttpServletResponse response) throws InterruptedException { return "test/index"; }
我们连着三次访问 http://localhost:8088/weixin/test/index.html
wireshark抓包之后截图如下:
分析:
(1)上面每发出一次请求,都有一个服务器回传给客户端的请求(可以选中一条之后查看发送方与接收方),因此是3对6次http(对应上面编号为No 37-39/63-63/75-77)
(2)选中No为37的然后 右击->追踪流->TCP流,之后的效果如下:
可以看到这次TCP流发送1次TCP三次握手,之后完成三次http请求,到我们停止的时候都没有释放TCP(没有进行FIN四次挥手)。
2. 关闭长连接的分析
后台代码:
@RequestMapping("/index") @ResponseBody public String index(HttpServletRequest request, HttpServletResponse response) throws InterruptedException { response.setHeader("Connection", "close"); return "test/index"; }
我们连着三次访问 http://localhost:8088/weixin/test/index.html
wireshark抓包之后截图如下:
(1)选中No为19 的追踪TCP流,结果如下:
可以看到:9/10/11是建立TCP连接,19是客户端发送请求,21是服务器回传消息,25-26是客户端向服务器发送关闭TCP请求-服务器应答关闭请求;29-30是服务器向客户端发送关闭TCP请求-客户端应答关闭请求。也就是客户端发送一次HTTP请求,经历了TCP建立连接、处理HTTP请求、TCP连接释放。
(2)选中No为42的进行TCP追踪,结果如下:
可以看到:12/13/14是建立TCP连接,42是客户端发送请求,44是服务器回传消息,52-53是客户端向服务器发送关闭TCP请求-服务器应答关闭请求;56-57是服务器向客户端发送关闭TCP请求-客户端应答关闭请求。也就是客户端发送一次HTTP请求,经历了TCP建立连接、处理HTTP请求、TCP连接释放。
补充:关于https解释
https(ssl)加密是发生在应用层与传输层之间,所以在传输层看到的数据才是经过加密的,而我们捕捉到的http post,是应用层的数据,此时还没有经过加密。这些明文信息,其实就是你的本地数据。
加密数据只有客户端和服务器端才能得到明文(也就是客户端与服务端可以通过抓包工具抓取到),客户端到服务端的通信过程是安全的。
https俗称超文本传输安全协议。是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS是在HTTP的基础上加上一层安全层,用于数据加密、解密、身份认证,即:
HTTP + 加密 + 认证 = HTTPS
我们平常开发中接触形形色色的加密算法,简单来说分为对称加密算法与非对称加密算法以及散列算法。算法的区别在哪呢?我们可以这么来理解三种算法的区别:
对称加密算法:加密和解密数据使用同一个密钥。这种加密方式的特点是速度很快。
非对称加密算法:数据用公钥加密后必须用私钥解密,数据用私钥加密后必须用公钥解密。这种加密方式的特点是速度慢,CPU 开销大。
散列算法:没有秘钥,目前无法反向解密。(暴力破解除外)
我们为什么需要加密?我们日常生活中登录密码或者各种隐私信息都需要进行加密保存防止信息泄露。那我们接下来来看看这三种算法类型分别有什么样的算法呢:
对称加密算法:目前主流算法有DES算法,3DES算法,AES算法
非对称加密算法:目前主流算法有RSA算法
散列算法:目前主要以MD5和SHA-1算法为主
补充:Fiddler 增加一列查看接口响应时间
由于fiddler自带的没有进行响应时间的统计,所以我们需要给他添加新的规则
(1) 在菜单栏上面找到Rules->CustomRules
(2) 将下面代码加到class handler 内部
function BeginRequestTime(oS: Session) { if (oS.Timers != null) { return oS.Timers.ClientBeginRequest.ToString(); } return String.Empty; } public static BindUIColumn("Time Taken") function CalcTimingCol(oS: Session){ var sResult = String.Empty; if ((oS.Timers.ServerDoneResponse > oS.Timers.ClientDoneRequest)) { sResult = (oS.Timers.ServerDoneResponse - oS.Timers.ClientDoneRequest).ToString(); } return sResult; }
(3) 然后退出Fiddler,再重启就可以了,可以看到最后多了一列Time Taken