<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ousterhout-tsvwg-homa-00" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Homa">Homa: An RPC Transport Protocol for Datacenters</title>
    <seriesInfo name="Internet-Draft" value="draft-ousterhout-tsvwg-homa-00"/>
    <author fullname="John Ousterhout">
      <organization>Stanford University</organization>
      <address>
        <email>ouster@cs.stanford.edu</email>
      </address>
    </author>
    <author fullname="Thiyagarajan Velappan">
      <organization>Mastercard, Inc.</organization>
      <address>
        <email>Thiyagarajan.Velappan@mastercard.com</email>
      </address>
    </author>
    <author fullname="Steven Bagby">
      <organization>Mastercard, Inc.</organization>
      <address>
        <email>Steven.Bagby@mastercard.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="20"/>
    <workgroup>TSVWG Working Group</workgroup>
    <abstract>
      <?line 76?>

<t>This document defines the Homa transport protocol. Homa provides
applications with a reliable and efficient mechanism for delivering
request and response messages for remote procedure calls (RPCs).
It is intended for use within datacenters. Homa uses messages,
receiver-issued grants, and packet priorities to support RPC workloads.
Published evaluations report a reduction of more than 10x in tail latency
for short messages relative to TCP for specific workloads
and test conditions; this document does not claim a performance
improvement for all datacenter environments.</t>
    </abstract>
  </front>
  <middle>
    <?line 88?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Homa is a general-purpose transport protocol for use within datacenters.
It is intended for applications that use remote procedure calls (RPCs),
in which a request message is sent from a client to a
server, followed by a response message returned from the server back to the
client. Homa handles the delivery of the messages and also detects
server failures.</t>
      <t>Homa differs from TCP <xref target="RFC9293"/> in almost every major aspect of its design:</t>
      <ul spacing="normal">
        <li>
          <t>Homa implements messages instead of byte streams.</t>
        </li>
        <li>
          <t>Homa is connectionless.</t>
        </li>
        <li>
          <t>Homa uses receiver-issued grants for flow control and does not depend
on buffer occupancy as a signal for congestion. These properties
describe Homa's flow-control mechanism; they do not, by themselves,
specify congestion control for the switching fabric.</t>
        </li>
        <li>
          <t>Homa does not require in-order packet delivery.</t>
        </li>
      </ul>
      <t>These design choices target the latency and message-delivery
requirements of datacenter RPC workloads. Performance depends on the
workload and deployment conditions; this document does not claim that
Homa outperforms TCP in every datacenter environment.</t>
      <t>Note: Homa is not suitable for use in WANs or other environments with
high latency. Homa is designed under the assumption of round-trip
times of a few tens of microseconds or less.</t>
      <t>This document defines version 1 of Homa.</t>
      <section anchor="background">
        <name>Background</name>
        <t>TCP has been widely successful, but its byte-stream abstraction and
in-order delivery can add queuing and head-of-line delays for datacenter
RPC workloads, particularly when short messages share the network with
larger transfers. Homa is a clean-slate, message-oriented transport
designed for applications running in datacenters. It uses
receiver-issued grants and packet priorities to address these workload
characteristics. In lab experiments, Homa reduced tail latency for
short messages in mixed workloads at high network utilization by
10-100x compared with TCP <xref target="HomaLinux"/>. These results are specific to
the evaluated workloads and test conditions; they should not be
interpreted as a general performance guarantee across datacenter
deployments.</t>
        <t>See <xref target="Homa"/> for more on the rationale for Homa, the original design
of Homa (which differs somewhat from the protocol described here) and
early performance measurements. <xref target="HomaLinux"/> describes the first
implementation of Homa in Linux, with additional performance
measurements.</t>
      </section>
      <section anchor="homa-summary">
        <name>Homa Summary</name>
        <t>This section contains a brief overview of the key features of Homa. The
features will be discussed in more detail in later sections.</t>
        <ul spacing="normal">
          <li>
            <t>Homa ensures reliable and flow-controlled delivery of messages for RPCs.
For each RPC it delivers a request message from the client to the server
and a response from the server back to the client.</t>
          </li>
          <li>
            <t>Homa is connectionless. Alternatively, each RPC can be thought of as
a lightweight and short-lived connection that lasts until the RPC response
has been received by the client.</t>
          </li>
          <li>
            <t>There is no ordering among Homa RPCs. Each RPC is processed independently,
so RPCs may not complete in the same order they were initiated.</t>
          </li>
          <li>
            <t>Flow control in Homa is driven from receivers, not senders. Short messages
are <em>unscheduled</em>: they may be transmitted in their entirety by senders
without any flow control. Longer messages are <em>scheduled</em>: the sender
notifies the receiver of the message's existence, then the receiver
controls the transmission of the message by sending <em>grants</em>. Scheduled
messages pay an extra 1 RTT of latency before transmission of data can
begin.</t>
          </li>
          <li>
            <t>Homa prioritizes shorter messages over longer ones. Specifically, it
attempts to approximate SRPT (Shortest Remaining Processing Time first),
which gives the highest priority to the messages with the fewest bytes
remaining to transmit. It does this in several ways:  </t>
            <ul spacing="normal">
              <li>
                <t>Homa takes advantage of the priority queues in datacenter switches,
arranging for shorter messages to use higher-priority queues.
The receiver of a message determines the priority for each incoming
packet of the message (including unscheduled packets).</t>
              </li>
              <li>
                <t>When a receiver has multiple scheduled messages inbound, the
receiver uses grants to prioritize shorter messages.</t>
              </li>
              <li>
                <t>When transmit queues build on senders, they use SRPT to prioritize outgoing
packets. In order to prevent NIC queue buildup, which would damage
SRPT, Homa endpoints generally need to implement packet pacing.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The packets for a message may be delivered out of order, and receivers
<bcp14>MUST</bcp14> reassemble out-of-order messages without requiring
retransmission. Homa encourages the use of packet spraying for load
balancing in the switching fabric.</t>
          </li>
          <li>
            <t>Homa receivers are responsible for detecting lost packets and
requesting retransmission.</t>
          </li>
          <li>
            <t>Homa implements "at most once semantics" for RPCs. Among other things,
this means that the server for an RPC must retain its state for that
RPC until the client has received the response message. Homa implements
an <em>acknowledgment</em> mechanism where clients (eventually) inform servers
that it is safe for them to reclaim RPC state.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>Commonly used terms in this document are described below (alphabetical
order).</t>
      <dl>
        <dt><strong>Acknowledgment:</strong></dt>
        <dd>
          <t>A token sent from an RPC's client to its server, indicating that it
is safe for the server to delete its state for the RPC. There are no
packet-level acknowledgments in Homa.</t>
        </dd>
        <dt><strong>Client:</strong></dt>
        <dd>
          <t>An entity that initiates a Homa RPC: it sends a request message and
receives the response. This term may refer to either the
application that initiates the RPC or to the corresponding Homa endpoint.</t>
        </dd>
        <dt><strong>Common Header:</strong></dt>
        <dd>
          <t>The initial bytes of each packet, which have the same format in all
packets regardless of type.</t>
        </dd>
        <dt><strong>Endpoint:</strong></dt>
        <dd>
          <t>An entity that implements the Homa protocol, typically associated with
a single network link on a given machine. Endpoints can act as both
client and server.</t>
        </dd>
        <dt><strong>Grant:</strong></dt>
        <dd>
          <t>A token issued by the receiver for a message, which entitles the
message sender to transmit all of the bytes of the message up to a
given offset. The grant also specifies the priority to use in
the message's data packets.</t>
        </dd>
        <dt><strong>Homa:</strong></dt>
        <dd>
          <t>The transport protocol described by this document. Homa is a name,
not an acronym.</t>
        </dd>
        <dt><strong>Incoming:</strong></dt>
        <dd>
          <t>Number of bytes of data in a message that have been authorized to be
transmitted but have not yet been received. Data is authorized if it is
within an unscheduled message or if the receiver has
transmitted a <tt>GRANT</tt> packet for it. Data is considered "incoming"
even if the sender has not yet received the grant and/or the data has
not yet been transmitted.</t>
        </dd>
        <dt><strong>Maximum Transmission Unit (MTU):</strong></dt>
        <dd>
          <t>The maximum allowable size for a network packet, including all headers.</t>
        </dd>
        <dt><strong>Message:</strong></dt>
        <dd>
          <t>The unit of communication that Homa provides to applications.
A message consists of a fixed-length array of bytes ranging in length from a
single byte up to a system-defined upper limit. There are two kinds
of messages in Homa: requests and responses.</t>
        </dd>
        <dt><strong>Packet:</strong></dt>
        <dd>
          <t>The unit of transmission between Homa endpoints. Each packet has one
of several types and consists of a type-specific header followed
optionally by part or all of the data for a single message.</t>
        </dd>
        <dt><strong>Priority:</strong></dt>
        <dd>
          <t>A value in the range [0-7], which is included in transmitted packets
and used by network switches to select a priority queue at the
egress port for the packet.
Switches should be configured to transmit higher-priority packets in
preference to lower-priority ones.</t>
        </dd>
        <dt><strong>Remote Procedure Call (RPC):</strong></dt>
        <dd>
          <t>The primary abstraction implemented by Homa, consisting of a request
message sent from client to server, followed by a response message
returned from the server back to the client.</t>
        </dd>
        <dt><strong>Rpcid:</strong></dt>
        <dd>
          <t>An integer that uniquely identifies a given RPC among all of the
