<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC0768 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0768.xml">
<!ENTITY RFC0791 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0791.xml">
<!ENTITY RFC1122 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1122.xml">
<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC8200 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8200.xml">
<!ENTITY RFC9293 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9293.xml">
<!ENTITY RFC2991 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2991.xml">
<!ENTITY RFC2992 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2992.xml">
<!ENTITY RFC6335 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6335.xml">
<!ENTITY RFC7413 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7413.xml">
]>


<rfc ipr="trust200902" docName="draft-cmcc-asrp-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>Available Session Recovery Protocol</title>

    <author initials="Z." surname="Luo" fullname="Zhaoyu Luo" role="editor">
      <organization>CMCC</organization>
      <address>
        <postal>
          <street>No. 58 Kunlunshan Road</street>
          <city>Suzhou</city>
          <code>215000</code>
          <country>China</country>
        </postal>
        <email>luozyq@qq.com</email>
      </address>
    </author>

    <date year="2025" month="December" day="18"/>

    <area>Applications</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 56?>

<t>This document describes an experimental protocol named the Available Session Recovery Protocol (ASRP). The protocol aims to optimize high-availability network cluster architectures, providing a superior cluster high-availability solution for stateful network services such as load balancing and Network Address Translation (NAT). ASRP defines the procedures for session backup and recovery, along with the message formats used in interactions, enabling efficient and streamlined session state management.</t>

<t>Unlike traditional high-availability technologies that back up session states within the cluster, the core innovation of ASRP lies in distributing state information to clients or servers. This approach offers multiple advantages, significantly enhancing the cluster&#39;s elastic scaling capability; supporting rapid recovery from single-point or even multi-point failures; reducing resource redundancy by eliminating centralized backup nodes; and substantially simplifying cluster implementation complexity.</t>

<t>The ASRP protocol provides network clusters with ultimate elastic scalability, facilitating the implementation and deployment of large-scale elastic network clusters.</t>



    </abstract>



  </front>

  <middle>


<?line 64?>

<section anchor="introduction"><name>Introduction</name>

<t>Traditional high-availability network cluster architectures, such as active-standby or hierarchical models, rely on session state synchronization and backup within the cluster nodes. While these architectures are functionally complete, they face challenges in the cloud era, including limited flexibility in elastic scaling, resource redundancy, and high implementation complexity.</t>

<t>The Available Session Recovery Protocol (ASRP) proposes an innovative approach aimed at building a simpler, more efficient, and more elastic high-availability solution for stateful services. Its core idea fundamentally shifts the paradigm by distributing the backup of network session state information to the endpoints of the session---clients or servers---rather than within the cluster. This allows network service nodes in the cluster (such as load balancers or NAT devices) to quickly retrieve and reconstruct session states from endpoints during failure recovery or scaling, thereby logically achieving &quot;stateless&quot; nodes.</t>

<t>Based on this concept, ASRP designs corresponding session backup and recovery mechanisms. The backed-up session state is strictly synchronized with the lifecycle of the actual network session---it becomes effective upon session establishment and is cleared upon session termination. This eliminates the need for independent keep-alive or timeout management, ensuring the timeliness and availability of the backup information.</t>

<t>Another key design goal of ASRP is to improve the efficiency of session backup. The protocol ingeniously utilizes in-band original data packets carrying service traffic to transmit session state information, embedding it into the payload of packets such as those in the TCP three-way handshake (<xref target="RFC9293"/> <xref target="RFC1122"/>). This approach avoids the overhead of generating additional control packets for state synchronization in most cases. While its implementation shares similarities with TCP Fast Open (TFO, <xref target="RFC7413"/>), it remains fully transparent to the application layer.</t>

<t>The highly available network cluster built on ASRP significantly enhances the cluster&#39;s elastic scaling capabilities, supports rapid recovery from single-point or even multi-point failures, and reduces resource consumption and implementation complexity by eliminating centralized backup nodes. These characteristics make ASRP particularly suitable for network environments that require frequent elastic scaling, prioritize efficient resource utilization, and pursue high service stability, providing a robust solution for the implementation and deployment of large-scale network clusters.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
   &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and
   &quot;OPTIONAL&quot; 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 anchor="protocol-overview"><name>Protocol Overview</name>

<section anchor="core-concepts"><name>Core Concepts</name>

<section anchor="two-operational-modes"><name>Two Operational Modes</name>

<t>For the ASRP protocol to function properly, all network nodes within the cluster must first deploy service programs that support the ASRP protocol. Additionally, the clients or servers responsible for backing up sessions must deploy EBPF modules or kernel modules that support the ASRP protocol. Whether these modules are deployed on the client side or the server side corresponds to the two operational modes of the ASRP protocol, respectively:</t>

<section anchor="passive-psv-mode"><name>Passive (PSV) Mode</name>

<t>In Passive (PSV) mode, the network nodes and the servers are typically located within the same trusted network domain (e.g., inside a data center). The network nodes back up session state information to the servers and recover sessions from the servers when needed. This mode requires both the network nodes and the servers to support the ASRP protocol. Typical application scenarios include traditional load balancers that provide services through a Virtual IP (VIP), or NFV load balancing network elements offering cloud load balancing services.</t>

</section>
<section anchor="active-act-mode"><name>Active (ACT) Mode</name>

<t>In Active (ACT) mode, the network nodes are typically located within the same trusted network domain as the clients (e.g., a corporate intranet). The network nodes back up session state information to the clients and recover sessions from the clients when needed. This mode requires both the network nodes and the clients to support the ASRP protocol. Typical application scenarios include Source Network Address Translation (SNAT) scenarios (such as internal network devices accessing the internet through an SNAT gateway) or NFV SNAT network elements providing cloud SNAT services.</t>

</section>
</section>
<section anchor="two-path-models"><name>Two Path Models</name>

<section anchor="symmetric-routing"><name>Symmetric Routing</name>
<figure title="Symmetric Routin" anchor="Symmetric-Routing"><artwork><![CDATA[
                             Elastic
                             Stateful
                             Cluster
                       +------------------+
+----------+           |       ...        |           +----------+
|          |           |  +------------+  |           |          |
|  Client  | <----------> |   node X   | <----------> |  Server  |
|          |           |  +------------+  |           |          |
+----------+           |       ...        |           +----------+
                       +------------------+
]]></artwork></figure>

<t>As shown in Figure 1, symmetric routing refers to a path model in which the bidirectional traffic of the same session between a client and a server is always routed to the same node within the cluster. This path consistency is the foundation for the proper functioning of stateful network services (such as NAT and firewalls), ensuring that a single node maintains and processes the complete session state information.</t>

<t>Typical examples that demonstrate symmetric routing include,</t>

<t><list style="numbers" type="1">
  <t>Active-Standby High Availability Architecture  <vspace blankLines='1'/>
In this model, all traffic for a specific session is always handled and maintained by the primary node (e.g., NAT mapping tables, firewall session states). The standby node remains on standby and only takes over when the primary node fails. This architecture inherently ensures symmetric routing of traffic to the primary node.</t>
  <t>Stateful Load Balancing Cluster with a &quot;Same-Source-Same-Destination&quot; Mechanism  <vspace blankLines='1'/>
In this modern extended architecture, network devices (such as OVS or routers) use a &quot;same-source-same-destination&quot; policy to ensure that all packets belonging to the same connection are directed to the same load balancing node, thereby maintaining symmetric routing in a distributed environment.</t>
</list></t>

</section>
<section anchor="asymmetric-routing"><name>Asymmetric Routing</name>
<figure title="Asymmetric Routin" anchor="Asymmetric-Routing"><artwork><![CDATA[
                             Elastic
                             Stateful
                             Cluster
                       +------------------+
                       |       ...        |
+----------+           |  +------------+  |           +----------+
|          | -----------> |   node X   | -----------> |          |
|          |           |  +------------+  |           |          |
|  Client  |           |       ...        |           |  Server  |
|          |           |  +------------+  |           |          |
|          | <----------- |   node Y   | <----------- |          |
+----------+           |  +------------+  |           +----------+
                       |       ...        |
                       +------------------+
]]></artwork></figure>

<t>The bidirectional traffic of the same session may be routed to different nodes within the cluster. Specifically, requests sent from the client to the server may be processed by node X, while responses sent from the server to the client may be processed by node Y. This path inconsistency requires two or more nodes to collaboratively maintain the state information of the same session, posing new challenges to the failure recovery mechanisms of stateful service clusters.</t>

<t>In cloud network environments, asymmetric routing is an extremely common and often default phenomenon. Taking NFV element clusters that require elastic scaling as an example, one of the core goals of their architectural design is to allow nodes to independently and flexibly scale horizontally. In such distributed architectures, without deploying specific traffic steering strategies like &quot;same-source-same-destination,&quot; underlying network devices (such as switches or load balancers) typically distribute traffic naturally and evenly across multiple available nodes based on mechanisms like ECMP (Equal-Cost Multi-Path <xref target="RFC2991"/>, <xref target="RFC2992"/>), thereby commonly forming asymmetric routing.</t>

</section>
</section>
</section>
<section anchor="protocol-message"><name>Protocol Message</name>

<t>ASRP achieves distributed backup and on-demand recovery of session state information by exchanging specific protocol messages among clients, servers, and network nodes (such as load balancers and NAT devices). In load balancing scenarios, session states are backed up to individual servers; in Source NAT (SNAT) scenarios, session states are backed up to individual clients.</t>

<section anchor="new-session-message-ns"><name>New session message (NS)</name>

<t>Generated by the network node, it is used to send the initial state information of a session to the designated client (in ACT mode) or server (in PSV mode) for backup when a new session is created. The NS message can be inserted into the original service packet for transmission or independently encapsulated and transmitted.</t>

</section>
<section anchor="hello-session-message-hs"><name>Hello session message (HS)</name>

<t>Generated by the client, it is used in ACT mode to declare its support for the ASRP protocol to the network node and to trigger the network node to return an NS message to complete session backup. The message also supports in-band or independent transmission.</t>

</section>
<section anchor="query-session-message-qs"><name>Query session message (QS)</name>

<t>Generated by the network node, it is used to query the backup party (client or server) for session status when a packet is received from the end where the session is backed up but cannot match a local session. This message is typically transmitted by modifying and echoing the original packet.</t>

</section>
<section anchor="recover-session-message-rs"><name>Recover session message (RS)</name>

<t>Generated as a response to the QS message by the client or server holding the backup, it contains the state information required to recover the session. The network node parses the RS message and reconstructs the local session, thereby achieving failure recovery.</t>

</section>
<section anchor="encap-nsqsrs-message-enseqsers"><name>Encap NS/QS/RS message (ENS/EQS/ERS)</name>

<t>When a packet received by the network node originates from a client or server that does not hold the backup of the session, ASRP messages cannot be transmitted simply by modifying the original packet. Instead, the ASRP message must be encapsulated in a new packet for transmission. In such cases, ASRP defines a format for encapsulating NS, QS, or RS messages within UDP (<xref target="RFC0768"/>) packets for transmission, referred to as ENS, EQS, and ERS messages, respectively.</t>

</section>
</section>
<section anchor="message-flows-and-session-recovery-scenarios"><name>Message Flows and Session Recovery Scenarios</name>

<t>This section elaborates on, through a series of typical scenarios, how the ASRP protocol achieves session backup and recovery via message interaction in the event of network node failures under different operational modes. Each scenario details the involved protocol message flows and the processing steps of each entity.</t>

<section anchor="psv-mode-creationrecovery-scenarios"><name>PSV Mode Creation/Recovery Scenarios</name>

<section anchor="scenario-1-direct-session-creation"><name>Scenario 1, direct session creation</name>

<figure title="direct session creation" anchor="PSV-Mode-Scenario-1"><artwork><![CDATA[
                            Elastic
                            Stateful
                            Cluster
+----------+            +-------------+                 +----------+
|          | --1:PKT--> |             | -----2:NS-----> |          |
|          |            |             |                 |          |
|  client  |            |    Nodes    |                 |  server  |
|          |            |             |                 |          |
|          | <--4:PKT-- |             | <-----3:RS----- |          |
+----------+            +-------------+                 +----------+

                      a. recv PKT                    a. recv NS
                      b. new SESS                    b. new/get SESS
                      c. FWD NS                      c. send RS
                      d. recv RS
                      e. new/update SESS
                      f. FWD PKT
]]></artwork></figure>

<t>This scenario describes the processing flow when a network node receives a packet that explicitly triggers the establishment of a new session. The most common example is the TCP SYN packet during connection establishment, which indicates that the client is initiating a new connection. Additionally, upon receiving a DNS request packet, the network node may also directly proceed with creating a new session. For convenience, subsequent descriptions will use the TCP SYN packet as the representative example of such packets, without elaborating on other similar packet types.</t>

<t>The processing flow is as follows,</t>

<t><list style="numbers" type="1">
  <t><strong>Client sends a packet</strong>: The client sends a packet (e.g., a TCP SYN packet) to the server.</t>
  <t><strong>Network node processes and forwards</strong>: Upon receiving this packet, if no matching existing session is found, the network node directly creates a new session. Subsequently, the network node generates an NS (New Session) message, embeds it into the payload of the original packet to form an NS packet, and forwards it to the selected server.</t>
  <t><strong>Server responds</strong>: After receiving the NS packet, the server parses the NS message and creates or retrieves the corresponding session state based on its content. The server then generates an RS (Recover Session) message, embeds it into the payload of its response packet (e.g., TCP SYN-ACK) to form an RS packet, and sends it back to the network node.</t>
  <t><strong>Network node completes session establishment</strong>: Upon receiving the RS packet, the network node parses the RS message and uses the information within it to finalize the establishment or update of the local session. Next, the network node removes the RS message from the packet, restores the original service response packet, and forwards it to the client.</t>
</list></t>

<t>At this point, the session is successfully established, and subsequent packets can be forwarded normally based on this session.</t>

</section>
<section anchor="scenario-2-session-recovery-triggered-by-server"><name>Scenario 2, session recovery triggered by server</name>

<figure title="session recovery triggered by server" anchor="PSV-Mode-Scenario-2"><artwork><![CDATA[
                            Elastic
                            Stateful
                            Cluster
+----------+             +-------------+                +----------+
|          |             |             | <----1:PKT---- |          |
|          |             |             |                |          |
|  client  | <--4:PKT--- |    Nodes    | -----2:QS----> |  server  |
|          |             |             |                |          |
|          |             |             | <----3:RS----- |          |
+----------+             +-------------+                +----------+

                         a. recv PKT                    a. send PKT
                         b. no SESS                     b. recv QS
                         c. reply QS                    c. get SESS
                         d. recv RS                     d. reply RS
                         e. new SESS
                         f. FWD PKT
]]></artwork></figure>

<t>The server first sends the original packet (PKT) to the client. Upon receiving this packet, the network node checks its local session table. If no corresponding session is found, the node does not forward the packet directly to the client. Instead, it attempts to insert a QS message into the original packet, swaps the source and destination addresses and ports to form a QS packet, and sends it back to the server.
After receiving the QS packet, the server looks up the corresponding session state, generates an RS message to replace the QS message in the packet, swaps the source and destination addresses and ports again to form an RS packet, and returns it to the network node.
Upon receiving the RS packet, the network node parses the RS message, creates a new session state based on the message content, removes the RS message from the packet, and then forwards the original packet to the client.</t>

<t>This scenario describes the recovery process when a server actively sends a packet to the client, but the intermediate network node cannot find the corresponding session.</t>

<t>The processing flow is as follows,</t>

<t><list style="numbers" type="1">
  <t><strong>Server sends a packet</strong>: The server first sends an original packet (PKT) to the client.</t>
  <t><strong>Network node queries the session</strong>: Upon receiving this packet, the network node checks its local session table. If no corresponding session is found, it does not forward the packet directly but initiates the recovery process. The network node generates a QS (Query Session) message, inserts it into the received packet, swaps the source and destination addresses and ports of the packet to form a QS packet, and sends it back to the server.</t>
  <t><strong>Server responds to the query</strong>: After receiving the QS packet, the server looks up the locally stored corresponding session state based on the message content, generates an RS (Recover Session) message, and uses it to replace the QS message in the packet. The server then swaps the source and destination addresses and ports of the packet again to form an RS packet and sends it back to the network node.</t>
  <t><strong>Network node recovers and forwards</strong>: Upon receiving the RS packet, the network node parses the RS message and creates a new local session based on this information. Subsequently, the network node removes the RS message from the packet, restores the original packet (PKT) initially sent by the server, and forwards it to the client.</t>
</list></t>

<t>At this point, the session is successfully recovered, and the communication link is reestablished.</t>

</section>
<section anchor="PSV-Scenario3"><name>Scenario 3: probe-based session creation/recovery</name>

<figure title="probe-based session creation/recovery" anchor="PSV-Mode-Scenario-3"><artwork><![CDATA[
                            Elastic
                            Stateful
                            Cluster
+----------+             +-----------+                +------------+
|          |             |           | ----2:EQS----> |    ...     |
|          |             |           | <---3:ERS----- |    ...     |
|          | ---1:PKT--> |           |     ...        | +--------+ |
|          |             |           | ----4:PKT----> | | server | |
|          |             |  elastic  |     ...        | +--------+ |
|  client  |             |  stateful | ----2':EQS---> |    ...     |
|          |             |  cluster  | <---3':ERS---- | +--------+ |
|          |             |           |                | | server | |
|          | <--8:PKT--- |           | -----5:ENS---> | +--------+ |
|          |             |           | <----6:ERS---- |    ...     |
|          |             |           | <----7:RS----- |    ...     |
+----------+             +-----------+                +------------+

                      a. recv PKT                    a. recv EQSs
                      b. no SESS                     b. reply ERSs
                      c. send EQSs                   c. recv PKT/ENS
                      d. recv ERSs                   d. new SESS
                      e. new/recover SESS            e. reply ERS
                      f. send PKT/ENS                f. send RS
                      g. recv RS/ERS
                      h. FWD PKT
]]></artwork></figure>

<t>This scenario describes the processing flow in PSV mode when a network node receives a client packet that neither directly triggers the creation of a new session (e.g., a non-TCP SYN packet) nor matches any existing session. In this case, the network node first needs to determine whether the packet belongs to an existing session. To achieve this, a probing mechanism based on the Deterministic Bucket Mapping Consistent Hash (DBMCH) algorithm is employed.</t>

<t>The processing flow is as follows,</t>

<t><list style="numbers" type="1">
  <t><strong>Network Node Receives Packet and Performs Lookup</strong>: The network node receives an original packet (PKT) from the client and checks its local session table. If no matching session is found, the network node uses the DBMCH algorithm to compute a set of potential servers (typically small in number) corresponding to the packet&#39;s 5-tuple.</t>
  <t><strong>Parallel Probing Queries</strong>: The network node generates EQS (Encapsulated Query Session) messages and sends them to each candidate server in the set in parallel to probe for the existence of a corresponding session.</t>
  <t>**Server Responses to Probes  <vspace blankLines='1'/>
If a server has the session: That server will reply with an ERS (Encapsulated Recover Session) message containing the state information needed to recover the session.  <vspace blankLines='1'/>
If none of the servers has a corresponding session: The process proceeds to the new session creation flow.</t>
  <t><strong>Network Node Processes Probe Results</strong>  <vspace blankLines='1'/>
<strong>Case A</strong>: Successful Session Recovery: If the network node receives a valid ERS message from a server, it uses the information therein to recover the session locally. Subsequently, the original packet (PKT) is forwarded to that server based on the recovered session (corresponding to step 4 in the diagram).  <vspace blankLines='1'/>
<strong>Case B</strong>: New Session Required: If all EQS probes return responses indicating no session, the network node creates a new session and selects a server for it via the DBMCH algorithm. The network node then generates an ENS (Encapsulated New Session) message and sends it to the selected server (step 5).</t>
  <t><strong>Server Acknowledgment and Response</strong>: Upon receiving the ENS message, the server creates a locally associated session and replies with an ERS message carrying no service data as an acknowledgment (step 6). In cases of asymmetric routing, the first service packet (PKT) sent from the server to the client will also carry an RS (Recover Session) message (step 7) to allow other nodes along the path to recover the session.</t>
  <t><strong>Final Packet Forwarding</strong>: Upon receiving the service packet carrying the RS message, the network node parses and extracts the session state, removes the RS message from the packet, and forwards the restored original packet to the client (step 8).</t>
</list></t>

<t><strong>Technical Notes</strong>:</t>

<t><list style="symbols">
  <t><strong>Reason for using ENS/EQS/ERS</strong>: In this scenario, the IP addresses used for communication between the network node and the servers may be completely different from those in the original packet. Therefore, NS/QS/RS messages need to be encapsulated within UDP packets (i.e., as ENS/EQS/ERS) to ensure routing reachability.</t>
  <t><strong>Algorithm Choice</strong>: The DBMCH algorithm maintains the mapping of all existing sessions unchanged when the number of servers changes, thereby minimizing session disruption caused by scaling. Its principles are detailed in Appendix A.</t>
</list></t>

</section>
</section>
<section anchor="act-mode-creationrecovery-scenarios"><name>ACT Mode Creation/Recovery Scenarios</name>

<section anchor="ACT-Scenario1"><name>Scenario 1: session creation, session recovry triggered by server</name>

<figure title="session creation, session recovry triggered by server" anchor="ACT-Mode-Scenario-1"><artwork><![CDATA[
                                Elastic
                                Stateful
                                Cluster
+----------+                +-------------+             +----------+
|          | -----1:HS----> |             |             |          |
|          |                |             | ---3:PKT--> |          |
|          | <----2:NS----- |             |             |          |
|          |                |             |             |          |
|  client  |                |    Nodes    |             |  server  |
|          |                |             |             |          |
|          | <----5:PKT---- |             | <--4:PKT--- |          |
|          | <---5':EQS---- |             |             |          |
|          | ----6':ERS---> |             |             |          |
+----------+                +-------------+             +----------+

a. send HS                  a. recv HS
b. recv NS                  b. new session
c. store NS                 c. reply NS
d. recv PKT/EQS             d. recv PKT
e. reply ERS                e. no SESS
                            f. send EQS
                            g. recv ERS
                            h. FWD PKT
]]></artwork></figure>

<t>In ACT mode, the client first sends a packet containing an HS message to the network node, declaring its support for the ASRP protocol. Upon receiving the HS message, the network node follows the normal procedure to create a new session and should immediately return an NS message to the client to back up the newly created session to the client.</t>

<t>In ACT mode, when a response packet from the server does not match any session, the session needs to be queried from the client. The network node faces the challenge of determining which client to query. To simplify implementation, ASRP recommends using a fixed mapping to locate the client.</t>

<t>This scenario describes the complete process in ACT mode, from session creation to the handling triggered by server response packets. Depending on whether the session exists on the network node, the processing path diverges into two branches.</t>

<t>Processing Flow:</t>

