实验要求

  1. wireshark的深入学习与掌握,如过滤器的使用,归纳方法
  2. 通过实验阐述ARP的工作原理
  3. 利用实验结果分析 ICMP 协议的报文结构字段定义
  4. 基于实验数据深入分析 TCP 协议的连接过程原理,报文的分片等功能
  5. 从校园网发起向外网中某 Web 服务器的访问,记录并分析从 MAC 层协议、IP 协议、TCP 协议一直到 HTTP 协议的过程

1. Wireshark学习

1.1 什么是Wireshark?

Wireshark 是一个网络数据包分析器。以下是 Wireshark 提供的众多功能中的一部分:

  • 适用于UNIXWindows
  • 从网络接口 捕获实时数据包数据。
  • 显示包含非常详细协议信息的数据包。
  • 保存捕获的数据包数据。
  • 以多种捕获文件格式 导出部分或全部数据包。
  • 根据许多标准 过滤数据包。
  • 根据许多条件 搜索数据包。
  • 根据过滤器对数据包显示 进行着色。
  • 创建各种统计数据
  • …等等

1.2 Wireshark支持的网络类型

Wireshark使用 libpcap/WinPcap 捕获库,其捕获机制不支持在所有平台上捕获所有网络类型。各平台支持的网络类型如下:

InterfaceLinuxmacOSWindows
蓝牙
以太网
USB
无线局域网
PPP链路
  • 蓝牙 - 捕获蓝牙流量 - 目前仅限于在 linux 上附加堆栈。
  • 以太网 - 在不同的以太网拓扑上捕获,包括交换网络。
  • USB - 捕获原始 USB 流量。
  • WLAN - 在 802.11(WLAN、Wi-Fi)接口上捕获,包括“监控模式”、原始 802.11 标头和无线电信息。
  • PPP链接 - 在拨号线路、ISDN 连接和 PPP-over-Ethernet(PPPoe,例如 ADSL)上捕获。

1.3 Wireshark过滤器

1.3.1 实验环境
系统信息
操作系统名称Microsoft Windows 11 家庭中文版
版本10.0.22621 版本 22621
处理器Intel® Core™ i5-10210U CPU @ 1.60GHz,2112 Mhz,4 个内核,8 个逻辑处理器
系统类型基于 x64 的电脑
网卡类型Intel® Wireless-AC 9462
Wireshark版本4.0.5-64bit
1.3.2 界面

image-20230513151954191

Wireshark首页主要分为以下几个界面:

  1. 菜单栏(包括文件、编辑、视图、捕获等功能)
  2. 工具栏(开始/停止捕获、查找分组等)
  3. 过滤栏(用于设置过滤条件进行数据包列表过滤)
  4. 数据列表区(显示捕获到的数据包,每个数据包包含编号,时间戳,源地址,目标地址,协议,长度,以及数据包信息。)
  5. 数据详细区(显示数据包的所有详细信息内容)
  6. 数据字节区(显示数据包原始字节流信息)
  7. 数据统计区(统计捕获到的分组数)
1.3.3 过滤器的使用

Wireshark的过滤器可以分为两种主要类型:捕获过滤器显示过滤器

  1. 捕获过滤器:使用Wireshark的捕获过滤器,用户可以过滤捕获的数据包以匹配用户指定的条件。这些过滤器可以根据协议、源/目标IP地址、端口、协议标志等条件进行设置。捕获过滤器可以手动输入或通过菜单选择,也可以从过滤器面板中选择预定义的过滤器。
  2. 显示过滤器:使用Wireshark的显示过滤器,用户可以将已捕获的数据包按照指定的条件进行过滤,并只显示与这些条件匹配的数据包。这些条件可以基于协议、源/目标IP地址、端口、时间戳等。显示过滤器可以通过在过滤器面板中手动输入或选择预定义的过滤器来创建。显示过滤器可以帮助用户快速查找感兴趣的数据包,也可以节省屏幕空间和处理时间。
1.3.3.1 捕获过滤器

捕获过滤器位于菜单栏的 捕获–> 捕获过滤器。用于捕获数据包前设置捕获条件。

image-20230513154122675

1.3.3.2显示过滤器

显示过滤器位于首页的 工具栏下方 的输入框。

当我们在终端输入 ping www.baidu.com时,在捕获时未设置抓包过滤规则直接通过网卡进行抓取所有数据包,如下

image-20230513154600207

image-20230513155302679

