Wireshark实验
本部分按照数据链路层、网络层、传输层以及应用层进行分类,共有 10 个实验。需要使用协议分析软件 Wireshark 进行,请根据简介部分自行下载安装。
1.数据链路层
实作一 熟悉 Ethernet 帧结构
使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。

Ethernet 帧结构:
在以太网帧中,能被直观看到的就是目标MAC地址(6字节)、源MAC地址(6字节)、帧类型(2字节)以及IP数据包(1500字节)
以太网最大帧1519字节,最小帧64字节
其中
目的MAC地址、源MAC地址、帧类型如下图:

问题:你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因
因为校验码是通过CRC校验判断帧是否有效或是否有错,当网卡可以收到数据帧并通过抓包抓到数据帧,该帧就是有效的,此时CRC就已经解析了,所以一般不显示校验字段。
实作二 了解子网内/外通信时的 MAC 地址
-
ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
旁边无计算机,理论分析一下,发出帧的目的MAC地址应该是我ping的主机的MAC地址,源MAC地址是我的计算机的MAC地址。
-
然后ping qige.io(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
-


发出帧源MAC地址:9e:30:5a:0c:06:46
返回帧源MAC地址:5c:80:b6:c4:b3:32
这个地址是本主机所在子网的网关MAC地址
- 再次 ping www.cqjtu.edu.cn (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?

发出帧源MAC地址:9e:30:5a:0c:06:46
返回帧源MAC地址:5c:80:b6:c4:b3:32
这个地址是本主机所在子网的网关MAC地址
问题:通过以上的实验,你会发现:
访问本子网的计算机时,目的 MAC 就是该主机的
访问非本子网的计算机时,目的 MAC 是网关的
请问原因是什么?
原因是访问本子网的计算机是在子网内部进行通信,而访问非本子网的计算机需要跨域通信,需要经过网关。
实作三 掌握 ARP 解析过程
-
为防止干扰,先使用 arp -d * 命令清空 arp 缓存

-
ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
旁边无计算机,理论上分析arp请求格式为Who has xxx? Tell yyy,回复的为本机的MAC地址 -
再次使用 arp -d * 命令清空 arp 缓存

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

回复为本机的MAC地址
问题:通过以上的实验,你应该会发现,
ARP 请求都是使用广播方式发送的
如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
请问为什么?
如果访问的是本子网的 IP ,现在 ARP 缓存找该 IP的mac 地址,若没有,就广播在子网中寻找这个ip ,得到该ip的对应MAC地址;如果访问的是非子网的 IP ,因为发送数据到外网都是通过网关这个端口,所以得到的是网关的 MAC地址
网络层
实作一 熟悉 IP 包结构
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。

版本:IPv4
头部长度:20
总长度:40
TTL:128
问题:为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
便于传输时的识别IP总长度
实作二 IP 包的分段与重组
根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。
缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 202.202.240.16 -l 2000 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等
如何进行分段:
分段标志:Flags
偏移量:Fragment Offset
当icmp发送的数据包大于MTU(以太网中,该值一般为1500字节)时,就会在ip层发生分片。
问题: 分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?
将其直接丢弃
实作三 考察 TTL 事件
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。
请使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。


Tracert 先发送 TTL 为 1 的回应数据包,并随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。
问题:在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?
64-50=14跳
传输层
实作一 熟悉 TCP 和 UDP 段结构
用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。

源端口:
用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
问题:由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
源端口就是本机程序用来发送数据的端口,目的端口就是对方主机用哪个端口接收
实作二 分析 TCP 建立和释放连接
- 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
- 请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。


TCP的三次握手过程:
1.第一次握手:客户端主动向服务器发送SYN包,服务端收到连接请求根据办理按揭队列的状态改变连接状态,若半连接队列未满,服务器就把连接信息放在半连接队列里面,若半连接队列满了,服务器就会将该连接丢弃。
2.第二次握手:服务器返回SYN+ACK包应答到客户端,客户端收到SYN+ACK包应答。
3.第三次握手:客户端发送ACK包给服务器,服务器收到包,TCP握手成功。
3. 请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。


第一次挥手:本机向学校服务器TCP发送连接释放包,并停止发送数据,主动关闭TCP连接。
第二次挥手:学校服务器收到连接释放包后,立即发出确认。
第三次挥手:若服务器已经没有要向本机发送的数据,就通知TCP释放连接。
第四次挥手:本机收到连接释放包后必须发出确认
问题: 去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
提高速度,开辟了多个传输通道,实现了多个用户进行访问
问题:我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
因为将第二次、第三次挥手发出的包合并为了一个
应用层
应用层的协议非常的多,我们只对 DNS 和 HTTP 进行相关的分析。
实作一 了解 DNS 解析
-
先使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。



-
你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
-
可了解一下 DNS 查询和应答的相关字段的含义

实作二 了解 HTTP 的请求和应答
-
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
-
请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。

 请求头(Request):
Accept:text/html application/xml 告诉服务器客户端浏览器这边可以出里什么数据;
Accept-Encodeing:gzip 告诉服务器我能支持什么样的压缩格式
accept-language:告诉服务器浏览器支持的语言
Cache-control:告诉服务器是否缓存
Connection:keep-alive 告诉服务器当前保持活跃(与服务器处于链接状态)
Host:远程服务器的域名
User-agent:客户端的一些信息,浏览器信息 版本
referer:当前页面上一个页面地址。一般用于服务器判断是否为同一个域名下的请求
- 请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。

connection:keep-live; 服务器同意保持连接
Date: 时间
server:ngnix 服务器类型
set-Cookie:服务器向客户端设置cookie 第一次访问服务器会下发cookie当作身份认证信息,第二次访问服务器再把cookie送给服务器,可以当作认证信息
last-modified: 时间戳 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
expires 告诉浏览器把回送的资源缓存多长时间 -1或0则是不缓存
etag:版本专有的加密指纹。(有的网站不用,并非必须)优先检查etag再检查last-modified的时间戳。向服务器请求带if-none-match,服务器判断是否过期未过期返回304,过期返回200
建议:HTTP 请求和应答的头部字段值得大家认真的学习,因为基于 Web 的编程中我们将会大量使用。如:将用户认证的令牌信息放到头部,或者把 cookie 放到头部等。
问题:刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的 200 应答?
304是指客户端已经执行了GET请求,但文件未变化。
本文详细介绍了使用Wireshark进行数据链路层、网络层、传输层及应用层的10个实验,包括Ethernet帧结构、MAC地址解析、ARP过程、IP包结构、TCP与UDP段结构、DNS解析和HTTP请求应答分析,旨在帮助读者深入理解网络通信过程。
1万+

被折叠的 条评论
为什么被折叠?



