我曾在Spirent公司工作,这是一家测试测量公司,专门开发高性能网络测试系统。我们的产品名为Test Center,当时我们与一支才华横溢的团队一起开发用于测试RoCEv2系统的系统。我的工作重点是优先级流控制(PFC),以及如何将其应用于基于800Gbps FPGA的“数据包分析器和生成器”(也称为PGA)。
然而,我从未真正了解过第 4 层,这份备忘录试图通过阐述 InfiniBand 传输层 (L4) 的关键要素并用一些图表将其可视化来弥合这一差距。
让我们从实际的 RoCEv2 帧开始:

基本传输头 (BTH)
链接到标题
BTH 标头中包含的关键字段:
操作码:用于指定 RDMA 操作的类型,例如 RDMA_WRITE、RDMA_READ 等。
目标队列对:用于区分数据包的不同目标队列对。
确认请求:指示接收端是否需要对此数据包返回 ACK。
数据包序列号 (PSN):用于数据包序列跟踪,以确保可靠交付。
由于UDP协议不可靠,帧可能会丢失、乱序或重复,因此使用PSN来确保帧的正确传输。然而,这也意味着IBTL需要有一种方法来请求帧重传。这可以通过AETH头部来实现,具体内容将在下文描述。
扩展传输头 (ETH)
链接到标题
InfiniBand传输层包含多个扩展头部,用于特定功能。对于RDMA而言,最值得关注的两个扩展头部是RETH和AETH。
RDMA 扩展传输头 (RETH)
链接到标题

RDMA_WRITE 操作需要多个元素,这些元素在 RETH 扩展报头的各个字段中表示。该报头会将写入操作的详细信息告知接收硬件,包括:
ACK 扩展传输标头 (AETH)
链接到标题
如前所述,IBTL 需要在传输不可靠时通知发送方。这是通过 EATH 扩展实现的,该扩展包含以下字段:
IBTL 规范(参见第 9 章)确实包含相当多的扩展,其中一些引起了我的注意:
比较和交换:可以实现无锁同步。
发送与写入:前者可用于控制流,后者可用于数据流。
立即扩展:允许在传输内存的同时交换侧信道元数据。
我也一直在思考如何知道标头中包含哪些扩展名。答案很简单:对于每个操作码,都有一个待解析的扩展名列表——该列表是静态定义的,是规范的一部分。
正如 Toni Pasanen 在其博客 The Network Times 中所述:
GPU 之间的通信会产生海量的数据流,支持 RDMA 的网卡会以线速传输这些数据流。这些数据流很容易导致后端网络拥塞。
RDMA 能够以线速生成流量,这令人惊叹。但这同时也带来了一个问题,即流单元大小(两个连续非活动时间段之间的流量大小)会受到影响,在使用 RDMA 大流量时,访问“非活动间隙”的概率会显著降低。
图片来自:支持网络内重排序的 RDMA 网络负载均衡
另一个复杂之处在于脊叶拓扑结构的负载均衡,当使用“数据包喷射”负载均衡时,单个队列对上的数据包可能会乱序接收。这造成了一定的复杂性,而英伟达通过引入一种名为“RDMA 只写”的新型 RDMA 操作解决了这个问题。
原图来自:网络时报
# 结论
这是一份“动态”备忘录,我会随着找到更多关于 IBTL 的信息而不断更新。
目前还没有定论,但可以肯定的是,RDMA 是一种非常优雅的解决网络效率挑战的方法,同时也带来了一系列新的挑战。
References: