RoCE v2中UDP的源端口和目的端口

0 前言

RoCE v2协议中RDMA的数据都是通过UDP来传输的,按照RoCE v2协议规范,UDP的目的端口是固定的(des port = 4791),但是UDP源端口的确定是由RDMA驱动使用hash来算出来的。不同的QP建链方式以及QP的类型采用具体的计算方法不同。其中源端口的范围是49152-65535 (十六进制:0xC000-0xFFFF)

1 采用RDMA_CM建链时源端口的计算方式

CM_REQ.ServiceID.DstPort [2 Bytes]
CM_REQ.PrivateData.SrcPort [2 Bytes]
RoCE.UDP.src_port = (DstPort[0..1] XOR SrcPort[0..1]) OR 0xC000
其中RDMA_CM建链时用到的源端口和目的端口占16bits,取DstPort 和SrcPort做异或然后再与0xC000做或运算。

2 不采用RDMA_CM建链时源端口的计算方式

不采用RDMA_CM建立连接时UDP源端口需要根据QP类型和建链两边的QP Number来确定,具体算法如下:
QP Number占24bits,需要先将这24bits Fold成16bits,具体运算为QP[0] ^= QP[2],具体的hash计算是根据QP而指定的:

  • 对于RC类型的QP,具体计算方法是:
  if (s.QP != d.QP)
    UDP src_port = s.QP XOR d.QP OR 0xC000
  else
    UDP src_port  = s.QP OR 0xC00
  • 对于UD类型的QP,具体计算方法是:
  if (s.QP != d.QP) && (d.QP != 0xFFFFFF)
    UDP src_port = s.QP XOR d.QP AND 0xC000
  Else
    UDP src_port = s.QP AND 0xC000

3 参考资料

RoCE v2.0 UDP Source Port Entropy
NVIDIA RoCE v2 UDP Source Port

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 05:02:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 05:02:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 05:02:05       82 阅读
  4. Python语言-面向对象

    2024-03-28 05:02:05       91 阅读

热门阅读

  1. 【QT】QT的事件机制及其与信号机制的区别

    2024-03-28 05:02:05       34 阅读
  2. uniapp 返回上一页再进入当前页mounted不执行

    2024-03-28 05:02:05       46 阅读
  3. TCP/IP:互联网通信的核心协议

    2024-03-28 05:02:05       41 阅读
  4. 老项目接入kafka消费信息另一种方式

    2024-03-28 05:02:05       38 阅读
  5. 记录一次ubuntu网络传输大文件时出现断网现象

    2024-03-28 05:02:05       45 阅读
  6. centos 安装wget

    2024-03-28 05:02:05       36 阅读
  7. 关于对postcss安装和使用比较详细

    2024-03-28 05:02:05       39 阅读
  8. t检验案例代码

    2024-03-28 05:02:05       34 阅读
  9. VUE3——watch函数

    2024-03-28 05:02:05       36 阅读