此时数据包内容较多,为了筛选我们想要的信息,则需要在显示过滤器中添加我们想要的过滤条件

如:ip.addr == 39.156.66.14 ,得到如下结果

image-20230513155458878

即可得到我们想要的 Ping 之后的 ICMP 报文。这基本上满足了我们的需求!

1.3.3.3 过滤规则总结

当使用Wireshark时,可以使用过滤规则来筛选和查看感兴趣的数据包。以下是一些常用的Wireshark过滤规则:

  1. 过滤特定IP地址:可以使用以下过滤器来查看特定IP地址的数据包:
 ip.addr == x.x.x.x  //x.x.x.x为特定IP地址
  1. 过滤特定IP地址和端口号:可以使用以下过滤器来查看特定IP地址和端口号的数据包:
 (ip.addr == x.x.x.x) && (tcp.port == n)  //x.x.x.x为特定IP地址,n为端口号
  1. 过滤特定协议:可以使用以下过滤器来查看特定协议的数据包:
 tcp  //只显示TCP协议的数据包
 udp  //只显示UDP协议的数据包
 icmp  //只显示ICMP协议的数据包
  1. 过滤特定的数据包大小:可以使用以下过滤器来查看特定大小的数据包:
 frame.len == n  //只显示大小为n的数据包
 frame.len > n  //只显示大小大于n的数据包
 frame.len < n  //只显示大小小于n的数据包
  1. 过滤特定的数据包类型:可以使用以下过滤器来查看特定类型的数据包:
 dns  //只显示DNS数据包
 http  //只显示HTTP数据包
 ssl  //只显示SSL数据包
  1. 过滤特定的数据包内容:可以使用以下过滤器来查看特定内容的数据包:
 http.request.method == "POST"  //只显示HTTP POST请求
 http.response.code == 200  //只显示HTTP 200响应
 dns.qry.name == "www.example.com"  //只显示请求www.example.com的DNS数据包

这些是常用的Wireshark过滤规则示例。还有很多其他过滤规则,可以根据具体情况进行选择和设置。

官网显示过滤器参考:https://www.wireshark.org/docs/dfref/

2. ARP 原理探究

ARP(Address Resolution Protocol,地址解析协议)是一种用于将IP地址映射到物理MAC地址的协议。ARP是在本地网络中运行的协议,其目的是为了在不同网络层之间建立映射关系,使得数据包能够正确地被传送到其目的地。

2. 1 实验准备

两台主机A、B,且连接同一个局域网。

2.1.1 查看主机IP地址和MAC地址

Windows 下打开命令提示符,输入ipconfig/all

image-20230513165731283

得到当前A主机的MAC地址为 A4-B1-C1-9B-28-** ,校园网下IP地址为:192.168.1.101

B主机的MAC地址为 D8-12-65-6E-D3-** ,校园网下IP地址为 192.168.1.100

主机IP地址MAC地址
A192.168.1.101A4-B1-C1-9B-28-**
B(实验机)192.168.1.100D8-12-65-6E-D3-**

2.2 查看ARP表

在 A 主机下查看当前 ARP 表,输入 arp -a,结果如下:

image-20230513162621231

此时并未有 B 主机的 ARP表项。

2.3 Wireshark捕获

后台打开相应网卡开始捕获,此时 A 主机命令提示符输入ping 192.168.1.100,向B发送 ICMP 报文以及 A主机发送ARP广播。

image-20230513162734153

此时在重新输入 arp -a,发现得到 B 主机的相应MAC地址,实验成功!

image-20230513162856471

2.4 Wireshark分析ARP原理

  1. 首先,假设主机A需要向主机B发送一个数据包,但是不知道主机B的物理地址(MAC地址),只知道主机B的IP地址,主机A将一个ARP请求广播到本地网络中的所有设备,请求包含目标IP地址和发送者MAC地址(通常是广播地址)。

    image-20230513165133299

  2. 交换机S接收到ARP请求,并将其转发到本地网络中的所有设备。由于这是一个广播消息,因此每个设备都会接收到此请求。主机B接收到ARP请求,检查其中的IP地址是否匹配自己的IP地址。如果是,主机B会向主机A发送一个ARP响应,该响应包含其MAC地址。

    image-20230513165143618

  3. ARP响应被广播到本地网络中的所有设备,主机A接收到响应并保存主机B的MAC地址到其ARP缓存中,以备将来使用。

    image-20230513165153279

    image-20230513165200438

