Wireshark 实验
一、数据链路层
1.熟悉 Ethernet 帧结构
使用 Wireshark 任意进行抓包,熟悉 Ethernet 帧的结构,如:目的 MAC、源 MAC、类型、字段等。
2.了解子网内/外通信时的 MAC 地址
1.ping
同一子网的计算机,同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
2.然后 ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
3.再次 ping www.cqjtu.edu.cn
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?
经过上面三个步骤,我们发现三个包的目的Mac都是相同,所以这个目的Mac根本不是我们ping命令目标计算机的Mac地址;于是经过ipconfig命令和arp命令后我们会发现,这个几个包相同的目的Mac是网关的目的Mac
3. 掌握 ARP 解析过程
1.为防止干扰,先使用 arp -d *
命令清空 arp 缓存
2.ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
3.再次使用 arp -d *命令清空 arp 缓存
4.然后 ping qige.io
(或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。
ARP请求为Who has xxx.xxx.xxx.xxx? Tell xxx.xxx.xxx.xxx
ARP 请求都是使用广播方式发送的,如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的IP, 那么 ARP 解析将得到网关的 MAC。对出有何解释
答:当本机访问的是本子网的计算机,数据包无需离开本通信子网, ARP
解析将也是在本子网里进行,所以ARP解析得到是对方主机的MAC物理地址;
当本机访问的是非本子网的计算机,也就是说此时有两个不同通信子网的主机之间需要通信,数据包就需要离开本通信子网,这里就涉及到数据包在两个通信子网的传输,传输数据要离开本通信子网,ARP
解析就势必要经过网关,因此,该ARP 解析得到的目的MAC物理地址就是本网关的物理地址。
二、网络层
1.熟悉 IP 包结构
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
使用Wireshark抓包得到IP头如下:
2.IP 包的分段与重组
根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。
缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 202.202.240.16 -l 2000
命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 202.202.240.16
进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等
ping qige.io -l 500
发送500个字节的内容给qige.io
可以看到总长度为528的ip包的偏移为0
再ping qige.io -l 1500
发送2000字节长度的内容
我们可以发现数据被分到了两个包发送
包①
我们可以看到第一个包总长为1500,偏移为0
包②
第二个包总长为48,偏移为1480
- 综上:可以看出分成两个IP包发送的时候,IP包①长度为1500,IP包②长度为48,分片偏移量为1480,意思是两个IP包以第1480字节作为分隔的节点
分片偏移的意义为:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
3.考察 TTL 事件
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了 tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。
请使用 tracert www.baidu.com
命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
从抓包情况能看出,我们依次向目标地址发送了TTL=1、2、3、4的ip包
Tracert 命令确定两台主机的路由主要是通过 IP 生存时间 (TTL) 字段和 ICMP 错误消息。 在工作环境中有多条链路出口时,可以通过该命令查询数据是经过的哪一条链路出口。
由于路径上的每个路由器在转发数据包之前至少将数据包上的 TTL 递减 1,因此 Tracert 先发送 TTL 为 1 的回应数据包,并在随后的每次发送过程将 TTL 递增 1,直到目标响应或 TTL 达到最大值,从而确定路由。通过检查中间路由器发回的“ICMP 已超时”的消息确定路由。
三、传输层
1.熟悉 TCP 和 UDP 段结构
(1)用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。
(2)用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
✎ 问题
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
答:传输层实现的是端到端的通信,也就是说两台设备之间的进程通信,而进程通信需要两边的确认,因此在传输层无论选择哪种协议,都需要源端口号与目的端口号实现端到端的进程通信。
2.分析 TCP 建立和释放连接
(1)打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
(2)请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
(3)请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
-
第一次握手:客户端将SYN标志位置为1,随机产生一个值SEQ = X,并将该数据包发送给服务器,客户机进入SYN_SENT状态,等待服务器确认。
-
第二次握手:服务器收到数据包后由标志位SYN = 1个知道客户端请求建立连接,服务器将SYN和ACK标志位都置为1,ACK = X + 1,随机产生一个值SEQ = Y,并将该数据包发送给客户端以确认连接请求,服务器进入SYN_RCVD状态。
-
第三次握手:客户端收到确认后,检查ACK是否为X + 1,ACK标志位是否为1,如果正确则将标志位ACK置为1,ACK = Y + 1,并将该数据包发送给服务器,服务器检查ACK是否为K + 1,ACK标志位是否为1,如果正确则连接建立成功,客户端和服务器进入ESTABLISHED状态,完成三次握手,随后客户端与服务器之间可以开始传输数据了。
四、应用层
1.了解 DNS 解析
先使用 ipconfig /flushdns
命令清除缓存,再使用 nslookup qige.io
命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。
你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
DNS查询和应答报文的格式
16位标识字段用于标记一对DNS查询和应答,以此区分一个DNS应答是哪个DNS查询的回应
16位标志字段用于协商具体的通信方式和反馈通信状态。DNS报文头部的16位标志字段的细节如图:
- 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(域名不存在)
接下来的4个字段则分别指出DNS报文的最后4个字段的资源记录数目。对查询报文而言,它一般包含1个查询问题,而应答资源记录数,授权资源记录数和额外资源记录数则为0.应答报文的应答资源记录数则至少为1,而授权资源记录数和额外资源记录数可为0或非0
2.了解 HTTP 的请求和应答
打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。
请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。
响应码分五种类型,由它们的第一位数字表示:
- 1xx:信息,请求收到,继续处理
- 2xx:成功,行为被成功地接受、理解和采纳
- 3xx:重定向,为了完成请求,必须进一步执行的动作
- 4xx:客户端错误,请求包含语法错误或者请求无法实现
- 5xx:服务器错误,服务器不能实现一种明显无效的请求
部分请求头字段的具体含义
- Accept:浏览器可接受的MIME类型。 Accept-Charset:浏览器可接受的字符集。
- Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。
- Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。
- Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。
- Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。
- Content-Length:表示请求消息正文的长度。 Cookie:设置cookie,这是最重要的请求头信息之一
- From:请求发送者的email地址,由一些特殊的Web客户程序使用,浏览器不会用到它。 Host:初始URL中的主机和端口。
- If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not - Modified”应答。
- Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝。
- Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
- User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
- UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU