Giter Club home page Giter Club logo

draft-pauly-quic-datagram's Introduction

IMPORTANT: Obsolete Draft

This repository contains draft-pauly-quic-datagram which has now been replaced by draft-ietf-quic-datagram. Please click here to go to the new repository.

An Unreliable Datagram Extension to QUIC

This is the working area for the Individual internet-draft, "An Unreliable Datagram Extension to QUIC".

Building the Draft

Formatted text and HTML versions of the draft can be built using make.

$ make

This requires that you have the necessary software installed. See the instructions.

Contributing

Before submitting feedback, please familiarize yourself with our current issues list and review the working group documents and mailing list discussion. If you're new to this, you may also want to read the Tao of the IETF.

Be aware that all contributions to the specification fall under the "NOTE WELL" terms outlined below.

  1. The best way to provide feedback (editorial or design) and ask questions is sending an e-mail to our mailing list (info). This will ensure that the entire Working Group sees your input in a timely fashion.

  2. If you have editorial suggestions (i.e., those that do not change the meaning of the specification), you can either:

a) Fork this repository and submit a pull request; this is the lowest friction way to get editorial changes in.

b) Submit a new issue to Github, and mention that you believe it is editorial in the issue body. It is not necessary to notify the mailing list for editorial issues.

c) Make comments on individual commits in Github. Note that this feedback is processed only with best effort by the editors, so it should only be used for quick editorial suggestions or questions.

  1. For non-editorial (i.e., design) issues, you can also create an issue on Github. However, you must notify the mailing list when creating such issues, providing a link to the issue in the message body.

Note that github issues are not for substantial discussions; the only appropriate place to discuss design issues is on the mailing list itself.

NOTE WELL

Any submission to the IETF intended by the Contributor for publication as all or part of an IETF Internet-Draft or RFC and any statement made within the context of an IETF activity is considered an "IETF Contribution". Such statements include oral statements in IETF sessions, as well as written and electronic communications made at any time or place, which are addressed to:

  • The IETF plenary session
  • The IESG, or any member thereof on behalf of the IESG
  • Any IETF mailing list, including the IETF list itself, any working group or design team list, or any other list functioning under IETF auspices
  • Any IETF working group or portion thereof
  • Any Birds of a Feather (BOF) session
  • The IAB or any member thereof on behalf of the IAB
  • The RFC Editor or the Internet-Drafts function
  • All IETF Contributions are subject to the rules of RFC 5378 and RFC 3979 (updated by RFC 4879).

Statements made outside of an IETF session, mailing list or other function, that are clearly not intended to be input to an IETF activity, group or function, are not IETF Contributions in the context of this notice.

Please consult RFC 5378 and RFC 3979 for details.

A participant in any IETF activity is deemed to accept all IETF rules of process, as documented in Best Current Practices RFCs and IESG Statements.

A participant in any IETF activity acknowledges that written, audio and video records of meetings may be made and may be available to the public.

draft-pauly-quic-datagram's People

Contributors

davidschinazi avatar rpaulo avatar tfpauly avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

draft-pauly-quic-datagram's Issues

Consider retransmission bit leakage

Rephrasing what I mentioned at the mic, imagine a scenario where an application uses DATAGRAM to send a single fixed message ("fire the missile"). An adversary on path can start selectively dropping packets and checking to see whether or not they're retransmitted to learn whether or not this special message was sent. (Retransmission detection could be done by looking at the size of the QUIC packet carrying the DATAGRAM, for example.)

I don't claim this is easy to do in practice, or useful, but I think it does raise interesting questions about how this new frame affects QUIC's security posture. Perhaps some text in the security considerations is needed?

Small max_datagram_frame_size that peer cannot send DATAGRAM frame

If I understand correctly, The endpoint can set a max_datagram_frame_size that is too small (0-1) for the peer to send DATAGRAM frames.

The specification says as follows

The max_datagram_frame_size transport parameter is an integer value (represented as a variable-length integer) that represents the maximum size of a DATAGRAM frame (including the frame type, flow identifier, length and payload) the endpoint is willing to receive, in bytes.

Type (1byte), Flow ID (0 ~ 8bytes), Length (0 ~ 8bytes). To send payload, it needs to be larger than 1byte, and if Flow ID and Length are used, larger value is necessary.

I suppose that max_datagram_frame_size (0-1) should be forbidden, or define recommended values to support. I suppose that behavior should be defined when an endpoint that needs to send DATAGARAM frames receives max_datagram_frame_size with insufficient value .

By defining in this specification, specifications that reference this specification do not need to consider it.

thank you

Clarify lost datagram

If a sender detects that a packet containing a specific DATAGRAM frame has been lost, the implementation MAY notify the application that the datagram was lost. Similarly, if a packet containing a DATAGRAM frame is acknowledged, the implementation MAY notify the application that the datagram was successfully transmitted and received.

