Wireshark实验

一、Wireshark基本使用

  1. 选择那块网卡进行捕捉,可以看到WLAN有网络波动,并且结合本机网络,确实应该选择这个。
    Wireshark实验_第1张图片

  2. 开始/停止捕获

    选择WLAN,右键,选择Start capture即可开始捕捉,or双击是一样的

    开始捕获后自动跳转到捕捉主界面:
    Wireshark实验_第2张图片

    可以看到工具栏中,有开始捕获、停止捕获、重新开始当前捕获这些基本功能。

    Wireshark实验_第3张图片

  3. 了解Wireshark主要窗口区域

    tips:在wireshark的抓包界面,基本分为菜单栏、工具栏、过滤栏、数据列表区、数据详细区、数据字节区和数据统计区等等

    Wireshark实验_第4张图片

    • 开始/停止捕获: 这两个可以通过菜单栏中的捕获一项进行控制,同样也可以通过工具栏中的图标进行控制。

    • 过滤栏则是快速对捕获的包进行过滤

    • 在数据列表区选择某条数据的时候,下方数据详细区则会显示对应包的详细信息,同样数据字节区则会显示该包实际传递到数据字节,数据统计区会对其进行统计分析,在数据列表区右键还可以进行数据流的追踪。

  4. 设置数据包的过滤

    tips:在过滤栏简单输入需要保留特征,回车即可快速过滤

    Wireshark实验_第5张图片

    在其中输入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"

  5. 跟踪数据流

    假设我们现在希望分析其中一个包,对其进行数据流追踪。

    故我们可以选择一个右键->追踪流->TCP流

    Wireshark实验_第6张图片

Wireshark实验_第7张图片

同时我们可以看到双方整个对话,或者选择单方,然后可以把展示数据改为原始数据,然后另存到本地,通过二进制的存储,然后利用WinHex等工具对原始资源进行还原。

二、数据链路层

实作一 熟悉 Ethernet 帧结构

使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。

Wireshark实验_第8张图片

双击任意一个包,即可弹出详细信息界面,在这里选择数据链路层的Ethernet帧,下方即可展开该帧结构,包括目的MAC,源MAC、类型,下方还会高亮对应的数据字节。甚至还会根据MAC地址特点分析出设备厂家等。

问题

你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。

答:因为校验字段不会进行校验,因此Wireshark将它丢弃了

实作二 了解子网内/外通信时的 MAC 地址

ping 192.168.31.165子网内通信

Wireshark实验_第9张图片
Wireshark实验_第10张图片

无论是发出的目的mac还是返回的源mac都为:7c-2a-db-6a-52-cd,对应设备的mac实际地址。

ping qige.io子网外通信

Wireshark实验_第11张图片

Wireshark实验_第12张图片

发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是8c-de-f9-31-c5-3d,这个MAC地址是本机的网关MAC地址

利用arp -a查看此时的网关mac:8c-de-f9-31-c5-3d

Wireshark实验_第13张图片

ping www.cqjtu.edu.cn 同样是子网外通信

Wireshark实验_第14张图片

Wireshark实验_第15张图片

发现目的的mac以及返回帧的源 MAC 同样是网关地址:8c-de-f9-31-c5-3d

问题

通过以上的实验,你会发现:

  1. 访问本子网的计算机时,目的 MAC 就是该主机的
  2. 访问非本子网的计算机时,目的 MAC 是网关的

请问原因是什么?

因为要访问本子网外的计算机时,必定先经过网关,在本子网内就不需要到达网关,直接到该计算机。

实作三 掌握 ARP 解析过程

  1. 为防止干扰,先使用 arp -d * 命令清空 arp 缓存

    Wireshark实验_第16张图片

  2. ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。

    ping 192.168.31.165

    Wireshark实验_第17张图片

    源MAC是本机的MAC地址,目的MAC地址是该IP的MAC地址

  3. 再次使用 arp -d * 命令清空 arp 缓存

  4. 然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。

Wireshark实验_第18张图片

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O81o513j-1671602490773)(C:\Users\shuoshuo\Desktop\书\计算机网络\实验\Wireshark\Wireshark实验.assets\arp.png)]
Wireshark实验_第19张图片

回复为本机的MAC地址

问题

通过以上的实验,你应该会发现,

  1. ARP 请求都是使用广播方式发送的
  2. 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。

请问为什么?

如果访问的是本子网的 IP ,如果 ARP 缓存中没有该 IP的mac 地址,那么就广播在子网中寻找这个ip ,然后再得到该ip的mac地址;如果访问的是非子网的 IP ,那么 APR 将会解析得到网关的 mac,因为发送数据到外网都是通过网关这个端口,所以得到的是网关的 mac。

三、网络层

实作一 熟悉 IP 包结构

使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CCpX4soE-1671602492740)(null)]

问题

为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?

答:为了在此基础上更加提高效率,有头部长度字段和总长度字段是为了方便上层将 IP 包中的数据提取出来,当数据长度超过1500B时就会被返回链路层进行分段,这样能帮助传输时的识别IP总长度,提高传输效率。

实作二 IP 包的分段与重组

根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。

缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 202.202.240.16 -l 2000 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等

