2. 以太网与MAC层:MAC地址与帧结构、ARP协议原理与调试、VLAN原理与配置、交换机工作原理
好,咱们今天聊聊网络协议栈里最底层、也最实在的东西——以太网和MAC层。说实话,很多嵌入式工程师写应用层代码写得飞起,但一碰到MAC地址、ARP这种“老古董”就头疼。我当年也一样,直到有一次调试一个工业相机,死活连不上交换机,最后发现是MAC地址冲突。嗯,从那以后,我再也不敢小看这层了。
2.1 MAC地址:设备的“身份证”
MAC地址,全称是Media Access Control地址。说白了,就是网卡在出厂时烧录的一个唯一标识。它长这样:00:1A:2B:3C:4D:5E,一共6个字节,48位。
我个人习惯把MAC地址分成两部分看:
- 前3个字节(OUI):厂商代码。比如00:1A:2B是思科的,00:0C:29是VMware的。你抓包时看到这个,基本能猜出设备是谁家的。
- 后3个字节:厂商自己分配的序列号。理论上全球唯一,但现实中...你懂的,总有“山寨”货。
重要提醒:MAC地址是二层地址,只在同一个广播域内有效。出了路由器,它就“隐身”了。你想想看,互联网上几十亿设备,要是靠MAC地址寻址,那路由表得有多大?
2.2 以太网帧结构:数据怎么“打包”的?
以太网帧,就是数据在网线上跑的时候的“包装盒”。我刚开始学的时候,总觉得这东西太底层,跟我写应用层代码没关系。直到有一次调试一个丢包问题,抓包一看,帧校验序列(FCS)全是错的——原来是硬件CRC计算有问题。
标准的以太网帧长这样:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 前导码 | 7 | 同步时钟用,实际抓包看不到 |
| 帧起始定界符 | 1 | 表示帧正式开始 |
| 目标MAC地址 | 6 | 谁收这个包 |
| 源MAC地址 | 6 | 谁发的这个包 |
| 类型/长度 | 2 | 0x0800表示IP包,0x0806表示ARP |
| 数据 | 46-1500 | 实际载荷,最小46字节 |
| 帧校验序列 | 4 | CRC32校验,错了就丢 |
我的小技巧:抓包时如果看到一堆“Bad FCS”的帧,别急着怀疑网卡。先看看是不是网线太长、电磁干扰太强,或者交换机端口协商出了问题。我曾经在一个工厂里排查了三天,最后发现是网线跟大功率电机走同一个线槽,干扰得一塌糊涂。
2.3 ARP协议原理与调试:IP怎么找到MAC?
ARP,Address Resolution Protocol,地址解析协议。它的作用很简单:已知对方的IP地址,问一下“你的MAC地址是多少?”
ARP的工作流程,我习惯用“敲门”来比喻:
- 主机A想跟主机B通信,但只知道B的IP,不知道B的MAC。
- A发一个广播帧:“谁是192.168.1.2?请告诉192.168.1.1(也就是我)你的MAC地址。”
- 所有设备都收到这个广播,但只有B回应:“我是192.168.1.2,我的MAC是00:1A:2B:3C:4D:5E。”
- A把B的IP和MAC记到ARP缓存表里,下次直接发单播,不用再广播了。
ARP缓存表长这样:
| IP地址 | MAC地址 | 类型 | 老化时间 |
|---|---|---|---|
| 192.168.1.2 | 00:1A:2B:3C:4D:5E | 动态 | 120秒 |
| 192.168.1.254 | 00:0C:29:AB:CD:EF | 静态 | 永久 |
避坑指南:我曾经遇到过一个“ARP欺骗”攻击。有人故意发假的ARP应答,告诉网关“192.168.1.100的MAC是XX:XX:XX:XX:XX:XX”,结果所有发往192.168.1.100的数据都跑到了攻击者那里。怎么防?在交换机上配动态ARP检测(DAI),或者干脆在嵌入式设备里写静态ARP条目。
调试ARP时,我最常用的命令是:
# 查看ARP缓存
arp -a
# 手动添加静态ARP条目(嵌入式设备上常用)
arp -s 192.168.1.100 00:1A:2B:3C:4D:5E
# 删除ARP条目
arp -d 192.168.1.100
为什么ARP缓存要老化?你想想看,设备可能会换网卡、换IP,如果不老化,缓存里的信息就过时了。但老化时间太短也不行,频繁广播会浪费带宽。一般默认是120秒,我个人习惯在嵌入式设备上设成300秒,省电。
2.4 VLAN原理与配置:把一台交换机变成多台
VLAN,Virtual Local Area Network,虚拟局域网。说白了,就是把一台物理交换机,逻辑上切成几台独立的交换机。
为什么要这么做?我举个例子:一个公司有研发部和财务部。如果不做VLAN,研发部发的广播包,财务部也能收到。财务部的同事天天看到“谁谁谁又打印了”的广播,烦不烦?而且万一有人搞个ARP欺骗,整个公司都瘫痪。
VLAN的划分方式有几种:
- 基于端口:把交换机的某些端口划到一个VLAN。最简单,最常用。
- 基于MAC地址:根据设备的MAC地址划分VLAN。灵活,但维护麻烦。
- 基于协议:比如IPv4的流量走VLAN 10,IPv6的走VLAN 20。少见。
VLAN的帧结构,就是在标准以太网帧里加了一个4字节的VLAN标签:
| 目标MAC | 源MAC | VLAN标签(4B) | 类型/长度 | 数据 | FCS |
VLAN标签里最重要的两个字段:
- VID(VLAN ID):12位,范围0-4095。0和4095保留,实际可用1-4094。
- 优先级(PCP):3位,0-7,用于QoS。
我的经验:配置VLAN时,最容易犯的错是“忘了配Trunk口”。两个交换机之间要传多个VLAN的数据,必须把互联端口设成Trunk模式,并允许相应的VLAN通过。我曾经在客户现场,两台交换机配了半天,VLAN 10能通,VLAN 20死活不通。最后发现Trunk口只允许了VLAN 10,没加VLAN 20。嗯,这种低级错误,犯过一次就记住了。
2.5 交换机工作原理:它到底是怎么“交换”的?
交换机,说白了就是一个“智能集线器”。集线器是收到什么数据就往所有端口广播,交换机则聪明得多——它知道每个MAC地址在哪个端口上。
交换机的工作流程,我总结成三步:
- 学习:收到一个帧,看源MAC地址,记下来“这个MAC是从端口1来的”。
- 转发:看目标MAC地址,查MAC地址表。如果找到了,就从对应端口转发出去;如果没找到,就广播到所有端口(除了接收端口)。
- 老化:MAC地址表里的条目有老化时间,默认300秒。如果某个MAC长时间不发数据,就把它删掉,腾出空间。
MAC地址表长这样:
| MAC地址 | 端口 | VLAN | 类型 |
|---|---|---|---|
| 00:1A:2B:3C:4D:5E | GigabitEthernet0/1 | 10 | 动态 |
| 00:0C:29:AB:CD:EF | GigabitEthernet0/2 | 20 | 静态 |
关键点:交换机的转发决策只基于MAC地址和VLAN,完全不看IP地址。所以,交换机是二层设备,路由器才是三层设备。你想想看,如果交换机也要解析IP,那它的处理速度得慢成什么样?
调试交换机时,我常用的命令:
# 查看MAC地址表
show mac address-table
# 查看某个端口的VLAN信息
show vlan brief
# 查看Trunk口配置
show interfaces trunk
最后说一个我踩过的坑。有一次,一个客户说网络“时断时续”。我抓包一看,发现同一个MAC地址在短时间内从两个不同的端口出现。这就是传说中的“MAC地址漂移”。原因是什么?有人私接了一个小交换机,形成了环路。怎么解决?开启生成树协议(STP),或者干脆在端口上配MAC地址限制,一个端口只允许一个MAC地址通过。
好了,这一章的内容就到这里。以太网和MAC层虽然基础,但很多高级问题都根子在这里。下一章我们聊聊IP层,看看数据包是怎么在互联网上“流浪”的。