网络基础回顾:TCP/IP模型、以太网帧结构与交换机工作原理

在深入链路丢包定位与RDMA重传优化之前,必须先夯实网络基础。RDMA(远程直接内存访问)报文虽然绕过了内核协议栈,但最终仍要封装为以太网帧在物理链路上传输。理解TCP/IP模型的分层职责、以太网帧的字节级结构以及交换机内部的转发决策过程,是判断丢包发生在哪一层、由哪个设备丢弃、以及为何RDMA重传机制会触发的前提。

2.1 TCP/IP模型:分层职责与丢包定位边界

TCP/IP模型将网络通信划分为四层,每一层都有独立的协议数据单元(PDU)名称和封装关系。RDMA over Converged Ethernet(RoCE)v2的报文结构恰好横跨了传输层(UDP)、网络层(IP)和链路层(Ethernet),因此任何一层的异常都会表现为链路丢包。

层次 PDU名称 典型协议/设备 丢包常见原因
应用层 消息(Message) RDMA应用、Socket 缓冲区溢出、应用未及时消费
传输层 段(Segment)/数据报(Datagram) TCP、UDP、RoCE v2(UDP封装) 端口不可达、校验和错误、接收队列满
网络层 包(Packet) IP、路由器、三层交换机 TTL超时、路由黑洞、MTU分片失败
链路层 帧(Frame) 以太网、交换机、网卡 FCS错误、CRC校验失败、端口拥塞、缓冲区不足

丢包定位的第一原则是:先确定丢包发生在哪一层,再针对该层的计数器与日志排查。例如,若交换机入方向CRC错误计数持续增长,则问题大概率在物理层或链路层,而非IP层路由策略。

2.2 以太网帧结构:逐字节拆解丢包现场

以太网帧是链路层传输的最小单位。标准IEEE 802.3以太网帧结构如下(不含前导码和SFD):

| 目的MAC (6B) | 源MAC (6B) | EtherType (2B) | 载荷 (46~1500B) | FCS (4B) |

关键字段与丢包关联如下:

  • 目的MAC地址:交换机依据它做转发决策。若目的MAC为广播地址(FF:FF:FF:FF:FF:FF),则帧被泛洪到所有端口。
  • EtherType:0x0800表示IPv4,0x86DD表示IPv6,0x8915表示RoCE v2(基于UDP的RDMA)。若交换机不支持该EtherType,可能直接丢弃。
  • 载荷长度:最小46字节,最大1500字节(标准MTU)。若启用Jumbo Frame,可达9000字节。RDMA流量常使用大MTU提升吞吐,但若链路中某设备MTU不一致,会导致分片或静默丢弃。
  • FCS(帧校验序列):使用CRC32算法。接收端计算校验值若不匹配,则丢弃该帧并增加CRC错误计数。这是物理层信号质量差、网卡故障或线缆过长导致丢包的最直接证据。
排障提示:当怀疑RDMA报文被交换机丢弃时,优先检查交换机端口的 rx_crc_errors 与 rx_undersize 计数器。若CRC错误持续增加,说明物理层存在信号完整性问题,此时调整RDMA重传参数毫无意义,必须更换光模块或线缆。

2.3 交换机工作原理:MAC地址表与转发决策

交换机是链路层的核心设备,其工作基础是MAC地址表(又称CAM表)。转发决策流程如下:

  1. 学习:收到帧后,将源MAC地址与入端口绑定,记录到MAC地址表。
  2. 查找:读取目的MAC地址,在MAC地址表中查找匹配条目。
  3. 决策:
    • 命中单播条目 → 仅从对应端口转发(单播转发)。
    • 未命中 → 向除入端口外的所有端口泛洪(未知单播泛洪)。
    • 目的MAC为广播/组播地址 → 泛洪或按组播组转发。
  4. 老化:MAC地址表条目默认老化时间300秒。若设备静默,条目被删除,后续流量将重新泛洪。

交换机内部的丢包点主要集中在出端口队列。当多个入端口同时向同一出端口发送流量时,若瞬时速率超过出端口带宽,帧将进入缓冲区队列。缓冲区满后,新到达的帧被丢弃,即尾丢弃(Tail Drop)。对于RDMA这类对丢包极其敏感的流量,尾丢弃会导致TCP-like RoCE的吞吐量断崖式下降,因此数据中心交换机普遍启用显式拥塞通知(ECN)或优先级流控(PFC)来缓解。

交换机转发决策与丢包点示意 发送端 MAC: 00:11:22:33:44:55 IP: 192.168.1.10 RoCE v2 流量 EtherType: 0x8915 以太网帧结构 目的MAC 源MAC 类型 载荷 FCS CRC校验失败→丢弃 交换机 MAC地址表 (CAM) MAC地址 端口 00:11:22:33:44:55 Eth1/0/1 66:77:88:99:AA:BB Eth1/0/2 CC:DD:EE:FF:00:11 Eth1/0/3 ... (老化时间300s) 转发决策 ① 学习源MAC → 入端口 ② 查找目的MAC ③ 命中→单播转发 未命中→泛洪 接收端 MAC: 66:77:88:99:AA:BB IP: 192.168.1.20 RDMA网卡 检查FCS、队列 帧入端口 帧出端口 丢包点①:入端口 CRC错误、帧过短、EtherType不支持 → 直接丢弃,计数器增加 丢包点②:出端口队列 缓冲区满 → 尾丢弃 PFC暂停帧可缓解,但可能引发死锁 丢包点③:接收端 接收队列满 NIC缓冲区溢出

2.4 案例:一次RDMA流量被交换机丢弃的排查

某分布式存储集群使用RoCE v2网络,业务反馈存储延迟从200μs飙升至5ms。检查接收端网卡统计,发现rx_dropped计数持续增长,但物理层无CRC错误。进一步在接入交换机上执行:

show interface ethernet 1/0/1
  rx_bytes: 1,234,567,890
  rx_crc_errors: 0
  rx_undersize: 0
  rx_oversize: 0
  tx_queue_depth: 1200/1280   <-- 队列深度接近上限
  tx_dropped: 8,765          <-- 出方向丢包计数

定位过程:

  1. CRC错误为0,排除物理层问题。
  2. 出端口队列深度接近上限,且tx_dropped非零,判断为出端口拥塞导致尾丢弃。
  3. 检查该端口连接的接收端网卡速率——发现接收端协商为25Gbps,而发送端为100Gbps,导致流量在出端口处拥塞。
误区警示:不要一看到RDMA重传计数增加就调整重传定时器或降低吞吐。本例中,重传是拥塞丢包的结果而非原因。正确做法是先检查交换机端口的 tx_dropped 与队列深度,确认是否存在带宽不匹配或微突发拥塞。

2.5 核心要点清单

  • TCP/IP分层决定了丢包排查的边界:链路层看FCS与队列,网络层看TTL与路由,传输层看端口与队列。
  • 以太网帧的FCS是物理层健康的“晴雨表”,CRC错误增加时优先排查光模块、线缆和网卡。
  • 交换机丢包主要发生在入端口(校验失败)和出端口(队列满),两者计数器不同,需区分对待。
  • MAC地址表老化会导致未知单播泛洪,可能引发临时性广播风暴,但通常不会造成持续丢包。
  • RDMA流量应优先使用PFC或ECN机制,避免尾丢弃对吞吐量的毁灭性影响。