千兆丢包的分类与特征

遇到千兆丢包,最怕的就是拿着日志一头雾水。我刚开始做网络运维那会儿,碰到丢包就只知道重启设备,结果问题反复出现。后来才明白——丢包不是一件事,是几件事堆在一起。物理层、链路层、传输层,每一层的症状和排查手段都不一样。

我个人习惯先把丢包按照影响层次拆开,再逐层看计数器。这样做效率高,也容易定位到底是谁的问题。

核心观点:丢包分为物理层、链路层、传输层三类。前两类通常在交换机/网卡上就有明确硬件计数器,第三类需要靠抓包和协议分析。不要一上来就怀疑网线,八成是别的层在搞鬼。

1. 物理层丢包 — 传都没传过去

物理层丢包是最底层的,说白了就是信号没有完整到达对端。你可以想象成打电话时声音断断续续,对方听不清。主要现象包括:

  • CRC(循环冗余校验)错误——以太网帧尾部校验失败,说明传输过程中比特翻转了。
  • FCS(帧校验序列)错误——与CRC类似,但有些厂商分别统计。
  • 链路抖动——端口频繁up/down,或者清除光模块信息。
  • 信号衰减——过长网线、劣质水晶头、光模块功率过低。

判断依据很简单:登录交换机,敲命令看端口误码。

# Cisco
show interface gigabitEthernet 1/0/1 | include CRC|runts|errors

# Juniper
show interfaces diagnostics optics ge-0/0/0

我曾经历过一个案例:机房刚上架一批新服务器,千兆链路三天两头丢包。查了CRC错误持续增长,最后发现是跳线扭结太严重,换了一根超五类线就解决了。有时候你想想看,物理层的问题往往最简单,也最容易忽略。

2. 链路层丢包 — 到了但没拿到

链路层丢包发生在数据链路层。帧已经传到对端网卡,但因为冲突、队列满、或MAC地址问题而被丢弃。典型表现:

  • FCS错误增多(有些交换机归入链路层)
  • 过载丢包(Tx/Rx drop)——端口带宽打满了,缓冲溢出
  • MAC冲突——同一VLAN里两个设备用了相同MAC(比较少,但遇到过)
  • 流量控制问题——pause帧协商失败导致短时丢帧

判断时重点看接口的“input errors”和“output errors”,以及队列丢弃计数器。我习惯先看端口利用率:

# 查看端口统计
show interfaces counters errors gigabitEthernet 0/1
show interfaces queue gigabitEthernet 0/1

小技巧:我在排查链路层丢包时,会先看端口有没有造成环路。STP(生成树协议)收敛过程中,端口会临时丢弃所有帧,这种情况下的丢包往往是瞬时的。我曾经遇到过一台交换机因为根桥选举失败,导致几分钟内所有帧都被丢弃——整个机房断网,后来查到是BPDU报文被错误过滤了。

3. 传输层丢包 — 收到了却不认

传输层丢包发生在TCP/UDP层面。帧到了对端,但TCP校验和错误、窗口满、或长时间未收到ACK导致重传。这是用户最敏感的丢包,因为直接表现为应用卡顿或连接断开。

特征:

  • TCP重传(Retransmisión)——Wireshark里看到大量“[TCP Retransmission]”
  • 零窗口(ZeroWindow)——接收端来不及处理,TCP窗口降为0
  • 丢ACK——中间设备丢弃了ACK包,导致发送端超时重传
  • 乱序(Out-of-Order)——不是一个严格的丢包,但也会触发重传

判断依据:在两端跑tcpdump,然后分析抓包文件。

# 监听80端口,保存为pcap
tcpdump -i eth0 -w trace.pcap tcp port 80

# 查看重传率
tcpdump -r trace.pcap | grep -o 'Retransmission' | wc -l

我记得有一次业务方反馈“文件上传很慢”,我抓了5分钟包,发现TCP重传率高达15%。再往下查,发现中间路由器配置了错误的MTU,导致大包被分片后重组失败。嗯,这种问题最有意思——物理层和链路层都显示正常,只有传输层在拼命重传。

4. 三层丢包的区分方法

实际排查中,不要一条一条翻日志。我自己的排查流水线是这样的:

  1. 先看物理层——检查光功率、电口协商速率、CRC错误。如果CRC多,肯定是物理层问题。
  2. 再看链路层——查端口丢弃计数、MAC表异常、STP状态。如果丢弃计数增长但CRC很少,链路层嫌疑大。
  3. 最后看传输层——tcpdump分析重传和ACK行为。如果物理层和链路层都干净,那就大概率在应用或中间设备上。
层次 典型丢包原因 排查工具 关键指标
物理层 信号衰减、光模块故障、线序错误、电磁干扰 交换机端口统计、光功率计、网线测试仪 CRC错误、FCS错误、链路抖动
链路层 端口过载、MAC冲突、队列溢出、STP收敛 交换机接口计数器、SNMP、netstat -i Rx/Tx drop、FCS错误、冲突计数
传输层 TCP重传、零窗口、丢ACK、MTU分片 Wireshark、tcpdump、ss -t 重传率、RTT波动、窗口大小

注意:有些设备将FCS错误归到物理层,有些归到链路层。跨厂商排查时,先搞清楚计数器定义。我曾因为这个细节跟厂商扯皮了半天,最后发现是硬件手册写错了。

5. 一张图看懂三层丢包关系

我把三层丢包之间的关系画成了流程图,你排查时可以参照这个逻辑走。

千兆丢包三层排查流程图 丢包现象发生 物理层 CRC错误、信号衰减、光衰 检查端口计数、光功率 正常 链路层 FCS、丢帧、MAC冲突 查队列/STP/流量控制 正常 传输层 TCP重传、零窗口 抓包分析、ss -t 找出最底层的丢包原因 定位到层之后,再针对性修复 提示:先看物理层再往上走 物理层问题会引起链路层计数虚高 链路层问题也可能触发TCP重传

这张图把排查流程串起来了。从丢包事件开始,一层一层往下剥。如果物理层有问题,上层计数器也会异常,但根因还是物理层。我个人习惯先解决物理层问题,再去管链路层和传输层,否则容易做无用功。

实战提醒:有时候抓包看到TCP重传,别急着调TCP参数。先用交换机的端口统计确认物理层和链路层有没有误码。我见过太多次“调了TCP参数但问题依旧”的例子——结果最后发现是网线接触不良。

6. 总结必知要点

  • 物理层丢包——查CRC、FCS、光功率、链路抖动。工具:交换机命令、光功率计。
  • 链路层丢包——查端口丢弃、MAC冲突、队列溢出、STP事件。工具:show interfaces counters、SNMP。
  • 传输层丢包——查TCP重传、零窗口、丢ACK。工具:tcpdump、Wireshark。
  • 排查顺序:物理 → 链路 → 传输。不要跳层,不要凭感觉。

嗯,这一章的内容大概就是这些。记住一点:丢包本身不是问题,问题是丢在哪一层。搞清楚层,后面修复就水到渠成了。