<?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.6.14 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-shi-quic-dtp-06" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.0 -->
  <front>
    <title abbrev="DTP">Deadline-aware Transport Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-shi-quic-dtp-06"/>
    <author initials="Y." surname="Cui" fullname="Yong Cui">
      <organization>Tsinghua University</organization>
      <address>
        <postal>
          <street>30 Shuangqing Rd</street>
          <city>Beijing</city>
          <country>China</country>
        </postal>
        <email>cuiyong@tsinghua.edu.cn</email>
      </address>
    </author>
    <author initials="C." surname="Ma" fullname="Chuan Ma">
      <organization>Tsinghua University</organization>
      <address>
        <postal>
          <street>30 Shuangqing Rd</street>
          <city>Beijing</city>
          <country>China</country>
        </postal>
        <email>mc21@mails.tsinghua.edu.cn</email>
      </address>
    </author>
    <author initials="H." surname="Shi" fullname="Hang Shi">
      <organization>Huawei</organization>
      <address>
        <email>shihang9@huawei.com</email>
      </address>
    </author>
    <author initials="K." surname="Zheng" fullname="Kai Zheng">
      <organization>Huawei</organization>
      <address>
        <email>kai.zheng@huawei.com</email>
      </address>
    </author>
    <author initials="W." surname="Wang" fullname="Wei Wang">
      <organization>Huawei</organization>
      <address>
        <email>wangwei375@huawei.com</email>
      </address>
    </author>
    <date/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Deadline-aware Transport Protocol</keyword>
    <abstract>
      <t>This document defines Deadline-aware Transport Protocol (DTP) to provide block-based deliver-before-deadline transmission. The intention of this memo is to describe a mechanism to fulfill unreliable transmission based on QUIC as well as how to enhance timeliness of data delivery.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-shi-quic-dtp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/STAR-Tsinghua/DTP-draft"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction">
      <name>Introduction</name>
      <t>Many emerging applications have the deadline requirement for their data transmission.  However, current transport layer protocol like TCP <xref target="RFC0793"/> and UDP <xref target="RFC0768"/> only provide primitive connection establishment and data sending service. This document proposes a new transport protocol atop QUIC <xref target="QUIC"/> to deliver application data before end-to-end deadline.</t>
      <section anchor="conventions">
        <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>
      </section>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>Many applications such as real-time media and online multiplayer gaming have requirements for their data to arrive before a certain time i.e., deadline. For example, the end-to-end delay of video conferencing system should be below human perception (about 100ms) to enable smooth interaction among participants. For Online multiplayer gaming, the server aggregates each player's actions every 60ms and distributes these information to other players so that each player's state can be kept in sync. Data missing the deadline is useless since it will be overwrote by the new data.</t>
      <t>These real-time applications have following common features:</t>
      <ul spacing="normal">
        <li>They tend to generate and process the data in block fashion. Each block is a minimal data processing unit. Missing a single byte of data will make the block useless. For example, video/audio encoder produces the encoded streams as a series of block(I,B,P frame or GOP). Decoder consumes the frame into the full image. For online games, the player's commands and world state will be bundled together as a message.</li>
        <li>They will continuously generate new data. Different from web browsing or file syncing, real-time applications like video conferencing and online multiplayer gaming have uninterruptedly interactions with users, and each interaction requires a bunch of new data to be transmitted.</li>
        <li>They prefer the timeliness of data instead of reliability since data missing deadline are useless to application and will be obsoleted by newer data. For example in multiplayer online games, the gaming server will broadcast the latest player states to every client, and the old information does not matter if it can not be delivered in time. So the meaningful deadline of the application is actually the block completion time i.e., the time between when the block is generated at sender and when the block is submitted to application at receiver.</li>
      </ul>
      <t>However, current transport layer protocols lack support for block-based deadline delivery. TCP guarantees reliability so it will waste network resource to transmit stale data and cause fresh data to miss its deadline. UDP is unreliable but it doesn't drop data according to deadline, all data have the same chance to be dropped indeed. QUIC makes several improvements and introduces Stream Prioritization
