2. IB链路层协议与物理层特性:链路层帧结构、物理层信号与编码、链路训练与初始化

各位,咱们今天聊聊IB网络里最底层的那些事儿。说实话,很多搞网络的人一听到「物理层」就头疼,觉得那是硬件工程师的活。但我在IB网络运维这行摸爬滚打这么多年,可以负责任地告诉你——不懂链路层和物理层,你连一根线缆出问题都查不明白。

IB的链路层,说白了就是负责把数据从一个端口搬到另一个端口。它不关心你跑的是HPC还是存储,它只关心帧对不对、信号稳不稳。嗯,咱们先从帧结构说起。

2.1 链路层帧结构

IB的帧结构,我习惯把它拆成三块看:本地路由头(LRH)数据载荷、以及尾部校验(ICRC/VCRC)。你想想看,一个帧在链路上跑,总得知道从哪来到哪去吧?LRH就是干这个的。

核心帧结构(简化版)

  • LRH(本地路由头):8字节,包含源LID、目的LID、VL(虚拟通道)、服务等级等。LID是IB网络里的二层地址,类似于以太网的MAC,但它是16位的。
  • GRH(全局路由头):40字节,可选。跨子网通信时才用,平时在单子网里可以省略。
  • BTH(基本传输头):12字节,包含操作码、目的QP号、分组序号等。这是传输层的东西,但帧结构里它紧跟在路由头后面。
  • 数据载荷:0~4096字节,最大4KB。注意,IB的MTU最大是4KB,比以太网的1500大得多,这对HPC应用非常友好。
  • ICRC(不变循环冗余校验):4字节,覆盖从LRH到数据载荷的所有字段。这个校验在交换机里不会被修改,所以叫「不变」。
  • VCRC(可变循环冗余校验):4字节,覆盖整个帧,包括ICRC。这个在每跳都会被重新计算,因为交换机可能会修改某些字段(比如VL)。

我记得有一次排查丢包问题,抓包发现ICRC一直报错。后来查了半天,发现是光纤模块的发射功率偏低,导致信号在长距离传输时出现了位错误。你看,帧结构里的校验字段,直接帮你定位到了物理层问题。

2.2 物理层信号与编码

IB物理层,目前主流的是4X12X两种宽度。4X就是4条差分信号对,12X就是12对。每条差分对跑的是8b/10b编码(早期)或者64b/66b编码(EDR及以后)。

为什么要编码?说白了就是为了保证直流平衡和时钟恢复。你想想看,如果信号里连续出现一串0或者一串1,接收端的时钟就锁不住了。8b/10b编码把8位数据变成10位,保证0和1的数量基本相等。代价是20%的带宽开销。

到了EDR(25Gbps每通道)时代,IB换成了64b/66b编码。开销降到了3%左右,但实现复杂度上去了。我个人习惯把编码方式看作一种「信号保险」——你多花点带宽,换来的是信号稳定性。

避坑指南

我曾经遇到过一台交换机,所有端口都显示物理层Down。查了半天,发现是机柜里的光纤弯曲半径太小,导致光信号衰减过大。物理层信号这东西,光功率、色散、反射,任何一个指标超标,链路就起不来。所以我的建议是:每次布线后,一定要用光功率计测一下,别光靠眼睛看灯亮不亮。

2.3 链路训练与初始化

链路训练,这是IB物理层最神奇的部分。你插上一根线,两端端口怎么知道该用多少速率、多少宽度?靠的就是训练。

训练过程大致分三步:

  1. 初始化:两端端口先以最低速率(比如SDR,2.5Gbps)建立基本通信。这时候交换的是训练序列,不是正常数据。
  2. 协商:两端互相告诉对方自己支持哪些速率、哪些宽度。比如A支持EDR和FDR,B只支持FDR,那最终就降级到FDR。
  3. 调优:调整信号均衡、相位偏移等参数。这一步很关键,因为不同线缆、不同距离,信号质量都不一样。调优就是找到最优的接收参数。

嗯,这里要注意:链路训练失败是IB网络里最常见的物理层故障之一。原因可能是线缆不兼容、光模块故障、或者两端速率不匹配。我见过最离谱的一次,是有人把QSFP+线缆插到了QSFP28端口上,结果训练了30秒后直接超时,端口进入Disable状态。

警告

千万不要在生产环境里频繁插拔IB线缆!每次插拔都会触发链路训练,训练期间端口是不转发数据的。如果你在训练过程中拔线,可能会导致对端端口误判为链路故障,进而触发切换或重启。我曾经见过一个集群因为运维人员连续插拔3根线,导致整个子网震荡了5分钟。

2.4 知识体系总览

下面这张图,是我自己总结的IB链路层与物理层核心逻辑。你可以把它当作一个快速索引,遇到问题先看属于哪一层。

IB链路层与物理层知识体系 物理层 信号与编码 8b/10b → 64b/66b 链路训练 初始化 → 协商 → 调优 物理介质 铜缆 / 光模块 / AOC 链路层 帧结构 LRH + 载荷 + ICRC/VCRC 流控机制 基于信用的流控 虚拟通道 VL0 ~ VL15 网络层(依赖链路层) LID路由 子网管理 多路径转发

你看,物理层在最底下,链路层在中间,网络层在上面。每一层都依赖下一层提供的服务。链路训练搞不定,帧结构再完美也传不过去。反过来,帧校验发现错误,也能反推物理层有问题。

2.5 实战经验总结

最后,我把自己这些年踩过的坑总结成几条原则,希望对你有帮助:

  • 链路起不来,先看物理层:光功率、线缆类型、端口速率,这三样排查完,90%的问题都能定位。
  • 帧错误多,查信号质量:ICRC错误暴增,大概率是物理层信号劣化,别急着换交换机。
  • 训练超时,查两端配置:强制速率、禁用自动协商,这些配置最容易导致训练失败。
  • 别迷信「热插拔」:IB的物理层设计确实支持热插拔,但频繁插拔对光模块和端口都不友好。我建议:插上去就别动它

好了,链路层和物理层的内容就聊到这儿。记住一句话:物理层是基石,链路层是桥梁。基石不稳,桥梁再结实也白搭。


公众号:蓝海资料掘金营,微信deep3321