4. 物理层与链路层接口:物理层信号、编码与链路训练

4.1 物理层与链路层的职责边界

InfiniBand 的物理层(Physical Layer)与链路层(Link Layer)通过明确的接口协同工作。物理层负责将链路层交付的比特流转换为适合在铜缆或光纤上传输的物理信号,并完成信号的恢复、时钟同步与线路编码;链路层则负责数据包的封装、流控、错误检测与链路级可靠性。两者之间的接口并非简单的“数据管道”,而是包含状态反馈、链路宽度协商、速率协商和错误上报的复杂控制面。

从协议栈角度看,物理层位于最底层,直接面对传输介质;链路层位于其上方,通过介质访问控制(MAC)子层与物理层交互。在 InfiniBand 规范中,物理层又被细分为电气子层(Electrical Sub-layer)、逻辑子层(Logical Sub-layer)和链路训练与状态机(Link Training and Status State Machine, LTSSM)。链路层并不直接操作引脚电平或光模块,而是通过一组标准化的原语(Primitive)与物理层通信。

核心接口原语示例:

// 链路层向物理层发送的请求
phy_send_request(data, port_width, rate);
phy_status_query(link_state, error_count);

// 物理层向链路层上报的事件
phy_link_up(negotiated_width, active_speed);
phy_link_down(reason_code);
phy_symbol_error(symbol_position, error_type);
链路层 (Link Layer) 数据包封装/解封装 流控 (Credit 管理) 错误检测/重传 VL 仲裁与调度 物理层-链路层接口 (PLI) 原语通道: 请求/确认/指示/事件 状态机: 链路初始化/训练/错误恢复 物理层 (Physical Layer) PCS (编码/解码) PMA (串行/解串) PMD (光/电) 线路编码方式对比 8b/10b 编码 SDR / DDR (2.5/5 Gb/s) DC 平衡, 内嵌时钟 20% 带宽开销 64b/66b 编码 QDR / FDR / EDR (10-25 Gb/s) 加扰 + 同步头 ~3% 带宽开销 物理信号状态 信号状态: 电气空闲 / 非空闲 信令速率: 2.5 / 5 / 10 / 14.0625 / 25.78125 Gb/s 链路训练状态机 (LTSSM) 状态迁移路径 1. Disabled → 2. Polling (检测对端) 3. Configuration (协商宽度/速率) 4. LinkUp (发送训练帧, 进入正常) 5. Recovery (误码率超限时回退)

4.2 线路编码:从 8b/10b 到 64b/66b 的演进

InfiniBand 的物理层编码经历了从 8b/10b 到 64b/66b 的演进,核心驱动力是速率提升带来的带宽效率压力。8b/10b 编码将每 8 位数据映射为 10 位线路码,保证足够的跳变密度以支持时钟恢复,同时维持 DC 平衡(即线路上的“0”和“1”数量大致相等)。这种编码在 SDR(2.5 Gb/s)和 DDR(5 Gb/s)时代是主流选择,但 20% 的额外开销在高速率下变得不可接受。

进入 QDR(10 Gb/s)及以后,InfiniBand 转向 64b/66b 编码。该编码将 64 位数据块封装为 66 位帧,其中前 2 位为同步头(Sync Header),用于区分数据块和控制块。同步头本身提供了足够的跳变来支持时钟恢复,而数据部分则通过加扰(Scrambling)来避免长串连续相同比特。64b/66b 的开销仅为约 3.125%,显著提升了有效带宽。

特性 8b/10b 64b/66b
适用速率 SDR (2.5 Gb/s), DDR (5 Gb/s) QDR (10 Gb/s), FDR (14.0625 Gb/s), EDR (25.78125 Gb/s)
编码开销 20% (8→10 bit) 3.125% (64→66 bit)
时钟恢复 依靠跳变密度保证 依靠同步头 + 加扰
DC 平衡 运行不一致性 (RD) 控制 加扰后统计平衡
错误检测 无效码字检测 同步头错误 + CRC

