开始/停止捕获
选择WLAN,右键,选择Start capture
即可开始捕捉,or双击是一样的
可以看到工具栏中,有开始捕获、停止捕获、重新开始当前捕获这些基本功能。
了解Wireshark
主要窗口区域
tips:在wireshark的抓包界面,基本分为菜单栏、工具栏、过滤栏、数据列表区、数据详细区、数据字节区和数据统计区等等
开始/停止捕获: 这两个可以通过菜单栏中的捕获一项进行控制,同样也可以通过工具栏中的图标进行控制。
过滤栏则是快速对捕获的包进行过滤
在数据列表区选择某条数据的时候,下方数据详细区则会显示对应包的详细信息,同样数据字节区则会显示该包实际传递到数据字节,数据统计区会对其进行统计分析,在数据列表区右键还可以进行数据流的追踪。
设置数据包的过滤
tips:在过滤栏简单输入需要保留特征,回车即可快速过滤
在其中输入tcp
后,协议只保留了所有TCP的协议。
同时我们还可以通过过滤,之查看与某ip相关的包。
下面列举各种过滤方法:
(1)协议过滤
直接输入协议名tcp/http/icmp(注:需要小写)
(2)IP过滤
ip.src==x.x.x.x 显示原地址为x.x.x.x的数据包列表
ip.dst==x.x.x.x 显示目标地址为x.x.x.x的数据包列表
ip.addr==x.x.x.x 显示原地址或者目标地址为x.x.x.x的数据包列表
(3)端口过滤
tcp.port==x 显示源主机或者目的主机端口为x的数据包列表
tcp.srcport==x 显示TCP协议的源主机端口为x的数据包列表
tcp.dstport==x 显示TCP协议的目的主机端口为x的数据包列表
(4)Http模式过滤
http.request.method==“GET” 显示HTTP GET方法。
(5)按照数据包内容过滤
找到数据包select contains“xxx"
跟踪数据流
假设我们现在希望分析其中一个包,对其进行数据流追踪。
故我们可以选择一个右键->追踪流->TCP流
同时我们可以看到双方整个对话,或者选择单方,然后可以把展示数据改为原始数据,然后另存到本地,通过二进制的存储,然后利用WinHex等工具对原始资源进行还原。
使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。
双击任意一个包,即可弹出详细信息界面,在这里选择数据链路层的Ethernet帧
,下方即可展开该帧结构,包括目的MAC,源MAC、类型,下方还会高亮对应的数据字节。甚至还会根据MAC地址特点分析出设备厂家等。
✎ 问题
你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。
答:因为校验字段不会进行校验,因此Wireshark将它丢弃了
ping 192.168.31.165
子网内通信
无论是发出的目的mac还是返回的源mac都为:7c-2a-db-6a-52-cd
,对应设备的mac实际地址。
ping qige.io
子网外通信
发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是8c-de-f9-31-c5-3d
,这个MAC地址是本机的网关MAC地址
利用arp -a
查看此时的网关mac:8c-de-f9-31-c5-3d
ping www.cqjtu.edu.cn
同样是子网外通信
发现目的的mac以及返回帧的源 MAC 同样是网关地址:8c-de-f9-31-c5-3d
。
✎ 问题
通过以上的实验,你会发现:
- 访问本子网的计算机时,目的 MAC 就是该主机的
- 访问非本子网的计算机时,目的 MAC 是网关的
请问原因是什么?
因为要访问本子网外的计算机时,必定先经过网关,在本子网内就不需要到达网关,直接到该计算机。
为防止干扰,先使用 arp -d *
命令清空 arp 缓存
ping
你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
ping 192.168.31.165
源MAC是本机的MAC地址,目的MAC地址是该IP的MAC地址
再次使用 arp -d *
命令清空 arp 缓存
然后 ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O81o513j-1671602490773)(C:\Users\shuoshuo\Desktop\书\计算机网络\实验\Wireshark\Wireshark实验.assets\arp.png)]
回复为本机的MAC地址
✎ 问题
通过以上的实验,你应该会发现,
- ARP 请求都是使用广播方式发送的
- 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
请问为什么?
如果访问的是本子网的 IP ,如果 ARP 缓存中没有该 IP的mac 地址,那么就广播在子网中寻找这个ip ,然后再得到该ip的mac地址;如果访问的是非子网的 IP ,那么 APR 将会解析得到网关的 mac,因为发送数据到外网都是通过网关这个端口,所以得到的是网关的 mac。
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CCpX4soE-1671602492740)(null)]
✎ 问题
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
答:为了在此基础上更加提高效率,有头部长度字段和总长度字段是为了方便上层将 IP 包中的数据提取出来,当数据长度超过1500B时就会被返回链路层进行分段,这样能帮助传输时的识别IP总长度,提高传输效率。
根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。
缺省的,ping
命令只会向对方发送 32 个字节的数据。我们可以使用 ping 202.202.240.16 -l 2000
命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16
进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等
由图知,一共分成了两个包,其中:
包总长为1500,偏移量为0,分段标志置1
包总长为548,偏移量为1480,分段标志置0
✎ 问题
分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?
答:会将其直接丢弃。
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了
tracert
命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。
请使用 tracert www.baidu.com
命令进行追踪,此时使用 Wireshark 抓包(用 icmp
过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
TTL设置为3
…
Tracert 先发送 TTL 为 1 的回应数据包,并随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。
✎ 问题
在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?
答:比50大且最接近的2的n次方为:64,即
64-50=14跳
用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCvfhBpc-1671602492317)(null)]
用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
✎ 问题
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
端口和目的端口是用来确认某一个应用程序,IP 只能到达子网网关,MAC 地址到达子网下的指定主机,而端口号是达到主机上的某个应用程序。
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream
),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
第一次握手,SYN为1,ACK为0
第二次握手,SYN为1,ACK为1
第三次握手,SYN为0,ACK为1
SYN 同步序列号,用来发起一个TCP连接
第四次挥手,FIN为0, ACK为1
TCP断开连接是通过发送FIN报文,来告诉对方数据已经发送完毕,可以释放连接了。
✎ 问题一
去掉
Follow TCP Stream
,即不跟踪一个 TCP 流,你可能会看到访问qige.io
时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
这属于短连接,这为了实现多个用户进行访问,对业务频率不高的场合,不让其长期占用通道。一个网页由多个部分组成,在头部的link标签中可能也有很多链接来寻找一些css或者js文件等其他文件。并行查找,加快网页展示速度。
✎ 问题二
我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
服务器向客户端发送断开连接和回复同意断开连接合成一次挥手。
先使用 ipconfig /flushdns
命令清除缓存,再使用 nslookup qige.io
命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。
你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
查询
可了解一下 DNS 查询和应答的相关字段的含义
QR:查询/应答标志。0表示这是一个查询报文,1表示这是一个应答报文
opcode,定义查询和应答的类型。0表示标准查询,1表示反向查询(由IP地址获得主机域名),2表示请求服务器状态
AA,授权应答标志,仅由应答报文使用。1表示域名服务器是授权服务器
TC,截断标志,仅当DNS报文使用UDP服务时使用。因为UDP数据报有长度限制,所以过长的DNS报文将被截断。1表示DNS报文超过512字节,并被截断
RD,递归查询标志。1表示执行递归查询,即如果目标DNS服务器无法解析某个主机名,则它将向其他DNS服务器继续查询,如此递归,直到获得结果并把该结果返回给客户端。0表示执行迭代查询,即如果目标DNS服务器无法解析某个主机名,则它将自己知道的其他DNS服务器的IP地址返回给客户端,以供客户端参考
RA,允许递归标志。仅由应答报文使用,1表示DNS服务器支持递归查询
zero,这3位未用,必须设置为0
rcode,4位返回码,表示应答的状态。常用值有0(无错误)和3(域名不存在)
✎ 问题
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
DNS不止一个的原因可能是DNS解析过程是先从浏览器的DNS缓存中检查是否有这个网址的映射关系,如果有,就返回IP,完成域名解析;如果没有,操作系统会先检查自己本地的hosts文件是否有这个网址的映射关系,如果有,就返回IP,完成域名解析;如果还没有,电脑就要向本地DNS服务器发起请求查询域名;本地DNS服务器拿到请求后,先检查一下自己的缓存中有没有这个地址,有的话直接返回;没有的话本地DNS服务器会从配置文件中读取根DNS服务器的地址,然后向其中一台发起请求;直到获得对应的IP为止。
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream
),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
选择qige.io使用的是https,使用http过滤已经无法抓取信息,换了个url进行抓取。
请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST
。并仔细了解请求的头部有哪些字段及其意义。
下面是我抓其他网站的get
:
字段:
User-Agent:在请求中使用,表示客户端的情况。
Host:在请求中使用,用于表示请求URL的主机和端口信息。当端口为当前url使用的协议http/https的默认端口时,浏览器会省略端口部分。
Content-Type:在请求和响应中都可使用,用于表示体部数据的类型。
Cookie:在请求中使用,只能有一个该字段,用于携带cookie的值对。name和value之间使用=连接,键值对之间使用;分隔。
Set-Cookie:在响应中使用,可以有多个该字段,用于cookie设置。
Content-Length:在请求或响应中使用,按字节计数,仅限请求或响应的体部。
Date:在响应中使用,表示当前时间,为GMT格式。
Origin:在请求中使用,用于表示发起该请求的页面。
200, 304, 404
等。并仔细了解应答的头部有哪些字段及其意义。1xx:表示收到请求。
2xx:成功,请求成功被接受。
3xx:重定向。
4xx:客户端错误。
5xx:服务器错误。
✍ 建议:
HTTP 请求和应答的头部字段值得大家认真的学习,因为基于 Web 的编程中我们将会大量使用。如:将用户认证的令牌信息放到头部,或者把 cookie 放到头部等。
✎ 问题
刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的
304
代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答304
应答而不是常见的200
应答?
HTTP 状态代码 304 表示所请求的资源未被修改,可以使用缓存的内容。浏览器会检查请求中的附带的头信息,如果这些头信息与缓存的内容相匹配,服务器就会返回 304 应答。这个状态代码的目的是减少网络流量,让浏览器使用本地缓存的内容而不是重新下载资源。
如果服务器返回了 200 应答,则意味着资源已被修改,浏览器必须重新下载资源。
当浏览器向服务器发送请求时,会附带一些头信息,其中包含了浏览器当前所使用的缓存的信息。服务器会使用这些头信息来判断浏览器当前缓存的内容是否已过期。如果缓存的内容过期了,服务器就会返回 200 应答,同时附带最新的资源内容。如果缓存的内容没有过期,服务器就会返回 304 应答,告诉浏览器使用本地缓存的内容。