RPCs initiated from the same endpoint. The pair &lt;endpoint address, rpcid&gt;
provides a system-wide unique identifier for a Homa RPC. Rpcids are
always even and increase sequentially in order of creation on the
client.</t>
        </dd>
        <dt><strong>Scheduled Data:</strong></dt>
        <dd>
          <t>Data that is transmitted in response to grant packets from the receiver.</t>
        </dd>
        <dt><strong>Server:</strong></dt>
        <dd>
          <t>An entity that receives a Homa request and sends the corresponding
response. This term may refer to either an application program or the
corresponding Homa endpoint.</t>
        </dd>
        <dt><strong>SRPT (Shortest Remaining Processing Time):</strong></dt>
        <dd>
          <t>Homa tries to prioritize messages that have the fewest remaining
bytes to transmit, both on the sender side and the receiver side.</t>
        </dd>
        <dt><strong>TCP Segmentation Offload (TSO):</strong></dt>
        <dd>
          <t>A hardware feature implemented by most NICs, which allows host
software to process outgoing network data in units larger than
the network MTU. With TSO, the host generates <em>TSO frames</em>,
which look like packets that exceed the MTU. The NIC divides
each TSO frame into multiple smaller packets (<em>segments</em>) for
transmission. In this document the term "packet" always refers
to the entities transmitted on the wire, not TSO frames.</t>
        </dd>
        <dt><strong>Top of Rack Switch (TOR):</strong></dt>
        <dd>
          <t>The network switches at the edges of the datacenter switching
fabric. Individual hosts connect to TORs.</t>
        </dd>
        <dt><strong>Unscheduled Data:</strong></dt>
        <dd>
          <t>Data that is sent unilaterally, without requiring the permission of
the receiver.</t>
        </dd>
      </dl>
    </section>
    <section anchor="packet-formats">
      <name>Packet Formats</name>
      <t>Homa endpoints communicate with packets that are transmitted using an
unreliable datagram protocol such as IPv4 <xref target="RFC791"/> or IPv6 <xref target="RFC8200"/>.
Each packet has a <em>type</em> that determines how the packet is processed.
A packet has two parts:</t>
      <ul spacing="normal">
        <li>
          <t>A <em>common header</em>, which has the same format in all packets,
regardless of type.</t>
        </li>
        <li>
          <t>Aditional information that is type-specific. Some packet types have
no type-specific information.</t>
        </li>
      </ul>
      <t>The structure of the common header is specified in <xref target="commonHdr"/>;
it closely mirrors the structure
of TCP headers <xref target="RFC9293"/> in order to allow Homa to take advantage
of TCP Segmentation Offload (TSO) implemented by many NICs.</t>
      <figure anchor="commonHdr">
        <name>Common header format</name>
        <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                            Reserved                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Reserved                   |     Type      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Doff | Rsvd |      Flags     |            Reserved           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Rpcid (high)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Rpcid (low)                     |S|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
      </figure>
      <t>The fields in the common header are as follows:</t>
      <dl>
        <dt><strong>Source Port:</strong></dt>
        <dd>
          <t>Identifier that corresponds to an application-level entity on the
the machine that sent the packet.</t>
        </dd>
        <dt><strong>Destination Port:</strong></dt>
        <dd>
          <t>Identifier that corresponds to an application-level entity on the
the machine that receives the packet.</t>
        </dd>
        <dt><strong>Type:</strong></dt>
        <dd>
          <t>Type of this packet. Must have one of the following values:</t>
        </dd>
      </dl>
      <artwork><![CDATA[
     DATA         16
     GRANT        17
     RESEND       18
     RPC_UNKNOWN  19
     BUSY         20
     CUTOFFS      21
     NEED_ACK     23
     ACK          24
     START_MSG    25
]]></artwork>
      <dl>
        <dt><strong>Doff:</strong></dt>
        <dd>
          <t>Corresponds to the Data Offset field in TCP. Only used by senders
in order to ensure correct TSO behavior; <bcp14>MUST NOT</bcp14> be used by Homa receivers.</t>
        </dd>
        <dt><strong>Flags:</strong></dt>
        <dd>
          <t>Corresponds to the Flags field in TCP.  Set by Homa during TCP hijacking
to enable receviers to distinguish Homa-over-TCP packets from genuine TCP
packets.</t>
        </dd>
        <dt><strong>Checksum:</strong></dt>
        <dd>
          <t>Corresponds to the Checksum field in TCP. Set by Homa during TCP hijacking.</t>
        </dd>
        <dt><strong>Urgent Pointer:</strong></dt>
        <dd>
          <t>Corresponds to the Urgent Pointer in TCP. Set by Homa during TCP
hijacking to enable receviers to distinguish Homa-over-TCP packets
from genuine TCP packets.</t>
        </dd>
        <dt><strong>Rpcid:</strong></dt>
        <dd>
          <t>Associates the packet with a particular RPC.</t>
        </dd>
        <dt><strong>S:</strong></dt>
        <dd>
          <t>If the low-order bit of the Rpcid is 0 it means that the packet was sent
by the client for the RPC; 1 means it was sent by the server.</t>
        </dd>
      </dl>
      <t><em>We are in the process of changing the protocol so that Homa packets
are encapsulated in UDP packets with a reserved destination port number.
Once that protocol change is complete, the format of the common header will
shrink and simplify, since it will no longer need to match TCP headers.
TCP hijacking will also be eliminated.</em></t>
      <section anchor="secDataPkt">
        <name>DATA packets</name>
        <t>The structure of a Homa data packet is specified by <xref target="dataPkt"/> below:</t>
        <figure anchor="dataPkt">
          <name>Format of DATA packets</name>
          <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Common Header                         |
   |                               .                               |
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Message Length                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Ack Rpcid (high)                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Ack Rpcid (low)                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |        Ack Server Port        |         Cutoff Version        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    Retrans    |                    Reserved                   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Offset                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Message Data                          |
   |                               .                               |
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>A data packet contains part or all of the payload for a message.
It <bcp14>MUST</bcp14> start with a common header whose <tt>Type</tt> is <tt>DATA</tt> and whose <tt>Rpcid</tt>
specifies the RPC that the data is associated with.
If the <tt>S</tt> bit is set in the common header then this
packet contains data for the response message of the RPC; otherwise it
contains data for the request.
The following fields follow the common header:</t>
        <dl>
          <dt><strong>Message Length:</strong></dt>
          <dd>
            <t>The total length of the message in bytes. This <bcp14>MUST</bcp14> be the same in
every data packet for the message.</t>
          </dd>
          <dt><strong>Ack Rpcid:</strong></dt>
          <dd>
            <t>Identifies another RPC for which the sender is client and the receiver is
server, whose response message has been fully received by the client.
Indicates that the server can safely reclaim any state for that RPC.
A value of 0 indicates that no RPC is being acknowledged.
See <xref target="secAcks"/> below for details on acknowledgments.</t>
          </dd>
          <dt><strong>Ack Server Port:</strong></dt>
          <dd>
            <t>The port number (on the server) to which <tt>Ack Rpcid</tt> was sent.</t>
          </dd>
          <dt><strong>Cutoff Version:</strong></dt>
          <dd>
            <t>The version number for the priority cutoffs currently used
on the sender for this receiver. See <xref target="secUnsched"/> below for details.</t>
          </dd>
          <dt><strong>Retrans:</strong></dt>
          <dd>
            <t>If this byte is nonzero it means the packet was sent in response
to a <tt>RESEND</tt> packet.</t>
          </dd>
          <dt><strong>Offset:</strong></dt>
          <dd>
            <t>Offset within the message of the first byte of data contained in
this packet.</t>
          </dd>
          <dt><strong>Message Data:</strong></dt>
          <dd>
            <t>Partial or complete contents of the message. The amount of data
is determined by the length of the packet. This field is <bcp14>OPTIONAL</bcp14>.</t>
          </dd>
        </dl>
        <t>In the simplest case, an RPC requires two <tt>DATA</tt> packets. The first one
contains the entire request; it is transmitted from client to server and
has an <tt>S</tt> bit of zero and a zero <tt>Offset</tt>. The second packet is transmitted
from server to client; it has an <tt>S</tt> bit of one, and a zero <tt>Offset</tt>.</t>
      </section>
      <section anchor="secStartMessagePkt">
        <name>START_MSG packets</name>
        <t><tt>START_MSG</tt> packets are used by senders to initiate the transfer of
scheduled messages; they notify the receiver that there is an inbound
message available and that the receiver should issue grants for it.
The structure of a <tt>START_MSG</tt> packet is specified by <xref target="startMessagePkt"/>
below:</t>
        <figure anchor="startMessagePkt">
          <name>Format of START_MESSAGE packets</name>
          <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Common Header                         |
   |                               .                               |
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Message Length                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>A <tt>START_MSG</tt> packet contains a common header followed by the following field:</t>
        <dl>
          <dt><strong>Message Length:</strong></dt>
          <dd>
            <t>The total length of the message, in bytes.</t>
          </dd>
        </dl>
      </section>
      <section anchor="secGrantPkt">
        <name>GRANT packets</name>
        <t><tt>GRANT</tt> packets are used to manage network queue lengths when multiple
senders attempt to send messages to the same destination. The structure of
a grant packet is specified by <xref target="grantPkt"/> below:</t>
        <figure anchor="grantPkt">
          <name>Format of GRANT packets</name>
          <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Common Header                         |
   |                               .                               |
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Offset                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    Priority   |
   +-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>A <tt>GRANT</tt> packet contains a common header followed by the following fields:</t>
        <dl>
          <dt><strong>Offset:</strong></dt>
          <dd>
            <t>The recipient of the <tt>GRANT</tt> packet is now entitled to transmit all of the
