<?xml version="1.0" encoding="utf-8"?>
<?xml-model href="rfc7991bis.rnc"?>  <!-- Required for schema validation and schema-aware editing -->
<!-- <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> -->
<!-- This third-party XSLT can be enabled for direct transformations in XML processors, including most browsers -->


<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<!-- If further character entities are required then they should be added to the DOCTYPE above.
     Use of an external entity file is not recommended. -->

<rfc
  xmlns:xi="http://www.w3.org/2001/XInclude"
  category="info"
  docName="draft-hu-6man-ipv6-flowlabel-load-balancing-rdma-02"
  ipr="trust200902"
  obsoletes=""
  updates=""
  submissionType="IETF"
  xml:lang="en"
  version="3">

  <front>
    <title abbrev="draft-hu-6man-ipv6-flowlabel-load-balancing-rdma-02"> A RoCEv2 Flow-Level Load Balancing Method Based
      on the IPv6 Flow Label
    </title>
    <!--  [REPLACE/DELETE] abbrev. The abbreviated title is required if the full title is longer than 39 characters -->

    <seriesInfo name="Internet-Draft" value="draft-hu-6man-ipv6-flowlabel-load-balancing-rdma-02"/>
   
    <author fullname="Jiayuan Hu" initials="Jiayuan" surname="Hu">
      <organization>China Telecom</organization>
      <address>
        <postal>
          <street>109, West Zhongshan Road, Tianhe District</street>
          <city>Guangzhou</city>
          <region>Guangzhou</region>
          <code>510000</code>
          <country>CN</country>
        </postal>
        <email>hujy5@chinatelecom.cn</email>
      </address>
    </author>

    <author fullname="Jie Dong" initials="J." surname="Dong">
      <organization>Huawei Technologies</organization>
      <address>
        <postal>
          <street>Huawei Bld., No.156 Beiqing Rd.</street>
          <city>Beijing</city>
          <code>100095</code>
          <country>CN</country>
        </postal>
        <email>jie.dong@huawei.com</email>
      </address>
    </author>

     <author fullname="Yao Liu" surname="Liu">
      <organization>ZTE Corporation</organization>
      <address>
        <postal>
          <street/>
          <!-- Reorder these if your country does things differently -->
         <city></city>
          <region/>
          <code/>
          <country>China</country>
        </postal>
        <phone></phone>
        <email>liu.yao71@zte.com.cn</email>
        <!-- uri and facsimile elements may also be added -->
     </address>
    </author>

    <author fullname="Xia Gong" initials="Xia" surname="Gong">
      <organization>China Telecom</organization>
      <address>
        <postal>
          <street>109, West Zhongshan Road, Tianhe District</street>
          <city>Guangzhou</city>
          <region>Guangzhou</region>
          <code>510000</code>
          <country>CN</country>
        </postal>
        <email>gongxia@chinatelecom.cn</email>
      </address>
    </author>

    <date year="2026"/>

    <area>Internet</area>
    <workgroup>IPv6 Maintenance</workgroup>
    <!-- "Internet Engineering Task Force" is fine for individual submissions.  If this element is 
          not present, the default is "Network Working Group", which is used by the RFC Editor as 
          a nod to the history of the RFC Series. -->

    <keyword>RFC</keyword>
    <!-- [REPLACE/DELETE]. Multiple allowed.  Keywords are incorporated into HTML output files for 
         use by search engines. -->

    <abstract>
      <t>
        This document proposes a method for achieving flow-level load balancing in RoCEv2 (RDMA over Converged Ethernet
        version 2) networks. Traditional per-flow load balancing based on the 5-tuple cannot distinguish between
        different RDMA sessions that share the same 5-tuple. This causes "elephant flows" to be hashed to the same
        path, leading to network congestion. This method resolves this issue by having the ingress network device (e.g.,
        a top-of-rack switch or router) parse the QP (Queue Pair) information
        from the IB BTH (Base Transport Header) and IB DETH (Datagram Extended Transport Header) headers of the RoCEv2
        packet. By combining this with portions of the IPv6 source and destination addresses as an entropy source, a
        CRC32 hash algorithm generates a 20-bit value, which is then written into the Flow Label field of the IPv6
        header. Network devices can subsequently use the updated "5-tuple + Flow Label" for more granular flow-level
        load balancing, thereby effectively improving transmission efficiency in high-performance networks such as AI
        computing.
      </t>
    </abstract>
 
  </front>


  <middle>
    
    <section>
      <name>Introduction</name>
      <t>
        The rapid advancement of Artificial Intelligence (AI) and High-Performance Computing (HPC) has driven the
        widespread adoption of Remote Direct Memory Access (RDMA) over Converged Ethernet (RoCEv2) in data center and
        intelligent computing networks. RoCEv2 enables high-throughput, low-latency data transfers that are critical
        for distributed training and storage workloads. However, the effective operation of these networks is challenged
        by the inherent characteristics of RDMA traffic, particularly the "elephant flow" problem.
      </t>
      <t>
        Traditional load balancing mechanisms in IP networks typically rely on a 5-tuple (source/destination IP address,
        source/destination port, and protocol number) to identify and distribute traffic flows. In RoCEv2 networks, a
        significant limitation arises: multiple distinct RDMA sessions or flows generated by the same upper-layer
        application may share an identical 5-tuple. This is because the RDMA Queue Pair (QP) information, which uniquely
        identifies a session, is encapsulated within the InfiniBand Base Transport Header (IB BTH) and Datagram Extended
        Transport Header (IB DETH) of the RoCEv2 packet. Consequently, conventional 5-tuple-based hashing treats these
        distinct RDMA flows as a single entity and forwards them to the same network path, leading to severe congestion,
        packet loss, and a significant degradation in overall network throughput and performance.
      </t>
      <t>
        To address this problem, this document introduces a novel method for flow-level load balancing that leverages a
        standard IPv6 extension mechanism. The core idea is to enable an ingress network device (e.g., a top-of-rack
        switch or router at the edge of the network) to extract the QP pair information (source QP and destination QP)
        from the RoCEv2 packets. This extracted QP pair information is then used as input to a CRC32-based hash function
        to generate a unique per-flow identifier. This identifier is subsequently mapped into the Flow Label field of
        the IPv6 header. The sending host is not required to set the Flow Label; it may send packets with the Flow Label
        set to zero, as permitted by <xref target="RFC6437"/>.
      </t>
      <t>
        By combining the traditional 5-tuple with this dynamically generated Flow Label, the proposed method creates a
        fine-grained "5-tuple + Flow Label" flow identification key. This allows network devices to effectively
        distinguish between different RDMA sessions that were previously indistinguishable, thereby achieving true
        flow-level load balancing. This approach minimizes path collisions, reduces congestion, and enhances the
        utilization of multi-path network topologies within RoCEv2 environments.
      </t>
      <t>
        This document outlines the concept, details the packet processing method, and describes the mapping of the QP
        pair to the IPv6 Flow Label field. The subsequent sections will cover the mechanism in detail, discuss its
        advantages over existing solutions, and present use cases for its implementation in intelligent computing and
        data center networks.
      </t>
    </section>
      
    <section title="Conventions Used in This Document">
      <section>
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
          "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT
          RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
          interpreted as described in BCP 14 <xref target="RFC2119"/>
          <xref target="RFC8174"/> when, and only when, they appear in
          all capitals, as shown here.</t>
      </section>

      <section title="Abbreviations and Terminology">
        <t> AIDC: Artificial Intelligence Data Center</t>
        <t> RoCEv2: RDMA over Converged Ethernet version 2</t>
        <t> RDMA: Remote Direct Memory Access</t>
        <t> QP: Queue Pair</t>
        <t> IB BTH: InfiniBand Base Transport Header</t>
        <t> IB DETH: InfiniBand Datagram Extended Transport Header</t>
        <t> CRC32: Cyclic Redundancy Check 32-bit algorithm.</t>
        <t> PRNG: Pseudo-Random Number Generator</t>
        <t> Elephant Flow: A data flow that transfers a large volume of data (e.g., gigabytes or more)
          over a sustained period, often associated with distributed training, checkpointing, and parameter
          synchronization in AI/HPC workloads. </t>
      </section>
    </section>
      <!-- [CHECK] The 'Requirements Language' section is optional -->

    <section>
      <name>Relation to Existing Standards and the Need for QP-based Entropy</name>
      <t>
        This method extends the principles established in <xref target="RFC6437"/> and <xref target="RFC6438"/> for
        using the IPv6 Flow Label. <xref target="RFC6437"/> recommends source hosts set the Flow Label using a
        PRNG to provide entropy for load balancing. <xref target="RFC6438"/> further specifies that this Flow Label can
        be used by intermediate routers for ECMP hashing.
      </t>
      <t>
        <xref target="RFC7098"/> describes using the IPv6 Flow Label for layer 3/4 load balancing in large server farms,
        suggesting that {source address, flow label} can serve as a session key when the Flow Label is non-zero. The
        present document complements <xref target="RFC7098"/> in two key aspects: 1. <xref target="RFC7098"/> targets
        general HTTP/TCP traffic where the 5-tuple is sufficient to distinguish sessions, whereas this document addresses
        RoCEv2 networks where multiple RDMA flows share an identical 5-tuple; 2. <xref target="RFC7098"/> assumes the
        source host sets the Flow Label per <xref target="RFC6437"/>, while this document specifies that the ingress
        network device writes the Flow Label based on QP information from the RoCEv2 payload, with the host setting it
        to zero as a signal for relabeling.
      </t>
      <t>
        However, the above existing standards <xref target="RFC6437"/><xref target="RFC6438"/><xref target="RFC7098"/>
        all rely on a fundamental assumption: that different transport layer flows are distinguishable by their 5-tuple
        (Source/Dest IP, Source/Dest Port, Protocol). In a RoCEv2 network, this assumption breaks down. A single host
        process (e.g., a GPU communicator library) often creates multiple parallel RDMA sessions, all of which share the
        same source and destination IPs (typically the host interface IPs) and port numbers (the standard UDP port for
        RoCEv2). Therefore, the 5-tuple is identical for all these concurrent flows.
      </t>
      <t>
        In this scenario, a standard PRNG, which has no knowledge of the internal RDMA session structure, would assign
        the same Flow Label to all packets, or a random value that cannot be correlated with the actual sessions. This
        would not solve the "elephant flow" problem.
      </t>
      <t>
        To overcome this, the proposed method extracts the actual source of session differentiation: the Queue Pair (QP)
        number. The QP number is the unique identifier for an RDMA connection and is present within the IB BTH header
        of the RoCEv2 packet. By hashing this information, the Flow Label becomes a direct function of the session
        itself, not just the network 5-tuple.
      </t>
      <t>
        Moreover, To ensure compatibility with the expectations of <xref target="RFC6437"/>, particularly Section 2, the following
        operational rule is established for this scheme:
      </t>
      <t>
        1. As specified in <xref target="RFC6437"/>, a Flow Label of zero is used to indicate packets that have not been explicitly labeled.
        Hosts participating in this scheme SHOULD either set the Flow Label to zero or not set it at all (which results
        in a default value of zero). This zero value serves as a signal to the network that the packet is eligible for
        relabeling by the ingress network device.
      </t>
      <t>
        2. If the arriving packet already carries a non-zero Flow Label value (e.g., set by the sending host or by
        another upstream device), the ingress network device MUST NOT overwrite it. This rule aligns with the core
        principle of <xref target="RFC6437"/> that "once set to a non-zero value, the Flow Label is expected to be
        delivered unchanged to the destination node(s)."
      </t>
    </section>

    <section title="Flow-Level Load Balancing Based on the IPv6 Flow Label">
      <section>
        <name>Construction of the Hash Input</name>
        <t>
          Ensuring the generated Flow Label can uniquely identify an RDMA flow while possessing sufficient randomness
          to minimize collision probability is critical. The procedure for constructing the hash input is as follows:
        </t>
        <t>
          1. Extract the QP Pair:
        </t>
        <t>
          * Dst_QP: Extracted from the IB BTH (Base Transport Header) header, 24 bits long (e.g., 0xABCDEF). The IB BTH
          is mandatory and always present in the RoCEv2 packet, so Dst_QP is always available.
        </t>
        <t>
          * Src_QP: If the IB DETH (Datagram Extended Transport Header) header is present, extract Src_QP from the DETH
          header, 24 bits long (e.g., 0x123456). The IB DETH header is optional and only present in unreliable datagram
          (UD) service. In reliable connection (RC) and other transport services commonly used in AI computing networks,
          the DETH header is absent, and consequently Src_QP is not available.
        </t>
        <t>
          2. Generate the Entropy Source:
        </t>
        <t>
          To increase hash randomness, an entropy source is introduced. This scheme recommends using portions of the
          IPv6 addresses.
        </t>
        <t>
            * Take the lower 16 bits of the IPv6 source address as the first entropy source, Entropy_Src.
        </t>
        <t>
            * Take the lower 16 bits of the IPv6 destination address as the second entropy source, Entropy_Dst.
        </t>
        <t>
          When DETH is present (Src_QP available): Hash_Input = {Src_QP || Dst_QP || Entropy_Src || Entropy_Dst} (80 bits)
        </t>
        <t>
          When DETH is absent (Src_QP not available): Hash_Input = {Dst_QP || Entropy_Src || Entropy_Dst} (56 bits)
        </t>
        <t>
          In the latter case, since only Dst_QP is used as the QP entropy source, the overall entropy is reduced.
          However, this is a reasonable trade-off: Dst_QP alone is still sufficient to distinguish different RDMA flows
          in most practical scenarios, because different QP sessions are uniquely identified by their destination QP
          number within the receiver. The use of IPv6 address entropy (Entropy_Src and Entropy_Dst) further mitigates
          the risk of collision.
        </t>
      </section>
        <section>
          <name>Hash by CRC32 Algorithm</name>
          <t>
            This draft uses CRC32 as the core hash algorithm and Initialize the CRC register to 0xFFFFFFFF. CRC32 offers
            advantages such as fast computation, hardware-friendly implementation, and a low collision rate, making it
            highly suitable for line-rate forwarding in network devices.
          </t>
          <t>
            First step is Byte-wise Split (using Hash_Input = 0x123456ABCDEF00010002): 0x12, 0x34, 0x56, 0xAB, 0xCD, 0xEF, 0x00, 0x01, 0x00, 0x02
          </t>
          <t>
            Second step is iterative Processing per Byte (using the first byte 0x12 as an example):
          </t>
          <t>
            Step 1 (XOR): XOR the lower 8 bits of the CRC register with the byte 0x12.
          </t>
          <t>
            Step 2 (8-bit Shift-XOR Loop): Process the result from Step 1 bit-by-bit for 8 iterations. In each iteration:
          </t>
          <t>
            a. Check the least significant bit (LSB) of the CRC register.
          </t>
          <t>
            b. Shift the CRC register right by one bit (pad the high bit with 0).
          </t>
          <t>
            c. If the LSB was 1, XOR the result with the generator polynomial 0x04C11DB7.
          </t>
          <t>
            Repeat Steps 1 and 2 for all subsequent bytes.
          </t>
          <t>
            After processing all bytes, the value in the CRC register is the final 32-bit hash result (e.g., 0x8E4D7A2F).
          </t>
        </section>
        <section>
          <name>Flow Label Field Population</name>
          <t>
            From the 32-bit CRC32 hash result, take the lower 20 bits as the Flow Label value and write this 20-bit
            value into the Flow Label field of the IPv6 header.
          </t>
          <figure>
          <name>Updated IPv6 Header Structure Showing the Newly Populated Flow Label Field</name>
          <artwork align="center"><![CDATA[
+---------+---------+---------+---------+---------+---------+---------+
| Version | Traffic Class     |          Flow Label (20 bits)         |
+---------+---------+---------+---------+---------+---------+---------+
|         Payload Length      |     Next Header   |     Hop Limit     |
+---------+---------+---------+---------+---------+---------+---------+
|                                                                     |
+                       IPv6 Source Address                           +
|                                                                     |
+---------+---------+---------+---------+---------+---------+---------+
|                                                                     |
+                       IPv6 Destination Address                      +
|                                                                     |
+---------+---------+---------+---------+---------+---------+---------+
|   ...   |      UDP Header   |   ...   | IB BTH  |   ...   | IB DETH |
+---------+---------+---------+---------+---------+---------+---------+
            ]]>
          </artwork>
        </figure>
        </section>
        <section>
          <name>Where the Flow Label is Modified</name>
          <t>
            In this method, the Flow Label field is modified by the ingress network device(e.g., a top-of-rack switch or
            router), not by the sending host. The sending host sends the RoCEv2 packet with the IPv6 Flow Label field SHOULD
            set to zero, as is the default behavior specified in <xref target="RFC6437"/>. Upon receiving the packet, the ingress network
            device parses the QP information from the IB BTH and IB DETH headers, computes the CRC32 hash, and writes
            the resulting 20-bit value into the Flow Label field before forwarding the packet toward the destination.

          </t>
        </section>
      </section>
    
    <section anchor="IANA">
    <!-- All drafts are required to have an IANA considerations section. See RFC 8126 for a guide.-->
      <name>IANA Considerations</name>
      <t>This document makes no request to IANA.</t>
    </section>
    
    <section anchor="Security">
      <!-- All drafts are required to have a security considerations section. See RFC 3552 for a guide. -->
      <name>Security Considerations</name>
      <section>
        <name>Security issue</name>
        <t>
          This scheme only modifies the Flow Label field of the IPv6 header, which is performed by the ingress network
          device. It does not involve altering the packet payload and does not affect end-to-end application-layer
          security (e.g., IPsec).  The modification does not change IP addresses or port numbers, thus imposing no
          additional processing burden on existing stateful firewalls or NAT devices.
        </t>
        <t>
          However, as noted in <xref target="RFC6437"/>, the Flow Label is an unprotected field that could be modified en route. Since
          the ingress network device is a trusted infrastructure element within the network operator's domain, the risk
          of malicious Flow Label modification is confined to the same trust boundary as other network devices.
        </t>
      </section>
      <section>
        <name>Compatibility issue</name>
        <t>
          End-to-End Protocol: The receiving device typically ignores the Flow Label field, making the scheme completely
          transparent to terminals that support standard IPv6.
        </t>
        <t>
          Intermediate Devices: All network devices supporting the IPv6 Flow Label field can benefit from this scheme.
          For legacy devices that do not support the Flow Label, they can still forward packets based on the traditional
          5-tuple. The scheme will not cause connectivity issues, but the full performance benefits will not be realized.
        </t>
        <t>
          Hardware-Friendly Implementation: The CRC32 algorithm is widely supported in existing network ASICs.
          Implementing the required logic (parsing BTH/DETH headers, performing the hash, and modifying the Flow Label)
          is relatively straightforward and requires minimal changes to existing hardware.
        </t>
      </section>
    </section>
    
    <!-- NOTE: The Acknowledgements and Contributors sections are at the end of this template -->
  </middle>

  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6437.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6438.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7098.xml"/>
        <!-- The recommended and simplest way to include a well known reference -->
        
      </references>
    </references>
    
    <section anchor="Contributors" numbered="false">
      <!-- [REPLACE/DELETE] a Contributors section is optional -->
      <name>Contributors</name>
      <t>Thanks to all the contributors.</t>
      <!-- [CHECK] it is optional to add a <contact> record for some or all contributors -->
    </section>
    
 </back>
</rfc>