通过上述实验,我们可以看出ARP的工作原理是通过广播的方式,在本地网络中进行的。ARP请求和响应都是广播消息,这意味着所有的网络设备都能够接收到并处理它们。ARP缓存记录了IP地址和对应的MAC地址,这可以避免重复的ARP请求并加速数据包的传输。

总结:ARP是一种在本地网络中工作的协议,它允许主机在不知道目标MAC地址的情况下查找目标设备的物理地址,从而实现数据包的正确传输。

3. ICMP 协议的报文结构定义

3.1 获取ICMP报文

由于 Ping 工作在应用层且直接使用网络层的 ICMP 协议,根据这个原理,在命令提示符输入 ping 192.168.1.100 即可在 Wireshark 捕获到 ICMP 报文,在显示过滤器里面输入 icmp 即可得到相应的 ICMP 报文数据。

image-20230513211214962

3.2 ICMP结构分析

3.2.1 IP数据报

查看IP数据报,观察IP数据报的首部字段及其内容,其报文结构如下:

image-20230513211831188

3.2.2 ICMP 数据报

点击Internet Control Message Protocol展开,查看 ICMP报文,如下分别为ICMP询问报文的回送请求报文和回答报文的首部字段。

image-20230513213004979

由此我们可以得到的 ICMP报文结构定义如下:

image-20230513213440346

  • 类型(8 bits):表示ICMP报文的类型,共有14种类型(例如回显请求、回显响应、目标不可达等)。Type的值在1~255之间,不同的类型有不同的Code值。
  • 代码(8 bits):表示ICMP报文的代码,用于更精确地描述ICMP报文的目的。Code的值在0~255之间,不同的Code值对应不同的类型。
  • 校验和(16 bits):是ICMP报文的校验和,用于检测数据是否传输过程中发生了错误。
  • 数据(可变长度):是ICMP报文的数据部分,其长度取决于ICMP报文的类型和代码。

4. TCP 原理探究

4.1 实验准备

  1. 获取 www.baidu.com 的实际IP地址,在命令提示符输入:

     ping www.baidu.com
    

    image-20230514181536098

    得到当前 www.baidu.com 的 IP 地址为:39.156.66.14

  2. 打开 Wireshark 捕获,开始抓取数据包,并在显示过滤器加入过滤条件:

     ip.addr == 39.156.66.14 
    

4.2 TCP 三次握手原理

此时在主机的浏览器搜索栏输入 www.baidu.com 进入百度网站,在 Wireshark 中观察TCP报文的捕获情况,如下:

image-20230514181922252

可以看到浏览器打开百度网站时,本主机与百度服务器进行了 TCP三次握手 ,根据这三次握手,分析 TCP连接管理的原理。

img

4.2.1 第一次握手阶段

由于 TCP协议是负责主机 端到端 的连接,因此本主机操作系统随机选取其中一个 动态端口号(49152~65535) ,本例中选取了 54617 作为源端口号,目的端口号是百度服务器提供的 HTTPS端口 443,由于此报文是 TCP同步报文,因此此时 ACK 位为 0(Not set),SYN 位为 1,随机序列号为 948123796。此时为客户端请求建立链接阶段,客户端进入 同步已发送 状态,等待服务器端确认,如图所示,TCP报文如下:

image-20230514184206965

4.2.2 第二次握手阶段

此时源端口为百度服务器提供的 HTTPS端口 443,目的端口为本主机的 54617,确认号为 948123796+1,即表示已成功收到 第一次握手阶段 的请求建立连接报文!此时第二次握手阶段的TCP报文随机选取一个序列号为 3375721040,同步位和确认位均为 1。百度服务器将该数据包发送给客户端以表示确认连接请求,服务器端进入同步已接收 状态。TCP报文如下所示:

image-20230514184918940

4.2.3 第三次握手阶段

本主机收到第二次握手阶段的TCP报文后,向百度服务器发送一个确认报文,表示收到了确认信息。该报文中的ACK字段值为收到的 3375721040+1,并且序列号为收到的ACK值 948123796+1。客户端和服务器端进入 连接已建立 状态,完成三次握手,此时 TCP 报文如下:

image-20230514185901730

至此本主机和百度服务器成功建立可靠的TCP连接!随后客户端与服务器端之间可以开始传输数据。

4.3 报文的分片