编码选择的关键考量: 8b/10b 的码字空间中有大量非法组合,接收端可以利用这些非法码字快速检测线路错误;而 64b/66b 的同步头只有 2 位,错误检测能力较弱,因此需要依赖更高层的 CRC(如链路层 CRC)来保证数据完整性。这也是为什么在 FDR 及以上速率中,链路层错误检测机制被加强的原因。

4.3 链路初始化与训练流程

链路训练是物理层与链路层交互最密集的阶段。当端口首次上电或链路从错误中恢复时,LTSSM 驱动一系列状态迁移,完成速率协商、宽度协商和比特级对齐。整个过程分为以下关键步骤:

  1. 禁用状态 (Disabled): 端口不发送任何信号,等待管理软件下发启用命令。
  2. 轮询状态 (Polling): 发送端发送训练序列 TS1/TS2,接收端检测对端信号并尝试比特锁定。此阶段需要完成 CDR(时钟数据恢复)锁定。
  3. 配置状态 (Configuration): 双方交换能力信息,协商链路宽度(1x、4x、8x、12x)和速率。协商结果通过训练帧中的字段传递。
  4. 链路就绪 (LinkUp): 发送空闲序列 (Idle) 并等待对端确认,随后进入正常操作状态。
  5. 恢复状态 (Recovery): 当误码率超过阈值或信号丢失时,链路自动回退到该状态,重新进行比特锁定和宽度协商。
// 链路训练过程中的关键参数示例 (ibdiagnet 输出片段)
# 端口速率协商结果
Port 1:  Active: 4X  FDR (14.0625 Gb/s)
        Negotiated: 4X  FDR
        Supported: 1X/4X/8X/12X, SDR/DDR/QDR/FDR

# 训练状态
Link Training State: LinkUp
Error Counters: Symbol Errors: 0, Disparity Errors: 0

4.4 实际案例:多速率环境下的链路降速

在一个实际的数据中心环境中,管理员将一台 HDR(32 Gb/s)交换机与一台 EDR(25 Gb/s)服务器直连。由于两端支持的速率不同,链路训练过程会进行速率协商。交换机端在 Polling 状态发送其支持的最高速率(HDR),但服务器端无法在该速率下完成 CDR 锁定,因此回送训练帧表明其最高支持速率为 EDR。交换机收到后自动降速至 EDR,并重新进行比特锁定。

这一过程通常需要几十毫秒,期间链路层会收到物理层上报的 phy_link_down 事件,并暂停所有 VL 上的数据发送。训练完成后,物理层上报 phy_link_up 事件,链路层重新初始化 credit 计数器并恢复数据流。

常见误区: 许多管理员误以为链路速率协商是“双方取最高共同速率”的简单过程。实际上,链路训练还涉及 加扰器种子同步 和 比特级相位对齐。如果两端使用的加扰多项式种子不一致,即使速率协商成功,数据解码也会出现大量符号错误。因此,在排查链路不稳定问题时,不能只关注速率和宽度,还需要检查物理层训练日志中的加扰器状态。

4.5 物理层与链路层交互的故障排查复盘

在一次真实故障中,某集群的 InfiniBand 链路频繁出现“链路抖动”(Link Flapping),表现为每 30 秒左右链路断开并重新训练。通过抓取物理层寄存器日志,发现 SignalDetect 位周期性变为 0,表明光模块接收信号幅度不足。进一步检查发现,光纤跳线弯曲半径过小导致衰减增大,触发物理层的信号丢失检测。

链路层在此过程中的表现是:收到 phy_link_down 事件后,立即停止发送数据并清空 credit 计数器;链路恢复后,重新执行 credit 初始化。由于链路层设计正确,没有出现数据包丢失,但频繁的训练过程导致 MPI 通信超时。最终通过更换光纤跳线并调整布线路径解决了问题。

此案例说明,物理层的信号质量直接决定链路层的稳定性。排查链路问题时,应遵循以下顺序:首先检查物理层信号(光功率、误码率),其次检查训练状态机是否稳定,最后才检查链路层配置。