资讯动态

链路层不只是 MAC:以太网帧、ARP 与 802.1Q VLAN 的逐跳拆解

发布时间:2026/10/20 6:25:01 来源:尧图企业网站定制
链路层的很多故障表现出来却是「IP 配得没问题却 ping 不通」同网段主机互相 ping 不通、抓包看到的目的地址是一串 ff 广播、换了个交换机端口又突然恢复。真正的问题往往不在 IP而在帧里的 MAC 与 VLAN 标签。只背熟 IP、子网掩码和端口是不够的。地址解析靠 ARP 缓存、帧转发靠交换机学习、广播隔离靠 VLAN 标签这些都发生在看不见的二层不理解就只能靠重启和换线碰运气。本文分享一套能把二层问题一次讲透并落地的做法MAC 位级拆解 802.1Q 帧剖析 端口模式与网关配置可直接照着抓包和配交换机。一、链路层定位帧转发与子网边界先明确链路层在整个协议栈里的职责边界向上交付封装网络层给出 IP 报文链路层负责把它包装成一条链路上能跑的帧处理成帧、寻址与差错检测。只管逐跳投递MAC 寻址的有效范围被限制在同一个广播域内跨网段必须交给路由器或三层交换机。一句话记住IP 负责端到端选路MAC 负责逐跳交付两者在网关处交接。核心结论链路层解决的是「这一帧该从哪个口发出去」而不是「这个包最终到哪台机器」。二、MAC 地址拆解48 位里的厂商与类型一个 48 位的 MAC 地址里到底藏了哪些信息字段位数含义OUI24厂商向 IEEE 申请的组织标识NIC 序号24厂商自行分配的网卡编号I/G 位1第一字节最低位为 1 表示组播或广播U/L 位1第一字节次低位为 1 表示本地管理地址本地管理位的用法虚拟化与容器场景经常改写 MAC把 U/L 位置 1 就声明这是人工指定的地址可避免与真实网卡冲突。现场辨识ip link输出里的link/ether字段就是 MAC广播地址恒为ff:ff:ff:ff:ff:ff。核心结论前半段认厂商、后半段认网卡两个控制位决定它是单播还是组播、真实还是虚拟。三、以太网帧结构从目的地址到 FCS一帧数据在线缆上究竟是怎么排布的固定头部 14 字节目的 MAC(6) 源 MAC(6) 类型(2)类型0x0800是 IPv4、0x0806是 ARP、0x86DD是 IPv6。载荷与校验载荷 46~1500 字节不足补 padding超出则交给上层处理末尾 4 字节 FCS 用 CRC32 校验校验失败的帧直接丢弃。下面这段 Python 把一段十六进制帧字节拆开看清头部各字段的位置适用于任何抓包导出的原始帧importstruct framebytes.fromhex(aabbccddeeff11223344556608004500001c)dst,srcframe[0:6],frame[6:12]ethertypestruct.unpack(H,frame[12:14])[0]print(dst ,:.join(f{b:02x}forbindst))print(src ,:.join(f{b:02x}forbinsrc))print(fethertype 0x{ethertype:04x})print(payload ,frame[14:])类型字段一变上层协议就换抓包时先看它再看内容。四、ARP 解析IP 到 MAC 的地址映射拿到 IP 之后主机怎么知道帧该发给谁两步闭环先查本地 ARP 缓存未命中就广播一条 ARP 请求目的 MAC 全 F持有该 IP 的主机单播回一条 ARP Reply。缓存会老化条目通常 20~30 秒过期过期后重新广播可用arp -n随时查看。抓取一问一答最直接的办法就是下面这段命令适用于 Linux 主机定位「同网段 ping 不通」# 抓取本机网卡上的 ARP 请求与响应sudotcpdump-nieth0arp-c6# 查看本地 ARP 缓存arp-n|head-5ARP 是二三层之间唯一的翻译器没有它 IP 报文根本落不到线上。五、交换机学习MAC 表的构建与泛洪交换机凭什么知道该从哪个口发帧源地址学习帧每进入一个端口就把它的源 MAC 与端口号写入 MAC 表并刷新老化时间默认 300 秒。目的地址转发查表命中就精准转发到对应端口查不到就向除入端口外的所有端口泛洪。源 MAC 学习 → 查目的 MAC → 命中单播 → 未命中泛洪 → 表项超时老化核心结论交换机没有魔法全靠「看源地址记账、按目的地址查账」这一条规则。六、广播域痛点为何单靠交换机不够一台交换机撑起整个网络会出什么问题问题广播帧被复制到每一个端口ARP 请求、DHCP Discover 与未知单播叠加起来带宽和设备 CPU 被白白消耗一处环路就能拖垮整网。治理用VLAN把一台交换机在逻辑上拆成多台广播只在本 VLAN 内传播物理布线一根不动。核心结论冲突域已经由交换机按端口隔离剩下的广播域只能靠 VLAN 切开。七、802.1Q给帧打上 VLAN 标签交换机怎么在帧里知道自己属于哪个 VLAN插入 4 字节标签在源 MAC 与类型字段之间插入 TPID(0x8100) PCP(3 bit) DEI(1 bit) VID(12 bit)帧长上限因此从 1500 变为 1504。12 位 VID 的边界可用 VLAN 为 1~40940 与 4095 保留0 通常表示这是一帧无标签数据。这段 Python 用 Scapy 构造并解析一个带 802.1Q 标签的帧适合在本机验证标签字段fromscapy.layers.l2importDot1Q,Ether pktEther(dstff:ff:ff:ff:ff:ff)/Dot1Q(vlan10)/payloadpktEther(bytes(pkt))# 模拟抓包后重新解析print(ethertype ,hex(pkt.type))print(vlan id ,pkt[Dot1Q].vlan)TPID 0x8100 是识别 VLAN 帧的唯一指纹抓包时先认它再读 VID。八、端口模式Access、Trunk 与 PVID三种端口模式到底差在哪一张表看清楚模式收到无标签帧发出帧的处理典型用途Access打上端口 PVID去掉标签发送直连 PC、服务器、打印机Trunk按本征 PVID 处理保留标签发送交换机互联、接虚拟化宿主机Hybrid打上 PVID按允许列表决定去留厂商扩展灵活混用PVID 负责进门换牌无标签帧进入 Access 或 Trunk 口时被打上的 VLAN 编号。允许列表负责出门验牌Trunk 口维护allowed vlan清单不在清单里的 VLAN 帧直接不放行。核心结论收方向只看 PVID发方向看端口类型加允许列表两端配不齐就是「能学到 MAC 却不通」。九、VLAN 间通信三层交换与子网落地分了 VLAN 之后10 和 20 怎么还能互相访问VLAN 即子网每个 VLAN 配一个网关地址交换机上叫 vlanif / SVI网关在本设备终结二层、转到三层查路由。三层交换优于外接路由器硬件一次路由、之后按流交换VLAN 间流量不用绕出设备。在 Linux 上验证同样的网关行为可以给网卡挂一个 VLAN 子接口充当 vlanif适用于容器网络与虚拟交换机实验# 创建 VLAN 10 子接口并配置网关地址sudoiplinkaddlinketh0 name eth0.10typevlanid10sudoipaddradd192.168.10.1/24 dev eth0.10sudoiplinkseteth0.10 upip-dlinkshow eth0.10先划 VLAN、再配子网、最后挂网关三步做完跨 VLAN 才通。十、抓包排错常见二层故障定位清单二层出问题时按什么顺序查最省时间现象抓包/命令特征定位与处理同网段 ping 不通有 ARP 请求却无应答查对端 IP 冲突、VLAN 是否一致通一下断一下出现错误 FCS 或错 VID 帧查链路质量、Trunk 允许列表网络整体变慢ARP 与未知单播大量泛洪查环路确认 STP 已启用跨 VLAN 不通网关上查不到 ARP 表项查 vlanif 是否 UP、有无路由三板斧顺序ip -d link show看本机 VLANarp -n看解析结果tcpdump -nei eth0看真实帧头。排查铁律先二层后三层帧都过不去时看路由表毫无意义。核心结论二层故障的证据永远写在帧头的 MAC、VID 与 FCS 上抓包比猜配置更快。结语把 MAC 地址的位级结构、以太网帧与 802.1Q 标签、交换机的学习与泛洪、端口模式与三层网关串起来就能建立起一条完整的二层认知链从「这一帧从哪来」到「这一帧往哪去」再到「跨网段时在哪一层交接」每一跳都有可抓、可看、可验证的证据。落到日常运维上这套东西可以直接复用新建业务先划 VLAN 和子网接入前确认端口模式与 PVID故障时按抓包三板斧从帧头往下查。别再让二层的问题伪装成三层的故障。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