Wireshark实验_第20张图片

由图知,一共分成了两个包,其中:

Wireshark实验_第21张图片

包总长为1500,偏移量为0,分段标志置1

Wireshark实验_第22张图片

包总长为548,偏移量为1480,分段标志置0

问题

分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?

答:会将其直接丢弃。

实作三 考察 TTL 事件

在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。

在验证性实验部分我们使用了 tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。

请使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。

Wireshark实验_第23张图片

  1. 第一跳

    Wireshark实验_第24张图片

    TTL设置为1

  2. 第二跳

    Wireshark实验_第25张图片

    TTL设置为2

  3. 第三跳

Wireshark实验_第26张图片

​ TTL设置为3

​ …

​ Tracert 先发送 TTL 为 1 的回应数据包,并随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。

问题

在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?

答:比50大且最接近的2的n次方为:64,即

​ 64-50=14跳

四、传输层

实作一 熟悉 TCP 和 UDP 段结构

  1. 用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCvfhBpc-1671602492317)(null)]

  2. 用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。

Wireshark实验_第27张图片

问题

由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?

端口和目的端口是用来确认某一个应用程序,IP 只能到达子网网关,MAC 地址到达子网下的指定主机,而端口号是达到主机上的某个应用程序。

实作二 分析 TCP 建立和释放连接

  1. 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。

  2. 请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。

    第一次握手,SYN为1,ACK为0

Wireshark实验_第28张图片

第二次握手,SYN为1,ACK为1

Wireshark实验_第29张图片

第三次握手,SYN为0,ACK为1

Wireshark实验_第30张图片

SYN 同步序列号,用来发起一个TCP连接

  1. 请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。

    第一次挥手,FIN为1,ACK为1

    Wireshark实验_第31张图片

    第二次挥手,FIN为0, ACK为1

    Wireshark实验_第32张图片

    第三次挥手,FIN为1,ACK为1

    Wireshark实验_第33张图片

第四次挥手,FIN为0, ACK为1

在这里插入图片描述

TCP断开连接是通过发送FIN报文,来告诉对方数据已经发送完毕,可以释放连接了。

问题一

去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?

这属于短连接,这为了实现多个用户进行访问,对业务频率不高的场合,不让其长期占用通道。一个网页由多个部分组成,在头部的link标签中可能也有很多链接来寻找一些css或者js文件等其他文件。并行查找,加快网页展示速度。

问题二

我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?

服务器向客户端发送断开连接和回复同意断开连接合成一次挥手。

五、应用层

实作一 了解 DNS 解析

  1. 先使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。

    Wireshark实验_第34张图片

  2. 你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。

    查询

    Wireshark实验_第35张图片

    应答
    Wireshark实验_第36张图片

  3. 可了解一下 DNS 查询和应答的相关字段的含义

Wireshark实验_第37张图片

Wireshark实验_第38张图片

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为止。

实作二 了解 HTTP 的请求和应答

  1. 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。

    选择qige.io使用的是https,使用http过滤已经无法抓取信息,换了个url进行抓取。

  2. 请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。

    下面是我抓其他网站的get

Wireshark实验_第39张图片

字段:
User-Agent:在请求中使用,表示客户端的情况。
Host:在请求中使用,用于表示请求URL的主机和端口信息。当端口为当前url使用的协议http/https的默认端口时,浏览器会省略端口部分。
Content-Type:在请求和响应中都可使用,用于表示体部数据的类型。
Cookie:在请求中使用,只能有一个该字段,用于携带cookie的值对。name和value之间使用=连接,键值对之间使用;分隔。
Set-Cookie:在响应中使用,可以有多个该字段,用于cookie设置。
Content-Length:在请求或响应中使用,按字节计数,仅限请求或响应的体部。
Date:在响应中使用,表示当前时间,为GMT格式。
Origin:在请求中使用,用于表示发起该请求的页面。

  1. 请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。

Wireshark实验_第40张图片

1xx:表示收到请求。
2xx:成功,请求成功被接受。
3xx:重定向。
4xx:客户端错误。
5xx:服务器错误。

✍ 建议:

HTTP 请求和应答的头部字段值得大家认真的学习,因为基于 Web 的编程中我们将会大量使用。如:将用户认证的令牌信息放到头部,或者把 cookie 放到头部等。

问题

刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的 200 应答?

HTTP 状态代码 304 表示所请求的资源未被修改,可以使用缓存的内容。浏览器会检查请求中的附带的头信息,如果这些头信息与缓存的内容相匹配,服务器就会返回 304 应答。这个状态代码的目的是减少网络流量,让浏览器使用本地缓存的内容而不是重新下载资源。

如果服务器返回了 200 应答,则意味着资源已被修改,浏览器必须重新下载资源。

当浏览器向服务器发送请求时,会附带一些头信息,其中包含了浏览器当前所使用的缓存的信息。服务器会使用这些头信息来判断浏览器当前缓存的内容是否已过期。如果缓存的内容过期了,服务器就会返回 200 应答,同时附带最新的资源内容。如果缓存的内容没有过期,服务器就会返回 304 应答,告诉浏览器使用本地缓存的内容。

你可能感兴趣的:(网络,服务器,java)