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

-->

</rfc>
