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
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)进行交叉验证。
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"
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 能够在异常发生时快速获取到最相关的诊断数据,为后续的根因分析和自动重连触发提供坚实的数据基础。