Wireshark实验

一、数据链路层

        实作一:熟悉 Ethernet 帧结构

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

目的MAC: b8:f8:83:33:c2:c6

源MAC:10:63:c8:e8:58:79

类型:IPv4

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

        答:wireshark把尾部四个字节的校验字段给过滤了。

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

  1. ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
    1. 发出帧

      目的MAC:8c:89:a5:f6:38:75
      这个MAC地址是IP地址为192.168.0.119这台主机的,即是我旁边这台计算机的。
    2. 返回帧
      源MAC: 8c:89:a5:f6:38:75
      这个MAC地址是IP地址为192.168.0.119这台主机的,即是我旁边这台计算机的。
  2. 然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
    1. 发出帧

      目的MAC:b8:f8:83:33:c2:c6
      这个MAC地址是我这台电脑所在子网的网关的。
    2. 返回帧
      源MAC: b8:f8:83:33:c2:c6
      这个MAC地址是我这台电脑所在子网的网关的。 
  3. 再次 ping www.cqjtu.edu.cn (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?
    1. 发出帧

      目的MAC:b8:f8:83:33:c2:c6
      这个MAC地址是我这台电脑所在子网的网关的。
    2. 返回帧
      源MAC: b8:f8:83:33:c2:c6
      这个MAC地址是我这台电脑所在子网的网关的。

问题:

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

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

请问原因是什么?

       答: 当访问本子网的计算机时是不需要出入子网的,因此网络数据包不会经过网关,因此目的MAC就是该主机的。而当访问非子网的计算机时,网络数据包出入子网都需要经过网关实现与外界的互通,因此此时的目的MAC是网关的。

实作三 掌握 ARP 解析过程

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

        

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

 

请求:

 我们发现请求格式是广播的形式,请求的内容是:Who has 192.168.0.119? Tell 192.168.0.111.该请求的目的MAC地址是:ff:ff:ff:ff:ff:ff。

回应:

 我们发现该回应的目的MAC地址为:10:63:c8:e8:58:79,源MAC地址为:8c:89:a5:f6:38:75。

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

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

 

查看arp请求:

 这次请求内容:Who has 192.168.0.1? Tell 192.168.0.111。

查看回应:

 可以看到是我的网关在回应。

问题:

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

  1. ARP 请求都是使用广播方式发送的
  2. 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
    请问为什么?
            答:当本机访问的是本子网的计算机,数据包无需离开本通信子网, ARP 解析将也是在本子网里进行,所以ARP解析得到是对方主机的MAC物理地址;当本机访问的是非本子网的计算机,也就是说此时有两个不同通信子网的主机之间需要通信,数据包就需要离开本通信子网,这里就涉及到数据包在两个通信子网的传输,传输数据要离开本通信子网,ARP 解析就势必要经过网关,因此,该ARP 解析得到的目的MAC物理地址就是本网关的物理地址。

二、网络层

实作一 :熟悉ip包结构

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

        1. 版本:IPv4

        2. 头部长度:20字节

        3. 总长度:1460

        4.TTL:128

        5.协议类型:TCP 

问题:

        为提高效率,我们应该让 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 包如何进行分段,如:分段标志、偏移量以及每个包的大小等。

当我们用wireshark进行抓包时,发现2000字节大小的数据分成了两个包发送。

IP包1:

IP包2:

         可以看出分成两个IP包发送的时候,IP包1长度为1500,IP包2长度为548,分片偏移量为1480,意思是两个IP包以第1480字节作为分隔的节点 。

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

        答:丢弃并通知发送方。

实作三:考察 TTL 事件

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

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

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

第一跳:

第二跳:

第三跳:

第四跳:

第7跳:

第11跳:

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

        答:2^6=64-50=14跳

三、传输层

实作一:熟悉 TCP 和 UDP 段结构

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

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

        答:标识进程的作用。在网络通信中,必须将IP地址和端口地址结合起来才能实现应用进程之间的通信。

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

  1. 打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
  2. 请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。

    Ack为0,Syn为1,为请求建立tcp连接

    Ack为1,Syn为1,为收到请求,同意建立tcp连接。

    Ack为1,Syn为0,为收到对方同意请求,建立tcp连接。
  3. 请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
    Fin为1,请求断开连接。
    Ack为1,确认断开请求。 

    Ack为1,Fin为1 收到确认消息,请求断开。

     Ack为1,确认断开。

问题一

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

 答:这属于短连接,这为了实现多个用户进行访问,对业务频率不高的场合,不让其长期占用通道。

问题二

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

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

四、应用层

应用层的协议非常的多,我们只对 DNS 和 HTTP 进行相关的分析。

实作一 了解 DNS 解析

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

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

  3. 可了解一下 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 解析请求不止一个,思考一下是什么原因?

        答:因为同一个域名下有多个主机IP用来减少服务器的负荷。我们访问的网址只有一个域名,但是并不只有一台服务器主机,因此每一台服务器的IP地址不同,但他们的域名都是相同的。因此发出的解析请求是分散给不同服务器。 

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

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

    请求使用的是POST命令。
    Host:请求主机IP信息。
    Accept:支持的数据类型。
    User-Agent:用户代理,向服务器表明当前来访的客户端信息。
    Connection:Keep-Alive,保持连接。
    Content-Type:数据类型。
    Content-Length:数据长度。
  3. 请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。

    HTTP状态消息:

    状态码【200】表示【请求成功】,一般在GET和POST请求中可以见到;

    状态码【302】表示【资源临时移动】;

    状态码【304】表示【所请求的资源并未修改】;

    状态码【403】表示【服务器拒绝执行客户端的请求】;

    状态码【404】表示【服务器找不到客户端所请求的资源(网页)】;

    状态码【500】表示【服务器内部错误】。
    Server:服务器信息。
    Connection:Keep-Alive,保持连接。
    Content-Type:数据类型。
    Content-Length:数据长度。

问题

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

        答:第一次成功访问时已经返回200,浏览器就会记录资源文件,同时缓存。浏览器第二次发送请求的时候,服务器发现网站的资源文件和缓存仍然存在,于是就回答了304,表示请求的对象没有修改直接使用缓存里的资源就行,这样就避免了重复数据传送,提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值