A lost DATAGRAM is not necessarily lost. It might be received by the peer after it is deemed lost. The late receiving peer cannot trivially be sure the sender thinks the frame is lost so it has a choice to make to drop the DATAGRAM or to give it to the application. Likely it will give it to the application. Hence, a lost DATAGRAM is merely suggestive of a possibly loss, and at least a delayed delivery.

API considerations for lack of DATAGRAM support

If an API allows the creation of a QUIC stream before the connection is established, this API might also allow the creation of a DATAGRAM stream. If the remote endpoint doesn't support the DATAGRAM extension, the implementation can either return an error to the application ("failed to create stream") or it could simply convert the stream abstraction to use QUIC STREAM frames instead. There are arguments on both sides and it depends on the specific application, but I'm creating this issue because perhaps this ought to be mentioned in the spec.

Congestion control

We should add text on how DATAGRAM frames interact with congestion control. In particular they should be congestion controlled so an application that sends too much data will not flood the network.

Make discussion of flow identifiers more vague

From @martinthomson (link to email):

The bit that mentions flow identifiers shouldn't presume so much about how these frames will be used. The only point you need to make is that it is up to the protocol in use to define how the receiver of a DATAGRAM frame processes that frame. If you are going to make a point, you might observe that it might be desirable in some protocols to have multiple logical entities receiving DATAGRAM frames, in which case it is up to the protocol to define how DATAGRAM frames are efficiently routed to one of those entities.

Receiver SHOULD ACK before dropping datagram frames

As QUIC transport provides congestion control, the receiver SHOULD acknowledge all the datagram frames that it received even if it is about to drop it. Some applications might do it implicitly but we want to ensure that all of them comply. Otherwise the congestion control will continue to lower the congestion window without any actual network loss.

This is even more important as the unreliable QUIC doesn't provide flow control.

Explain how max datagram frame size interacts with PTMU

We should add text to explain how the application may effectively still have smaller datagram payload sizes due to small PMTU (and interface MTU) even if the max datagram frame size is large. Essentially, the effective at any point is the MIN(max frame size, PMTU, MTU)

0-RTT clarifications

This spec currently is missing details on 0-RTT. Specifically:

  1. Whether the transport parameter needs to be stored for future 0-RTT use. The QUIC Transport spec currently says:

The definition of new transport parameters (Section 7.3.2) MUST specify whether they MUST, MAY, or MUST NOT be stored for 0-RTT.

  1. How to handle the new TP after 0-RTT. For example, the TP can be completely gone (and DATAGRAM becomes unsupported) or it could decrease or increase the size of the DATAGRAM.

  2. If we tell implementations to store the TP with the 0-RTT metadata, it's possible that we can send DATAGRAM frames in 0-RTT packets but suddenly we won't be able to send any more DATAGRAM frames if the TP is missing after the handshake. We need language to clarify what to do in this case.

Draft 05 defines how many frame types?

The introduction says:

This document defines four new DATAGRAM QUIC frame types, which carry
application data without requiring retransmissions.

However, only two types seem to be defined with code points 0x30 and 0x31.

Specify Max Payload Size instead of Max Frame Size

Right now, the TP specifies a maximum frame size, including frame type, length and payload. This makes certain values invalid (0, 1?). Also, since this values practically is a kind of flow control, indicating how much data I'm willing to receive at a time, it's the payload length that's important here, not the framing.

For these reasons, I'm arguing to change this to specifying a maximum payload length. Then, the question of what a value of zero means. Should a value of 0 be the same thing as not present or should it mean that only 0 length datagrams are allowed? I think it is simpler to say that a value of zero is the same as not present (i.e. disabled).

Flow control for datagram flows

I think we need per datagram flow control along with the per stream flow control. Otherwise the sender could end up using the connection level flow control entirely for the datagram flow and stream flows won't get any chance to send data.

Now the implementation could provide some internal flow control for the datagram flow but it would be non-trivial. It would entail the following on every send on datagram flow:

  1. How many streams are open and how much % of connection quota to allocate to each stream
  2. Use the remaining quota to check permissible data for datagram flow.

If we want to skip these steps and allow datagram flow to grow to connection-level flow control, the application would need to manage its sends between streams and datagram flows which I think is not ideal.

I think adding some form of flow control for datagram flow would solve the sender’s conundrum.

Datagram flow prioritization

We have a need for text regarding prioritization in the document, similar to the “Stream Prioritization” section in the main transport document. The application should be able to indicate to the quic implementation the relative priority of a flow of datagrams with regards to other streams and other flows, thus indicating how to schedule frames when congestion control opens up.

Section 5 Nit

"This frame SHOULD NOT be delayed, but MAY be coalesced with other STREAM or DATAGRAM frames."

Is STREAM or DATAGRAM important? Instead, should we just say:

"This frame SHOULD NOT be delayed, but MAY be coalesced with other frames."

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.