<xref target="QUIC"/> to enhance application performance, but prioritization is not enough for enhancing timeliness.</t>
      <t>Insufficiency of existing transport layer forces applications to design their own customized and complex mechanism to meet the deadline requirement. For example, the video bitrate auto-adjustment in most streaming applications. But this is a disruption to the Layered Internet Architecture, forcing applications to worry about network conditions.</t>
      <t>This document proposes Deadline-aware Transport Protocol (DTP) to provide deliver-before-deadline transmission. DTP is implemented as an extension of QUIC (Refer to <xref target="extension-to-quic"/>) because QUIC provides many useful features including full encryption, user space deployment, zero-RTT handshake and multiplexing without head-of-line blocking.</t>
    </section>
    <section anchor="design-of-dtp">
      <name>Design of DTP</name>
      <t>The key insight of DTP is that these real-time applications usually have multiple blocks (As shown in <xref target="arch-of-dtp"/> below) to be transferred simultaneously and these blocks have diverse impact on user experience(denoted as priority). For example, audio data is more important than video stream in video conferencing. Central region is more important than surrounding region in 360 degree video. Foreground object rendering is more important than the background scene in mobile VR offloading.</t>
      <t>The priority difference among multiple blocks makes it possible to drop low priority data to improve timeliness of high priority data delivery, which can enhance the overall QoE if resources allocated to blocks are correctly prioritized. In this section, we describe the mechanism which enables DTP to leverage that insight.</t>
      <section anchor="data-abstraction">
        <name>Abstraction</name>
        <t>DTP provides block-based data abstraction for application. A 'block' is a piece of continuous data. A partial delivered block is useless for applications, and each block can be independently processed. Application <bcp14>MUST</bcp14> attach metadata along with the data block to facilitate the scheduling decision, those metadata include:</t>
        <ul spacing="normal">
          <li>Each block has a deadline requirement, meaning if the block cannot arrive before the deadline, then the whole block may become useless because it will be overwrote by newer blocks.  The application can mark the deadline timestamp indicating the deadline of its completion time. In the API of DTP, the deadline argument represents the desired block completion time in ms.</li>
          <li>Each block has its own importance to the user experience. The application can assign each block a priority to indicate the importance of the block. The lower the priority value, the more important the block. The priority argument also indicates the reliability requirement of the block. The higher priority, the less likely the block will be dropped by sender.</li>
        </ul>
        <t>The sender can actively drop any block. DTP <bcp14>SHOULD</bcp14> transmit every undropped block reliably.</t>
      </section>
      <section anchor="architecture-of-dtp">
        <name>Architecture of DTP</name>
        <t>The sender side architecture is shown in <xref target="arch-of-dtp"/>:</t>
        <figure anchor="arch-of-dtp">
          <name>The Architecture of DTP</name>
          <artwork><![CDATA[
                            +-------------+
                            |             |
                            | Application |
                            |             |
                            +-------------+
                                   |
                                   |
                                   V
 +------------------------------------------------------------------------+
 |         Block 0                Block 1                   Block n       |
 | +--------+----------+  +--------+----------+     +--------+----------+ |
 | |Metadata|Data Block|  |Metadata|Data Block| ... |Metadata|Data Block| |
 | +--------+----------+  +--------+----------+     +--------+----------+ |
 |                                                                        |
 | (Metadata includes Deadline and Priority)                              |
 +------------------------------------------------------------------------+
                                   |
                                   |
                                   v
                            +-------------+
                            |             |
                            |  Scheduler  |
                            |             |
                            +-------------+
                                   |
                                   |
                                   v
                            +-------------+
                            |             |
                            | Redundancy  |
                            |             |
                            +-------------+
                                   |
                                   |
                                   v
                            +-------------+
                            |             |
                            | Congestion  |
                            | Control     |
                            +-------------+
                                   |
                                   v
]]></artwork>
        </figure>
      </section>
      <section anchor="deadline-aware-scheduler">
        <name>Deadline-aware Scheduler</name>
        <t>The scheduler will pick the blocks to send and drop stale blocks when the buffer is limited. This section describes the algorithm of DTP scheduler.</t>
        <t>Scheduler of DTP takes into account many factors when picking blocks in sender buffer to send. The goal of the scheduler is to deliver as much as high priority data before the deadline and drop obsolete or low-priority blocks. To achieve this, the scheduler utilizes both bandwidth and RTT measurement provided by the congestion control module and the metadata of blocks provided by the application to estimate the block completion time. The scheduler will run each time ACK is received or the application pushes the data.</t>
        <t>A simple algorithm which only considers priority cannot get optimal result in transmitting deadline-required data. Suppose the bandwidth reduces and the scheduler chooses not to send the low priority block. Then the bandwidth is restored. The data block with lower priority is closer to the deadline than the high priority block. If in this round the scheduler still chooses to send the high priority block, then the low priority block may miss the deadline next round and become useless. In some cases, the scheduler can choose to send a low priority block because it's more urgent. But it should do so without causing the high priority stream missing the deadline. This example reveals a fundamental conflict between the application specified priority and deadline implicated priority. DTP needs to take both priorities into consideration when scheduling blocks.</t>
        <t>DTP will combine all these factors to calculate real priority of each block. Then the scheduler just picks the block with the highest real priority. Scheduler of DTP will calculate the block remaining transmission time and then compare it to the deadline. The closer to the deadline, the higher real priority. And higher application specified priority will also result in higher real priority. In this way, the scheduler can take both approaching deadline and application-specified priority into account. Blocks which are severely overdue can be dropped accordingly.</t>
        <section anchor="block-dropping-mechanism">
          <name>Block dropping mechanism</name>
          <t>DTP allows the sender side to cancel sending several blocks in the transport layer, and this action is called 'drop'. By dropping some stale blocks, DTP can enhance the timeliness of other sending blocks and save bandwidth. DTP <bcp14>SHOULD</bcp14> implement some strategies on the sender side to determine which 'block' should be dropped. On the receiver side, DTP <bcp14>SHOULD</bcp14> be able to check which block is dropped and <bcp14>MAY</bcp14> have functions to inform the application about the canceled blocks.</t>
        </section>
      </section>
      <section anchor="deadline-aware-redundancy">
        <name>Deadline-aware Redundancy</name>
        <t>After the scheduler pick the block to send, the packetizer will break the block into packet streams. Those packet streams will go through the redundancy module. When the link is lossy and deadline is tight, retransmission will cause the block missing the deadline. Redundancy module has the ability of sending redundancy (like FEC Repair Symbols) along with the data that will help to recover the data packets (like FEC Source Symbols), this can avoid retransmission.</t>
        <t>We use unencrypted DTP packets as input to Redundancy Module because the loss of a DTP packet exactly corresponds to the loss of one Redundancy Packet. And to perform the coding and decoding with packets of different sizes, some packets may need to be padded with PADDING Frame. The present design of Redundancy Module follows the FEC Framework specified in <xref target="arXiv_1809.04822"/>. <xref target="redundancy"/> illustrates this framework:</t>
        <figure anchor="redundancy">
          <name>DTP Redundancy Module</name>
          <artwork><![CDATA[
           |
           |
           v
    +-------------+
    |             |
    |     DTP     |
    |  Scheduler  |
    |             |
    +------+------+
           |
        (1)|DTP Packets
+----------|-------------------------------------------+
|          v                                           |
|  +-------+------+                    +------------+  |
|  |              | (2)DTP Payload     |            |  | DTP
|  |  Redundancy  |------------------> | Redundancy |  | Redundancy
|  |  Packtizing &|<------------------ | Scheme     |  | Module
|  |  Grouping    | (2)Redundancy Data |            |  |
|  +-------+------+                    +------------+  |
|          |                                           |
+----------|-------------------------------------------+
        (3)|Redundancy
           |Packets
           |
           v
]]></artwork>
        </figure>
        <t><xref target="redundancy"/> above shows the mechanism of how the Deadline-aware Redundancy module works. (1) Redundancy Module first receives the unencrypted DTP packets from scheduler. (2) The Redundancy Scheme use DTP Payload (similar to FEC Repair Symbols) to generate Redundancy Data (similar to FEC Source Symbols). (3) Redundancy-protected DTP Packets and Redundancy Data will be packtized and grouped. Redundancy Packtizing and Grouping Part will generate FEC Payload INFO (<xref target="rf"/>) and attach it to the DTP Packets and Redundancy Data, generating Redundancy Packets (a Redundancy Packet with the header shown in <xref target="rf"/>). Once the protocol receives the Repair Symbols, they are sent to the receiver through the FEC Packets. At the receiver-side, the received Redundancy Packets can be processed immediately. The Redundancy Data is reconstituted from the Redundancy Packtizing and Grouping and passed to the underlying Redundancy Scheme to recover the lost DTP Packets.</t>
        <t>Although Redundancy Module allows recovering lost packets without waiting for retransmissions, it consumes more bandwidth than a regular, non-Redundancy-protected transmission. In order to avoid spending additional bandwidth when it is not needed, design of Redundancy <bcp14>MUST</bcp14> allow defining which DTP packets should be considered as Redundancy Packets. Currently we use a F flag from DTP Packet Header to indicate whether a packet is Redundancy-protected or not. The format of header will be described in <xref target="redundancy-packet"/> later.</t>
        <t>The Redundancy Data generated in Redundancy module <bcp14>MUST</bcp14> be distinguished from application data payload. Redundancy Data should not be transferred to the application upon reception, they are indeed generated by and for the Redundancy Scheme used by the transport protocol. We use Redundancy Packet to transmit Redundancy Data <xref target="redundancy-packet"/>.</t>
        <t>There are multiple Redundancy Scheme candidates. During the handshake process, a scheme will be negotiated for the DTP session, just like encryption scheme negotiation. Currently DTP specifically chooses Reed-Solomon FEC Scheme as described in <xref target="arXiv_1809.04822"/>.</t>
      </section>
      <section anchor="congestion-control">
        <name>Loss Detection and Congestion Control</name>
        <t>This document reuses the congestion control module defined in QUIC <xref target="QUIC"/>. Congestion control module is responsible to send packets, collects ACK and do packet loss detection. Then it will put the lost data back to the retransmission queue of each block. Congestion control module is also responsible to monitor the network status and report the network condition such as bandwidth and RTT to scheduler.</t>
      </section>
    </section>
    <section anchor="extension-to-quic">
      <name>Extension of QUIC</name>
      <t>DTP is implemented as an extension of QUIC by <strong>mapping QUIC stream to DTP block one to one</strong>. In that way, DTP can reuse the QUIC stream cancellation mechanism to drop the stale block during transmission. And DTP can also utilize the max stream data size defined by QUIC to negotiate its max block size. Besides, the block id of DTP can also be mapped to QUIC stream id without breaking the QUIC stream id semantic.</t>
      <t>DTP implements its block dropping mechanism by leveraging QUIC's stream cancellation function. DTP only defines the drop action on the <strong>sender side</strong> to cancel stale blocks. DTP leaves the decisions to the application layer on the receiver side to determine whether to accept an overdue block. However, because QUIC allows to cancel streams on both sides and DTP is an extension of QUIC, DTP <bcp14>MAY</bcp14> cancel the block from the receiver side. It requires mechanisms to measure each receiving block's importance and drop it.</t>
      <t>DTP endpoints communicate by exchanging packets. And the payload of DTP packets, consists of a sequence of complete frames. As defined in <xref target="QUIC"/>, each frame begins with a Frame Type, indicating its type, followed by additional type-dependent fields. Besides the many frame types defined in Section 12.4 of <xref target="QUIC"/>, DTP introduces BLOCK_INFO Frame to support timeliness data transmission. And DTP also makes adjustment on QUIC ACK Frame. Another extension is introducing FEC packet to support FEC.</t>
      <section anchor="blockinfo-frame">
        <name>New Frame: BLOCK_INFO Frame</name>
        <t>DTP adds two kinds of BLOCK_INFO frames (type=0x20, 0x21). Either of these frames <bcp14>SHOULD</bcp14> be attached in the front of each block to inform the scheduler of Block Size, Block Priority, and Block Deadline. These parameters can be used to do block scheduling. The BLOCK_INFO frame is as follows:</t>
        <figure anchor="block">
          <name>BLOCK_INFO Frame 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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Stream ID (i)                        ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Block Size (i)                       ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Priority (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Deadline (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    [Start time stamp (i)]                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>Stream ID: A variable-length integer indicating the stream ID of the stream.</li>
          <li>Block Size: A variable-length integer indicating the size of the block.</li>
          <li>Block Priority: A variable-length integer indicating the priority of the block.</li>
          <li>Block Deadline: A variable-length integer indicating the required transimission deadline. Dealine should be a duration in microseconds.</li>
          <li>Start time stamp: An optional parameter to inform the receiver about the starting time of this block. This parameter may be helpful when the receiver wants to use the deadline information. The time stamp parameter <bcp14>SHOULD</bcp14> be the same format as <eref target="https://en.wikipedia.org/wiki/Unix_time">Unix timestamp</eref>. The sender and receiver <bcp14>SHOULD</bcp14> do clock synchronization if they use this parameter.</li>
        </ul>
      </section>
      <section anchor="timestamped-ack-frame">
        <name>Adjusted QUIC Frame: Timestamped ACK Frame</name>
        <t>DTP add a new Time Stamp Parameter to QUIC ACK Frame. Timestamped ACK frames are sent by reveiver to inform senders of the time when the packet the peer is acknowledging is received and processed. ACK mechanism of DTP is almost the same with QUIC. The format of the Timestamped ACK frames is similar to that of the standard ACK Frames defined in section 19.3 of <xref target="QUIC"/>:</t>
        <figure anchor="time">
          <name>Timestamped ACK Frame 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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Largest Acknowledged (i)                ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          Time Stamp (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          ACK Delay (i)                      ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       ACK Range Count (i)                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       First ACK Range (i)                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          ACK Ranges (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          [ECN Counts]                       ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>Using this time stamp parameter we can calculate whether the prior blocks transmitted missing deadline or not, and we can also calculate the block completion rate before deadline. The time stamp parameter <bcp14>SHOULD</bcp14> be the same format as <eref target="https://en.wikipedia.org/wiki/Unix_time">Unix timestamp</eref>.</t>
        <t>The Timestamped ACK is adequate to inform the sender about the timeliness information from the receiver side. To fully use the deadline information in the block, the sender and the receiver should do clock synchronization.</t>
      </section>
      <section anchor="redundancy-packet">
        <name>Redundancy Packet</name>
        <t>We use a F Flags in DTP Packet to distinguish which DTP packets is Redundancy-protected or not. <xref target="rf"/> shows the Redundancy Packet Format. If the flag is set, the Redundancy Group ID, m, n, index field is appended to the header. They are used by the Redundancy Scheme(Forward-Error-Correction) to identify the redundancy-protected data and communicate information about the encoding and decoding procedures to the receiver-side Redundancy Scheme.</t>
        <figure anchor="rf">
          <name>Redundancy Packet 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
   +-+-+-+-+-+-+-+-+
   |F|   Flags(7)  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                Redundancy Group ID (i)(if F set)            ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       m (i)(if F set)                       ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       n (i)(if F set)                       ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     index (i)(if F set)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         Payload (i)                         ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>F: A flag indicating whether this DTP packets is FEC-protected or not.</li>
          <li>Redundancy Group ID: A variable-length integer indicating the id of the redundancy group which the packet belongs to.</li>
          <li>m: A variable-length integer indicating the number of original packets of the redundancy group.</li>
          <li>n: A variable-length integer indicating the number of redundancy packets of the redundancy group.</li>
          <li>index: A variable-length integer indicating the location of the packet inside the redundancy group.</li>
          <li>Payload: The payload of the Redundancy Packet, containing DTP Payload or Redundancy Data.</li>
        </ul>
      </section>
    </section>
    <section anchor="dtp-use-cases">
      <name>DTP Use Cases</name>
      <section anchor="block-based-real-time-application">
        <name>Block Based Real Time Application</name>
        <t>DTP can provide deliver-before-deadline service for Block Based Real Time Applications. Applications like real-time media and online multiplayer gaming have deadline requirements for their data transimission. These application also tend to generate and process the data in block fashion, for example, video/audio encoder produces the encoded streams as a series of block (I,B,P frame or GOP). And these real-time applications usually have multiple blocks (As shown in <xref target="arch-of-dtp"/>) to be transferred simultaneously. DTP can optimize the data transmission of these applications by scheduling which block to be sent first. And Redundancy Module of DTP can reduce retransmission delay.</t>
      </section>
      <section anchor="api-of-dtp">
        <name>API of DTP</name>
        <section anchor="data-transimission-functions">
          <name>Data Transmission Functions</name>
          <section anchor="send">
            <name>Send</name>
            <t>Format: SEND(connection id, buffer address, byte count, block id, block deadline, block priority) -&gt; byte count</t>
            <t>The return value of SEND is the continuous bytes count which is successfully written. If the transport layer buffer is limited or the flow control limit of the block is reached, application needs to call SEND again.</t>
            <t>Mandatory attributes:</t>
            <ul spacing="normal">
              <li>connection id - local connection name of an indicated connection.</li>
              <li>buffer address - the location where the block to be transmitted is stored.</li>
              <li>byte count - the size of the block data in number of bytes.</li>
              <li>block id - the identity of the block.</li>
              <li>block deadline - deadline of the block.</li>
              <li>block priority - priority of the block.</li>
            </ul>
          </section>
          <section anchor="update">
            <name>Update</name>
            <t>Format: UPDATE(connection id, block id, block deadline, block priority) -&gt; result</t>
            <t>The UPDATE function is used to update the metadata of the block. The return value of UPDATE function indicates the success of the action. It will return success code if succeeds, and error code if fails.</t>
            <t>Mandatory attributes:</t>
            <ul spacing="normal">
              <li>connection id - local connection name of an indicated connection.</li>
              <li>block id - the identity of the block.</li>
              <li>block deadline - new deadline of the block.</li>
              <li>block priority - new priority of the block.</li>
            </ul>
          </section>
          <section anchor="retreat">
            <name>Retreat</name>
            <t>Format: RETREAT(connection id, block id) -&gt; result</t>
            <t>The RETREAT function is used to cancel the block. The return value of RETREAT function indicates the success of the action. It will return success code if succeeds, and error code if fails.</t>
            <t>Mandatory attributes:</t>
            <ul spacing="normal">
              <li>connection id - local connection name of an indicated connection.</li>
              <li>block id - the identity of the block.</li>
            </ul>
          </section>
          <section anchor="receive">
            <name>Receive</name>
            <t>Format: RECV(connection id, buffer address, byte count, [,block id]) -&gt; byte count, fin flag, [,block id]</t>
            <t>The RECV function shall read the first block in-queue into the buffer specified, if there is one available. The return value of RECV is the number of continuous bytes which is successfully read, and fin flag to indicate the ending of the block. If the block is cancelled, the RECV function will return error code BLOCK_CANCELLED. It will also returns the block id on which it receives if application does not specify it.</t>
            <t>If the block size specified in the RECV function is smaller than the size of the receiving block, then the block will be partial copied(indicated by the fin flag). Next time RECV function is called, the remaining block will be copied, and the id will be the same. This fragmentation will give extra burden to applications. To avoid the fragmentation, sender and receiver can negotiate a max block size when handshaking.</t>
            <t>Mandatory attributes:</t>
            <ul spacing="normal">
              <li>connection id - local connection name of an indicated connection.</li>
              <li>buffer address - the location where the block received is stored.</li>
              <li>byte count - the size of the block data in number of bytes.</li>
            </ul>
            <t>Optional attributes:</t>
            <ul spacing="normal">
              <li>block id - to indicate which block to receive the data on.</li>
            </ul>
          </section>
        </section>
        <section anchor="feedback-functions">
          <name>Feedback Functions</name>
          <section anchor="ondropped">
            <name>on_dropped</name>
            <t>Format: ON_DROPPED(connection id) -&gt; block id, deadline, priority, goodbytes</t>
            <t>The ON_DROPPED function is called when a block is dropped. The metadata of the dropped block such as block id, deadline, priority is attached. The number of bytes delivered before its deadline(goodbytes) is returned.</t>
            <t>Mandatory attributes:</t>
            <ul spacing="normal">
              <li>connection id - local connection name of an indicated connection.</li>
            </ul>
          </section>
          <section anchor="ondelivered">
            <name>on_delivered</name>
            <t>Format: ON_DELIVERED(connection id) -&gt; block id, deadline, priority, delta, goodbytes</t>
            <t>The ON_DELIVERED function is called when a block is delivered. The metadata of the delivered block such as block id, deadline, priority is attached. The number of bytes delivered before its deadline (goodbytes) and the difference between the block completion time and the deadline (delta) are returned.</t>
            <t>Mandatory attributes:</t>
            <ul spacing="normal">
              <li>connection id - local connection name of an indicated connection.</li>
            </ul>
            <t>All these functions mentioned above are running in asynchronous mode. An application can use various event driven framework to call those functions.</t>
          </section>
        </section>
      </section>
      <section anchor="collaborate-with-upper-layer-protocols">
        <name>Collaborate with upper layer protocols</name>
        <t>Application protocol on top of DTP may benefit from the block info and detail metric of the transport layer. DTP <bcp14>MAY</bcp14> expose the block information to the receiver side application and the status of the congestion control and buffer status to both sender side and receiver side application. This information will enable multiple DTP relay node working together to improve the deadline-delivery performance end-to-end.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>See the security considerations in <xref target="QUIC"/> and <xref target="QUIC-TLS"/>; the block-based data of DTP shares the same security properties as the data transmitted within a QUIC connection.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="QUIC">
        <front>
          <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
          <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar">
            <organization/>
          </author>
          <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
            <organization/>
          </author>
          <date month="May" year="2021"/>
          <abstract>
            <t>This document defines the core of the QUIC transport protocol.  QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances.  Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9000"/>
        <seriesInfo name="DOI" value="10.17487/RFC9000"/>
      </reference>
      <reference anchor="QUIC-TLS">
        <front>
          <title>Using TLS to Secure QUIC</title>
          <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson">
            <organization/>
          </author>
          <author fullname="S. Turner" initials="S." role="editor" surname="Turner">
            <organization/>
          </author>
          <date month="May" year="2021"/>
          <abstract>
            <t>This document describes how Transport Layer Security (TLS) is used to secure QUIC.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9001"/>
        <seriesInfo name="DOI" value="10.17487/RFC9001"/>
      </reference>
      <reference anchor="arXiv_1809.04822" target="https://arxiv.xilesou.top/pdf/1809.04822.pdf">
        <front>
          <title>Adding Forward Erasure Correction to QUIC</title>
          <author initials="F." surname="Michel" fullname="François Michel">
            <organization/>
          </author>
          <author initials="Q." surname="Coninck" fullname="Quentin De Coninck">
            <organization/>
          </author>
          <author initials="O." surname="Bonaventure" fullname="Olivier Bonaventure">
            <organization/>
          </author>
          <date year="2018" month="September"/>
        </front>
      </reference>
      <reference anchor="RFC0793">
        <front>
          <title>Transmission Control Protocol</title>
          <author fullname="J. Postel" initials="J." surname="Postel">
            <organization/>
          </author>
          <date month="September" year="1981"/>
        </front>
        <seriesInfo name="STD" value="7"/>
        <seriesInfo name="RFC" value="793"/>
        <seriesInfo name="DOI" value="10.17487/RFC0793"/>
      </reference>
      <reference anchor="RFC0768">
        <front>
          <title>User Datagram Protocol</title>
          <author fullname="J. Postel" initials="J." surname="Postel">
            <organization/>
          </author>
          <date month="August" year="1980"/>
        </front>
        <seriesInfo name="STD" value="6"/>
        <seriesInfo name="RFC" value="768"/>
        <seriesInfo name="DOI" value="10.17487/RFC0768"/>
      </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">
            <organization/>
          </author>
          <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">
            <organization/>
          </author>
          <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>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>We sincerely thank <eref target="liu-zw20@mails.tsinghua.edu.cn">Z. Liu</eref> and <eref target="zhangjie19@mails.tsinghua.edu.cn">J. Zhang</eref> for contributing to the DTP project. They provided a lot of advice and revisions to the draft and actively helped advance the relevant progress of DTP standardization.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+092XIcR3Lv8xVlMsICqJkhQGolEd7dWBDHChZJQAAoWUsx
Nmq6a2Za7Ome7eoGCIF0+Df85jf/h/0n/hLnVUcf4KGlqA2voQgR6KnOysrM
yrtqJpPJqM7q3OyofaPTPCvMRF/qyqjzShd2XVa1OqnKukzKfKRns8pcwMjz
k1Gia7Moq6sdlRXzcjRKy6TQKwCTVnpeT+wym/ylyZJJWq8nW5+PbDNbZdZm
ZVFfrWHU0cH5oVK3lc5tuaNuZUVq1gb+V9S3xurW0e5D+Kes4LfT88NboxQm
21HX+7vnB69HSVlYU9jG7qi6aswIELo/Aow1wPFI3xpdltWLRVU2a3j8zdOj
vVujF+YKHqbvstJsXRF0W9/b2nqwdW80ujBFY3ZGSi2yetnMAOjZ+e7p5Nxm
xWLZ6LtAkwkt/dZopJt6WVY7owkMzwrA8/up2msy+Gve5DmT6fuyWMjDslrs
KAdIPS2yC1PZrL6Cj2xdGVPDArfUGXxYLP4Co9RpCh8lMGJHPTTZj/AI/y6b
okZ+7C2zQsMDs9JZvqOSJruCuf5QywRTkzbTpBgF7Pam6rFuIbeHc/HDXxa5
VXJv+w/4q53ejN9XU4Dfpt5XMJs8JAS/avSlyQJcEL8lDHnwhyV9ME3KVQTw
66n609IQYgHk1zrzTwdhvtDZ9CccMAz0u6n6Tndgfmcy93AQ5CV8Bg/uf/Gb
FsyirFa6BkrvjGAsCu+OOj3ce7C1teUeTM4fnbmH2/hQV/+SXexsf7n1YLr1
2Zf37qGoKiVbezdNkTWHZQUCn6qDStsGBH+vrCqT1LApVV0SWHrJia+Sn4n/
TZZ6qB5nydLk0XNe7yHspP/+zzKz3QE9EN/A5EVWJC96ML5pQAlkBWzS3pAe
lGP1sCw0bM0altODdJxnF5mpemNYm5yZdW1WM/h8+766t7X9JX02J9K7tZ/s
H+6oZV2v7c7du7p6mV1MX2a5sWUzrcv13XU6vxsoPoU/RyPUhoF7o8lkovQM
dopO6tHofAmkAU3ZrAAdlZo5KCH7dnWkNkC7bCKP1lV5kaVGzfIyeTGZaWtS
AJPjppzMDMxsJqlAA/UFcETpTtX50gDNaqQtsLucqxpxWZlVqeBfAJ0am1TZ
zCgNTxPYPZld4XOQ5nmW56opKphIz/I2ZMVIwC8oP0pbdWlgNPy7LC/xfVMA
rAReylYG8bIWZwceaIf51ZTptMrSNDej0W11BMqiTBsWzevbWfTn69HosS6u
YAeZaoFCrdfrPANrBJ/BnMBoWJlRngqVATNUGSI40Ac/zCqevk0g9VV5aQCb
MWhM2BYwvPaMyPUVyMnasSPPXgCb9k7U9fU/wBbc+uLB/devlS5S9XQ/PPz8
S3hYFvmV59q6ylYZSgbow6KQnWdsDUTN7JJQRCCEHJg42rPWVBdZYpCBsewA
yHVpQXi0KsxlhKpHUoOEMk+ur/EfQIa4TCSPqcbzsfQAt9JJXU4MoiEkBO7c
vo178YKFxxKS+yi8Gf99fTsJn75GMTcKjK1Ca2vVrcdPz87RquO/6skx/X56
ADidHuzj72df7T565H8ZyYizr46fPtoPv4U3944fPz54ss8vw1PVejS69Xj3
e/gEkbx1fHJ+dPxk99EtkH2WeE9B3GpAkBlvi2pdmRrkWNuR2wgpvvNw7+S/
/mP7M2Hqve3tB0BH/uPL7S8+gz8uwSTwbMRr/hOk7GoENDa6QigadkSi11kN
7s4Y94aFzVGopamQuneeIWWe76jfzpL19me/lwe44NZDR7PWQ6JZ/0nvZSbi
wKOBaTw1W887lG7ju/t9629H9+gh7uvHJUi/ll298n+4Pd3ayrZJlkgqcOzy
CSoPUEtpph2lcW+vmrzO1rw5F3qF24UUQLTnbW/Tl8D5CvegSLxWialqjfKB
k2RTMx0H2UebqcxLvVrnhtja3iEwN2oz3N0lbuo5cLRIaN9eWTAvyOgmT1HK
ZiYHhbhsVuBZrU2VgPlBOmzoWdnUantra2U3WV+SjrWrsqyXLJuaNYVeoc+4
1lWdJdlaw+IYveObqMEIowbBHb9YVGYBps8qo4G0PPIT2M0JExyV35X6HPBg
LZSB1cpmDb4AYKxR3rSxvwDooVIkMMCuEkbpugMbdFsN2g6WPEOVsK5xN9ir
IpmqfeQGaV9YVEtlwy5trMnRUsCHYDqyWl2iCQIYJSB5CSoO6HlFb6H2Q8ZO
Se1YE8lL3zLMyxyYgBOCnwXUVHOj0S2wYKrvoIkEmMhYWN3CFEB4mAdpAUo1
QXQITcQbVkEmWM01uJpoPg5w3fwsQ60M9M9WOufh8j5O3IDSBH9b1q1xhYsc
VwNTObtIi13pF2zKGKhQpCOQJHh3dZNmKDhJmbKZAlvJXJOHKfnqGjmLuIFE
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
C1QApmPpeAAA

-->

</rfc>