data in the message given by the <tt>Rpcid</tt> common header field up to (but not
including) this offset.</t>
          </dd>
          <dt><strong>Priority:</strong></dt>
          <dd>
            <t>The recipient should use the value of this field as the priority in all
future <tt>DATA</tt> packets transmitted for this message.</t>
          </dd>
        </dl>
      </section>
      <section anchor="secResendPkt">
        <name>RESEND packets</name>
        <t>A Homa endpoint sends <tt>RESEND</tt> packets when message data that it is expecting
to receive is overdue and possibly lost. The structure of a <tt>RESEND</tt> packet is
specified by <xref target="resendPkt"/> below:</t>
        <figure anchor="resendPkt">
          <name>Format of RESEND packets</name>
          <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Common Header                         |
   |                               .                               |
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Offset                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Length                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |    Priority   |
   +-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>A <tt>RESEND</tt> packet contains a common header followed by the following fields:</t>
        <dl>
          <dt><strong>Offset:</strong></dt>
          <dd>
            <t>The offset within the message of the first byte of data to retransmit.</t>
          </dd>
          <dt><strong>Length:</strong></dt>
          <dd>
            <t>The number of bytes to retransmit. -1 means that the sender has not
received any data for the message, so the receiver should retransmit
all data that it has previously transmitted.</t>
          </dd>
          <dt><strong>Priority:</strong></dt>
          <dd>
            <t>The priority to use for all packets retransmitted in response to
this request.</t>
          </dd>
        </dl>
      </section>
      <section anchor="secUnknownPkt">
        <name>RPC_UNKNOWN packets</name>
        <t>A Homa endpoint sends a packet with type <tt>RPC_UNKNOWN</tt> when it receives a
<tt>RESEND</tt> packet with an Rpcid that is unknown to it (i.e. the endpoint
has no outbound message for that Rpcid). An <tt>RPC_UNKNOWN</tt> packet consists of
a common header with no additional information.</t>
      </section>
      <section anchor="secBusyPkt">
        <name>BUSY packets</name>
        <t>Packets with type <tt>BUSY</tt> are sent by an endpoint when it is unable or
unwilling to perform an action expected by the receiving endpoint.  A <tt>BUSY</tt>
packet indicates that the sending endpoint is alive and well and will
eventually get around to the expected action, so the receiver
should not time out the RPC. There are currently three situations where
<tt>BUSY</tt> packets are issued:</t>
        <ul spacing="normal">
          <li>
            <t>When the server for an RPC receives a <tt>RESEND</tt> request for the response
message, but the response message is not yet available.</t>
          </li>
          <li>
            <t>When an endpoint receives a <tt>RESEND</tt> request for message data that is
available, but it has chosen not to transmit the data because of its
SRPT policy.</t>
          </li>
          <li>
            <t>When a server receives a duplicate <tt>START_MSG</tt> request for an RPC.
A client sends a duplicate <tt>START_MSG</tt> if it fails to receive any grants
for a new message within a reasonable time frame (in case the <tt>START_MSG</tt>
was lost). The server may not have sent grants yet because of its
SRPT policy.</t>
          </li>
        </ul>
        <t>A <tt>BUSY</tt> packet consists entirely of the common header.</t>
      </section>
      <section anchor="secCutoffsPkt">
        <name>CUTOFFS packets</name>
        <t>Packets with type <tt>CUTOFFS</tt> specify how the recipient should
assign priorities for unscheduled messages in the future
(see <xref target="secUnsched"/> for details). The structure of
a <tt>CUTOFFS</tt> packet is specified by <xref target="cutoffsPkt"/> below:</t>
        <figure anchor="cutoffsPkt">
          <name>Format of CUTOFFS packets</name>
          <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Common Header                         |
   |                               .                               |
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Cutoffs[0]                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Cutoffs[1]                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                              ...                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Cutoffs[7]                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Cutoff Version        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>A <tt>CUTOFFS</tt> packet contains a common header followed by the following fields:</t>
        <dl>
          <dt><strong>Cutoffs:</strong></dt>
          <dd>
            <t>An array of 8 monotonically nonincreasing 32-bit values. The priority for an
unscheduled <tt>DATA</tt> packet sent from the <tt>CUTOFFS</tt> recipient to its sender
<bcp14>MUST</bcp14> be the largest <tt>i</tt> such that <tt>Cutoffs[i]</tt> is greater than or
equal to the length
of the packet's message. Entry 0 in <tt>Cutoffs</tt> must be greater than or
equal to the largest allowable message length.</t>
          </dd>
          <dt><strong>Cutoff Version:</strong></dt>
          <dd>
            <t>Identfies this particular choice of cutoffs; the <tt>CUTOFFS</tt> recipient
<bcp14>MUST</bcp14> include this value as the <tt>Cutoff Version</tt> in all
future <tt>DATA</tt> packets sent to the <tt>CUTOFFS</tt> sender (this allows the sender to
detect when cutoffs need to be updated).</t>
          </dd>
        </dl>
      </section>
      <section anchor="secNeedAckPkt">
        <name>NEED_ACK packets</name>
        <t>A <tt>NEED_ACK</tt> packet is sent from the server for an RPC to the client.
It indicates that the server has transmitted all of the data in the
response message for an RPC and would like to reclaim its state for
that RPC. However, it cannot do so until the client has acknowledged
receiving the entire response. If the client is no longer waiting for
the indicated <tt>Rpcid</tt> (or if the <tt>Rpcid</tt> is unknown), it <bcp14>MUST</bcp14> respond with
an <tt>ACK</tt> packet that includes the <tt>Rpcid</tt>. If the client has not yet
received the full response, it need not respond to the <tt>NEED_ACK</tt> packet
(but it <bcp14>SHOULD</bcp14> issue a <tt>RESEND</tt> for any unreceived bytes).</t>
        <t>The structure of a <tt>NEED_ACK</tt> packet consists of a common header with
no additional information.</t>
      </section>
      <section anchor="secAckPkt">
        <name>ACK packets</name>
        <t>An <tt>ACK</tt> packet is sent from a client to a server.  It acknowledges that
the server can safely reclaim state for one or more RPCs.
The structure of an <tt>ACK</tt> packet is specified by <xref target="ackPkt"/> below:</t>
        <figure anchor="ackPkt">
          <name>Format of ACK packets</name>
          <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Common Header                         |
   |                               .                               |
   |                               .                               |
   |                               .                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Num_Acks           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Ack Rpcid (high)                    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           Ack Rpcid (low)                     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Server Port          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Rpcid (high)                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             Rpcid (low)                       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Server Port          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   . . .
]]></artwork>
        </figure>
        <t>An <tt>ACK</tt> packet can acknowledge multiple RPCs. First, it acknowledges the
RPC identified by the <tt>Rpcid</tt> and <tt>Server Port</tt> fields of the common header.
It also acknowleldges additional RPCs specified with information following
the common header:</t>
        <dl>
          <dt><strong>Num_Acks:</strong></dt>
          <dd>
            <t>Indicates how many additional acknowledgments follow after this field.</t>
          </dd>
          <dt><strong>Ack Rpcid:</strong></dt>
          <dd>
            <t>Identifies an RPC with the following properties:
