使用Fiddler抓包、wireshark抓包分析(三次握手、四次挥手深入理解)
==================Fiddler抓包==================
Fiddler支持代理的功能,也就是说你所有的http请求都可以通过它来转发,Fiddler代理默认使用端口8888,不知道的同学有可能因此无法使用翻墙,因为端口冲突。
利用这点,我们可以在手机端设置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抓包、wireshark抓包分析(三次握手、四次挥手深入理解)的更多相关文章
- wireshark抓包直观图解 TCP三次握手/四次挥手详解
转http://www.seanyxie.com/category/linux/ 作者:seanyxie | 一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负 ...
- wireshark抓包图解 TCP三次握手/四次挥手详解[转]
原文链接:http://www.seanyxie.com/wireshark%E6%8A%93%E5%8C%85%E5%9B%BE%E8%A7%A3-tcp%E4%B8%89%E6%AC%A1%E6% ...
- IP分片 与 TCP分段的区别 !!!!careful========以及udp中一个包大小究竟为多大合适 ==========三次握手四次挥手细节
首先声明:TCP分片应该称为TCP分段 TCP/IP详解--TCP的分段和IP的分片 分组可以发生在运输层和网络层,运输层中的TCP会分段,网络层中的IP会分片.IP层的分片更多的是为运输层的UDP服 ...
- TCP/IP三次握手四次挥手分析
流程图 全部11种状态 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 (4)CLOSING (5)TIME_WAIT 服务器独有的:(1)LISTEN (2 ...
- wireshark抓包图解 TCP三次握手/四次挥手详解
http://www.seanyxie.com/wireshark%E6%8A%93%E5%8C%85%E5%9B%BE%E8%A7%A3-tcp%E4%B8%89%E6%AC%A1%E6%8F%A1 ...
- wireshark抓包工具简介以及tcp三次握手的一些含义
wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必须了解网络协议,否则就看不懂wireshark了.为了安全考虑, ...
- python socket+tcp三次握手四次撒手学习+wireshark抓包
Python代码: server: #!/usr/bin/python # -*- coding: UTF-8 -*- # 文件名:server.py import socket # 导入 socke ...
- 网络编程 TCP协议:三次握手,四次回收,反馈机制 socket套接字通信 粘包问题与解决方法
TCP协议:传输协议,基于端口工作 三次握手,四次挥手 TCP协议建立双向通道. 三次握手, 建连接: 1:客户端向服务端发送建立连接的请求 2:服务端返回收到请求的信息给客户端,并且发送往客户端建立 ...
- 用 Wireshark 图解:TCP 三次握手
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “snow warn throughout the winter” 一.什么是 Wireshar ...
随机推荐
- 架构师小跟班:如何高效又安全的清理Linux服务器上的缓存?
操作服务器上的生产环境,一定要慎之又慎,安全第一,优化第二! 一些基本原理 说到清理内存,那么不得不提到/proc这一个虚拟文件系统,这里面的数据和文件都是内存中的实时数据,很多参数的获取都可以从下面 ...
- 关于Git的用法
关于Git Git 是一个分布式版本控制软件,与CVS.Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其 ...
- Qt json使用
JSON 6 种基本数据类型 QJsonValue::Bool QJsonValue::Double QJsonValue::String QJsonValue::Array QJsonValue:: ...
- jmeter+jenkins配置过程
目录 前置条件 脚本规划 讲解非GUI方式运行脚本 在jenkins里面新建项目 在Jmeter的jtl结果文件转换成html页面 邮件.配置 前置条件 1.jmeter安装好并已配置好环境变量,可正 ...
- Linux shell awk中print及变量使用
Linux处理文本工具 grep: 过滤文本内容 sed: 编辑文本内容 awk: 显示文本 awk: Aho Peter Weinberger Kerni ...
- windows开启PostgreSQL数据库远程访问
1.在PostgreSQL安装目录下data文件夹,打开pg_hba.conf文件,新增允许访问的ip 2.打开postgresql.conf,将listen_addresses = 'localho ...
- 记一次wsl上的pip3安装失败问题 The following packages were automatically installed and are no longer required:
转载请注明来源.https://www.cnblogs.com/sogeisetsu/.然后我的CSDNhttps://blog.csdn.net/suyues/article/details/103 ...
- centos7下搭建JDK和Hadoop
涉及基础操作命令 这里只是将涉及到的提了下一下具体的使用还需要读者自己查阅资料 tar 解压命令 su 进入root用户模式 rm -rf 删除 cd /文件名/.../ 进入某个文件夹下 注意要逐层 ...
- 关于python中lambda 函数使用小结
例子: 如果定义普通函数,一般都是这样写: def:ds(x): return 2*x+1 调用即: ds(5) 如果用lambda函数就是这么写,就是一句话: g =lambda x:2*x+1 调 ...
- Linux——查找占用磁盘体积最大的前10个文件
前言 服务器上传文件失败了,才开始没考虑到磁盘原因还以为是自己的scrt的问题,还好df -h看了下,最后发现磁盘满了,真是.... 查找 find / -type f -print0 | xargs ...