2. 协议栈分层模型与故障映射
这一章我们聊聊最底层的问题。很多工程师遇到网络不通,第一反应就是配路由、查防火墙。但我个人的习惯是——先看物理层和数据链路层。说白了,信号都没传过去,上层协议再对也没用。
你想想看,TCP/IP 协议栈里,物理层负责把比特流变成电信号或光信号,数据链路层负责在同一个广播域里找到目标设备。这两层出问题,表现往往很诡异:能 ping 通网关但上不了外网、交换机端口亮灯但丢包、VLAN 之间死活不通……嗯,我当年刚入行时就被这些问题折磨过。
核心原则:排错从底层往上走。物理层不通,别碰链路层;链路层不通,别碰网络层。这是铁律。
2.1 网线/光纤故障排查
物理层故障是最容易定位的,但也是最容易被忽略的。我记得有一次在数据中心割接,新装的服务器死活连不上交换机。查了半小时配置,最后发现是网线水晶头没压好——第 4 根线虚接。
2.1.1 网线故障常见场景
- 线序错误:百兆网络只用 1、2、3、6 四根线。如果这四根中有任何一根不通,链路就起不来。千兆网络需要全部 8 根线。
- 长度超限:双绞线理论极限 100 米。超过这个距离,信号衰减严重,会出现间歇性丢包。
- 电磁干扰:网线贴着强电线走,或者穿过荧光灯管附近,会产生串扰。我曾经在工厂车间遇到过,网线走线槽时和动力电缆绑在一起,结果网络时断时续。
- 水晶头氧化:机房湿度大,水晶头触点氧化会导致接触不良。表现是端口灯偶尔灭一下又亮起来。
2.1.2 光纤故障常见场景
| 故障类型 | 典型表现 | 排查方法 |
|---|---|---|
| 光模块功率过低 | 端口灯亮但链路不稳定,丢包率高 | 用光功率计测收发光功率,对比模块规格 |
| 光纤弯曲半径过小 | 光衰突然增大,链路时通时断 | 检查光纤走线,弯曲处半径应大于 10 倍光纤直径 |
| 光纤端面污染 | 光功率正常但误码率高 | 用光纤显微镜检查端面,用专用清洁笔擦拭 |
| 收发器波长不匹配 | 两端光模块都亮灯,但链路不通 | 确认两端模块波长一致(如 1310nm 对 1310nm) |
我的习惯:手边常备一根短网线和一根短光纤。排查时先用短跳线替换怀疑有问题的线缆,如果问题消失,那就是线缆的问题。这招能省下大量时间。
2.2 交换机端口协商问题
端口协商是数据链路层的第一步。两端设备通过自动协商(Auto-Negotiation)确定速度和双工模式。如果协商失败,链路要么起不来,要么以半双工模式运行——半双工模式下,冲突域变大,丢包率飙升。
2.2.1 常见协商失败场景
- 一端手动设置,一端自动协商:这是最常见的坑。比如服务器网卡强制设为 1000M/全双工,交换机端口设为自动协商。结果交换机检测不到协商信号,只能以半双工模式工作。表现是:能 ping 通,但大文件传输极慢。
- 两端自动协商但硬件不兼容:不同厂商的网卡和交换机之间,偶尔会出现协商失败。我遇到过 Intel 网卡和某国产交换机死活协商不上,最后手动固定速度和双工才解决。
- 网线质量差导致协商降速:本该协商到千兆,但因为线缆质量不行,只能降到百兆。检查端口状态就能发现。
2.2.2 排查命令与步骤
# 查看交换机端口状态(以 Cisco 为例)
Switch# show interfaces GigabitEthernet0/1
GigabitEthernet0/1 is up, line protocol is up
Hardware is Gigabit Ethernet, address is 0011.2233.4455
MTU 1500 bytes, BW 1000000 Kbit/sec, DLY 10 usec
reliability 255/255, txload 1/255, rxload 1/255
Encapsulation ARPA, loopback not set
Keepalive set (10 sec)
Full-duplex, 1000Mb/s, link type is auto
input flow-control is off, output flow-control is unsupported
...
# 查看协商状态
Switch# show interfaces status
Port Name Status Vlan Duplex Speed Type
Gi0/1 connected 1 a-full a-1000 10/100/1000BaseTX
Gi0/2 connected 1 a-half a-100 10/100/1000BaseTX
注意看 a-full 表示自动协商到的全双工,a-half 表示自动协商到的半双工。如果看到 a-half,基本可以断定有问题。
避坑指南:我曾经在割接时手动把交换机端口设为 1000M/全双工,但服务器网卡是自动协商。结果链路起不来,业务中断了 20 分钟。后来我学乖了——除非两端都手动固定,否则一律用自动协商。现代设备自动协商已经很成熟了,别画蛇添足。
2.3 MAC 地址表与 ARP 表异常
MAC 地址表是交换机转发数据帧的依据,ARP 表是设备把 IP 地址映射到 MAC 地址的依据。这两张表出问题,数据帧就送不到正确的地方。
2.3.1 MAC 地址表异常
交换机的 MAC 地址表记录了每个端口下有哪些 MAC 地址。如果表项错误,数据帧会被转发到错误的端口,造成单通或丢包。
| 异常现象 | 可能原因 | 排查方法 |
|---|---|---|
| MAC 地址漂移 | 同一个 MAC 地址在不同端口间反复跳变 | 检查是否有环路,或有人私接交换机 |
| MAC 表满 | 新设备无法学习到 MAC 地址,导致单通 | 查看 MAC 表容量,清理无用表项 |
| 静态 MAC 配置错误 | 手动绑定的 MAC 地址与实际设备不符 | 核对静态 MAC 配置,确认设备实际 MAC |
# 查看 MAC 地址表
Switch# show mac address-table
Mac Address Table
-------------------------------------------
Vlan Mac Address Type Ports
---- ----------- -------- -----
1 0011.2233.4455 DYNAMIC Gi0/1
1 00aa.bbcc.ddee DYNAMIC Gi0/2
10 0055.6677.8899 STATIC Gi0/3
# 查看 MAC 地址漂移
Switch# show mac address-table notification
MAC Move Notification: Enabled
2.3.2 ARP 表异常
ARP 表是设备本地的缓存,记录 IP 和 MAC 的对应关系。ARP 表出问题,设备就找不到下一跳的 MAC 地址,数据帧发不出去。
- ARP 表项过期:设备长时间没有通信,ARP 表项被老化删除。下次通信时需要重新发送 ARP 请求,会有短暂延迟。
- ARP 欺骗:恶意设备发送伪造的 ARP 应答,篡改 ARP 表。表现是流量被劫持到错误设备上。
- ARP 表满:设备上 ARP 表容量有限,如果局域网内设备太多,新设备无法加入 ARP 表。
# 查看 ARP 表(Windows)
C:\> arp -a
Interface: 192.168.1.100 --- 0x5
Internet Address Physical Address Type
192.168.1.1 00-11-22-33-44-55 dynamic
192.168.1.101 aa-bb-cc-dd-ee-ff dynamic
# 查看 ARP 表(Linux)
$ ip neigh show
192.168.1.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE
192.168.1.101 dev eth0 lladdr aa:bb:cc:dd:ee:ff STALE
我的经验:遇到 ARP 问题,先清空 ARP 缓存再试。Windows 用 arp -d,Linux 用 ip neigh flush all。如果清空后问题依旧,那多半是网络中有设备在捣乱。
2.4 VLAN 配置错误导致不通
VLAN 是数据链路层的重要功能,它把广播域分割成多个逻辑子网。VLAN 配置错误,最常见的表现是:同一台交换机上,两个端口明明连了设备,但就是 ping 不通。
2.4.1 常见 VLAN 配置错误
- 端口未加入 VLAN:端口默认在 VLAN 1,如果设备需要接入 VLAN 10,但端口没配,设备就收不到 VLAN 10 的广播帧。
- Trunk 链路未放行 VLAN:两台交换机之间用 Trunk 连接,但 Trunk 上没放行需要的 VLAN。表现是跨交换机的 VLAN 不通。
- Native VLAN 不匹配:Trunk 链路上两端 Native VLAN 不一致,会导致 VLAN 标签处理错误。我曾经遇到过,两端 Native VLAN 一个配了 1,一个配了 99,结果 VLAN 10 的流量被错误地打上了标签,另一端不认。
- VLAN 间路由未配置:不同 VLAN 之间通信需要三层路由。如果没配 VLAN 接口或路由,VLAN 之间自然不通。
2.4.2 排查步骤
- 确认端口所属 VLAN:用
show vlan brief查看端口和 VLAN 的对应关系。 - 确认 Trunk 放行列表:用
show interfaces trunk查看 Trunk 上放行了哪些 VLAN。 - 确认 Native VLAN 一致性:两端 Trunk 端口的 Native VLAN 必须相同。
- 确认 VLAN 接口状态:用
show ip interface brief查看 VLAN 接口是否 up。
# 查看 VLAN 信息
Switch# show vlan brief
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Gi0/1, Gi0/2, Gi0/3
10 Sales active Gi0/4, Gi0/5
20 Engineering active Gi0/6, Gi0/7
# 查看 Trunk 信息
Switch# show interfaces trunk
Port Mode Encapsulation Status Native vlan
Gi0/24 on 802.1q trunking 1
Port Vlans allowed on trunk
Gi0/24 1-100,200-300
避坑指南:我曾经在配置 Trunk 时,忘了在两端都放行 VLAN 10。结果 VLAN 10 的设备能 ping 通同 VLAN 内的其他设备,但就是 ping 不通网关。查了半天才发现是 Trunk 放行列表的问题。所以,配置 Trunk 后一定要两端核对放行列表。
2.5 本章知识体系
下面这张图总结了物理层和数据链路层排错的核心逻辑。从线缆开始,到端口协商,再到 MAC 地址表和 ARP 表,最后是 VLAN 配置。每一步都有对应的排查要点。
嗯,这一章的内容就到这里。物理层和数据链路层的排错,说白了就是「看灯、看表、看配置」。灯亮了不代表链路没问题,表对了不代表转发正确,配置全了不代表没有遗漏。多动手、多验证,慢慢就有感觉了。