4.3.1 不分片报文传输
  1. 较短 IP 报文

    观察不分片标志对于较短的 IP 报文传输的影响,在 命令提示符中输入 ping -l 1472 -f 192.168.1.102,意思是向 192.168.1.102 主机发送长度为 1472字节的数据包,但是此 IP报文 不进行分片,结果如图所示:image-20230515134923956image-20230515135317906

    可见以太网帧总长度为 IP首部 20 + ICMP首部 8 + 数据长度1472 =1500(小于等于 MTU 的 1500),不分片标志的片位移为 0,由此可知:不分片标志对较小的 IP 报文传输没有影响

  1. 较大 IP 报文

    观察不分片标志对较大 IP 报文传输的影响,在 命令提示符中输入 ping -l 1473 -f 192.168.1.102,结果如图所示:

    image-20230515140248049

    image-20230515135911764

    可见:由于IP报文的长度(IP首部 20 + ICMP首部 8 + 数据长度1473 =1501 )过大(超过了 MTU 的 1500 长度),不分片标志会导致超过 MTU 的长报文无法传输

4.3.2 分片报文传输

打开命令提示符,输入ping -l 3000 -n 1 192.168.1.102,意思为只发送一个大小为3000的数据包。结果如下:

image-20230515141248724

image-20230515141534981

需要封装在 IP数据包里面发送的数据大小为 8(ICMP首部)+3000(数据包)= 3008

第一个分片不能超过 MTU,所以为 20(IP首部)+ 1480(数据分片)= 1500;第二个分片不能超过 MTU,所以也为 20(IP首部)+ 1480(数据分片)= 1500;由于 3008(数据总长度)- 1480 - 1480 = 48,因此第三个分片大小为 20(IP首部) + 48(剩余数据)=68。分析结果与实验数据一致!

5. Web服务器连接过程

要求:从校园网发起向外网中某 Web 服务器的访问,记录并分析从 MAC 层协议、IP 协议、TCP 协议一直到 HTTP 协议的过程。

5.1 访问云 Web服务器

以个人网站 http://47.94.12.50 为例,后台打开 Wireshark嗅探,显示过滤器输入 ip.addr == 47.94.12.50

image-20230515142423242

5.2 收到的数据报文

在Wireshark嗅探到的数据报文如下所示:

image-20230515222714737

首先 主机先与云服务器进行第一次 TCP 连接,完成三次握手,然后应用层使用 HTTP 协议进行传输,最后传输层使用 TCP四次挥手释放第一次 TCP 连接。下面根据自下而上地分析从 MAC 层协议、IP 协议、TCP 协议一直到 HTTP 协议的过程。

5.3 MAC 协议

首次收到的 HTTP 报文为例,其收到的以太网帧数据如下:

image-20230515223837966

由 以太网Ⅱ 帧的格式可知,此以太网帧的目的地址为 ca:9e:6b:d1:d7:,源地址为 a4:b1:c1:9b:28: ,类型为 0x0800。由于在我们抓到的包中,前八个字节的前导码和帧开始符已经被网卡过滤掉了所以我们抓不到。

image-20230515224231338

常见的类型对应值如下:

协议
0x0800IPv4
0x0806ARP
0x86DDIPv6
0x88CCLLDP
0x8035RARP

我们的帧类型为0x0800 是一个 IPv4 的封装帧,后面的冗余校验也和前导码一样,已经被网卡删掉了,所以捕获不到,以太网的头部就已经全部抽离了,我们继续分析下一层协议:IPv4。

5.4 IPv4 协议

由此 IP报文 可知:

image-20230515224700109

  • 版本4(即 IPv4,0x0100 = 4);
  • 首部长度20(即 5 * 4B = 20B);
  • ECNNot-ECT(显式拥塞通知Explicit Congestion Notification,简称ECN00代表不支持 ECN);
  • DF1(不分片);
  • MF0(没有分片);
  • Offset0(没有偏移);

由于以太网有 MTU 的包大小限制,IPv4 选择了通过分片重组的方式来向上层的传输层协议提供传输任意包大小的能力,DF、MF、Offset位就是用来进行分片控制的。

  • TTL:0x40 = 64,代表了这个包的存活时间,还剩 64 s;
  • 上层协议:0x06 = 6,代表 TCP, 常见取值如下:
取值协议
1ICMP
6TCP
17UDP
  • 源 IP 地址:192.168.93.86
  • 目的 IP 地址:47.94.12.50

5.5 TCP协议

IP 数据部分就是 TCP报文,其数据如下:

image-20230515232020133

  • 源端口: c0 8a -> 49290
  • 目的端口:00 50 -> 80

最大端口值为 2^16-1 = 65535,端口号划分成了三段:

端口范围用途
0-1023公认端口。常见的公认端口有:ftp(21)、ssh(22 )、smtp(25)、http(80 )、https(443) 等。
1024-49151用户自用。一般操作系统会随机在其中选择可用端口。
49152-65535保留端口。一般不推荐使用,因为用户端口也很够用了。
  • 序列号2288663079
  • 确认号2099426961

之后紧接着是九个启用中的标志位,下面我们来逐位分析。

  • NS: ECN-nonce,显式拥塞通知(Explicit Congestion Notification),这个是和 IP 层的 ECN 一样,主动表示发生了网络拥塞的信号。
  • CWR: Congestion Window Reduced,这个是配合 ECN 标志位使用的,用来通知发送者拥塞窗口已经调小。
  • ECE:ECN-Echo,这个标志位主要是用 TCP 连接在握手的时候用来协商两端是否都支持显示拥塞控制。
  • URG: Urgent Pointer field significant,代表存在于选项中的紧急指针字段已经启用,需要尽快处理这些数据,不过使用的范围不广。
  • ACK: Acknowledgment field significant,代表 ACK 字段有效。
  • PSH: Push Function,用于将缓冲区内的所有数据全部发送,不再等待,同时对端在收到 PSH 标志时,应立即将数据全部递交给上层应用处理,不用再等待数据合并提交。PSH 标志位和 TCP_NoDelay 选项的区别在于,PSH 是 TCP 报文中的字段,对端也会做出对应的响应,而 TCP_NoDelay 只是内核的一个参数,用于在当前应用中关闭 Nagle 算法。
  • RST: Reset,用于重置当前连接,一般用于拒绝连接,或者出现错误时指示重建连接。
  • SYN: Synchronize sequence numbers,同步序列号,用于建立连接并同步序列号。
  • FIN: Finish, 用于关闭连接,表明没有数据要发送了。

在我们的包中,这九个标志位分别是:000011000,ACK = 1,PSH = 1,代表 ACK 字段是生效的,

  • 窗口大小:259,单位是字节。
  • 校验和:5c 05 ,这个校验和在计算时不仅包括头部,也包括了传输内容。
  • 紧急指针:我们这里 URG 标志位是 0,所以也就不存在紧急指针,这 16 位全是0
  • TCP 的选项字段:TCP 选项是不定长的。

5.6 HTTP 协议

image-20230515233827525

由此 HTTP报文可知主机通过 HTTP/1.1 协议使用 GET 的请求方法向 服务器 资源发起请求。

  • Host :47.94.12.50,代表了请求资源所属的主机。
  • User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36,代表主机使用的 HTTP 协议的客户端类型。
  • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7, 代表客户端这边支持任何类型的资源。

5.7 总结

计算机网络的组成可以自底向上地总结为以下几个层次,每个层次负责不同的功能和任务:

  1. 物理层

    • 物理层是计算机网络的最底层,负责传输原始的比特流。
    • 它定义了电气、光学和机械接口的规范,以及传输介质的特性和传输速率等。
    • 主要任务是将比特流从发送端传输到接收端,没有对数据进行处理或分析。
  2. 数据链路层

    • 数据链路层建立在物理层之上,负责在直接相连的节点之间可靠地传输数据。
    • 它将比特流划分为帧,处理错误检测和纠正,以及帧的传输控制。
    • 主要任务是提供可靠的数据传输,并处理节点之间的通信错误。
  3. 网络层

    • 网络层是在数据链路层之上,处理不同网络之间的数据包转发和路由选择。
    • 它负责将数据包从源主机传输到目标主机,通过路由选择算法确定数据包的最佳路径。
    • 主要任务是实现逻辑上的主机到主机的通信,以及网络互联和互操作性。
  4. 传输层

    • 传输层建立在网络层之上,提供端到端的数据传输和服务质量控制。
    • 它为应用程序提供可靠的数据传输和错误恢复,并进行流量控制和拥塞控制。
    • 主要任务是确保数据在源主机和目标主机之间的可靠传输,以及提供端到端的连接和通信服务。
  5. 应用层

    • 应用层是网络的最高层,提供特定应用程序和用户之间的接口。
    • 它包括各种应用层协议和服务,例如电子邮件、文件传输、Web浏览等。
    • 主要任务是为用户提供各种应用程序和服务,以满足特定的通信需求。

通过这次Wireshark抓包实验帮助了我更深层次地理解每一层的功能和责任,以及它们如何协同工作来实现可靠的数据通信和应用服务!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