3. 诊断数据采集:链路层、网络层、传输层关键指标

异常诊断的起点是数据。没有准确、多维度的指标采集,后续的根因分析和自动重连策略都无从谈起。本章聚焦于 TCP/IP 协议栈中与链路稳定性、网络可达性、传输可靠性最相关的三个层次,明确每一层需要采集哪些关键指标、通过什么手段采集、以及这些指标如何反映异常状态。

采集原则: 链路层关注“通不通”,网络层关注“到不到”,传输层关注“快不快、稳不稳”。三层指标必须联合分析,单一层的正常不能代表整体链路健康。

3.1 链路层关键指标采集

链路层(L2)负责物理介质上的数据帧传输。对于以太网和无线网络,以下指标是诊断物理连接和底层通信故障的核心。

指标名称 采集方式 异常阈值参考 典型异常场景
链路状态 (Link Status) ethtool / ip link / 网卡驱动 状态 != UP 网线松动、交换机端口 down、光模块故障
协商速率与双工模式 ethtool eth0 速率 != 预期值 或 双工 != Full 网线质量差导致降速、协商失败导致半双工
CRC 错误计数 ethtool -S eth0 | grep crc 持续增长 > 0.1% 总帧数 信号干扰、网线过长、电磁干扰
丢包计数 (RX/TX dropped) ip -s link show eth0 dropped > 0 且持续增长 网卡缓冲区溢出、驱动异常、背压机制失效
错误帧计数 (Errors) ip -s link show eth0 errors > 0 物理层信号畸变、网卡硬件故障
采集命令示例(Linux):
# 查看链路状态与协商信息
ethtool eth0

# 查看详细的错误统计(CRC、错帧等)
ethtool -S eth0 | grep -E "crc|error|drop"

# 查看接口级别的丢包与错误计数
ip -s link show eth0
链路层指标采集架构 物理介质 网线 / 光纤 / 无线 网卡驱动 / MAC 帧收发 / 校验 内核统计模块 计数 / 错误聚合 采集工具 ethtool / ip link 链路状态 / CRC / 丢包 采集要点 • 持续监控,非单次采集 • 关注增量变化而非值

3.2 网络层关键指标采集

网络层(L3)以 IP 为核心,负责数据包的路由与转发。网络层指标直接反映端到端的可达性与路径质量。

指标名称 采集方式 异常阈值参考 典型异常场景
ICMP 可达性 (Ping) ping -c 10 <target> 丢包率 > 5% 或 RTT > 200ms 路由黑洞、防火墙丢包、链路拥塞
路由表变化 ip route show / 路由协议监控 路由条目频繁增减 BGP 会话震荡、静态路由误配
TTL 超时 traceroute / mtr 中间节点 TTL 超时 > 2 跳 路由环路、错误的路由策略
IP 分片计数 netstat -s | grep fragment 分片重组失败 > 0 MTU 不匹配、路径 MTU 发现故障
ARP 解析成功率 arp -n / ip neigh show INCOMPLETE 状态 > 10% ARP 欺骗、邻居表溢出、二层隔离
注意: ICMP 可达性测试虽然直观,但部分网络设备会限速或丢弃 ICMP 报文,导致误判。建议同时结合 TCP 端口探测(如 tcping)进行交叉验证。
网络层路径探测与指标采集 源主机 A 路由器 R1 路由器 R2 目标主机 B ping / traceroute / mtr 可达性指标 丢包率 / RTT / 可达状态 路径指标 跳数 / TTL / 路径变化 路由与 ARP 指标 路由表变化 / ARP 状态

3.3 传输层关键指标采集

传输层(L4)的 TCP/UDP 指标直接反映应用数据的传输质量。对于 LinkTest 场景,TCP 的可靠性机制是诊断重连触发条件的核心依据。

指标名称 采集方式 异常阈值参考 典型异常场景
TCP 重传率 netstat -s | grep retransmit 重传率 > 2% 网络拥塞、带宽不足、链路丢包
TCP 连接状态 ss -tan / netstat -tan 大量 TIME_WAIT / SYN_SENT 连接泄漏、对端无响应、防火墙拦截
RTT (往返时延) ss -ti / tcpdump 分析 RTT 抖动 > 50% 基线值 路径切换、拥塞、队列积压
接收窗口 (Recv-Q) ss -tan Recv-Q 持续 > 0 应用层处理慢、接收缓冲区满
发送窗口 (Send-Q) ss -tan Send-Q 持续 > 0 对端接收窗口关闭、网络瓶颈
连接建立时间 tcpdump + 时间戳计算 SYN-ACK 时延 > 1s 对端负载高、中间设备处理慢
采集命令示例(Linux):
# 查看 TCP 重传统计
netstat -s | grep -i "retransmit"

