<?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.39 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-shi-quic-dtp-10" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="DTP">Deadline-aware Transport Protocol</title>
    <seriesInfo name="Internet-Draft" value="draft-shi-quic-dtp-10"/>
    <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>
      <?line 81?>

<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>
    <?line 85?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Many emerging applications have the deadline requirement for their data transmission.  However, current transport layer protocols 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>
        <?line -18?>

</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 is 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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Type (i) = 0x20..0x21                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Stream ID (i)                        ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Block Size (i)                       ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Priority (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                      Block Deadline (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    [Start timestamp (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 timestamp: 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 timestamp 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>New Frame: Timestamped ACK Frame</name>
        <t>DTP adds a new Timestamped ACK Frame, containing a timestamp to carry the timeliness information. The receiver sends Timestamped ACK Frame to inform the sender when a packet is received and processed. ACK mechanism of DTP is almost the same as QUIC. The format of Timestamped ACK frames is similar to the standard ACK Frames defined in section 19.3 of <xref target="QUIC"/> (As shown in <xref target="ackq"/>):</t>
        <figure anchor="ackq">
          <name>Standard QUIC 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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Type (i) = 0x02..0x03                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Largest Acknowledged (i)                ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          ACK Delay (i)                      ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       ACK Range Count (i)                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       First ACK Range (i)                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          ACK Ranges (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          [ECN Counts]                       ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>DTP appends a timestamp parameter after the original QUIC ACK Frame Format and defines the type of this new frame 0x22..0x23 (As shown in <xref target="time"/>). The timestamp parameter can be regarded as an optional parameter of the QUIC ACK Frame while using an extension frame type.</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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Type (i) = 0x22..0x23                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                     Largest Acknowledged (i)                ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          ACK Delay (i)                      ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       ACK Range Count (i)                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       First ACK Range (i)                   ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          ACK Ranges (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          [ECN Counts]                       ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          Timestamp (i)                     ...
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>
        </figure>
        <t>Using this timestamp parameter, we can calculate whether the prior blocks transmitted misses the deadline or not, and we can also calculate the block completion rate before the deadline. The timestamp parameter <bcp14>SHOULD</bcp14> be in 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 <bcp14>SHOULD</bcp14> do clock synchronization.</t>
      </section>
      <section anchor="redundancy-packet">
        <name>New Packet: 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="design-considerations">
      <name>Design Considerations</name>
      <section anchor="clock-synchronization">
        <name>Clock Synchronization</name>
        <t>The fundamental design of DTP relies on precise clock synchronization. The block scheduler requires high clock precision to accurately perform block canceling functions and efficient scheduling. Timestamped ACKs also necessitate high clock precision to enable the server and client to utilize deadline information effectively. However, achieving high precision clock synchronization across the web poses challenges. Further discussions are required to explore how to best utilize the deadline information in such circumstances.</t>
      </section>
      <section anchor="block-dependency">
        <name>Block Dependency</name>
        <t>Video streams often exhibit decoding dependencies among their frames. To address this, it would be beneficial to include block dependencies as critical metadata in the block info. Our basic design involves adding an integer field to the block info frame, indicating the stream id on which the current block depends. This enhancement may facilitate efficient block processing and playback, ensuring that frames are correctly ordered and decoded based on their dependencies.</t>
      </section>
      <section anchor="automatic-block-info">
        <name>Automatic Block Info</name>
        <t>DTP receives block priorities and block deadlines from the <tt>send</tt> and <tt>update</tt> API. However, determining appropriate values for these parameters can be challenging for applications. Even in cases where applications, such as RTC publishers, aim for transport delays below 100ms, they may not get the ideal transport result by setting the <tt>block deadline</tt> parameter to 100ms. To address this, it might be necessary to devise an automatic method that can recognize the application's requirements and assign rational parameter values accordingly. Implementing such an automatic mechanism can streamline the configuration process for applications, freeing developers from the burden of manually fine-tuning parameters and ensuring optimal data transmission with minimal human intervention.</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"/>
          <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
          <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"/>
          <author fullname="S. Turner" initials="S." role="editor" surname="Turner"/>
          <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"/>
          <date month="September" year="1981"/>
        </front>
        <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"/>
          <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"/>
          <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>
    <?line 500?>

<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:
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
RSVOWFpIicj34XD/Bbh2hElZhwAA

-->

</rfc>
