计算机网络Wireshark抓包实操

一、Wireshark简介

Wireshark常用于网络通信的抓包分析,通过抓取通信过程中的数据包,分析其中所携带的信息,进一步了解网络通信的过程。
熟悉Wireshark的用户界面、基本操作以及特殊操作,如信息的过滤与指定条件的抓包等,可以提高我们的工作效率。具体内容可参考Wireshark抓包图文详解

二、实操内容

本次实操按照计算机网络的分层结构,对数据链路层、网络层、传输层、应用层进行抓包分析,熟悉每一层数据单元的构成,以及主要协议的实现过程。

(一)数据链路层

1、熟悉 Ethernet 帧结构

  • 打开wireshark进行任意抓包,抓到数据中的Ethernet即为我们要查看的数据链路层内容
    在这里插入图片描述
  • 将数据链路层展开,可以看到 Ethernet 帧的内容
    在这里插入图片描述

至于为什么抓包数据里没有前导码校验字段,是因为这两个字段是给物理链路层中的物理接口用来识别的,当接口识别没有错误时,就会将数据包中这两个字段去掉,然后交给网卡驱动程序,而Wireshark抓包是在驱动程序中进行的,所以抓到的数据包中就不包含这两个字段。

2、了解子网内/外通信时的 MAC 地址

  • 同一子网内通信
    打开Wireshark抓包,在命令符窗口中使用ping命令,ping与自己在同一子网的主机
    在这里插入图片描述
    目的主机网络地址信息
    在这里插入图片描述
    本机网络地址信息
    在这里插入图片描述发送帧抓包可通过过滤器查看直指定的icmp内容
    在这里插入图片描述返回帧抓包
    在这里插入图片描述可以发现在与同一子网的主机进行通信时,发送帧的源MAC为本机MAC,目的MAC为目的主机MAC。返回帧的源MAC为目的主机MAC,目的MAC为本机MAC。
  • 不同子网间通信
    打开Wireshark抓包,在命令符窗口中使用ping命令,ping百度
    在这里插入图片描述
    发送帧抓包(ping百度)
    在这里插入图片描述
    返回帧抓包(ping百度)
    在这里插入图片描述
    再ping www.csdn.net
    在这里插入图片描述
    发送帧抓包(pingcsdn
    在这里插入图片描述
    返回帧抓包(pingcsdn
    在这里插入图片描述
    使用arp -a命令查看本机网关的物理地址
    在这里插入图片描述
    观察发送帧的目的MAC和返回帧的源MAC,可发现都与本机的网关MAC相同

通过以上对同一子网内通信和不同子网间通信的抓包分析,可以得出子网内的目的MAC为目的主机MAC,子网间的目的MAC为子网网关MAC。
这是因为,如果在同一子网内,源主机可以直接通过广播ARP请求与目的主机建立通信。而不在同一子网时,目的主机收不到源主机的广播信息,需要经网关路由转发,而网关路由如果发现数据包的目的MAC不是自己,则会将包丢弃,所以源主机发送的数据包的目的MAC要为网关MAC,ARP请求过程在下面抓包详解。

3、ARP 解析过程

  • 先在命令符窗口中使用arp -d * 将本机的arp缓存清空
    在这里插入图片描述

  • ping 和自己同一子网的主机,同时用 Wireshark 抓包(可用 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
    本机网络配置
    在这里插入图片描述
    目的主机(Apple)网络配置
    在这里插入图片描述
    请求帧
    在这里插入图片描述
    返回帧
    在这里插入图片描述
    在这里插入图片描述

可以看到,在本机没有ARP缓存时,主机发送的ARP请求将进行广播的操作,然后收到目的主机包含了自己MAC地址的回复帧。
我这里收到两个回复是因为我的路由器使用的是校园网,连接的校园网路由器,主机发送的ARP广播,校园网网关路由也会收到,但它回复的不是目的主机的MAC而是自己的MAC。

(二)网络层

1、熟悉IP包结构

  • 使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
    在这里插入图片描述
    从上到下的字段为:
    版本(4bit) ip报文中,版本占了4位,用来表示该协议采用的是那一个版本的ip,相同版本的ip才能进行通信。
    首部长度(4bit) 该字段表示整个ip包头的长度,其中数的单位是4字节。即二进制数0000-1111(十进制数0-15),其中一个最小长度为0字节,最大长度为60字节。一般来说此处的值为0101,表示头长度为20字节。
    区分服务(8bit) 该字段用来获得更好的服务,在旧标准中叫做服务类型,但实际上一直未被使用过。1998 年这个字段改名为区分服务。只有在使用区分服(DiffServ)时,这个字段才起作用。在一般的情况下都不使用这个字段。
    总长度(16bit) 该字段指首部和数据之和的长度,单位为字节,因此数据报的最大长度为 65535 字节。总长度必须不超过最大传送单元 MTU。
    **标识(16bit)**标识(identification)占 16 位,它是一个计数器,用来产生数据报的标识。
    标志(3bit) 标志(flag)占 3 位,目前只有前两位有意义。标志字段的最低位是 MF (More Fragment)。MF=1 表示后面“还有分片”。MF=0 表示最后一个分片。标志字段中间的一位是 DF (Don’t Fragment) 。只有当 DF=0 时才允许分片。
    片偏移(13 bit) 该字段指出较长的分组在分片后某片在原分组中的相对位置。片偏移以 8 个字节为偏移单位。
    生存时间(8 bit) 记为 TTL (Time To Live)数据报在网络中可通过的路由器数的最大值。
    协议(8 bit) 该字段指出此数据报携带的数据使用何种协议以便目的主机的 IP 层将数据部分上交给哪个处理过程。
    首部检验和(16 bit) 该字段只检验数据报的首部不检验数据部分。
    源地址/目的地址(32bit)

为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。这是因为,IP包的最大传输长度有限制,标识了总长度,便于传输时选择处理,超过长度则进行分段。且可用于计算数据区的长度。

2、IP 包的分段与重组

  • 根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。
    缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 104.18.40.82 -l 1500 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 104.18.40.82 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述

通过以上操作,我们发现在IP包超过最大长度时会被分段传输,偏移量即为相对于用户数据起点,经过多少个字节进行分段,如上图的1480即为用户数据的第1480字节开始分段,且每个分段的大小为8的整数倍。
相同IP包的分段会拥有相同标识位,便于接收端重组。

3、考察 TTL 事件

  • 在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
    tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。
    使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
    在这里插入图片描述
    第一跳抓包,经网关路由,TTL=1
    在这里插入图片描述
    第二跳抓包,经172.19.2.2路由,TTL=2
    在这里插入图片描述
    第12跳抓包,到达目标子网,TTL=12
    在这里插入图片描述
    在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其 TTL 的值为 50,那么可以推断这个包从源点到你之间至少有50跳。

(三)传输层

1、熟悉TCP 和 UDP 段结构

  • 用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段
    在这里插入图片描述
    在这里插入图片描述
    SYN(synchronous建立联机)
    ACK(acknowledgement 确认)
    PSH(push传送)
    FIN(finish结束)
    RST(reset重置)
    URG(urgent紧急)
    Sequence number(顺序号码)
    Acknowledge number(确认号码)

  • 用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
    在这里插入图片描述
    由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。因为一个设备有许多的应用,每个应用都通过端口号来标识,所以源端口与目的端口是进行通信的应用服务双方建立数据连接的重要标志,只有通过端口号,两个设备上需要通信的应用服务才能建立连接。

2、分析 TCP 建立和释放连接

  • 打开浏览器访问 www.baidu.com,用 Wireshark 抓包(可用 tcp 过滤后再跟踪tcp流),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间使得能够捕获释放连接的包。在捕获的包中找到三次握手建立连接的包分析为何它们是用于释放连接的,有什么特征。
    在这里插入图片描述
    ”第一次握手”客户端发送的TCP报文中将[SYN]设为标志位,段序号Seq=0;
    ”第二次握手”服务器返回的TCP报文中将[SYN,ACK]设为标志位;段序号Seq=0;确认号Ack=1(“第一次握手”所发送段序号Seq+1);
    ”第三次握手”客户端向服务器端发送的TCP报文中将[ACK]设为标志位;段序号Seq=1(“第二次握手”中服务器端确认号Ack的值);确认号Ack=1(“第二次握手”中服务器所发送段序号Seq+1)。

  • 在捕获的包中找到四次挥手释放连接的包,分析为何它们是用于释放连接的,有什么特征。
    在这里插入图片描述
    ”第一次挥手”服务器端发送的请求释放连接报文以[FIN,ACK]作为标志位,其中报文序号Seq=904;确认号Ack=7307;
    ”第二次挥手”客户端发送[ACK]作为标志位;其中报文序号Seq=7307;确认号Ack=905;
    ”第三次挥手”客户端发出确认接收和断开连接报文以[FIN,ACK]作为标志位;其中报文序号Seq=7307;确认号Ack=905;

  • 释放连接抓到只有三次挥手,原因是什么
    是因为有两次挥手合并了,FIN报文用在本端没有数据发送给对方时,关闭从本端到对端的连接。但是并不影响从对方到本端的连接,也就是说本端仍然可以接收对方的数据。即发送通道关闭,接收通道正常。
    如果对方收到本端FIN报文时,对方的接收通道就会关闭。此时,如果对方也没有数据发给本端,那么对方也会发送FIN给本端,用于关闭从对方到本端的连接,这时候就可能出现ACK和FIN合在一起的情况。
    当然,如果对方仍然有数据发送,那么就等数据发完,再发FIN来关闭连接,这时候就是四次挥手了。

(四)应用层

1、了解 DNS 解析

  • 使用 ipconfig /flushdns (注意空格)命令清除缓存,再使用 nslookup www.baidu.com 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。
    在这里插入图片描述
    第一次请求
    在这里插入图片描述
    第一次回复
    在这里插入图片描述
    第二次请求
    在这里插入图片描述
    第二次回复
    在这里插入图片描述
    从抓包的数据中可以看到本机向DNS服务器的53号端口发送了DNS请求,服务器通过53号端口回复,且第一次服务器并没有回复域名解析结果,第二次回复了解析结果,且同一个域名解析出了多个目的IP地址。
    而且,对同一域名的解析,发送了多次请求,这是因为每次域名解析请求都会根据对应的负载均衡算法计算出一个不同的IP地址并返回,这样记录中配置多个服务器就可以构成一个集群,并可以实现负载均衡。

2、了解 HTTP 的请求和应答

  • 打开浏览器访问网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。在捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。
    请求
    在这里插入图片描述回复
    在这里插入图片描述
    请求方法
    GET:获取资源,可理解为读取或下载数据
    HEAD:获取资源的元信息
    POST:向资源提交数据,相当于写入或上传数据
    PUT:类似 POST
    DELETE:删除资源
    CONNECT:建立特殊的连接隧道
    OPTIONS:列出可对资源实行的方法
    TRACE:追踪请求-响应的传输路径
    常用方法说明
    GET方法虽然基本动作比较简单,但搭配URI和其他头字段就能实现对资源更精细操作,例如,在URI后使用“#”,可以在获取页面后直接定位到某个标签所在的位置;使用If-Modified-Since字段就变成了“有条件的请求”,仅当资源被修改时才会执行获取动作;使用Range字段就是“范围请求”,只获取资源的一部分数据
    POST请求,把你的数据放进报文的body里,然后拼好POST请求头,通过TCP协议发给服务器。

版权声明:本文为zmhDD原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。