# 查看连接状态分布
ss -tan | awk '{print $1}' | sort | uniq -c

# 查看具体连接的 RTT 与窗口信息
ss -ti | grep -A 1 "ESTAB"
传输层 TCP 状态机与关键采集点 连接建立 SYN / SYN-ACK / ACK 数据传输 SEQ / ACK / 窗口 连接关闭 FIN / TIME_WAIT 异常状态 SYN_SENT / CLOSE 连接建立指标 建立时间 / SYN 重传 传输质量指标 重传率 / RTT / 窗口 连接状态指标 状态分布 / 连接数 采集工具推荐 ss / netstat / tcpdump / tcptrace

3.4 三层指标联合分析矩阵

单一层的指标异常往往会在其他层产生连锁反应。以下矩阵展示了典型故障场景下三层指标的联动表现,帮助诊断时快速定位根因。

故障场景 链路层表现 网络层表现 传输层表现 诊断优先级
物理链路中断 Link Status = DOWN ICMP 不可达 TCP 连接超时 链路层优先
网络拥塞 CRC 错误可能增加 RTT 升高、丢包 重传率飙升、窗口缩小 传输层优先
路由震荡 正常 路由表频繁变化、路径切换 RTT 抖动、短暂中断 网络层优先
MTU 不匹配 正常 IP 分片计数增加、重组失败 TCP 分段后性能下降 网络层优先
ARP 欺骗 MAC 地址冲突 ARP 表异常、ICMP 可达但 TCP 异常 连接建立失败、数据错传 链路层优先
实战建议: 在自动化诊断脚本中,建议按照“链路层 → 网络层 → 传输层”的顺序逐层检查。如果链路层已经 DOWN,则无需继续向上层采集,直接触发重连流程。这种分层剪枝策略可以大幅减少无效采集和诊断时间。

3.5 采集频率与数据存储策略

指标采集不是一次性的,需要合理的频率和存储策略来支撑趋势分析和异常回溯。

  • 高频采集(1-5秒间隔): 链路状态、TCP 连接状态、重传计数。用于实时检测瞬态故障。
  • 中频采集(30-60秒间隔): RTT、丢包率、窗口大小。用于评估链路质量趋势。
  • 低频采集(5-15分钟间隔): 路由表快照、ARP 表、接口统计汇总。用于基线建立和长期分析。
  • 数据保留策略: 原始指标保留 7 天用于回溯,聚合后的分钟级数据保留 30 天,小时级数据保留 90 天。
采集脚本框架示例(Python 伪代码):
import subprocess
import time
from collections import deque

class LinkDiagnosticCollector:
    def __init__(self):
        self.metrics_buffer = deque(maxlen=3600)  # 1小时窗口
    
    def collect_link_layer(self):
        # 采集链路状态、CRC、丢包
        result = subprocess.run(['ethtool', '-S', 'eth0'], capture_output=True, text=True)
        return self._parse_ethtool_stats(result.stdout)
    
    def collect_network_layer(self, target_ip):
        # 采集 ICMP 可达性与 RTT
        result = subprocess.run(['ping', '-c', '5', target_ip], capture_output=True, text=True)
        return self._parse_ping_output(result.stdout)
    
    def collect_transport_layer(self):
        # 采集 TCP 重传与连接状态
        result = subprocess.run(['netstat', '-s'], capture_output=True, text=True)
        return self._parse_tcp_stats(result.stdout)
    
    def run_diagnostic_cycle(self, target_ip):
        link_metrics = self.collect_link_layer()
        if link_metrics['link_status'] != 'UP':
            return {'layer': 'L2', 'action': 'trigger_reconnect'}
        
        net_metrics = self.collect_network_layer(target_ip)
        if net_metrics['packet_loss'] > 5:
            return {'layer': 'L3', 'action': 'trigger_reconnect'}
        
        tcp_metrics = self.collect_transport_layer()
        if tcp_metrics['retransmit_rate'] > 2:
            return {'layer': 'L4', 'action': 'trigger_reconnect'}
        
        return {'layer': 'OK', 'action': 'continue'}

通过上述分层、分频的采集策略,LinkTest 能够在异常发生时快速获取到最相关的诊断数据,为后续的根因分析和自动重连触发提供坚实的数据基础。