<t><list style="numbers" type="1">
  <t><strong>Capability Declaration and Session Creation</strong>: When initiating a new session, the client first sends a packet containing an HS (Hello Session) message to the network node, declaring its support for ASRP. Upon receiving the HS message, the network node creates a new session following the normal procedure and immediately generates an NS (New Session) message to return to the client, thereby completing the backup of the session state on the client side.</t>
  <t><strong>Service Request Forwarding</strong>: The network node forwards the original request packet (PKT) used to establish the session to the server.</t>
  <t><strong>Server Response</strong>: After processing the request, the server sends a response packet (PKT) back to the network node.</t>
  <t><strong>Network Node Processes the Response (Branching Occurs)</strong>  <vspace blankLines='1'/>
<strong>Path A (Session Exists, Step 5)</strong>: If the network node successfully finds a matching session locally, it directly forwards the server&#39;s response packet (PKT) to the client according to the session&#39;s forwarding rules. This is the normal forwarding path.  <vspace blankLines='1'/>
<strong>Path B (Session Lost, Steps 5&#39; and 6&#39;)</strong>: If the network node loses the session due to reasons such as a reboot or failure and cannot find a match, the recovery process is triggered. At this point, the network node generates an EQS (Encapsulated Query Session) message (which may encapsulate the original response packet or be sent separately) and sends it to the corresponding client through a fixed mapping relationship (e.g., port mapping in SNAT scenarios).</t>
  <t><strong>Client Assists in Recovery</strong>: Upon receiving the EQS message, the client queries its locally stored session backup and replies with an ERS (Encapsulated Recover Session) message containing the session state to the network node. If the EQS message encapsulates the original packet, the network node&#39;s ASRP module, after processing the EQS message, processes the original packet according to the session and then submits it to the normal packet processing module.</t>
  <t><strong>Recovery and Completion of Forwarding</strong>: After receiving the ERS message, the network node restores the session state locally.</t>
</list></t>

<t><strong>Technical Notes</strong>:</t>

<t><list style="symbols">
  <t><strong>Processing Path Branching</strong>: This scenario clearly illustrates the two key branches when the network node processes server response packets in ACT mode: Fast Forwarding (session exists) and Query Recovery (session lost).</t>
  <t><strong>Flexibility of EQS Messages</strong>: EQS messages can be sent independently or encapsulate the original packet, providing flexibility in balancing protocol overhead and processing efficiency.</t>
  <t><strong>Core Mapping Mechanism</strong>: Unlike during session creation where the client is known, in the recovery phase, the network node must be able to deterministically locate the client that backed up the session. ASRP recommends using a static, configurable mapping strategy as the foundation for achieving efficient and reliable recovery. If such a mapping cannot be established, it is not recommended to use ASRP in this scenario. For SNAT services, ports can typically be used to map clients. Different clients use configurable, distinct port ranges. When a server packet arrives at the network node, the network node can locate the client through the destination port.</t>
  <t><strong>Design Choice</strong>: Unlike some mechanisms that rely on keep-alive timers to trigger recovery, ASRP adopts an on-demand query approach. This avoids the additional latency or packet overhead introduced by timer interval settings, enabling fast and precise recovery.</t>
</list></t>

</section>
<section anchor="scenario-2-recover-session-triggered-by-client"><name>Scenario 2: recover session triggered by client</name>

<figure title="recover session triggered by client" anchor="ACT-Mode-Scenario-2"><artwork><![CDATA[
                              Elastic
                              Stateful
                              Cluster
+----------+              +-------------+               +----------+
|          | ---1:PKT---> |             |               |          |
|          |              |             |               |          |
|          |              |             |               |          |
|  client  | <---2:QS---- |    Nodes    | ----4:PKT---> |  server  |
|          |              |             |               |          |
|          |              |             |               |          |
|          | ----3:RS---> |             |               |          |
+----------+              +-------------+               +----------+

a. send PKT               a. recv PKT
b. recv QS                b. no SESS
c. got SESS               c. reply QS
d. replay RS              d. recv RS
                          e. new SESS
                          f. FWD PKT
]]></artwork></figure>

<t>This scenario describes the recovery process in ACT mode when a client actively sends a data packet to the server, but the network node has lost the corresponding session.</t>

<t>The processing flow is as follows:</t>

<t><list style="numbers" type="1">
  <t><strong>Client Sends a Packet</strong>: The client sends a data packet (PKT) to the server.</t>
  <t><strong>Network Node Triggers a Query</strong>: Upon receiving this packet, the network node checks its local session table. If no matching session is found (and the packet does not contain an HS message), it generates a QS (Query Session) message, inserts it into the received packet, and swaps the source and destination addresses and ports of the packet to form a QS packet. It then sends this QS packet back to the client (i.e., the packet&#39;s originator).</t>
  <t><strong>Client Replies with State</strong>: After receiving the QS packet, the client queries its locally stored backup of the corresponding session, generates an RS (Recover Session) message, and uses it to replace the QS message in the packet. The client then swaps the source and destination addresses and ports of the packet again to form an RS packet and sends it back to the network node.</t>
  <t><strong>Network Node Recovers and Forwards</strong>: Upon receiving the RS packet, the network node parses the RS message and uses the information to create a new session locally. Subsequently, the network node removes the RS message from the packet, restores the original data packet (PKT) initially sent by the client, and forwards it normally to the server.</t>
</list></t>

<t>At this point, the session is successfully recovered, and the request path from the client to the server is reestablished.</t>

</section>
</section>
</section>
</section>
<section anchor="protocol-details"><name>Protocol Details</name>

<section anchor="message-formats"><name>Message Formats</name>

<t>The ASRP protocol defines two types of protocol markings, multiple message types, and their associated packet formats. All messages are encoded using a TLV (Type-Length-Value) structure. All numeric fields use network byte order (big-endian).</t>

<t>All ASRP messages consist of the following five parts:</t>

<t><list style="numbers" type="1">
  <t><strong>Type</strong>: 1 byte, used to uniquely identify different ASRP messages.</t>
  <t><strong>Flags</strong>: 1 byte, indicating message attributes. Two flag bits are currently defined:  <vspace blankLines='1'/>
<strong>ASRP_F_ACT (0x1)</strong>: If set, indicates the message belongs to ACT mode; otherwise, it belongs to PSV mode.  <vspace blankLines='1'/>
<strong>ASRP_F_MSG (0x2)</strong>: If set, indicates this message is transmitted independently (not together with the original service packet); otherwise, it indicates the message is embedded within the original service packet for transmission.</t>
  <t><strong>Length</strong>: 2 bytes, representing the total length of the entire ASRP message (including the header).</t>
  <t><strong>Session-Tuple</strong>: Carries the address and port information of the session. Its length depends on the address type (<xref target="RFC0791"/> <xref target="RFC8200"/>):  <vspace blankLines='1'/>
<strong>IPv4</strong>: Contains source IPv4 address, destination IPv4 address, source port, and destination port, totaling 12 bytes.  <vspace blankLines='1'/>
<strong>IPv6</strong>: Contains source IPv6 address, destination IPv6 address, source port, and destination port, totaling 36 bytes.</t>
  <t>Session-Data: A variable-length field that carries the private state information of the network node. Its specific content is implementation-defined.</t>
</list></t>

<section anchor="asrp-marking"><name>ASRP Marking</name>

<t>ASRP messages are placed before the packet data. In actual transmission, not all packets carry ASRP messages, so a marker---referred to as ASRP Marking---needs to be added to the packet to quickly determine whether it contains an ASRP message.</t>

<t>For the TCP protocol, a new TCP option can be defined in the TCP header to indicate that an ASRP message is located at the beginning of the TCP data. The newly added TCP option type is TCPOPT_ASRP(60), with a length of 2. Its format is as follows:</t>

<figure title="ASRP TCP Option" anchor="ASRP-TCP-OPT"><artwork><![CDATA[
                   0                   1
                   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
                  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                  |    Kind       |     Length    |
                  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>For other transport-layer protocols, similar to the Proxy Protocol, a 12-byte ASRP magic value is used at the beginning of the data: 0x0D 0x0A 0x0D 0x0A 0x00 0x0D 0x0A 0x41 0x53 0x52 0x50 0x0A</t>

<t>This magic value contains a CRLF pattern, a null byte, and the specific ASCII sequence ASRP. The probability of this sequence occurring in normal data streams is less than 2^{-96}, making it easy to debug and identify: during packet capture analysis, the clear ASRP identifier is visible.</t>

<t>After an ASRP message is inserted into a packet, ASRP Marking must be applied to the packet. This is the default operation and will not be reiterated in subsequent discussions.</t>

</section>
<section anchor="ns-message-format"><name>NS message format</name>

<t>The NS message is used by the network node to back up session state information to the client or server. There are two types of NS messages, corresponding to IPv4 and IPv6 respectively.</t>

<t>Type Assignments:</t>

<t>ASRP_NS4 = 1 (IPv4)</t>

<t>ASRP_NS6 = 2 (IPv6)</t>

<t>NS (IPv4) Message Format:</t>

<figure title="ASRP NS(IPv4) Message format" anchor="ASRP-NS-MSG"><artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Type      |       Mode     |           Length              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Source IP (IPv4)                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      Destination IP (IPv4)                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Source Port          |       Destination Port        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                         Session-Data                          ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>NS (IPv6) Message Format:</t>

<t>The structure of IPv6 NS messages is the same as IPv4, with the main difference being the IP address length in the Session-Tuple field. IPv6 uses 128-bit addresses, so both Source IP and Destination IP occupy 16 octets each, expanding the entire Session-Tuple field to 36 octets.</t>

<t>The NS message is inserted before the original packet data. The packet carrying the NS message is referred to as an NS packet, and its format is as follows:</t>

<figure title="ASRP NS Packet format" anchor="ASRP-NS-PKT"><artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                           PKT-Header                          ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                           NS message                          ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                            PKT-DATA                           ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>In PSV mode, the NS message is inserted into the original packet, and the source and destination addresses remain unchanged. The NS packet is then forwarded to the server.</t>

<t>In ACT mode, the NS message is inserted into a newly allocated packet. The source and destination addresses and ports of the original packet are copied and swapped, and the NS packet is returned to the client.</t>

<t>It is important to note that the NS message internally contains only one Session-Tuple. However, a session on a network node requires two Session-Tuples, representing the connections between the network node and the client, and between the network node and the server, respectively. To improve transmission efficiency, ASRP extracts the other Session-Tuple directly from the packet header of the NS message packet. Similarly, QS and RS messages also require extracting the other Session-Tuple from the message packet header. This will not be elaborated on further in subsequent sections.</t>

</section>
<section anchor="hs-message-format"><name>HS message format</name>

<t>The HS message is sent by the client during the initial connection establishment phase to declare its support for the ASRP protocol capability to the network node.</t>

<t>Type Assignment:</t>

<t>ASRP_HS = 3</t>

<figure title="ASRP HS Message format" anchor="ASRP-HS-MSG"><artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Type       |      Mode     |            Length             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>The HS message is inserted at the beginning of the original packet data. The packet carrying the HS message is referred to as an HS packet, and its format is similar to that of the NS packet, with the only difference being the type of message it carries.</t>

</section>
<section anchor="query-session-qs-message-format"><name>Query Session (QS) message format</name>

<t>The QS message is used by the network node to query session information.</t>

<t>In PSV mode, if the network node receives a packet from the server and cannot find a matching session, it uses the QS message to query the server for the session.</t>

<t>In ACT mode, if the network node receives a packet from the client, and the packet does not contain an HS message while no matching session is found, it uses the QS message to query the client for the session.</t>

<t>Type Assignment:</t>

<t>ASRP_QS = 4</t>

<t>The QS message format is identical to HS message, differing only in the type identifier.</t>

<t>The QS message is inserted before the original packet data, and the source and destination addresses and ports are swapped (in order to return the QS message to the client or server that backs up the session). The packet carrying the QS message is referred to as a QS packet, and its format is similar to that of the NS packet, with the only difference being the type of message it carries.</t>

</section>
<section anchor="recover-session-rs-message-format"><name>Recover Session (RS) message format</name>

<t>The RS message is used to recover the network node session. There are three types of RS messages, corresponding respectively to IPv4 sessions, IPv6 sessions, and null sessions.</t>

<t>Type Assignments:</t>

<t>ASRP_RS4 = 5 (IPv4)</t>

<t>ASRP_RS6 = 6 (IPv6)</t>

<t>ASRP_RSN = 7 (null)</t>

<t>When the RS message type is <spanx style="verb">ASRP_RS4</spanx> or <spanx style="verb">ASRP_RS6</spanx>, its message format is identical to the NS message of the corresponding IP version, differing only in the type identifier.</t>

<t>When the RS message type is <spanx style="verb">ASRP_RSN</spanx>, the message length is 4 bytes, indicating that the message does not contain information for session recovery (i.e., a null session). Its message format is similar to that of the HS message.</t>

<t>The RS message is the response to the QS message. The packet carrying the QS message is referred to as a QS packet, and its format is similar to that of the NS/HS packet, with the only difference being the type of message it carries.</t>

</section>
<section anchor="enseqsers-message-format"><name>ENS/EQS/ERS message format</name>

<t>When the packet received by the network node originates from a client or server that does not back up the session, the original destination address of the original packet may differ entirely from that of the ASRP message packet. Therefore, encapsulation is required before transmission. ASRP employs a UDP encapsulation format to encapsulate NS/QS/RS message packets. The encapsulated NS/QS/RS messages are referred to as ENS/EQS/ERS messages.</t>

<t>The format of the ENS/EQS/ERS message packet is as follows:</t>

<t>IP + UDP + NS/QS/RS Packet</t>

<figure title="ASRP ENS/EQS/ERS Packet format" anchor="ASRP-ENCAP-PKT"><artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                      Encap IP + UDP Header                    ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                        NS/QS/RS Packet                        ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>The source and destination addresses in the Encap IP header ensure the normal delivery of messages between the network node and the client or server. In the Encap UDP header, the source port is adjustable, while the destination port defaults to 55555 (configurable). The receiving end uses the destination port to distinguish between ENS, EQS, and ERS packets.</t>

</section>
</section>
<section anchor="message-processing"><name>Message Processing</name>

<section anchor="asrp-marking-detection"><name>ASRP Marking Detection</name>

<t>For the TCP protocol, the TCP option <spanx style="verb">TCPOPT_ASRP(60)</spanx> is checked. If this option is present, it indicates that the beginning of the data contains an ASRP message.</t>

<t>For other protocols, the magic value at the beginning of the data is matched first. A successful match indicates that an ASRP message follows the magic value.</t>

<t>In subsequent discussions regarding the processing of ASRP messages in packets, it is assumed that ASRP Marking has already been handled and will not be reiterated.</t>

</section>
<section anchor="ns-message-processing"><name>NS Message Processing</name>

<t>In PSV mode, when the network node receives an original packet such as a TCP SYN, it proceeds directly to the session creation flow. After creating the session, it generates an NS message and sends it to the server.</t>

<t>In ACT mode, after creating a session, the network node needs to allocate a new packet, insert the NS message into this new packet, and return the NS packet to the client. Upon receiving the NS message, the client parses its content and stores the session state information locally.</t>

<t><strong>Avoiding IP Fragmentation</strong>:</t>

<t>In PSV mode, the NS message is typically transmitted together with the TCP SYN packet. In ACT mode, the NS message is transmitted independently (not together with the original packet), so the NS packet generally does not exceed the MTU. If inserting the NS message into the original packet would cause it to exceed the MTU, to avoid IP fragmentation, the NS message should be transmitted separately and prioritized, with the <spanx style="verb">Flags</spanx> field set to <spanx style="verb">ASRP_F_MSG</spanx>, followed by the transmission of the original packet. This approach of separate transmission (not combined with the original packet) will be referenced subsequently.</t>

<t><strong>Solutions for NS Message Loss</strong>:</t>

<t>In PSV mode, the NS message is typically bound to the TCP SYN packet. If the packet is lost, reliance is placed on the TCP protocol&#39;s own retransmission mechanism or application-layer retries to resend the packet carrying the NS message.</t>

<t>In ACT mode, if the client does not receive the NS message, its subsequent data packets will continue to carry HS messages. When the network node receives these subsequent HS messages, it must also return an NS message to the client.</t>

</section>
<section anchor="hs-message-processing"><name>HS Message Processing</name>

<t>HS messages are generated only in ACT mode. When a client initiates a new session, it creates an HS message, inserts it into a packet, and sends it to the network node. After sending the HS message, the client waits for an NS message. If the NS message is not received, the client continues to insert the HS message into subsequent packets it sends, thereby prompting the network node to return the NS message.</t>

<t>Upon receiving an HS message, if the network node does not find a matching local session, it creates a session, generates an NS message, and sends it to the client. If the network node receives subsequent HS messages and finds a matching local session, it should also immediately send an NS message to the client.</t>

<t><strong>Avoiding IP Fragmentation</strong>:</t>

<t>Although the HS message is only 4 bytes long, inserting it into the original packet may cause the total size to exceed the MTU. In such cases, the HS message must be sent separately and prioritized, followed by the transmission of the original packet. For the standalone HS message, the <spanx style="verb">Flags</spanx> field should be set to <spanx style="verb">ASRP_F_MSG</spanx> to indicate that the message is not transmitted together with the original packet.</t>

<t><strong>Solution for HS Message Loss</strong>:</t>

<t>All packets sent by the client must carry the HS message until an NS message is received.</t>

</section>
<section anchor="qs-message-processing"><name>QS Message Processing</name>

<t>The QS message is generated by the network node to query sessions.</t>

<t>In PSV mode, when the network node receives a packet from the server and cannot find a matching session, it returns a QS message to the server to query the session.</t>

<t>In ACT mode, when the network node receives a packet from the client and cannot find a matching session (and the packet does not contain an HS message), it returns a QS message to the client to query the session.</t>

<t>The QS message attempts to be inserted into the original packet, after which the source and destination addresses and ports of the original packet are swapped. This allows the QS message and the original packet to be returned together to the client or server. The benefit of this approach is that there is no need to discard or buffer the original packet.</t>

<t><strong>Avoiding IP Fragmentation</strong>:</t>

<t>When inserting the QS message into the original packet, it is necessary not only to check whether the size of the resulting QS packet exceeds the MTU but also to calculate whether the size of the responding RS message packet would exceed the MTU. Since RS messages are generally larger than QS messages, if the calculation indicates that the original packet length of the RS message packet would exceed the MTU, the original packet should be discarded. In this case, the <spanx style="verb">Flags</spanx> field of the QS message should be set to <spanx style="verb">ASRP_F_MSG</spanx> to indicate that the QS message is not transmitted together with the original packet.</t>

<t><strong>Solution for QS Message Loss</strong>:</t>

<t>Subsequent packets continue to generate QS messages, and attempts to recover the session persist.</t>

</section>
<section anchor="rs-message-processing"><name>RS Message Processing</name>

<t>The RS message is generated by either the client or the server and processed by the network node to recover a session.</t>

<t>When the client or server receives a QS message, it looks up the corresponding session state information locally. If found, it returns this information to the network node by converting the QS message. If the corresponding session state information is not found, it returns an RS message indicating a null session.</t>

<t>The method to convert a QS message packet into an RS message is as follows: replace the QS message in the packet with the RS message, and swap the source and destination addresses and ports of the packet.</t>

<t>Upon receiving a non-null RS message, the network node uses the session information within the RS message to recover the session locally.</t>

</section>
<section anchor="enseqsers-message-processing"><name>ENS/EQS/ERS Message Processing</name>

<section anchor="passive-psv-mode-1"><name>Passive (PSV) Mode</name>

<t>When a network node receives a packet from a client, cannot match an existing session, and cannot directly create a new session, it will communicate with the server using ENS/EQS/ERS messages.</t>

<t>PSV EQS/ERS/ENS Flow:</t>

<t><list style="numbers" type="1">
  <t>The network node uses the DBMCH algorithm to determine the candidate server set.</t>
  <t>It sequentially sends EQS messages (encapsulating session queries) to the candidate servers.</t>
  <t>The network node checks the returned ERS messages from the servers. If a session is found, it recovers the session.</t>
  <t>If the network node does not find the session after querying all candidates, it uses an ENS message to create a new session.</t>
  <t>Upon receiving the ENS message, the server returns an ERS message for acknowledgment.</t>
</list></t>

<t>ENS/EQS/ERS messages can be transmitted along with the original packet. To avoid IP fragmentation: If the ENS message packet size exceeds the MTU, send the ENS message separately first; If the EQS/ERS message packet size exceeds the MTU, buffer the original packet and send the EQS/ERS message separately.</t>

<t>Message Loss Handling:</t>

<t><list style="numbers" type="1">
  <t>EQS message loss: A query timeout occurs; the node deletes the associated data and buffered packet (if any).</t>
  <t>ENS message loss: The network node continues to send ENS messages periodically until it receives an ERS response.</t>
</list></t>

</section>
<section anchor="active-act-mode-1"><name>Active (ACT) Mode</name>

<t>When a network node receives a packet from a server and cannot match an existing session, it will communicate with the client using EQS/ERS messages.</t>

<t>ACT EQS/ERS Flow:</t>

<t><list style="numbers" type="1">
  <t>The network node locates the client using a fixed mapping (e.g., SNAT port mapping).</t>
  <t>It sends an EQS message to query that client, and the client returns an ERS message.</t>
  <t>The network node processes the ERS message and recovers the session if found.</t>
</list></t>

<t>EQS/ERS messages can be transmitted along with the original packet. To avoid IP fragmentation: If the EQS/ERS message packet size exceeds the MTU, discard the original packet and send the EQS message separately.</t>

<t>Message Loss Handling: Lost EQS/ERS messages are handled by triggering a new EQS query upon the arrival of subsequent packets from the server.</t>

</section>
</section>
</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="general-defenses-against-message-forgery-attacks"><name>General Defenses Against Message Forgery Attacks</name>

<t>The security design of the ASRP protocol is based on its typical deployment model.</t>

<t><strong>Deployment Boundaries and Access Control</strong>: ASRP recommends deploying network nodes and the clients or servers that back up sessions within the same trusted internal network domain. Under this model, all ASRP protocol packets communicate within the internal address space. By implementing appropriate network segmentation (e.g., using firewall policies or security groups) and rigorously checking the source addresses of packets, forged ASRP packets originating from untrusted external networks can be effectively prevented from reaching the target nodes.</t>

<t><strong>Session Legitimacy Validation</strong>: When processing any ASRP packet that may establish a new session (e.g., packets carrying NS or RS messages), network nodes must perform basic validation according to the specific policies of the upper-layer application or service. For example, in a load balancing scenario, a node should verify whether the session points to a known and healthy server; in a NAT scenario, it should validate whether the address translation complies with predefined rules. This prevents the establishment of illegal sessions at the application level.</t>

<t><strong>Internal Threat Assessment</strong>: Even if an attacker is located within the trusted network and can forge ASRP packets, the scope of impact is inherently limited. The attacker can only forge sessions where they themselves are the endpoint (e.g., impersonating a client to request recovery of a non-existent connection). Such forged sessions are indistinguishable in form from those established through normal access, do not directly endanger the security of other users or nodes, and cannot elevate the attacker&#39;s privileges or grant access to unauthorized resources.</t>

<t><strong>Trade-offs Regarding Enhanced Authentication</strong>: Theoretically, stronger authentication mechanisms could be introduced for ASRP, such as having the network node generate a random number (Cookie) during session backup and include it in the transmission, then requiring the other party to echo this Cookie during the recovery phase. However, considering that ASRP primarily operates within trusted domains and faces a limited external attack surface, introducing such mechanisms would increase protocol complexity and processing overhead. Therefore, this protocol does not recommend mandating such inter-node Cookie validation in its base design.</t>

</section>
<section anchor="mitigation-against-eqsers-flood-attacks"><name>Mitigation Against EQS/ERS Flood Attacks</name>

<t>In the PSV mode&#39;s probe-based session creation/recovery scenario (Section 2.4.1, Scenario 3) and the ACT mode scenario where recovery is triggered by server traffic (Section 2.4.2, Scenario 1), a network node may send a large number of EQS query messages to multiple backup parties upon session loss. This behavior, if maliciously exploited or resulting from a fault, could lead to flood attacks.</t>

<t>To mitigate such risks, implementers should consider the following protective measures:</t>

<t><strong>Message Aggregation</strong>: When a network node needs to query multiple sessions from the same backup party (e.g., a specific server) within a short timeframe, the implementation SHOULD support aggregating multiple QS messages into a single EQS packet for transmission. This can significantly reduce the number of control packets, lowering network and processing overhead.</t>

<t><strong>Rate Limiting and Traffic Shaping</strong>: Each network node MUST implement monitoring and limiting of the rate at which EQS packets are sent. A reasonable threshold (e.g., the maximum number of EQS packets allowed per second) should be established. When the rate exceeds this threshold, the node should adopt a packet discarding policy, such as:</t>

<t>Discarding newly arrived service packets that would trigger queries, or, discarding lower-priority pending EQS query requests.</t>

<t>This measure aims to prevent EQS packet floods caused by node failures, configuration errors, or malicious traffic, thereby protecting the backup parties (clients or servers) from resource exhaustion attacks. The parameters for rate limiting should be configurable to adapt to deployment environments of different scales.</t>

<t><strong>State Monitoring and Alerting</strong>: Implementations are advised to log the frequency and patterns of EQS/ERS messages. Abnormally high query rates should trigger logging and system alerts, enabling administrators to promptly detect potential network issues or security attacks.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document defines the Application-layer Session Recovery Protocol (ASRP), an application-layer protocol whose message types and internal identifiers are scoped to its own specification. Therefore, no registration in the &quot;Assigned Internet Protocol Numbers&quot; registry is required.</t>

<t>However, to support in-band signaling over TCP and encapsulated control messaging over UDP, the following IANA allocations are requested.</t>

<section anchor="tcp-option-for-asrp"><name>TCP Option for ASRP</name>

<t>The ASRP protocol uses a TCP option to signal that the beginning of the TCP payload contains an ASRP message (e.g., HS, NS, or RS). This option is defined as follows:</t>

<t><strong>Option Name</strong>: TCPOPT_ASRP</t>

<t><strong>Option Kind</strong>: To be assigned by IANA</t>

<t><strong>Length</strong>: 2 bytes</t>

<t>The format and semantics of this option are specified in Section ASRP Marking.</t>

<t>IANA is requested to assign a value from the &quot;TCP Option Kind Numbers&quot; registry (within the &quot;TCP Parameters&quot; registry) for TCPOPT_ASRP and to reference this document.</t>

<t><strong>Note</strong>: Early implementations used Kind 60 for experimentation. However, this document requests a permanent, unassigned value suitable for standards-track use.</t>

</section>
<section anchor="udp-port-for-encapsulated-asrp-messages"><name>UDP Port for Encapsulated ASRP Messages</name>

<t>Encapsulated ASRP control messages (ENS, EQS, ERS) are transmitted over UDP between network nodes and servers or clients. To support interoperable testing and early deployments, this document requests a standardized UDP port assignment.</t>

<t><strong>Service Name</strong>: asrp-encap</t>

<t><strong>Transport Protocol</strong>: udp</t>

<t><strong>Port Number</strong>: To be assigned by IANA (from the User Ports range, 1024--49151)</t>

<t><strong>Description</strong>: UDP port for receiving encapsulated ASRP protocol messages (ENS/EQS/ERS).</t>

<t>For experimental implementations and interoperability testing prior to IANA assignment, <strong>UDP port 55555</strong> MAY be used as a temporary default. This port falls within the dynamic/private port range (49152--65535) reserved for local or temporary use and documentation examples <xref target="RFC6335"/>.</t>

<t>IANA is requested to assign a permanent port number in the &quot;User Ports&quot; range (1024--49151) for the &quot;asrp-encap&quot; service in the &quot;Service Name and Transport Protocol Port Number Registry&quot;, with a reference to this document.</t>

</section>
</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC0768;
&RFC0791;
&RFC1122;
&RFC2119;
&RFC8174;
&RFC8200;
&RFC9293;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

&RFC2991;
&RFC2992;
&RFC6335;
&RFC7413;


    </references>

</references>


<?line 792?>

<section anchor="deterministic-bucket-mapping-hash-dbmh"><name>Deterministic Bucket Mapping Hash, DBMH</name>

<section anchor="principles-of-the-dbmh-algorithm"><name>Principles of the DBMH Algorithm</name>

<t>When the passive (PSV) mode of ASRP is applied to load balancing scenarios, the core requirement is to stably map client connections (identified by a 5-tuple) to a backend server. Even when the server cluster scales in or out, the mapping of existing connections should remain unchanged to ensure session recoverability. The DBMCH (Deterministic Bucket Mapping Consistent Hash) algorithm achieves this goal by introducing the concepts of virtual buckets, server weight, and bucket weight, combined with ASRP&#39;s session probing capability.</t>

<section anchor="core-concepts-and-design-goals"><name>Core Concepts and Design Goals</name>

<t><list style="numbers" type="1">
  <t><strong>Virtual Buckets</strong>: Set a fixed number (N, default 65536) of virtual buckets. N should be far greater than the maximum expected number of servers to ensure balance. Once set, the value of N does not change.</t>
  <t><strong>Fixed Mapping from Sessions to Buckets</strong>: Through a stable hash function, deterministically map the 5-tuple of each connection to a virtual bucket in the range 0, N-1. This ensures that all packets of the same connection always hit the same bucket.</t>
  <t><strong>Server List in a Bucket</strong>: Each virtual bucket maintains an ordered list of servers. The first server in this list is called the preferred server of the bucket, specifically used to handle new connections.</t>
  <t><strong>Server Weight</strong>: The weight of a server is defined as the total number of times the server appears in the server lists of all N virtual buckets (regardless of whether it is the preferred server). It reflects the &quot;distribution breadth&quot; of the server in the global mapping.</t>
  <t><strong>Bucket Weight</strong>: The weight of a virtual bucket is defined as the sum of the weights of all servers in its server list. It reflects the &quot;global influence&quot; of the bucket.</t>
  <t><strong>Core Design Goals</strong>  <vspace blankLines='1'/>
<strong>Session Stability</strong>: When the cluster scales in or out, the preferred server of the virtual bucket where an existing connection resides never changes. This ensures uninterrupted recovery of these connections through the ASRP mechanism.  <vspace blankLines='1'/>
<strong>Load Balancing</strong>: After scaling, by adjustment, ensure that each server serves as the preferred server an equal number of times, so that new connections are evenly distributed.</t>
</list></t>

</section>
<section anchor="dynamic-scaling-steps-of-the-algorithm"><name>Dynamic Scaling Steps of the Algorithm</name>

<t>The ingenuity of the algorithm lies in achieving the above goals by adjusting weights and preferred servers when the server set changes.</t>

<t><list style="numbers" type="1">
  <t><strong>Scaling Out</strong> (Add m servers, currently n servers, target total n+m)  <vspace blankLines='1'/>
<strong>Goal</strong>: The number of times each server is preferred should be adjusted to N/(n+m).  <vspace blankLines='1'/>
<strong>Step 1, Selection and Retention</strong>: Sort the existing n servers by weight from lightest to heaviest. For each existing server, from all virtual buckets that currently include this server, retain the heaviest N/(n+m) buckets, and ensure that the preferred server of these buckets is set to this server.  <vspace blankLines='1'/>
<strong>Step 2, Allocation of New Buckets</strong>: After step 1, there will be a batch of remaining virtual buckets. Sort these buckets by weight from lightest to heaviest. Then, allocate buckets to each new server in turn and cyclically until each new server obtains N/(n+m) buckets. Set the preferred server of these allocated buckets to the corresponding new server.</t>
  <t><strong>Scaling In</strong> (Remove some servers, leaving k servers)  <vspace blankLines='1'/>
<strong>Goal</strong>: The number of times each remaining server is preferred should be adjusted to N/k.  <vspace blankLines='1'/>
<strong>Step 1, Cleanup and Calculation</strong>: Remove the deleted servers from the lists of all virtual buckets. Calculate the weight N/k that each of the remaining k servers should obtain.  <vspace blankLines='1'/>
<strong>Step 2, Priority Satisfaction</strong>: Sort the remaining k servers by weight from lightest to heaviest. For each server, from all available virtual buckets, allocate the heaviest N/k buckets and make this server the preferred server of these buckets. Record which servers have obtained enough buckets.  <vspace blankLines='1'/>
<strong>Step 3, Make Up the Shortfall</strong>: After step 2, there may still be some servers that have not obtained enough buckets (less than N/k). Match the servers that are still short with the remaining virtual buckets (sorted by weight from lightest to heaviest) and allocate them in turn until all remaining servers have reached N/k preferred buckets.</t>
</list></t>

<t><strong>Summary</strong>: The DBMCH algorithm dynamically manages &quot;weight&quot; and &quot;preferred server&quot; to achieve uniform load distribution of new connections after cluster scaling while ensuring absolute stability of all historical connection mappings. Combined with ASRP&#39;s session probing capability, it constitutes a robust and efficient scaling solution for stateful services.</t>

</section>
</section>
<section anchor="estimation-of-server-count-per-virtual-bucket-in-dbmch"><name>Estimation of Server Count per Virtual Bucket in DBMCH</name>

<t>The core conclusion is: The length of the server list within a virtual bucket grows slowly and has a definite upper bound. Its growth is primarily related to two factors: (1) the number of scaling operations, and (2) the ratio of the number of newly added servers to the current scale during each scaling operation.</t>

<t>Quantitative analysis of the following two typical scaling strategies clearly demonstrates this characteristic:</t>

<t><list style="numbers" type="1">
  <t><strong>Incremental Scaling Strategy</strong>  <vspace blankLines='1'/>
Assume an initial server count of K, and each scaling operation adds K new servers (i.e., the scale doubles each time). After 8 consecutive scaling operations, the total number of servers reaches 9K. During this process, the mathematical expectation (which can approximate the average number) of servers in any virtual bucket is roughly 1 + 1/2 + 1/3 + ... + 1/8 approximately equal to 2.7. Therefore, the maximum number of servers per bucket is 3, and the minimum is 2.  <vspace blankLines='1'/>
<strong>Scale Example</strong>: This means that scaling from a small cluster of 4 servers to 36 servers, or from 32 servers to 288 servers, the maximum number of servers per bucket remains merely 3.</t>
  <t><strong>Aggressive Scaling Strategy</strong>  <vspace blankLines='1'/>
Assume an initial server count of K, and each scaling operation adds 8K new servers (i.e., significant expansion). After 4 scaling operations, the total number of servers reaches 33K. The mathematical expectation of servers per bucket is roughly 1 + 8/9 + 8/17 + 8/25 + 8/33 approximately equal to 2.92. Similarly, the maximum number of servers per bucket is 3, and the minimum is 2.  <vspace blankLines='1'/>
<strong>Scale Example</strong>: This means scaling from 4 servers to 132, or from 32 servers to 1056, the maximum number of servers per bucket still stabilizes at 3.</t>
</list></t>

<t><strong>Implications and Guidance</strong></t>

<t>The above analysis demonstrates that the DBMCH algorithm possesses excellent scalability. Even when the cluster scale grows by tens or even hundreds of times, the number of server probes required to recover any connection remains extremely limited (typically no more than 3). This theoretically ensures the efficiency of the ASRP session recovery mechanism, making it suitable for large-scale, elastically scaling cloud-native environments.</t>

<t>In practical operations, it is recommended to adopt relatively centralized scaling batches (such as the aggressive strategy mentioned above) to better control the average probing cost.</t>

</section>
<section anchor="advantages-and-disadvantages-of-the-dbmch-algorithm"><name>Advantages and Disadvantages of the DBMCH Algorithm</name>

<section anchor="advantages"><name>Advantages</name>

<t><list style="numbers" type="1">
  <t><strong>Complete Session Stability</strong>  <vspace blankLines='1'/>
During dynamic scaling (expansion or contraction) or node failures, the algorithm guarantees that the mapping of all existing connections remains absolutely unchanged. This provides a solid foundation for ASRP-based session recovery and is a key factor in achieving high availability.</t>
  <t><strong>Excellent Load Balancing for New Connections</strong>  <vspace blankLines='1'/>
After each scaling operation, the algorithm reallocates virtual buckets so that each server serves as the preferred server for an equal number of buckets. This ensures that newly established connections are evenly distributed across all available servers, effectively preventing load imbalance.</t>
  <t><strong>Enhanced Robustness through Synergy with ASRP</strong>  <vspace blankLines='1'/>
The algorithm maintains a server list for each virtual bucket, providing a well-defined target set for ASRP&#39;s session probing mechanism (EQS/ERS). Working in synergy, they enable precise location and recovery of any connection after a node failure, achieving connection recoverability at the cluster level.</t>
</list></t>

</section>
<section anchor="limitations-and-considerations"><name>Limitations and Considerations</name>

<t><list style="numbers" type="1">
  <t><strong>Probe Overhead and Server Count per Bucket</strong>  <vspace blankLines='1'/>
For connectionless protocols (e.g., UDP) or TCP connections that need recovery, ASRP must sequentially probe the server list within a bucket via EQS messages. In the worst-case scenario of frequent scaling operations and continuous cluster growth, the number of servers in a bucket may gradually accumulate, leading to decreased probing efficiency.</t>
  <t><strong>Operational Recommendations</strong>  <vspace blankLines='1'/>
To control the average length of bucket lists, it is recommended to adopt a batch-operation strategy when planning scaling events: &quot;reduce the frequency of operations, but adjust more servers each time.&quot;</t>
  <t><strong>Optimization Directions</strong>  <vspace blankLines='1'/>
Since new connections are handled only by the preferred server, it can be envisioned that once all old connections previously mapped to non-preferred servers are closed, those servers can be safely removed from the corresponding virtual bucket lists. Ideally, after some time, most virtual buckets will retain only the preferred server, bringing the average list length close to 1, which would significantly reduce probing costs. For the few remaining long-lived connections, special handling mechanisms (such as maintaining a separate small mapping table) could be considered to further reduce the number of servers in virtual bucket lists.</t>
</list></t>

<t>In summary, the DBMCH algorithm provides an innovative solution for seamless scaling and high availability of stateful services. Its value is particularly pronounced when combined with distributed session state backup (ASRP). By understanding its characteristics, designers and operators can maximize its benefits and control its potential overhead through reasonable cluster sizing planning and operational strategies.</t>

</section>
</section>
</section>
<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>The authors would like to thank all individuals who have provided valuable feedback and contributions during the development of this document.</t>

</section>


  </back>

<!-- ##markdown-source:
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
iKCn0C0b/xemw6JekA8BAA==

-->

</rfc>

