Wireshark是非常流行的网络封包分析软件,可以截取各种网络数据包,并显示数据包详细信息。
Wireshark 抓包示例
1、打开wireshark ,界面如下:
2、我这里勾选WLAN网卡(这里需要根据各自电脑网卡使用情况选择,简单的办法可以看使用的IP对应的网卡)。进去后,就开始在抓包
4、执行需要抓包的操作,如ping www.jd.com。
5、操作完成后相关数据包就抓取到了。为避免其他无用的数据包影响分析,可以通过在过滤栏设置过滤条件进行数据包列表过滤,获取结果如下。说明:ip.addr == 111.13.149.108 and icmp 表示只显示ICPM协议且源主机IP或者目的主机IP为111.13.149.108的数据包。
5、wireshark抓包完成,就这么简单。关于wireshark过滤条件和如何查看数据包中的详细内容在后面介绍。
Wireshakr抓包界面
说明:数据包列表区中不同的协议使用了不同的颜色区分。协议颜色标识定位在菜单栏 试图 -->着色规则 。
WireShark 主要分为这几个界面
-
Display Filter(显示过滤器), 用于设置过滤条件进行数据包列表过滤。菜单路径:分析 --> Display Filters。
-
Packet List Pane(数据包列表), 显示捕获到的数据包,每个数据包包含编号,时间戳,源地址,目标地址,协议,长度,以及数据包信息。 不同协议的数据包使用了不同的颜色区分显示。
-
Packet Details Pane(数据包详细信息), 在数据包列表中选择指定数据包,在数据包详细信息中会显示数据包的所有详细信息内容。数据包详细信息面板是最重要的,用来查看协议中的每一个字段。各行信息分别为
- Frame: 物理层的数据帧概况
- Ethernet II: 数据链路层以太网帧头部信息
- Internet Protocol Version 4: 互联网层IP包头部信息
- Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
- Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
TCP包的具体内容
从下图可以看到wireshark捕获到的TCP包中的每个字段。
Wireshark过滤器设置
工具中自带了两种类型的过滤器,学会使用这两种过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。
1.抓包过滤器
捕获过滤器的菜单栏路径为捕获(Capture) --> 捕获过滤器(Capture Filters)。用于在抓取数据包前设置。
如何使用?可以在抓取数据包前设置如下。
wireshark过滤器表达式的规则
1、抓包过滤器语法和实例
抓包过滤器类型Type(host、net、port)、方向Dir(src、dst)、协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、逻辑运算符(&& 与、|| 或、!非)
- 协议过滤
比较简单,直接在抓包过滤框中直接输入协议名即可。
TCP,只显示TCP协议的数据包列表
HTTP,只查看HTTP协议的数据包列表
ICMP,只显示ICMP协议的数据包列表 - 搜索和匹配运算符
"contains"运算符允许筛选器搜索以字符串(带引号或非引号)表示的字符序列,或以字节数组表示的字节,或以 C 样式字符常量表示的单个字符序列。例如,若要在捕获中搜索给定的 HTTP URL,可以使用以下筛选器:
http contains "https://www.wireshark.org"
“matches"或”~"运算符允许将筛选器应用于指定的 Perl 兼容正则表达式 (PCRE)。"matches"运算符仅针对协议和具有文本字符串表示形式的协议字段实现。默认情况下,匹配项不区分大小写。例如,要搜索给定的 WAP WSP 用户代理,您可以编写:
wsp.user_agent matches "cldc"
这将匹配"cldc",“CLDC”,"cLdC"或任何其他大写和小写字母的组合。
2、显示过滤器语法和实例
-
比较操作符
比较操作符有== 等于、!= 不等于、> 大于、< 小于、>= 大于等于、<=小于等于。
-
协议过滤
比较简单,直接在Filter框中直接输入协议名即可。注意:协议名称需要输入小写。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
- ip过滤
ip.src ==192.168.1.104 显示源地址为192.168.1.104的数据包列表
ip.dst==192.168.1.104, 显示目标地址为192.168.1.104的数据包列表
ip.addr == 192.168.1.104 显示源IP地址或目标IP地址为192.168.1.104的数据包列表
-
端口过滤
tcp.port ==80, 显示源主机或者目的主机端口为80的数据包列表。
tcp.srcport == 80, 只显示TCP协议的源主机端口为80的数据包列表。
tcp.dstport == 80,只显示TCP协议的目的主机端口为80的数据包列表。
-
Http模式过滤
http.request.method==“GET”, 只显示HTTP GET方法的。
-
逻辑运算符为 and/or/not
过滤多个条件组合时,使用and/or。比如获取IP地址为192.168.1.136的ICMP数据包表达式为ip.addr == 192.168.1.136 and icmp
-
按照数据包内容过滤。假设我要以IMCP层中的内容进行过滤,可以单击选中界面中的码流,在下方进行选中数据。如下
右键单击选中后出现如下界面 对应中文是(作为过滤器应用)—>(选中)
选中Select后在过滤器中显示如下
后面条件表达式就需要自己填写。如下我想过滤出data数据包中包含"abcd"内容的数据流。包含的关键词是contains 后面跟上内容。
Wireshark抓包分析TCP三次握手
1.TCP三次握手连接建立过程
Step1:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;
Step2:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了
并且让客户端发送一个确认数据包,这是第二次握手;
Step3:服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。TCP连接建立
开始通讯。
- wireshark抓包获取访问指定服务端数据包
分析TCP握手包
第一次 客户端发送 SYN 报文 到服务器
第二次 ,服务器接收到 客户端的SYN 报文,回复 SYN + ACK 报文
第三次 ,客户端接收到服务端的 SYN+ACK 报文后,回复 ACK报文
注意:
这里有个坑:Wireshark 显示的 Syn Ack的数目是不准确的
理论上,Syn 应该初始值是个随机数的,后面的要根据初始值增加
Wireshark抓包分析TCP四次挥手
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP的连接的拆除需要发送四个包,因此称为四次挥手(four-way handshake)。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。
TCP采用四次挥手关闭连接如图2所示。
抓包截图
其中 183.136.236.13 是服务器的ip
可以看到 这一次挥手是由 服务器 发起的
第一次挥手 FIN +ACK
第二次挥手 ACK
第三次挥手 FIN +ACK
第四次挥手 ACK