Wireshark 实验
一.实验目的
1.熟悉计算机网络各层的含义·
2.了解计算机网络的原理
3.对Wireshark有更熟悉的掌握
二.实验工具
笔记本电脑,Wireshark 软件
三. 实验内容
3.1 数据链路层
实作一 熟悉 Ethernet 帧结构
使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。
Ethernet 帧结构主要包括以下
⑴ 前导码(Preamble):由0、1间隔代码组成,用来通知目标站作好接收准备。以太网帧则使用8个字节的0、1间隔代码作为起始符。IEEE 802.3帧的前导码占用前7个字节,第8个字节是两个连续的代码1,名称为帧首定界符(SOF),表示一帧实际开始。
⑵ 目标地址和源地址(Destination Address & Source Address):表示发送和接收帧的工作站的地址,各占据6个字节。其中,目标地址可以是单址,也可以是多点传送或广播地址。
⑶ 类型(Type)或长度(Length):这两个字节在Ethernet II帧中表示类型(Type),指定接收数据的高层协议类型。而在IEEE 802.3帧中表示长度(Length),说明后面数据段的长度。
⑷ 数据(Data):在经过物理层和逻辑链路层的处理之后,包含在帧中的数据将被传递给在类型段中指定的高层协议。该数据段的长度最小应当不低于46个字节,最大应不超过1500字节。如果数据段长度过小,那么将会在数据段后自动填充(Trailer)字符。相反,如果数据段长度过大,那么将会把数据段分段后传输。在IEEE 802.3帧中该部分还包含802.2的头部信息。
⑸ 帧校验序列(FSC):包含长度为4个字节的循环冗余校验值(CRC),由发送设备计算产生,在接收方被重新计算以确定帧在传送过程中是否被损坏。
我们随机抓取包
找到帧
其中Destination是目的MAC地址,source目的MAC地址是,type是使用的ip协议
✎ 问题
你会发现 Wireshark 展现给我们的帧中没有校验字段,请了解一下原因。
答:因为wireshark把这2个都给过滤了。
在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如果校验和正确,就判断帧的目 的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交“设备驱动程序”做进一步处 理。这时我们的抓包软件才能抓到数据,因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据。
实作二 了解子网内/外通信时的 MAC 地址
1.ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
答:这个mac地址是对方电脑主机的mac;
2.然后 www.baidu.com (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
发出帧
返回帧
3.再次 ping www.cqjtu.edu.cn (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?
发出帧
返回帧
答:访问本子网的计算机时,目的 MAC 就是该主机的
访问非本子网的计算机时,目的 MAC 是网关的
实作三 掌握 ARP 解析过程
1.为防止干扰,先使用 arp -d * 命令清空 arp 缓存
2.ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
然后 ping 一下我旁边的计算机 IP
解析: 假如我没有,我旁边的mac地址,然后我ping了它的ip地址的话,我的缓存里就会有它的mac地址
解析:我们抓个包试一下,当我没有对方的mac地址,我会广播谁有对方的mac地址,然后有他的mac地址的会回应我,对方的mac地址
3.再次使用 arp -d * 命令清空 arp 缓存
然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。
答:
1.ARP 请求都是使用广播方式发送的
2、如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
3.2网络层
实作一 熟悉 IP 包结构
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
版本号(Version)
:长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6)
IP包头长度Header Length
长度4比特。这个字段的作用是为了描述IP包头的长度,因为在IP包头中有变长的可选部分。该部分占4个bit位,单位为32bit(4个字节),即本区域值= IP头部长度(单位为bit)/(8
4),因此,一个IP包头的长度最长为“1111”,即15
4=60个字节。IP包头最小长度为20字节。
IP包总长Total Length
长度16比特。 以字节为单位计算的IP包的长度 (包括头部和数据),所以IP包最大长度65535字节。
标识符Identifier
长度16比特。该字段和Flags和Fragment Offest字段联合使用,对较大的上层数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
标记(Flags)
:长度3比特。该字段第一位不使用。第二位是DF(Don’t Fragment)位,DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的情况下进行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
片偏移(Fragment Offset):长度13比特。表示该IP包在该组分片包中位置,接收端靠此来组装还原IP包。
生存时间(TTL)
:长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。
协议Protocol
长度8比特。标识了上层所使用的协议。
以下是比较常用的协议号:
1 ICMP
2 IGMP
6 TCP
17 UDP
88 IGRP
89 OSPF
头部校验Header Checksum
:长度16位。用来做IP头部的正确性检测,但不包含数据部分。 因为每个路由器要改变TTL的值,所以路由器会为每个通过的数据包重新计算这个值。
✎ 问题
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
答;因为ipv4里包头的长度是可变的,我们的包头里既有可选的部分,也有不可选的部分,所以我们必须要有标明。
实作二 IP 包的分段与重组
根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。
缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 202.202.240.16 -l 2000 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等
当需要进行分片时,在每个数据报片的首部存放着该数据报的标识、标志位和片偏移,在进行重组时,标识用来分辨该数据报片的原数据报是哪个,标志位中的MF用来分辨这是不是原数据报的最后一片,片偏移用来分辨这个数据报片相对原数据报的位置。通过这几个字段,可以稳定的完成数据报的分片与重组操作
实作三 考察 TTL 事件
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了 tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。
请使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
✎ 问题
3.3传输层
实作一 熟悉 TCP 和 UDP 段结构
用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。
用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
TCP报文段(segment)
报文段包括了20~60字节的首部,其中20字节是没有选项的,后面40字节可选。
首先我们要看一下我们的TCP段不可选的结构
具体而言
(1)源地址端口:16位字段,发送该报文段的主机中应用程序的端口号
(2)目的端口地址:
(3)序号:32位字段。指派给本报文段第一个数据字节的编号,TCP传输保证连接性,发送的每个字节都要编上号。序号就是告诉终点,报文段中的第一个字节是序列中的哪个。建立连接时,发收双发使用各自的随机数产生器产生一个初始序号(ISN),通常,两个方向的ISN是不同的。
(4)确认号:32位字段定义了接收方期望从对方接受的字节编号。如果报文段的接收方成功的接受了对方发过来的编号x的字节,那么返回x+1作为确认号,确认号可以和数据捎带一起发送。
(5)HLEN(首部长度):4位,指出TCP首部一共有多少个4字节,所以范围是5~15
保留:
(6)控制:定义了6中不同的控制位或者标志位。如图
(9)紧急指针:只有当紧急标志置位时URG,该16位的字段才有效。紧急指针定义了一个数值,把这个数值加到序号上就得到版文段数据部分中最后一个紧急字节的编号。
用Wireshark 任意抓包
tcp过滤
查看包里的tcp层
✎ 问题
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
答:源端口,端口是确定数据到达用户的哪个进程的一种标识。
2、UDP
UDP的分组称用户数据报:它有8字节的固定首部
(1)总长度:16位字段,定义了用户数据报的总长度为0~65535字节。但实际长度肯定比65535小,因为用户数据报要放在总长度为65535的IP数据报中,封装在IP数据报中。因此UDP长度=IP长度-IP首部长度。
(2)检验和:增加一个伪首部,对于UDP协议来说协议字段的值为17。若在传输过程中这个值发生改变,接收端计算检验和就能检测出来。UDP使用检验和是可选的,如果不计算就将这16位全部填0.
用 Wireshark 任意抓包
实作二 分析 TCP 建立和释放连接
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
找到qige.io的包
追踪qige.io的数据流
找到syn
我们可以看到sy=1,而ack=0,所以这是第一次握手
第二次握手
第三次握手
✎ 问题一
去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io 时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
答:这是因为我们浏览器在访问qige.io的时候,运用多个端口同时与qige.io建立连接,同时加载数据,提高速度。
✎ 问题二
我们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
答:因为我们建立的是长连接,假如我们抓包的时间不够长的话, 那么我们可能我们的连接还没释放,所以我们有可能抓不到。
3.4应用层
应用层的协议非常的多,我们只对 DNS 和 HTTP 进行相关的分析。
实作一 了解 DNS 解析
先使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。
你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
可了解一下 DNS 查询和应答的相关字段的含义
DNS应答字段含义
1.QR:查询/应答标志。0表示这是一个查询报文,1表示这是一个应答报文
2.opcode,定义查询和应答的类型。0表示标准查询,1表示反向查询(由IP地址获得主机域名),2表示请求服务器状态
3.AA,授权应答标志,仅由应答报文使用。1表示域名服务器是授权服务器
4.TC,截断标志,仅当DNS报文使用UDP服务时使用。因为UDP数据报有长度限制,所以过长的DNS报文将被截断。1表示DNS报文超过512字节,并被截断
5.RD,递归查询标志。1表示执行递归查询,即如果目标DNS服务器无法解析某个主机名,则它将向其他DNS服务器继续查询,如此递归,直到获得结果并把该结果返回给客户端。0表示执行迭代查询,即如果目标DNS服务器无法解析某个主机名,则它将自己知道的其他DNS服务器的IP地址返回给客户端,以供客户端参考
6.RA,允许递归标志。仅由应答报文使用,1表示DNS服务器支持递归查询
7.zero,这3位未用,必须设置为0
8.rcode,4位返回码,表示应答的状态。常用值有0(无错误)和3(域名不存在)
清除缓存
✎ 问题
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
答:我的计算机域名解析服务其不止一个,所以会同时向两个域名解析服务器发出请求。
实作二 了解 HTTP 的请求和应答
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。
请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。
状态码:
1xx:接收到请求且正在处理
2xx:请求正常处理完毕:eg:200 OK
3xx:重定向状态,表示浏览器需要进行附加操作
4xx:服务器无法处理这个请求 eg :404 Page Not Found
5xx:服务器处理出错 eg:502 Bad Gateway
请求行分析:
1.method:GET;
URL:是一个相对的URL。是相对下面的Host来说的。两者组合就是一个完整的URL;这里联合http组合之后就是:http://www.people.com.cn/
版本:HTTP/1.1;
CRLF:\r\n
2.首部分析:在首部中,每一个字段名最后面都是会有一个cr和lf的。所以,我就在下面的内容中就不提及这个了。
Host:
也就是是你要访问的主机的名字;
Connection:keep-alive
值代表的意思是保持连接。这样子有利于在你访问的网页中有很多图片等其他资源的时候,可以使用同一个TCP连接接收,而不是针对每一个文件都建立一次TCP/IP的连接。这个也就是课本上面说的“持久连接”。
✍ 建议:
HTTP 请求和应答的头部字段值得大家认真的学习,因为基于 Web 的编程中我们将会大量使用。如:将用户认证的令牌信息放到头部,或者把 cookie 放到头部等。
✎ 问题
刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的 304 代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的 200 应答?
答:浏览器和服务器有一个协商的过程,服务器告诉浏览器当前请求的资源上一次修改的时间是这个时间。浏览器第二次发送请求的时候,告诉浏览器我上次请求的资源现在还在自己的缓存中,如果你那边这个资源还没有修改,就可以不用传送应答体给我了。服务器根据浏览器传来的时间发现和当前请求资源的修改时间一致,就应答304,表示不传应答体了,从缓存里取。
四.总结
通过这次抓包实验,我对计算机网络有了更加深刻地了解,计算机网络里有很多协议,而这些协议里也有很多内容,所以要完全理解可能要花很多时间,通过对这门课的学习我得到很多计算机网络的知识,希望以后也可以继续学习。