用Wireshark抓取并分析MAC帧,是理解数据链路层工作原理最直观的方式。下面我会带你从准备抓包开始,通过几个具体的实验,一步步看懂MAC帧的结构,并理解它在网络通信中的关键作用。
🛠️ 第一步:准备工作与抓包
过程如下:
获取工具 :从官网下载并安装Wireshark,参考:wireshark抓包工具简介及使用总结-CSDN博客它是我们分析网络流量的"显微镜"。
选择网卡:打开Wireshark,选择当前正在使用的网卡(如Wi-Fi或以太网)开始抓包。
生成流量 :打开命令行(CMD或终端),输入
ping www.baidu.com,这会生成可供分析的ICMP请求和响应数据包。停止与筛选 :在Wireshark中停止抓包,并在顶部的过滤栏输入
icmp,让屏幕只显示我们关心的ping包。经过第一步,有如下内容:
这里点击了第一行数据,下面展开的四行是啥?
你贴出的这四行信息,是Wireshark对一个数据包从下到上的精炼总结。每一行都代表了网络模型中的一个关键层级,我来帮你逐一拆解:
1. 第一行:全局概览 (Frame 122)
Frame 122: Packet, 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on interface...
Frame 122:这是Wireshark抓到的第122个数据包。
74 bytes on wire:这个包在网线上实际传输的大小是74字节。这里包含了所有开销,比如尾部用于校验的FCS(帧校验序列)字段。
74 bytes captured :Wireshark实际抓取到的数据大小。通常和
on wire一致,除非你设置了抓包截断。on interface...:这是数据包被捕获的具体网卡代号。
一句话总结:它告诉你,这是捕获到的第122个、大小为74字节的原始数据帧。
注意, 不要以为第一行是物理层信息,事实上,真实的物理层 (如:电压高低、电磁波频率、光信号、比特流、前导码、帧间隙)在Wireshark里基本是看不到的 。你能看到的"Frame"行,其实是网卡驱动把物理层传来的比特流组装成帧之后 ,再交给Wireshark时,Wireshark为了方便你分析而额外添加的一个元数据头部。
2. 第二行:数据链路层 (Ethernet II)
Ethernet II, Src: MicroStarINT_6e:d9:b8 (2c:f0:5d:6e:d9:b8), Dst: TpLinkTechno_35:63:1c (68:77:24:35:63:1c)
协议 :
Ethernet II,这是最常用的以太网帧格式。源MAC地址 (Src) :
MicroStarINT...。这是发送方 的网络硬件地址。MicroStarINT是微星(MSI),表明这个包很可能是从你的微星电脑网卡发出的。目的MAC地址 (Dst) :
TpLinkTechno...。这是接收方 的网络硬件地址。TpLinkTechno是普联(TP-LINK),说明接收方是你家或办公室里的TP-LINK路由器或交换机。一句话总结:它标明了这个数据包在局域网内的"下一站"物理地址------从你的电脑(微星网卡)发给路由器(TP-LINK设备)。
3. 第三行:网络层 (Internet Protocol Version 4)
Internet Protocol Version 4, Src: 192.168.0.108, Dst: 180.101.51.73
协议 :
IPv4,互联网协议第四版。源IP地址 (Src) :
192.168.0.108。这是你电脑在局域网内的逻辑地址(私有IP)。目的IP地址 (Dst) :
180.101.51.73。这是目标服务器的逻辑地址(公网IP)。通过查询可知,这个IP通常属于百度或其他大型服务商。一句话总结 :它告诉网络设备,这个数据包"逻辑上的终点"是IP地址为
180.101.51.73的服务器。4. 第四行:传输层/应用层 (Internet Control Message Protocol)
Internet Control Message Protocol
- 协议 :
ICMP(互联网控制消息协议)。这不是一个承载用户数据的常规协议(如TCP/UDP),而是一个用于网络诊断和控制的协议。一句话总结 :这个包的具体用途是发送一个网络控制消息。你常用的
ping命令,底层就是通过发送和接收ICMP包来工作的。🎯 把四行连起来看:一个完整的故事
把这四行信息串联起来,就能还原这个数据包在网络中传递的完整意图:
第122个数据包,大小74字节。
它由你的电脑(MAC: 微星...,IP: 192.168.0.108) 发出,先交给局域网的路由器(MAC: TP-LINK...)。
路由器会读取它,然后根据目标IP地址(180.101.51.73) 将它转发到互联网。
而它本身携带的是一个 ICMP协议 的网络探测请求 (很可能是
ping命令发出的)。✨ 一个关键细节:MAC和IP地址的不同作用
注意第二行和第三行地址的区别:
MAC地址 (第二行) :从
你的电脑→路由器。这描述的是 "下一跳" 。就像你寄快递,先要交给楼下代收点。IP地址 (第三行) :从
你的电脑→目标服务器。这描述的是 "最终目的地" 。就像快递单上写的收件人最终地址。即使目标服务器远在千里之外,每一段链路的MAC地址都在变化(从电脑到路由器,路由器到下一个路由器...),但IP地址始终指向最终的那个服务器。这正是TCP/IP协议栈分层思想的绝佳体现。
🔬 第二步:解剖一个标准的以太网MAC帧
在抓包列表中选中任意一个ICMP包,然后在下方详情面板展开"Ethernet II"部分,就能看到一个完整的MAC帧头部。
目的MAC地址 (Destination)
6字节。表示这个数据包要发给谁。
在你的
ping实验中,发出帧的目的MAC 是下一站设备的地址。如果ping的是子网外的主机(如百度),这个地址是你路由器的MAC地址。源MAC地址 (Source)
6字节。表示这个数据包从哪里来。
这是发出帧的网络接口卡(NIC)的唯一硬件地址。在你抓到的
ping请求里,它就是你电脑网卡的MAC地址。类型/长度字段 (Type/Length)
2字节。告诉网卡,这个帧的数据部分装的是什么上层协议。
常见的值如
IPv4 (0x0800)表示上层是IP协议;ARP (0x0806)表示是地址解析协议。
💡 第三步:通过实验理解MAC地址的作用
MAC地址是局域网中进行"点对点"寻址的核心。为了更好地理解这一点,可以进行几个对比实验:
场景一:访问同子网的设备
当你
ping同宿舍的另一台电脑(IP在同一网段)时,你会发现,发出的ICMP请求帧中,目的MAC地址直接就是那台目标电脑的MAC地址。这说明在同一个"院子"里,数据可以直接送到邻居家。场景二:访问外网(如百度)
当你
ping www.baidu.com时,你会发现一个有趣的现象:发出的ICMP请求帧中,目的MAC地址 并不是百度的MAC(它根本不在你的局域网里),而是你默认网关的MAC地址(通常就是你的路由器)。这是为什么呢?
简单来说,你的电脑知道,要离开自己的"院子"(局域网)去往外面的世界,必须先把数据交给唯一的"大门"(网关)。所以,无论你要访问哪个外网IP,数据帧都会把网关的MAC地址作为目标,让网关帮忙把数据转发出去。
🤔 第四步:深入探究:FCS校验与ARP协议
为什么Wireshark里看不到帧校验序列(FCS)?
你可能已经注意到,Wireshark的Ethernet帧详情里没有显示帧尾的4字节FCS字段。这是因为FCS的校验工作是由网卡硬件完成的。当网卡检查完数据无误后,会把这个字段去掉,才将数据交给操作系统和Wireshark。所以,Wireshark"看到"的是校验通过的帧,但不显示这个"已用即焚"的字段。
MAC地址是如何自动获取的?------ARP协议
你一定好奇过:电脑是怎么知道"百度"的MAC地址是网关,又是怎么知道网关的MAC地址是
00:74:9c:9f:40:13的呢?这靠的是地址解析协议(ARP)。
当你
ping一个IP时,系统会先检查自己的ARP缓存表。如果找不到对应的MAC地址(比如刚开机或清了缓存),就会在局域网内广播一个ARP请求:"谁拥有IP
192.168.1.1?请告诉MAC地址为AA:AA:AA:AA:AA:AA的设备。"拥有该IP的设备(如网关)会单播回复自己的MAC地址。这样,你的电脑就知道该把数据发给谁了。
是不是所有的网络协议都要经过mac层
这是一个很深刻的问题。简短的回答是:不完全是,但绝大多数你日常接触的网络协议都要经过MAC层。
要理解为什么,需要分清两个概念:MAC层 (介质访问控制层)和更广义的数据链路层。
1. 绝大多数情况:是的,必须经过MAC层
在你最熟悉的场景里(用电脑上网、手机连Wi-Fi、服务器通过网线通信),答案是肯定的。
物理媒介的强制要求 :只要数据需要通过以太网线、Wi-Fi、光纤这些物理介质传输,就必须封装成MAC层能识别的帧格式(如Ethernet II、802.11无线帧)。MAC地址就像快递的"下一站门牌号",没有它,交换机、路由器不知道在局域网内把数据交给谁。
你的抓包就是例子 :你的抓包文件里,IP包外面确实套了一个
Ethernet II的MAC帧头。这就是最典型的例子:IP over Ethernet。2. 例外情况:不经过MAC层
有些网络协议可以不经过传统的MAC层,主要有这几类:
场景 例子 为什么不经过MAC层 回环地址 ping 127.0.0.1数据由操作系统直接在内部虚拟的"回环接口"处理,根本不走任何物理网卡,自然也不需要MAC封装。 点对点链路 老旧拨号上网(PPP协议)、路由器之间的专线(HDLC协议) 这种链路只有两端两个节点,不需要MAC地址来区分多个设备。它们使用PPP、HDLC等协议代替MAC层。 某些广域网技术 传统的帧中继、ATM网络 这些技术使用自己的寻址方式(如帧中继的DLCI号、ATM的VPI/VCI),不使用MAC地址。 虚拟机内部通信 同一台电脑上两个虚拟机之间的虚拟网络 虚拟交换机可以在内部直接转发,绕过物理网卡的MAC层处理。 3. 一个容易混淆的概念:MAC层 vs 数据链路层
关键在于,MAC层是数据链路层的一个子层。
数据链路层通常分为两个子层:
LLC子层(逻辑链路控制):负责差错控制、流量控制,对上层统一接口。
MAC子层(介质访问控制):负责封装成帧、物理寻址(MAC地址)、介质访问竞争(CSMA/CD或CSMA/CA)。
所以更准确的说法是:
所有需要经过共享介质(网线、Wi-Fi)的网络协议,都必须经过数据链路层的MAC子层。
但像PPP这样的协议,它虽然也是数据链路层,却没有MAC子层(它不需要MAC地址)。
4. 为什么你会有"所有协议都要过MAC层"的印象?
因为以太网太成功了。
我们现在上网,90%以上的最后一公里都是以太网(包括Wi-Fi,它的帧格式类似以太网)。TCP/IP协议栈在设计时,就假设下层是"尽力而为"的MAC层网络。所以:
IP协议被设计成可以运行在任何数据链路层之上(包括以太网、Wi-Fi、PPP等)。
但现实中 ,你99%抓到的包,IP外面都套着
Ethernet II。总结
问题 答案 所有网络协议都要经过MAC层吗? 不是。 回环、PPP、某些广域网技术就不需要。 你日常上网(以太网/Wi-Fi)要经过吗? 必须经过。 这是物理传输的前提。 你抓包看到的要经过吗? 你已经看到了 ------IP包外面套着 Ethernet II,这就是MAC层。一句话记住 :MAC层是"局域网以太网世界"的门票,但如果你不出这个门(回环)或走的是专线(PPP),就不需要这张票。