</t>
            <ul spacing="normal">
              <li>
                <t>The source of the <tt>ACK</tt> packet was the client for the RPC and the
  target of the <tt>ACK</tt> packet was its server.</t>
              </li>
              <li>
                <t>The RPC's response message has been fully received by the client.</t>
              </li>
              <li>
                <t>Or, the <tt>Ack Rpcid</tt> was received in a <tt>NEED_ACK</tt> message but was unknown
  to the client.</t>
              </li>
            </ul>
          </dd>
          <dt><strong>Ack Server Port:</strong></dt>
          <dd>
            <t>The server port associated with <tt>Ack Rpcid</tt>.</t>
          </dd>
        </dl>
        <t><em>It does not appear that Acks need to include a `Server Port. This field
should probably be eliminated.</em></t>
      </section>
    </section>
    <section anchor="secGrants">
      <name>Policy Considerations for Grants</name>
      <t>The policy for issuing grants (which messages to grant at any given time and
how much to grant to each message) involves complex considerations and has
a significant impact on message latency and throughput, network link
utilization, buffer occupancy in network switches, and packet drops.</t>
      <t>The basic lifecycle of a scheduled message is as follows:</t>
      <ul spacing="normal">
        <li>
          <t>The message sender transmits a <tt>START_MSG</tt> packet to inform the receiver
of the message. The packet also includes the message's length.</t>
        </li>
        <li>
          <t>Once the <tt>START_MSG</tt> packet has been received, the receiver begins
issuing grants for the bytes of the message.</t>
        </li>
        <li>
          <t>As grants arrive at the sender, it transmits data packets. As
these packets are received, the receiver issues additional grants, until
eventually the entire message has been transmitted.</t>
        </li>
      </ul>
      <section anchor="achieving-high-throughput">
        <name>Achieving high throughput</name>
        <t>At any given time there is a range of bytes in a message that have been
granted but not yet been received. The number of bytes in this range is
referred to as the <em>incoming</em> for the message. A byte is considered to
have been granted once the <tt>GRANT</tt> packet has been transmitted by the
receiver,  even if the grant has not yet been received by the sender and/or
the packet containing the byte has not been transmitted by the sender.</t>
        <t>Incoming data also includes unscheduled messages. If a message is
unscheduled, any of its bytes not yet received at the receiver
are treated as "incoming".</t>
        <t>The term <em>total incoming</em> refers to the sum of the incomings of all messages
known to an endpoint.</t>
        <t>In order for a message to achieve the full throughput of the network, its
incoming must always be at least as large as the bandwidth-delay product (BDP)
for a packet roundtrip. The relevant bandwidth for BDP
is that of the network links connecting hosts and top-of-rack switches
(TORs); this discussion assumes for simplicity that all host-TOR uplinks
have the same bandwidth. The delay for BDP must include all software
overheads in addition to delays in the network hardware.
For example, delay can be measured on the sender as the time
from when the first <tt>DATA</tt> packet for a message is passed to the NIC until
the packet
has been received and processed by software on the receiver, a <tt>GRANT</tt>
packet is issued by the receiver, the <tt>GRANT</tt> is received and processed
by software on the sender, and a subsequent <tt>DATA</tt> packet has been
passed to the NIC. On the receiver, delay can be measured as the time
from when Homa software receives a <tt>DATA</tt> packet until a new <tt>GRANT</tt>
has been transmitted, the <tt>GRANT</tt> has been received and processed by
software on the sender, a <tt>DATA</tt> packet  authorized by the <tt>GRANT</tt>
has been transmitted, and that packet has been received by Homa software
on the receiver.</t>
        <t>The round-trip time for BDP is dominated by software overheads.  For example,
the network hardware contribution to round-trip time can be as low as 5 μs,
but the total round-trip time including software is likely to be at least
15-20 μs in the best case on unloaded servers <xref target="HomaLinux"/>. Software overheads
are affected significantly by server load (e.g., hot spots can cause large
delays in servicing incoming packets). On servers
with moderate loads, median round-trip times are likely to be at least
30-50 μs, with 99th-percentile times of 100-300 μs <xref target="HomaLinux"/>.
If we assume a round-trip time of 100 μs in order to ensure consistently
high throughput under load, with a link speed of 100 Gbps, then the
incoming for a message must be at least 1.25 Mbytes. As discussed below,
buffer occupancy considerations may make this amount impractical.</t>
      </section>
      <section anchor="srpt-and-overcommitment">
        <name>SRPT and Overcommitment</name>
        <t>Grants play an important role in implementing SRPT. If a receiver has
multiple inbound messages, it <bcp14>MUST</bcp14> use grants to prioritize messages
with the fewest remaining bytes to transmit.</t>
        <t>One simple approach is to issue grants only to the single highest priority
message, allowing that message to consume the entire downlink bandwidth. Then,
once the highest priority message is completely granted, the receiver can
issue grants to the next higher priority message, and so on. If a new
message begins arriving and has fewer remaining bytes than the current
highest priority message, then the receiver stops granting to the previous
message and begins granting to the new message.</t>
        <t>Unfortunately a one-message-at-a-time approach will result in wasted
link bandwidth. The problem is that a sender may also have multiple
outbound messages. If it has grants for more than one of them, then it
will dedicate its uplink bandwidth to the highest priority message.
Thus, when a receiver issues a grant it cannot be certain that the
sender will transmit the granted bytes immediately. If a receiver
only grants to one message and that message's sender chooses not to
transmit the message, then there will be a "bubble" on
the receiver's downlink where its bandwidth is not utilized, even
though there might be other inbound messages that could use the bandwidth.
Measurements in <xref target="Homa"/> indicate that a one-message-at-a-time approach
wastes about 40% of the link bandwidth in mixed workloads.</t>
        <t>In order to maximize link bandwidth utilization, receivers <bcp14>SHOULD</bcp14>
          <em>overcommit</em> their downlinks; that is, they should maintain outstanding
grants for more than one message at a time. With this approach, even if
some senders choose not to transmit, other senders can use the available
link bandwidth. A degree of overcommitment of 4-8 seems adequate in practice.</t>
        <t>Overcommitment has two potential negative consequences. The first is that
it potentially weakens SRPT: if the highest-priority sender is willing to
transmit, there may be packets from lower-priority messages that compete
for the downlink bandwidth, thereby reducing the throughput for the
high-priority message. This problem is solved by using priorities, as
discussed in <xref target="secPriorities"/>.</t>
        <t>The second problem with overcommitment is that it increases buffer
occupancy in the network switch. If a receiver grants to multiple inbound
messages and all of their senders transmit, the aggregate bandwidth of
transmission will exceed the bandwidth of the receiver's downlink, so
packets will be buffered at the egress port in the TOR. The amount of
buffer space occupied will equal the total incoming across all of the
receiver's inbound messages, less one BDP. Thus, the
more messages a receiver grants to, the more buffer space will be
consumed in the TOR (assuming total incoming increases with the degree
of overcommitment). Buffer management is discussed in <xref target="secBuffers"/>.</t>
      </section>
      <section anchor="one-message-per-endpoint">
        <name>One message per endpoint</name>
        <t>Under normal conditions, a Homa endpoint <bcp14>SHOULD</bcp14> only issue grants to a
single message from a given endpoint. If a receiver grants to multiple
messages from the same endpoint, the sender will only transmit the higher
priority of the two messages; if the sender has some other message to a
different destination that is even higher priority, then it will not
transmit either of the two lower-priority messages. Thus there is no
point in granting to a second message from the same endpoint; better to
use that grant for a message from a different endpoint, even if it is
lower priority.</t>
        <t>However, as network speeds increase it may make sense for a receiver
to grant to multiple messages from the same endpoint. This is because
it is becoming increasingly difficult for a single message to consume
all of the outbound bandwidth of a network link. For example, the
bandwidth for copying data from user space into nework packets
has been measured at 30-40 Gbps on some machines; this is inadequate
to support a 100 Gbps link. When this occurs, it may make sense to
grant to multiple messages from the same endpoint in order to ensure
full usage of the sender's uplink.</t>
      </section>
      <section anchor="fifo-grants">
        <name>FIFO grants</name>
        <t>The SRPT policy has been shown to result in low latencies across almost
all message lengths <xref target="Homa"/> <xref target="HomaLinux"/>. Although the latency benefits are
greatest for short messages, Homa also reduces latencies for
long messages when compared to the "fair sharing" approach used in TCP.
This is because SRPT results in "run to completion" behavior. Once a
message becomes highest priority, it will remain highest priority until
it completes (unless a new message with higher priority arrives) so it
will finish quickly.  In contrast, fair sharing will split the available
network bandwidth across all of the inbound messages, so all of the
inbound messages finish slowly. This is similar to a phenomenon
observed in process scheduling: when there are many CPU-bound processes,
FIFO scheduling results in lower average completion time than round-robin.</t>
        <t>In principle it is possible that SRPT could result in starvation for the
longest inbound message, if there are enough shorter messages to fully
utilize the link bandwidth. This is unlikely to occur in practice, though,
since network links are rarely driven at 100% capacity; lab experiments
have found it difficult to generate starvation even with adversarial
workloads.</t>
        <t>To eliminate any possibility of starvation, a receiver <bcp14>MAY</bcp14> reserve a
small fraction of its link bandwidth for grants to the oldest inbound
message rather than the highest priority one.  A FIFO fraction of about
5% seems adequate to eliminate starvation even under pathological
conditions.</t>
      </section>
    </section>
    <section anchor="secPriorities">
      <name>Priorities and Cutoffs</name>
      <t>Homa uses the priority queues in modern data center switches to implement
SRPT. A sender can specify a priority in each outbound packet (for example,
using the high-order bits of the DSCP field in IPv4 or the high-order bits
of the Traffic Class field in IPv6).
Network switches can be configured to use the priority value in a packet
to place the packet in one of several queues at the switch egress port.
Switches can also be configured to serve the egress queues in strict
priority order, so that higher-priority packets are transmitted before
lower-priority packets. This section describes how Homa uses packet
priorities.</t>
      <section anchor="scheduled-packets">
        <name>Scheduled packets</name>
        <t>Each <tt>GRANT</tt> packet contains a Priority field, which the sender <bcp14>MUST</bcp14> use
for all subsequent packets in the associated message until the next
<tt>GRANT</tt> is received. The receiver thus
has direct control over the priority for each scheduled packet. When a
receiver grants to multiple inbound messages at once, it <bcp14>SHOULD</bcp14> assign
a different priority for each message (highest priority for the message
with the fewest remaining bytes to transmit). This ensures that when
multiple senders transmit simultaneously and the receiver's TOR link
is overcommitted, packets from the highest priority message will be
transmitted and packets for other messages will be queued in the TOR.
If the highest-priority sender chooses not to transmit its message,
then packets from other messages will get through to the receiver.
The use of priorities allows Homa to achieve "perfect" SRPT even when
overcommitting its TOR link.</t>
      </section>
      <section anchor="secUnsched">
        <name>Unscheduled packets</name>
        <t>For unscheduled packets the receiver must assign packet priorities in
advance. It does this by analyzing recent incoming traffic and
assigning unscheduled priorities based on message length (shorter messages
receive higher priorities). A collection of "cutoffs" identifies the
message lengths that separate different priority
levels. Each receiver communicates its cutoffs to senders using <tt>CUTOFF</tt>
packets. Senders retain information about the cutoffs for each
endpoint that they communicate with, and use that information to choose
priorities for unscheduled packets.</t>
        <t>A version number is associated with the cutoff information for each
endpoint. A receiver <bcp14>SHOULD</bcp14> occasionally update its cutoffs to reflect
changes in traffic patterns and when it does so it <bcp14>MUST</bcp14> assign a new
version number for the new cutoffs.  The version number is included in
<tt>CUTOFFS</tt> packets, saved on senders, and included in <tt>DATA</tt>
packets from the sender to the corresponding receiver. Each time a
data packet is received, the receiver <bcp14>MUST</bcp14> check the Cutoff
Version in the packet; if it is out of date, the receiver <bcp14>MUST</bcp14>
send a new <tt>CUTOFFS</tt> packet to update the sender.</t>
        <t>Homa endpoints <bcp14>SHOULD</bcp14> assign unscheduled priorities so that each
priority level is used for about the same number of incoming bytes.
First, an endpoint can use recent traffic statistics to compute the
total fraction of incoming bytes that are unscheduled. The available
priority levels <bcp14>SHOULD</bcp14> be divided between unscheduled packets and
scheduled packets using this fraction; e.g., if 75% of incoming bytes
are unscheduled, then 75% of available priority levels <bcp14>SHOULD</bcp14> be used
for unscheduled packets and 25% of available priority levels <bcp14>SHOULD</bcp14> be
used for scheduled packets. The highest priority levels <bcp14>MUST</bcp14> be
assigned to unscheduled packets. At least one priority level <bcp14>MUST</bcp14> be
available for each of unscheduled and scheduled packets, but the
lowest unscheduled priority level <bcp14>MAY</bcp14> also be used as the highest
scheduled priority level.</t>
        <t>Once the number of unscheduled priority levels is known, the cutoffs
between unscheduled priorities <bcp14>SHOULD</bcp14> be chosen so that each priority
level is used for the same amount of traffic (based on recent traffic
patterns). Higher priority levels go to shorter messages.</t>
      </section>
      <section anchor="how-many-priority-levels">
        <name>How many priority levels?</name>
        <t>Measurements suggest that 4 priority levels is enough to produce
good performance and additional priority levels beyond 4
provide little benefit <xref target="HomaLinux"/>. Homa can operate with a single
priority level and still provide better latency than
TCP, though additional priority levels provide significant latency
improvements.</t>
      </section>
      <section anchor="priorities-and-overcommitment">
        <name>Priorities and overcommitment</name>
        <t>The number of priority levels assigned for scheduled packets need
not be the same as the degree of overcommitment. Suppose that an
endpoint is currently granting to M inbound messages and there
are S scheduled
priority levels. If M &gt; S, then the S-1 highest priority messages
<bcp14>SHOULD</bcp14> each use a dedicated priority level and the M-(S-1) lowest
priority messages <bcp14>SHOULD</bcp14> share the lowest scheduled priority level.
If M &lt; S, then the M lowest scheduled priorities <bcp14>SHOULD</bcp14> be used for
grants (reserving the highest priority levels allows faster
preemption if new higher-priority messages arrive).</t>
      </section>
      <section anchor="control-packets">
        <name>Control packets</name>
        <t>All packets other than <tt>DATA</tt> packets <bcp14>SHOULD</bcp14> use the highest available
priority level in order to minimize the delays experienced by these
packets. It is particularly important for <tt>GRANT</tt> packets to have high
priority in order to minimize control lag and maximize throughput.</t>
      </section>
      <section anchor="priorities-and-the-switching-fabric">
        <name>Priorities and the switching fabric</name>
        <t>Packet priorities are most useful at the egress ports of TOR switches,
since this is where congestion is most likely to occur. It is unclear
whether there is any benefit to using priorities for other egress ports
within the switching fabric. Congestion is less likely to occur at these
ports (see <xref target="secBuffers"/> for discussion) and the priorities computed by Homa may
not make much sense within the switching fabric (the priorities for each
receiver are computed independently, and the packets at an egress port
within the fabric could represent a variety of receivers, so it doesn't
make sense to compare their priorities).</t>
      </section>
    </section>
    <section anchor="secRetrans">
      <name>Retransmission and Timeouts</name>
      <t>Homa uses unreliable datagram protocols for packet delivery, so it
must be prepared to retransmit lost packets. In Homa, retransmission of
message data is requested explicitly by the receiver of the message,
using <tt>RESEND</tt> packets as described in <xref target="secResendPkt"/>.</t>
      <section anchor="when-to-issue-resends">
        <name>When to issue RESENDs</name>
        <t><tt>RESEND</tt> packets are triggered by lack of progress in a message.
Specifically, if a period of time elapses without the arrival
of an expected data packet, then the receiver for the message
issues a <tt>RESEND</tt>
packet for the missing data. Ultimate responsibility for <tt>RESEND</tt>s
lies with the client: if it has not received the entire response
message within an expected time then it <bcp14>MUST</bcp14> issue <tt>RESEND</tt> request(s)
for the missing part(s) of the response. The client <bcp14>MUST</bcp14> issue
<tt>RESEND</tt>s for the response even if the request message has not been
fully transmitted, for reasons given in the next paragraph.</t>
        <t>Servers <bcp14>MUST</bcp14> issues <tt>RESEND</tt>s for missing parts of the request message;
these <bcp14>MAY</bcp14>
be triggered in either of two ways. First, the server <bcp14>MAY</bcp14> set its own timers
to track progress on request messages and then issue <tt>RESEND</tt>s if
packets do not arrive in a timely fashion. However, these timers are
not sufficient because all of the packets of the request message may be
lost. If this happens the server will have no knowledge of the RPC and
cannot issue <tt>RESEND</tt>s. However, the client will eventually
send a <tt>RESEND</tt> for the response. If a <tt>RESEND</tt> arrives at a server
for an unknown RPC, then the server <bcp14>MUST</bcp14> issue an <tt>RPC_UNKNOWN</tt> packet.
On receipt of the <tt>RPC_UNKNOWN</tt>, the client retransmits everything
it has previsouly sent. A server <bcp14>MAY</bcp14> choose not to set its own
timers and to rely entirely on <tt>RESEND</tt> requests sent by clients.</t>
        <t>Choosing the <em>resend interval</em> (how long to wait for expected data before
issuing <tt>RESEND</tt>s) involves a tradeoff among several considerations:</t>
        <ul spacing="normal">
          <li>
            <t>If a packet has been lost, it is desirable to issue the <tt>RESEND</tt> as
quickly as possible; long resend intervals introduce unnecessary
delays.</t>
          </li>
          <li>
            <t>Short resend intervals create unnecessary overheads if packets are
delayed but not actually lost. For example, on Linux
servers as of December 2025, packets occasionally experience
software processing delays of 5ms or more on the receiving host.</t>
          </li>
          <li>
            <t><tt>RESEND</tt>s will occur when the service time for an RPC is longer than
the resend interval. These <tt>RESEND</tt>s are unnecessary and waste resources,
so the resend interval should be large enough to cover most service
times.</t>
          </li>
        </ul>
        <t>In the Linux kernel implementation of Homa, the resend interval is
currently 5 ms.</t>
      </section>
      <section anchor="avoiding-unnecessary-resends">
        <name>Avoiding unnecessary RESENDs</name>
        <t>There are some situations where <tt>DATA</tt> packets for a message do not arrive,
but the receiver can determine from its own state that it should not expect
those packets to arrive until it takes additional steps. In such situations
endpoints <bcp14>SHOULD NOT</bcp14> send extraneous <tt>RESEND</tt>s. Here are a few examples:</t>
        <ul spacing="normal">
          <li>
            <t>If all granted bytes have been received, then a receiver should not issue
<tt>RESEND</tt>s for bytes that have not yet been granted.</t>
          </li>
          <li>
            <t>If a client has not yet transmitted all of the granted (or unscheduled)
bytes for a request message, it should not issue a <tt>RESEND</tt> for the response.</t>
          </li>
        </ul>
      </section>
      <section anchor="responding-to-resends">
        <name>Responding to RESENDs</name>
        <t>When an endpoint receives a <tt>RESEND</tt> packet it <bcp14>MUST</bcp14> respond in order to prevent
timeouts at the packet's sender. It <bcp14>MAY</bcp14> respond in either of three ways:</t>
        <ul spacing="normal">
          <li>
            <t>The endpoint receiving the <tt>RESEND</tt> <bcp14>MAY</bcp14> retransmit the range of bytes
requested in the <tt>RESEND</tt> packet (it <bcp14>MUST</bcp14> set the <tt>Retrans</tt> flag in each
retransmitted DATA packet).</t>
          </li>
          <li>
            <t>The endpoint receiving the <tt>RESEND</tt> <bcp14>MAY</bcp14> respond with <tt>RPC_UNKNOWN</tt>. This
happens if the receiver of the <tt>RESEND</tt> is the server for the RPC, but it has
not yet received any packets for the RPC (either <tt>DATA</tt> or <tt>START_MSG</tt>).</t>
          </li>
          <li>
            <t>The endpoint receiving the <tt>RESEND</tt> <bcp14>MAY</bcp14> respond with a BUSY packet. This
indicates that the recipient of the <tt>RESEND</tt> is alive and aware of the message but is not
yet prepared to transmit the requested data. This can happen if a server
receives a <tt>RESEND</tt> for an RPC's response at a time when it has received
the entire request but the RPC is still being serviced so the response
message is not yet ready. This can also happen if the endpoint receiving
the <tt>RESEND</tt> has chosen not to transmit the "missing" data (e.g., it is
using all of its uplink bandwidth for higher priority transmissions).</t>
          </li>
        </ul>
      </section>
      <section anchor="timeouts">
        <name>Timeouts</name>
        <t>If an endpoint issues multiple <tt>RESEND</tt> packets for an RPC and receives no
response from the peer endpoint, the peer is considered to have failed.
When this happens, all RPCs involving that endpoint <bcp14>SHOULD</bcp14> be aborted.</t>
        <t>An endpoint <bcp14>SHOULD NOT</bcp14> delete per-peer state for a timed-out endpoint,
such as unscheduled priority cutoffs. This is because the peer might
not have actually crashed. It is possible that the timeout occurred
because of a disruption in communication, but the peer is still alive
and will eventually resume communication.</t>
        <t>An endpoint <bcp14>SHOULD NOT</bcp14> timeout a peer until multiple <tt>RESEND</tt> packets
have been issued with no response. This is because any given <tt>RESEND</tt>
packet could potentially be lost. Timeouts are expected to be infrequent
and the consequences of a timeout are relatively severe, so it is
better to wait long enough to be certain that the peer has
crashed or is unreachable.</t>
      </section>
      <section anchor="retransmitting-startmsg-packets">
        <name>Retransmitting <tt>START_MSG</tt> Packets</name>
        <t>If an endpoint transmits a <tt>START_MSG</tt> packet for a scheduled message
and receives no <tt>GRANT</tt> packets for that message, it must eventually
retransmit the <tt>START_MSG</tt> packet, in case the original <tt>START_MSG</tt>
was lost. If an endpoint receives a <tt>START_MSG</tt> packet for a message
that it is already aware of, it should transmit either a <tt>GRANT</tt> or
<tt>BUSY</tt> packet in response.</t>
      </section>
    </section>
    <section anchor="secAcks">
      <name>At-Most-Once Semantics</name>
      <t>While a server retains state for an RPC, it <bcp14>MUST NOT</bcp14> pass that request
to the server application more than once. This duplicate-suppression
property does not guarantee at-most-once execution after the server
reclaims the RPC state, crashes, or restarts. In those cases, a delayed
or retried request can be treated as a new RPC and can be executed
again. Applications that require at-most-once effects across state
reclamation, crashes, or retries need application-level deduplication
that persists across those events.</t>
      <t>Duplicate suppression requires careful management of RPC state on
servers. The server creates internal state for an RPC
when it receives the first <tt>DATA</tt> packet for that RPC. Under normal
conditions the state will be retained until the RPC has been executed
by the application and the result has been returned to the client.</t>
      <t>Up until the request message is passed to the server application for
execution, the server <bcp14>MAY</bcp14> delete its state for the RPC. Once the
request message has been passed to the server application, the server
endpoint <bcp14>MUST</bcp14> retain its state
for the RPC until the client has received the response message or
the server has reason to believe the client has crashed.
If a server deletes its state before one of these events occurs, a
<tt>RESEND</tt> from the client could cause the creation of a new RPC on the
server. Applications requiring duplicate suppression beyond the
lifetime of this endpoint state need a separate, durable mechanism.</t>
      <t>Homa includes an acknowledgment mechanism that clients use to notify
servers that they have received the full response for an RPC; this
indicates to the server that it can safely delete its state for the
RPC. Acknowledgments <bcp14>MAY</bcp14> be made in either of two different ways:</t>
      <ul spacing="normal">
        <li>
          <t>The acknowledgment for an RPC <bcp14>MAY</bcp14> be piggybacked on a future <tt>DATA</tt>
packet sent by the client. Each <tt>DATA</tt> packet includes space in its header
to acknowledge one RPC.</t>
        </li>
        <li>
          <t>A client <bcp14>MAY</bcp14> send an explicit <tt>ACK</tt> packet, which may contain multiple
acknowledgments.  This form may be useful if a client has RPCs to
acknowledge but no new RPCs to use for piggybacking acknowledgments.
<tt>ACK</tt>s are also sent in response to <tt>NEED_ACK</tt> packets, as discussed
below.</t>
        </li>
      </ul>
      <t>Acknowledgments are not reliable. Both <tt>DATA</tt> and <tt>ACK</tt> packets may be lost,
and there is no way for a client to know whether an acknowledgment has been
received by the server. Although clients <bcp14>SHOULD</bcp14> attempt to acknowledge
each completed RPC, they <bcp14>MAY</bcp14> delete information about a pending
acknowledgment once it has been included in a <tt>DATA</tt> or <tt>ACK</tt> packet.</t>
      <t>If a server fails to receive an acknowledgment within a reasonable
time after sending the last <tt>DATA</tt> packet for a response message,
then it <bcp14>MUST</bcp14> request an acknowledgment for the RPC using a <tt>NEED_ACK</tt>
packet. When a client receives a <tt>NEED_ACK</tt> packet, it <bcp14>MUST</bcp14> return
an <tt>ACK</tt> packet unless it can determine that it has not received
the RPC's response. A client must return an <tt>ACK</tt> if it has no
state for the RPC (this is likely to be the case, since the client
can delete its state for an RPC once it has received the response).</t>
      <t>If a client receives a <tt>NEED_ACK</tt> packet for an RPC with an incomplete
response, it <bcp14>MUST NOT</bcp14> return an <tt>ACK</tt> packet. However, it
<bcp14>MAY</bcp14> issue <tt>RESEND</tt> requests for missing packets at this time.</t>
      <t><tt>NEED_ACK</tt> packets are not reliable, so servers <bcp14>MUST</bcp14> continue to issue
<tt>NEED_ACK</tt> requests for an RPC until an acknowledgment has been received.
 If an extended period of time elapses with no communication of any
 sort from the peer endpoint for the RPC, then the server <bcp14>MAY</bcp14> assume
 that the client has crashed and reclaim its state for the RPC.</t>
      <t>An extended disruption of communication can cause the server to assume
a client crash and delete its state for the RPC. The timeout period on
the server <bcp14>MUST</bcp14> be long enough so that even if the client has not
actually crashed it will have timed out the RPC on its end and aborted
it.</t>
      <section anchor="discussion">
        <name>Discussion</name>
        <t>The duplicate-suppression property above does not prevent a delayed
request from being executed again after the server has deleted its RPC
state. Preventing this requires additional state to detect old requests,
such as a per-client high-water mark of processed RPC identifiers.
This document does not specify such a mechanism.</t>
        <t>It is questionable whether at-most-once semantics are worth the complexity
they add to the protocol. Applications generally expect it, so not
attempting to provide it could discourage Homa adoption.
However, applications are likely to retry operations after
server crashes, which can lead to multiple executions. Thus, the
only truly safe approach is for duplicate executions to be detected and
discarded at application level. This isn't a problem that can be solved
entirely by network transport.</t>
      </section>
    </section>
    <section anchor="secPacer">
      <name>Pacing</name>
      <t>Homa endpoints <bcp14>MUST</bcp14> implement an SRPT policy for packet transmission,
where packets from short messages are given priority for transmission
over those from long messages. However, few if any NICs  support a notion
of transmit priority: packets will be transmitted (roughly) in the order
in which they were enqueued at the NIC. If a long queue of transmit packets
builds up in the NIC, then a new packet for a short
message will suffer head-of-line blocking in the NIC transmit queue.
Homa endpoints <bcp14>MUST</bcp14> attempt to reduce head-of-line blocking delays in
the NIC for short messages.</t>
      <t>To prevent head-of-line blocking delays in NICs that do not support
priorities, Homa endpoints <bcp14>MUST</bcp14> limit the buildup of transmit queues
in the NIC. One way to do this is with a <em>pacer</em>, which throttles the
rate at which packets are enqueued in the NIC so that it doesn't exceed
the link speed.  If a large number of outbound packets arrive suddenly,
most of them will be queued in the pacer, not in the NIC.  The pacer
queue can be managed with SRPT so that short messages are not
delayed by long ones.</t>
      <t>Here are some considerations for the design of the pacing mechanism:</t>
      <ul spacing="normal">
        <li>
          <t>The timing of a software pacing mechanism is not perfectly predictable
(e.g., the pacer could be delayed by interrupts)
so the pacer must allow a small queue in the NIC in
order to keep the uplink fully utilized if the pacer is momentarily
non-responsive. In the Linux kernel implementation, 5 μs worth of data seems
to be adequate.</t>
        </li>
        <li>
          <t>The pacing mechanism must include all outbound network traffic,
including packets from TCP and other non-Homa protocols. Otherwise
non-Homa traffic can generate long NIC queues, which will degrade
Homa performance.</t>
        </li>
        <li>
          <t>The pacer should limit output to just slightly less than the network
bandwidth in order to be safe. If it errs and generates output at
a rate even slightly higher than the network bandwidth, long queues
will build up in the NIC during bursts of high load.</t>
        </li>
        <li>
          <t>Unfortunately, NICs cannot always transmit packets at full link speed;
for example, measurements of 100 Gbps Intel NICs in December 2025 showed
NIC output as low as 80% of link bandwidth even with a large backlog of
(mixed-size) output packets. As a result, with this approach alone NIC
queues frequently build up (measurements showed total NIC backlogs of
5 MB or more under high network load). If the pacing rate is reduced to
a level where the NIC can always keep up, it would sacrifice link bandwidth
in the normal case where the NIC can transmit at line rate.</t>
        </li>
        <li>
          <t>Thus the Linux kernel implementation of Homa also uses a second approach,
which is based on information maintained by the Linux dynamic queue limits
mechanism (DQL). DQL keeps counters that indicate how many bytes of
packet data are in the NIC's possession (i.e. packets that have been passed
to the NIC but not yet returned after transmission). If the number of
outstanding bytes exceeds a limit then the NIC is considered congested and
Homa will stop queuing more packets until the congestion subsides.
Measurements in January 2026 indicate that this reduces worst-case total
NIC queuing by 2-3x.</t>
        </li>
        <li>
          <t>It might seem that the second approach is sufficient by itself, so the
first approach is not needed. Unfortunately there can be a significant lag
(10's of μsecs) between when a packet is transmitted and when the DQL
counters get updated. In order to keep the NIC running at line rate,
The NIC must be allowed to buffer enough data to cover that lag (40 μsecs as
of May 2026); this means that outgoing packets can be queued for as much
as 40 μsecs. In contrast, the rate-based pacing mechanism can limit
NIC buffers to about 5 μsecs, which provides a much tighter bound on NIC
queue length. Thus, tail latency for short messages is minimized with a
dual approach: the time-based pacing mechanism keeps the NIC queue very
short in the normal case where the NIC can transmit at full link speed,
and the DQL-based mechanism limits queue buildup in situations where the
NIC can't transmit at full link speed. Measurements in May 2026 indicate
that disabling either of these techniques increases P99 latency for
short messages by 10-15%.</t>
        </li>
        <li>
          <t>It may make sense for the shortest packets to bypass the pacing mechanism
completely (transmit them immediately without checking for NIC congestion).
This is done in the Linux kernel implementation because (a)  it reduces tail
latency significantly for short packets, (b) modern machines cannot
generate enough short packets to cause NIC queue buildup, and (c) the
the mechanism for transmitting deferred packets is implemented in a single
thread, which doesn't have enough throughput to handle all the short
packets at high load (whereas the normal processing for packets that are
not deferred happens concurrently on multiple cores).</t>
        </li>
      </ul>
      <t>When implementing an SRPT policy for packet transmission, Homa
endpoints <bcp14>MAY</bcp14> choose to reserve a small amount of outbound
bandwidth for the oldest message in order to prevent starvation.
The motivation for this is similar to the FIFO granting mechanism
described in <xref target="secGrants"/>.</t>
    </section>
    <section anchor="secBuffers">
      <name>Managing Buffer Occupancy in Switches</name>
      <t>Homa's performance will degrade badly if packets are dropped frequently
because of buffer overflows in the network switches (occasional packet
drops are not problematic). Homa does not depend on packet drops for a
congestion signal, so in principle there should be no packet drops.
However, modern switches have limited buffer space and the amount of
switch buffer memory is not increasing as quickly as network bandwidth.
This increases the likelihood that switch buffers will overflow.</t>
      <section anchor="sources-of-buffer-buildup">
        <name>Sources of buffer buildup</name>
        <t>The most common location for buffer buildup is at the edge downlinks from
TORs to hosts. Queuing is caused by incast,
where multiple senders transmit simltaneously to the same receiver.
Assuming all links have the same bandwidth, there is no way for the
receiver's downlink to transmit packets as fast as they arrive
at the TOR.</t>
        <t>Homa gives receivers considerable control over their incoming
traffic, and thus over buffer buildup. However, queuing at TOR
downlinks can still happen in 2 ways:</t>
        <ul spacing="normal">
          <li>
            <t>Unscheduled messages. Senders can transmit unscheduled messages
without receiving permission in advance from receivers. This feature
provides a significant latency benefit, but it carries the risk of
buffer buildup. There is no limit to how many senders
can transmit unscheduled messages to the same receiver at once.</t>
          </li>
          <li>
            <t>Overcommitment. Receivers intentionally issue grants to multiple
incoming messages at once; this will result in
buffer buildup in the switch. The buffer buildup from granted packets
is limited by the degree of overcommitment: as discussed previously
in <xref target="secGrants"/>, the
worst-case packet queuing in the switch from grants will be equal to the
receiver's total incoming data, minus one BDP.</t>
          </li>
        </ul>
        <t>Both forms of queuing can happen simultaneously.</t>
        <t>Buffer buildup can also occur within the switching fabric, for example
if multiple long messages are routed across the same internal link in
the fabric.</t>
      </section>
      <section anchor="configuring-the-network">
        <name>Configuring the network</name>
        <t>Network switches <bcp14>SHOULD</bcp14> configured in 2 ways to reduce the likelihood of
buffer overflows for Homa:</t>
        <ul spacing="normal">
          <li>
            <t>Buffer space within a switch <bcp14>SHOULD</bcp14> be shared dynamically across
egress ports, rather than statically allocating
space to each port. This is particularly important for the TOR
downlinks: when incast occurs at one port, there will be other
ports that are underutilized. It is unlikely that there will be large
queues on many egress ports simultaneously.</t>
          </li>
          <li>
            <t>Packet spraying <bcp14>SHOULD</bcp14> be used for Homa packets within the switching
fabric (i.e.  different packets within a message may take different
paths through the fabric in order to balance loading within the fabric).
In contrast, TCP requires flow-consistent routing: packet reorderings
cause problems for TCP, so all of the packets within a TCP flow must
follow the same path through the fabric to prevent reorderings.
With flow-consistent routing, queues can build up in the fabric if
two flows happen to share an internal link within the fabric; this
can occur even if the fabric overall is underutilized. With
packet spraying, queues are unlikely to form in the fabric unless
the entire fabric is running at near-capacity (and modern datacenters
are generally configured with excess fabric capacity).</t>
          </li>
        </ul>
      </section>
      <section anchor="dealing-with-inadequate-buffer-space">
        <name>Dealing with inadequate buffer space</name>
        <t>Depending on the workload, the network speed, and the available switch
buffer space, it is possible that packet drops may occur for Homa
at an unacceptably high level. If this happens, Homa can be modified
in two ways to reduce its buffer utilization.</t>
        <ul spacing="normal">
          <li>
            <t>Reduce the amount of maximum allowed size for unscheduled messages.
Scheduled messages suffer an additional 1 RTT of delay for the
<tt>START_MSG</tt> packet and the first <tt>GRANT</tt> packet before data
transmission begins; reducing the maximum unscheduled size will
increase the number of messages that pay this additional latency.</t>
          </li>
          <li>
            <t>Use grants to limit the total amount of incoming data. To do this,
Homa endpoints <bcp14>SHOULD</bcp14> keep track of their total incoming data,
including both unscheduled and scheduled data.
An adjustable limit <bcp14>SHOULD</bcp14> be supported, such that grants will not
be issued when total incoming data exceeds the limit. As the limit
is reduced, Homa endpoints <bcp14>SHOULD</bcp14> either reduce the degree of
overcommitment or reduce the amount of incoming for each message
below one BDP.  Each of these reductions will have some impact
on throughput, but this impact is likely to be less damaging
than the impact of frequent packet drops.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TBD</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This area is currently almost completely unaddressed in Homa. We would
welcome help identifying potential threats and other security issues.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>IANA has assigned IP protocol number 146 for Homa.</t>
    </section>
    <section anchor="questions-and-unresolved-issues">
      <name>Questions and Unresolved Issues</name>
      <t>The following questions are included to invite feedback from interested parties. Their resolution may require further
discussion before this document can serve as a complete interoperable
protocol specification.</t>
      <section anchor="requirement-language-policy-and-implementation-guidance">
        <name>Requirement language, policy, and implementation guidance</name>
        <ul spacing="normal">
          <li>
            <t>How to decide whether to use <bcp14>MUST</bcp14> vs. <bcp14>SHOULD</bcp14>? E.g., if something
only affects performance but not correctness, is that a <bcp14>SHOULD</bcp14>?</t>
          </li>
          <li>
            <t>To what degree should this document discuss policy choices, vs. just
the mechanisms? In some cases, such as policies for issuing grants,
it's not a problem if different endpoints use different policies.
To what degree should that be reflected here?</t>
          </li>
          <li>
            <t>How much should this document reflect current hardware and software
characteristics?</t>
          </li>
          <li>
            <t>Should this document describe details of the Linux implementation?
This information might be useful to people writing new implementations.</t>
          </li>
        </ul>
      </section>
      <section anchor="encapsulation-and-wire-format">
        <name>Encapsulation and wire format</name>
        <ul spacing="normal">
          <li>
            <t>Which packet-carriage method should this version specify: Homa directly
using IP protocol number 146, or Homa over UDP? Could the choice also
define packet demultiplexing, checksum handling, address-family behavior,
and any required IANA actions? Once UDP encapsulation is complete,
should all mention of TCP hijacking be removed?</t>
          </li>
          <li>
            <t>What additional rules would independent implementers need for field
encoding, the relationship between <tt>Rpcid</tt> and <tt>S</tt>, protocol versioning,
malformed packets, and packet-size, path-MTU, or fragmentation behavior?</t>
          </li>
          <li>
            <t>Specify constants, such as largest message length and number of priorities?</t>
          </li>
        </ul>
      </section>
      <section anchor="loss-recovery-and-endpoint-behavior">
        <name>Loss recovery and endpoint behavior</name>
        <ul spacing="normal">
          <li>
            <t>Change to drive retransmission entirely from the client?</t>
          </li>
          <li>
            <t>Could sender and receiver state transitions be specified for packet
loss, reordering, stale grants and cutoff updates, RESEND ranges,
and ACK/NEED_ACK recovery?</t>
          </li>
        </ul>
      </section>
      <section anchor="security-and-resource-limits">
        <name>Security and resource limits</name>
        <ul spacing="normal">
          <li>
            <t>Could contributors help identify appropriate protections against spoofed
or replayed packets, forged retransmission or state-release requests,
and denial-of-service attacks?</t>
          </li>
          <li>
            <t>What resource bounds and endpoint behavior should be specified for
incomplete RPCs, reassembly, outstanding state, and unscheduled traffic?</t>
          </li>
        </ul>
      </section>
      <section anchor="congestion-priorities-and-deployment">
        <name>Congestion, priorities, and deployment</name>
        <ul spacing="normal">
          <li>
            <t>What deployment assumptions should this document make about network
congestion and coexistence with non-Homa traffic? Are additional
requirements needed for priority mapping, fairness, starvation
prevention, or network configuration?</t>
          </li>
          <li>
            <t>How to determine the limit for unscheduled messages? Include in CUTOFFS packets?</t>
          </li>
          <li>
            <t>Ideally, packet spraying should be used in the switching fabric. However,
Homa should also be able to spray packets by varying one of the port fields.</t>
          </li>
        </ul>
      </section>
      <section anchor="publication-scope">
        <name>Publication scope</name>
        <ul spacing="normal">
          <li>
            <t>What publication category and IETF stream are appropriate for this
document? Could the acknowledgments and other remaining editorial
details also be finalized before RFC publication?</t>
          </li>
        </ul>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC9293">
          <front>
            <title>Transmission Control Protocol (TCP)</title>
            <author fullname="W. Eddy" initials="W." role="editor" surname="Eddy"/>
            <date month="August" year="2022"/>
            <abstract>
              <t>This document specifies the Transmission Control Protocol (TCP). TCP is an important transport-layer protocol in the Internet protocol stack, and it has continuously evolved over decades of use and growth of the Internet. Over this time, a number of changes have been made to TCP as it was specified in RFC 793, though these have only been documented in a piecemeal fashion. This document collects and brings those changes together with the protocol specification from RFC 793. This document obsoletes RFC 793, as well as RFCs 879, 2873, 6093, 6429, 6528, and 6691 that updated parts of RFC 793. It updates RFCs 1011 and 1122, and it should be considered as a replacement for the portions of those documents dealing with TCP requirements. It also updates RFC 5961 by adding a small clarification in reset handling while in the SYN-RECEIVED state. The TCP header control bits from RFC 793 have also been updated based on RFC 3168.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="7"/>
          <seriesInfo name="RFC" value="9293"/>
          <seriesInfo name="DOI" value="10.17487/RFC9293"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC791">
          <front>
            <title>Internet Protocol</title>
            <author fullname="J. Postel" initials="J." surname="Postel"/>
            <date month="September" year="1981"/>
          </front>
          <seriesInfo name="STD" value="5"/>
          <seriesInfo name="RFC" value="791"/>
          <seriesInfo name="DOI" value="10.17487/RFC791"/>
        </reference>
        <reference anchor="RFC8200">
          <front>
            <title>Internet Protocol, Version 6 (IPv6) Specification</title>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <date month="July" year="2017"/>
            <abstract>
              <t>This document specifies version 6 of the Internet Protocol (IPv6). It obsoletes RFC 2460.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="86"/>
          <seriesInfo name="RFC" value="8200"/>
          <seriesInfo name="DOI" value="10.17487/RFC8200"/>
        </reference>
        <reference anchor="ReplaceTCP" target="https://arxiv.org/abs/2210.00714">
          <front>
            <title>It's Time to Replace TCP in the Datacenter</title>
            <author initials="J." surname="Ousterhout" fullname="John Ousterhout">
              <organization>Stanford University</organization>
            </author>
            <date year="2023" month="January"/>
          </front>
        </reference>
        <reference anchor="Homa" target="https://dl.acm.org/doi/10.1145/3230543.3230564">
          <front>
            <title>Homa: A Receiver-Driven Low-Latency Transport Protocol Using Network Priorities</title>
            <author initials="B." surname="Montazeri" fullname="Benham Montazeri">
              <organization>Stanford University</organization>
            </author>
            <author initials="Y." surname="Li" fullname="Yilong Li">
              <organization>Stanford University</organization>
            </author>
            <author initials="M." surname="Alizadeh" fullname="Mohammad Alizadeh">
              <organization>MIT</organization>
            </author>
            <author initials="J." surname="Ousterhout" fullname="John Ousterhout">
              <organization>Stanford University</organization>
            </author>
            <date year="2018" month="August"/>
          </front>
          <seriesInfo name="Proc. ACM SIGCOMM 2018, pp. 221–235" value=""/>
        </reference>
        <reference anchor="HomaLinux" target="https://www.usenix.org/system/files/atc21-ousterhout.pdf">
          <front>
            <title>A Linux Kernel Implementation of the Homa Transport Protocol</title>
            <author initials="J." surname="Ousterhout" fullname="John Ousterhout">
              <organization>Stanford University</organization>
            </author>
            <date year="2021" month="July"/>
          </front>
          <seriesInfo name="2021 USENIX Annual Technical Conference (USENIX ATC '21), pp. 773–787" value=""/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+19a5Ib15Xm/7uKnFI4VMUBIBZFWhLlaXWJpKSyxYdZxdY4
3AozASSq0kxkojMTLMKyOmYPs4FZyPyaBcwiZiVzvvO4j0yAlB9SeyakjmhL
KOA+zz3v853pdOr6sq+K+9nRV806v5+d1dnzZw+yyzavu03T9tmztumbRVNl
q6bNHuZ9vijqvmi7I5fP523xWn955BZ5X1w17e5+Vtarxrlls6jzNY28bPNV
P222Hf3sutn20757fXM1vaZfTW/fdt12vi67rmzqfrehr58/uvwiy97L8qpr
aPCyXhabgv5f3R9NsqNiWfZNW+YV/uP87HP6H1rX0fnzyy+OXL1dz4v2vlvS
Uu67RVN3Rd1tu/tZ324LR0v90N007aurttlu7meXF//yzZfZN/RBWV9lX+JD
5/Jtf93QENnUZfTPaltVsotfN9d19tRvgv/atFd5Xf4p72nx97OLPqeNt8vs
RV2+phMq+x1/q1jnZXU/kwP450U36/SLs2K5HU90eV3u8qu8zf+Y19m/FFW+
2eT1nuke5xhvkbfLSXZeL2bxXPEYMxvjn9f+F7NFsx7PfNEXr4s6+zy/mu/+
wgnlpzP+6XAeVzftmsZ4TXeSZc+/ePDJnU8+vO8cyCT9w0efnOq/fXzn9m3+
12JTEcVdPnh2n6czYj3v3++yy3JdZH1jX8roW0R7WX9dRIR6xL/z18r/TLPD
d6r7PnydTFzZr/N6m7e7SXbn9p0PZWl5e1X0NsV132+6+x98kLdvytczGvCD
fN59cOfO6e3Z7dsfnd519D1+ccm29A3SjhYFJp0+bEtcydfNzfRrmrde7PY9
zRcdUbBfPf3zpOhB6PSNkh5LXxbd247h86K+ztfZY3qB+Z+Ktvxh5xB+/7uy
augFff0X//BxQ/Ou82V2VhGVLYvrdIDH55d/jwvraEtFB2qzjdPBLWbZ2YPH
2cX5lw+ePn5Mt3j68STbbGYZXdH/+W///c6H98Jl66/Otlc0M3/1LRe+rGb5
Ys03vmzKD+i+T0/v3vvgwzsf3r5398MZ/+8v/fV/XdbbNykNnGX8Yfaboq2L
Kjtfb6piTaTMrzBrVkzf+O0eSvhriL2siUH+evZ3OFZ6CqfZi4tHT87/K8kR
eh9VdlksrutyQf/2oKlXRUsUXGTH9p3LB9n7d05P5OA/+uhDOviPPv5odPC/
3lY7Hvwtx35zczPbErsv3/DRdzvazPqDVVkV3Qd5v7hzGgmg2Wa5cs5Np9OM
HmXf5oveOWKZXUYya4uzzpbFqqyLLpx17896o2c9kz/Qf74ul0XniMdWtFPc
UpfdlP11lmdtUZX5vCqyvF5mxWpVLkqMvqZTIcbarVmoLulLdLB4wm3xb9uC
aAxfbwuajyQYfbvr8itaDL7cFuumLzDrgqRHW2R0tlWXHZPQ7k5m7rzPaBsl
MT6SmEv+BZ0KL4c44zKIb109/bHzE0xofuU7JJC39Psr2nXfTXg9m3zxqsD2
jaWA9XbbDR8KdAZwnKrJl93MPdvOq7K7phGK13m11UNpC/4ujmW5XRg5rxva
RU/nkZ3efsP8myRKVgm3c9hBd42f+WOgQ2WhgfnB8vkrm2JR0vGGRTisucdh
kh5ASgNW8CnNk9xyQ8PVDX2lyss1LWxTtCyTiEpducbV8tPjKeicowPMivp1
2TY1/kwbZmJal8tlVTj3HonHvm10j87xSdO8eXZV1EWbV9PNtt00dC9jqnrb
le273YTq6BR7/vFbqWRCkje7uS4XQqFCcXq6GL/jHbcNDmRRMcHSSeeOHjyR
xoSmrarmhuaf73iAlEzpg35LnGspQ+AByQ+zOREQRqKPnIyrREh3T+cmj00f
w84Ynb91XCdUQvpGXyz6TpeTrYhaaIe4Ax5sWa6Iz3QyO8jj96pxfAvayqt1
Q7steIp1/kecIGinx3xlT7RBLO2qJu3klqytNPYbngk4Zl+Q1KKfzHd0zMRC
inyNFdiPOhBdXfD9086iP/GD2//M+D5XdLT4MdFPxXv2NCpqMLE9ejbzLTaZ
NYvFlhQ7UgpyUBdWngsF0Qi0Ukw/I2Ww6JgWiLrxbmkI2uWiLefC20iTwqxT
m9VzJzyXYkcrwPwTXDf997orqtfgFZk+ul00mV851sBXT2S8uIZ+vcrnbbkI
B+H3BQosiUTLekpShnaljMYoYQbejB3I1WSL66ZcgFpYDvAsyiz4vPSWpvZz
p+PLHdKVRW845VrZs/D69bQ7HDbo1b4lV0L6ZrNjxvCDeQuephAoCSBlM51p
rEKO+5kLbf9JA43TKAtjdtuyZ7li3IIG+ebsSQdbqKH1puyJeYm7Lq+u7aRm
fjQ5VKLBbY2zx2nmRJTrjbFnMovq5bRvyw1ZinS4+CzPVsUNMdea/2tdLlpi
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
7KiO+/yLB/FC6byn0ymnbLr/C0wyFJyBDgEA

-->

</rfc>
