<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.2.5 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-trammell-taps-post-sockets-02" category="info">

  <front>
    <title abbrev="Post Sockets">Post Sockets, An Abstract Programming Interface for the Transport Layer</title>

    <author initials="B." surname="Trammell" fullname="Brian Trammell">
      <organization>ETH Zurich</organization>
      <address>
        <postal>
          <street>Gloriastrasse 35</street>
          <city>8092 Zurich</city>
          <country>Switzerland</country>
        </postal>
        <email>ietf@trammell.ch</email>
      </address>
    </author>
    <author initials="C." surname="Perkins" fullname="Colin Perkins">
      <organization>University of Glasgow</organization>
      <address>
        <postal>
          <street>School of Computing Science</street>
          <city>Glasgow  G12 8QQ</city>
          <country>United Kingdom</country>
        </postal>
        <email>csp@csperkins.org</email>
      </address>
    </author>
    <author initials="T." surname="Pauly" fullname="Tommy Pauly">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>1 Infinite Loop</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>tpauly@apple.com</email>
      </address>
    </author>
    <author initials="M." surname="Kuehlewind" fullname="Mirja Kuehlewind">
      <organization>ETH Zurich</organization>
      <address>
        <postal>
          <street>Gloriastrasse 35</street>
          <city>8092 Zurich</city>
          <country>Switzerland</country>
        </postal>
        <email>mirja.kuehlewind@tik.ee.ethz.ch</email>
      </address>
    </author>
    <author initials="C." surname="Wood" fullname="Chris Wood">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>1 Infinite Loop</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>cawood@apple.com</email>
      </address>
    </author>

    <date year="2017" month="October" day="27"/>

    <area>Transport</area>
    <workgroup>TAPS Working Group</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<t>This document describes Post Sockets, an asynchronous abstract programming
interface for the atomic transmission of messages in an inherently multipath
environment. Post replaces connections with long-lived associations between
endpoints, with the possibility to cache cryptographic state in order to
reduce amortized connection latency. We present this abstract interface as an
illustration of what is possible with present developments in transport
protocols when freed from the strictures of the current sockets API.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>The BSD Unix Sockets API’s SOCK_STREAM abstraction, by bringing network
sockets into the UNIX programming model, allowing anyone who knew how to write
programs that dealt with sequential-access files to also write network
applications, was a revolution in simplicity. It would not be an overstatement
to say that this simple API is the reason the Internet won the protocol wars
of the 1980s. SOCK_STREAM is tied to the Transmission Control Protocol (TCP),
specified in 1981 <xref target="RFC0793"/>. TCP has scaled remarkably well over the past
three and a half decades, but its total ubiquity has hidden an uncomfortable
fact: the network is not really a file, and stream abstractions are too
simplistic for many modern application programming models.</t>

<t>In the meantime, the nature of Internet access, and the variety of Internet
transport protocols, is evolving. The challenges that new protocols and access
paradigms present to the sockets API and to programming models based on them
inspire the design elements of a new approach.</t>

<t>Many end-user devices are connected to the Internet via multiple interfaces,
which suggests it is time to promote the paths by which two endpoints are
connected to each other to a first-order object. While implicit multipath
communication is available for these multihomed nodes in the present Internet
architecture with the Multipath TCP extension (MPTCP) <xref target="RFC6824"/>, MPTCP was
specifically designed to hide multipath communication from the application for
purposes of compatibility. Since many multihomed nodes are connected to the
Internet through access paths with widely different properties with respect to
bandwidth, latency and cost, adding explicit path control to MPTCP’s API would
be useful in many situations.</t>

<t>Another trend straining the traditional layering of the transport stack
associated with the SOCK_STREAM interface is the widespread interest in
ubiquitous deployment of encryption to guarantee confidentiality,
authenticity, and integrity, in the face of pervasive surveillance
<xref target="RFC7258"/>. Layering the most widely deployed encryption technology,
Transport Layer Security (TLS), strictly atop TCP (i.e., via a TLS library
such as OpenSSL that uses the sockets API) requires the encryption-layer
handshake to happen after the transport-layer handshake, which increases
connection setup latency on the order of one or two round-trip times, an
unacceptable delay for many applications. Integrating cryptographic state
setup and maintenance into the path abstraction naturally complements efforts
in new protocols (e.g. QUIC <xref target="I-D.ietf-quic-transport"/>) to
mitigate this strict layering.</t>

<t>To meet these challenges, we present the Post-Sockets Application Programming
Interface (API), described in detail in this work. Post is designed to be
language, transport protocol, and architecture independent, allowing
applications to be written to a common abstract interface, easily ported among
different platforms, and used even in environments where transport protocol
selection may be done dynamically, as proposed in the IETF’s Transport Services
working group.</t>

<t>Post replaces the traditional SOCK_STREAM abstraction with a Message
abstraction, which can be seen as a generalization of the Stream Control
Transmission Protocol’s <xref target="RFC4960"/> SOCK_SEQPACKET service. Messages are sent
and received on Carriers, which logically group Messages for transmission and
reception. For backward compatibility, bidirectional byte stream protocols are
represented as a pair of Messages, one in each direction, that can only be marked
complete when the sending peer has finished transmitting data.</t>

<t>Post replaces the notions of a socket address and connected
socket with an Association with a remote endpoint via set of Paths.
Implementation and wire format for transport protocol(s) implementing the Post
API are explicitly out of scope for this work; these abstractions need not map
directly to implementation-level concepts, and indeed with various amounts of
shimming and glue could be implemented with varying success atop any
sufficiently flexible transport protocol.</t>

<t>The key features of Post as compared with the existing sockets API are:</t>

<t><list style="symbols">
  <t>Explicit Message orientation, with framing and atomicity guarantees for
Message transmission.</t>
  <t>Asynchronous reception, allowing all receiver-side interactions to be
event-driven.</t>
  <t>Explicit support for multistreaming and multipath transport protocols and
network architectures.</t>
  <t>Long-lived Associations, whose lifetimes may not be bound to underlying
transport connections. This allows associations to cache state and
cryptographic key material to enable fast resumption of communication, and for
the implementation of the API to explicitly take care of connection establishment
mechanics such as connection racing <xref target="RFC6555"/> and peer-to-peer rendezvous
<xref target="RFC5245"/>.</t>
  <t>Transport protocol stack independence, allowing applications to be written
in terms of the semantics best for the application’s own design, separate
from the protocol(s) used on the wire to achieve them. This enables
applications written to a single API to make use of transport protocols in
terms of the features they provide, as in <xref target="I-D.ietf-taps-transports"/>.</t>
</list></t>

<t>This work is the synthesis of many years of Internet transport protocol
research and development. It is inspired by concepts from the Stream Control
Transmission Protocol (SCTP) <xref target="RFC4960"/>, TCP Minion <xref target="I-D.iyengar-minion-protocol"/>,
and MinimaLT <xref target="MinimaLT"/>, among other transport protocol
modernization efforts. We present Post as an illustration of what is
possible with present developments in transport protocols when freed from the
strictures of the current sockets API. While much of the work for building
parts of the protocols needed to implement Post are already ongoing in other
IETF working groups (e.g. MPTCP, QUIC, TLS), we argue that an abstract
programming interface unifying access all these efforts is necessary to fully
exploit their potential.</t>

</section>
<section anchor="abstractions-and-terminology" title="Abstractions and Terminology">

<figure title="Abstractions and relationships in Post Sockets" anchor="fig-abstractions"><artwork><![CDATA[
           +===============+
           |    Message    |
           +===============+
                |    ^         |               |
          send()|    |ready()  |initiate()     |listen()
                V    |         V               V
           +=======================+         +============+
           |                       | accept()|            |
           |       Carrier         |<--------|  Listener  |
           |                       |         |            |
           +=======================+         +============+
            |1        |          n|                |             +=========+
            |         |           |1               |         +---|  Local  |
            | +===============+  +=======================+   |   +=========+
            | |               |  |                       |---+
            | | Configuration |--|      Association      |       +=========+
            | |               |  |                       |-------|  Remote |
            | +===============+  +=======================+       +=========+
            |         |                1| durable end-to-end
            +-------+ |                 | state via many paths,
                    | |                 | policies, and prefs  
                   n| |                n|
               +===========+       +==========+
     ephemeral |           |       |          |
   transport & | Transient |-------|   Path   | properties of
  crypto state |           |n     1|          | address pair
               +===========+       +==========+

]]></artwork></figure>

<t>Post is based on a small set of abstractions, centered around a Message Carrier
as the entry point for an application to the networking API.
The relationships among them are shown in Figure <xref target="fig-abstractions"/> and detailed in this section.</t>

<section anchor="carrier" title="Message Carrier">

<t>A Message Carrier (or simply Carrier) is a transport protocol stack-independent
interface for sending and receiving messages between an application and a remote
endpoint; it is roughly analogous to a socket in the present sockets API.</t>

<t>Sending a Message over a Carrier is driven by the application, while receipt
is driven by the arrival of the last packet that allows the Message to be
assembled, decrypted, and passed to the application. Receipt is therefore
asynchronous; given the different models for asynchronous I/O and concurrency
supported by different platforms, it may be implemented in any number of ways.
The abstract API provides only for a way for the application to register
how it wants to handle incoming messages.</t>

<t>All the Messages sent to a Carrier will be received on the
corresponding Carrier at the remote endpoint, though not necessarily
reliably or in order, depending on Message properties and the underlying
transport protocol stack.</t>

<t>A Carrier that is backed by current transport protocol stack state (such as a
TCP connection; see <xref target="transient"/>) is said to be “active”: messages can be
sent and received over it. A Carrier can also be “dormant”: there is long-term
state associated with it (via the underlying Association; see
<xref target="association"/>), and it may be able to reactivated, but messages cannot be
sent and received immediately. Carriers become dormant when the underlying
transport protocol stack determines that an underlying connection has been
lost and there is insufficient state in the Association to re-establish it
(e.g., in the case of a server-side Carrier where the client’s address has
changed unexpectedly). Passive close can be handled by the application via an
event on the carrier. Attempting to use a carrier after passive close results
in an error.</t>

<t>If supported by the underlying transport protocol stack, a Carrier may be
forked: creating a new Carrier associated with a new Carrier at the same remote
endpoint. The semantics of the usage of multiple Carriers based on the same
Association are application-specific. When a Carrier is forked, its
corresponding Carrier at the remote endpoint receives a fork request, which it
must accept in order to fully establish the new carrier. Multiple Carriers
between endpoints are implemented differently by different transport protocol
stacks, either using multiple separate transport-layer connections, or using
multiple streams of multistreaming transport protocols.</t>

<t>To exchange messages with a given remote endpoint, an application may initiate
a Carrier given its remote (see <xref target="remote"/> and local (see <xref target="local"/>)
identities; this is an equivalent to an active open. There are four special
cases of Carriers, as well, supporting different initiation and
interaction patterns, defined in the subsections below.</t>

<t><list style="symbols">
  <t>Listener:
A Listener is a special case of Message Carrier which only responds to
requests to create a new Carrier from a remote endpoint, analogous to a server
or listening socket in the present sockets API. Instead of being bound to a
specific remote endpoint, it is bound only to a local identity; however, its
interface for accepting fork requests is identical to that for fully fledged
Carriers.</t>
  <t>Source:
A Source is a special case of Message Carrier over which messages can only be
sent, intended for unidirectional applications such as multicast transmitters.
Sources cannot be forked, and need not accept forks.</t>
  <t>Sink:
A Sink is a special case of Message Carrier over which messages can only
be received, intended for unidirectional applications such as multicast
receivers. Sinks cannot be forked, and need not accept forks.</t>
  <t>Responder:
A Responder is a special case of Message Carrier which may receive messages
from many remote sources, for cases in which an application will only ever
send Messages in reply back to the source from which a Message was received.
This is a common implementation pattern for servers in client-server
applications. A Responder’s receiver gets a Message, as well as a Source to
send replies to. Responders cannot be forked, and need not accept forks.</t>
</list></t>

</section>
<section anchor="message" title="Message">

<t>A Message is the unit of communication between applications. Messages
can represent relatively small structures, such as requests in a
request/response protocol such as HTTP; relatively large
structures, such as files of arbitrary size in a filesystem; and structures of
indeterminate length, such as a stream of bytes in a protocol like TCP.</t>

<t>In the general case, there is no mapping between a Message and packets sent by
the underlying protocol stack on the wire: the transport protocol may freely
segment messages and/or combine messages into packets. However, a message may be
marked as immediate, which will cause it to be sent in a single packet when
possible.</t>

<t>Content may be sent and received either as Complete or Partial Messages.
Dealing with Complete Messages should be preferred for simplicity whenever
possible based on the underlying protocol. It is always possible to send Complete
Messages, but only protocols that have a fixed maximum message length may
allow clients to receive Messages using an API that guarantees Complete Messages.
Sending and receiving Partial Messages (that is, a Message whose content spans multiple
calls or callbacks) is always possible.</t>

<t>To send a Message, either Complete or Partial, the Message content is passed into the
Carrier, and client provides a set of callbacks to know when the Message was delivered or
acknowledged. The client of the API may use the callbacks to pace the sending of
Messages.</t>

<t>To receive a Message, the client of the API schedules a completion to be called when
a Complete or Partial Message is available. If the client is willing to accept Partial Messages,
it can specify the minimum incomplete Message length it is willing to receive at once,
and the maximum number of bytes it is willing to receive at once. If the client wants
Complete Messages, there are no values to tune. The scheduling of the receive completion
indicates to the Carrier that there is a desire to receive bytes, effectively creating a “pull
model” in which backpressure may be applied if the client is not receiving Messages
or Partial Messages quickly enough to match the peer’s sending rate. The Carrier may
have some minimal buffer of incoming Messages ready for the client to read to reduce
latency.</t>

<t>When receiving a Complete Message, the entire content of the Message must
be delivered at once, and the Message is not delivered at all if the full Message
is not received.  This implies that both the sending and receiving endpoint,
whether in the application or the carrier, must guarantee storage for the full
size of a Message.</t>

<t>Partial Messages may be sent or received in several stages, with a handle
representing the total Message being associated with each portion of the
content. Each call to send or receive also indicates whether or not the Message
is now complete. This approach is necessary whenever the size of the
Message does not have a known bound, or the size is too large to process
and hold in memory. Protocols that only present a concept
of byte streams represent their data as single Messages with unknown bounds.
In the case of TCP, the client will receive a single Message in pieces using the
Partial Message API, and that Message will only be marked as complete when
the peer has sent a FIN.</t>

<t>Messages are sent over and received from Message Carriers (see <xref target="carrier"/>).</t>

<t>On sending, Messages have properties that allow the application to specify its
requirements with respect to reliability, ordering, priority, idempotence, and
immediacy; these are described in detail below. Messages may also have arbitrary
properties which provide additional information to the underlying transport
protocol stack on how they should be handled, in a protocol-specific way. These
stacks may also deliver or set properties on received messages, but in the
general case a received messages contains only a sequence of ordered bytes.
Message properties include:</t>

<t><list style="symbols">
  <t>Lifetime and Partial Reliability:
A Message may have a “lifetime” – a wall clock duration before which the
Message must be available to the application layer at the remote end. If a
lifetime cannot be met, the Message is discarded as soon as possible. Messages
without lifetimes are sent reliably if supported by the transport protocol
stack. Lifetimes are also used to prioritize Message delivery.  <vspace blankLines='1'/>
There is no guarantee that a Message will not be delivered after the end of
its lifetime; for example, a Message delivered over a strictly reliable
transport will be delivered regardless of its lifetime. Depending on the
transport protocol stack used to transmit the message, these lifetimes may
also be signalled to path elements by the underlying transport, so that path
elements that realize a lifetime cannot be met can discard frames containing
the Messages instead of forwarding them.</t>
  <t>Priority:
Messages have a “niceness” – a priority among other messages sent over the
same Carrier in an unbounded hierarchy most naturally represented as a
non-negative integer. By default, Messages are in niceness class 0, or highest
priority. Niceness class 1 Messages will yield to niceness class 0 Messages
sent over the same Carrier, class 2 to class 1, and so on. Niceness may be
translated to a priority signal for exposure to path elements (e.g. DSCP
code point) to allow prioritization along the path as well as at the sender and
receiver. This inversion of normal schemes for expressing priority has a
convenient property: priority increases as both niceness and lifetime
decrease. A Message may have both a niceness and a lifetime – Messages with
higher niceness classes will yield to lower classes if resource constraints
mean only one can meet the lifetime.</t>
  <t>Dependence:
A Message may have “antecedents” – other Messages on which it
depends, which must be delivered before it (the “successor”) is delivered.
The sending transport uses deadlines, niceness, and antecedents, along with
information about the properties of the Paths available, to determine when to
send which Message down which Path.</t>
  <t>Idempotence:
A sending application may mark a Message as “idempotent” to signal to the
underlying transport protocol stack that its application semantics make it
safe to send in situations that may cause it to be received more than once
(i.e., for 0-RTT session resumption as in TCP Fast Open, TLS 1.3, and QUIC).</t>
  <t>Immediacy:
A sending application may mark a Message as “immediate” to signal to the
underlying transport protocol stack that its application semantics require it to
be placed in a single packet, on its own, instead of waiting to be combined with
other messages or parts thereof (i.e., for media transports and interactive
sessions with small messages).</t>
</list></t>

<t>Senders may also be asynchronously notified of three events on Messages they
have sent: that the Message has been transmitted, that the Message has been
acknowledged by the receiver, or that the Message has expired before
transmission/acknowledgement. Not all transport protocol stacks will support
all of these events.</t>

</section>
<section anchor="association" title="Association">

<t>An Association contains the long-term state necessary to support
communications between a Local (see <xref target="local"/>) and a Remote (see <xref target="remote"/>)
endpoint, such as trust model information, including pinned public
keys or anchor certificates, cryptographic session resumption parameters,
or rendezvous information. It uses information from the Configuration
(see <xref target="Configuration"/>) to constrain the selection of
transport protocols and local interfaces to create Transients (see
<xref target="transient"/>) to carry Messages; and information about the paths through the
network available available between them (see <xref target="path"/>).</t>

<t>All Carriers are bound to an Association. New Carriers will
reuse an Association if they can be carried from the same Local to the same
Remote over the same Paths; this re-use of an Association may implies the
creation of a new Transient.</t>

<t>Associations may exist and be created without a Carrier. This may be done if
peer cryptographic state such as a pre-shared key is established out-of-band.
Thus, Associations may be created without the need to send application data
to a peer, that is, without a Carrier. Associations are mutable. Association
state may expire over time, after which it is removed from the Association,
and Transients may export cryptographic state to store in an Association as needed.
Moreover, this state may be exported directly into the Association or modified
before insertion. This may be needed to diversify ephemeral Transient keying
material from the longer-term Association keying material.</t>

<t>A primary use of Association state is to allow new Associations and their derived
Carriers to be quickly created without performing in-band cryptographic handshakes.
See <xref target="I-D.kuehlewind-taps-crypto-sep"/> for more details about this separation.</t>

</section>
<section anchor="remote" title="Remote">

<t>A Remote represents information required to establish and maintain a
connection with the far end of an Association: name(s), address(es), and
transport protocol parameters that can be used to establish a Transient;
transport protocols to use; trust model information, inherited from the
relevant Association, used to identify the remote on connection establishment;
and so on. Each Association is associated with a single Remote, either explicitly by
the application (when created by the initiation of a Carrier) or a
Listener (when created by forking a Carrier on passive open).</t>

<t>A Remote may be resolved, which results in zero or more Remotes with more
specific information. For example, an application may want to establish a
connection to a website identified by a URL https://www.example.com. This URL
would be wrapped in a Remote and passed to a call to initiate a 
Carrier. The first pass resolution might parse the URL, decomposing it into a
name, a transport port, and a transport protocol to try connecting with. A
second pass resolution would then look up network-layer addresses associated
with that name through DNS, and store any certificates available from DANE.
Once a Remote has been resolved to the point that a transport protocol stack
can use it to create a Transient, it is considered fully resolved.</t>

</section>
<section anchor="local" title="Local">

<t>A Local represents all the information about the local endpoint necessary to
establish an Association or a Listener. It encapsulates the Provisioning Domain
(PvD) of a single interface in the multiple provisioning domain architecture
<xref target="RFC7556"/>, and adds information about the service endpoint (transport protocol
port), and, per <xref target="I-D.pauly-taps-transport-security"/>, cryptographic identities
(certificates and associated private keys) bound to this endpoint.</t>

</section>
<section anchor="Configuration" title="Configuration">

<t>A Configuration encapsulates an application’s preferences around Path
selection and protocol options.</t>

<t>Each Association has exactly one Configuration, and all Carriers belonging
to that Association share the same Configuration.</t>

<t>The application cannot modify the Configuration for a Carrier or Association
once it is set. If a new set of options needs to be used, then the application needs
a new Carrier or Association instance. This is necessary to ensure that a
single Carrier can consistently track the Paths and protocol options it uses,
since it is usually not possible to modify these properties without breaking connectivity.</t>

<t>To influence Path selection, the application can configure a set of requirements,
preferences, and restrictions concerning which Paths may be selected by the
Association to use for creating Transients between a Local and a Remote. For example,
a Configuration can specify that the application prefers Wi-Fi access over
LTE when roaming on a foreign LTE network, due to monetary cost to the user.</t>

<t>The Association uses the Configuration’s Path preferences as a key part of determining
the Paths to use for its Transients. The Configuration is provided as input when examining
the complete list of available Paths on the system (to limit the list, or order the Paths by
preference). The system’s policy will further restrict and modify the Path that is ultimately
selected, using other aspects of the Configuration (protocol options and originating application)
to select the most appropriate Path.</t>

<t>To influence protocol selection and options, the Configuration contains one
or more allowed Protocol Stack Configurations. Each of these is comprised of
application- and transport-layer protocols that may be used together to communicate
to the Remote, along with any protocol-specific options. For example, a
Configuration could specify two alternate, but equivalent, protocol stacks:
one using HTTP/2 over TLS over TCP, and the other using QUIC over UDP.
Alternatively, the Configuration could specify two protocol stacks with the same
protocols, but different protocol options: one using TLS with TLS 1.3 0-RTT enabled
and TCP with TCP Fast-Open enabled, and one using TLS with out 0-RTT and TCP
without TCP Fast-Open.</t>

<t>Protocol-specific options within the Configuration include trust settings and acceptable
cryptographic algorithms to be used by security protocols. These may be configured for
specific protocols to allow different settings for each (such as between TLS over TCP and
TLS for use with QUIC), or set as default security settings on the Configuration to
be used by any protocol that needs to evaluate trust. Trust settings may
include certificate anchors and certificate pinning options.</t>

</section>
<section anchor="transient" title="Transient">

<t>A Transient represents a binding between a Carrier and the instance of the
transport protocol stack that implements it. As an Association contains
long-term state for communications between two endpoints, a Transient contains
ephemeral state for a single transport protocol over a one or more Paths at a
given point in time.</t>

<t>A Carrier may be served by multiple Transients at once, e.g. when
implementing multipath communication such that the separate paths are exposed to
the API by the underlying transport protocol stack. Each Transient serves only
one Carrier, although multiple Transients may share the same underlying
protocol stack; e.g. when multiplexing Carriers over streams in a multistreaming
protocol.</t>

<t>Transients are generally not exposed by the API to the application, though
they may be accessible for debugging and logging purposes.</t>

</section>
<section anchor="path" title="Path">

<t>A Path represents information about a single path through the network used by an
Association, in terms of source and destination network and transport layer
addresses within an addressing context, and the provisioning domain <xref target="RFC7556"/>
of the local interface. This information may be learned through a resolution,
discovery, or rendezvous process (e.g. DNS, ICE), by measurements taken by the
transport protocol stack, or by some other path information discovery mechanism.
It is used by the transport protocol stack to maintain and/or (re-)establish
communications for the Association.</t>

<t>The set of available properties is a function of the transport protocol stacks
in use by an association. However, the following core properties are generally
useful for applications and transport layer protocols to choose among paths
for specific Messages:</t>

<t><list style="symbols">
  <t>Maximum Transmission Unit (MTU): the maximum size of an Message’s payload
(subtracting transport, network, and link layer overhead) which will likely
fit into a single frame. Derived from signals sent by path elements, where
available, and/or path MTU discovery processes run by the transport layer.</t>
  <t>Latency Expectation: expected one-way delay along the Path. Generally
provided by inline measurements performed by the transport layer, as opposed
to signaled by path elements.</t>
  <t>Loss Probability Expectation: expected probability of a loss of any
given single frame along the Path. Generally provided by inline measurements
performed by the transport layer, as opposed to signaled by path elements.</t>
  <t>Available Data Rate Expectation: expected maximum data rate along the
Path. May be derived from passive measurements by the transport layer, or from
signals from path elements.</t>
  <t>Reserved Data Rate: Committed, reserved data rate for the given
Association along the Path. Requires a bandwidth reservation service in the
underlying transport protocol stack.</t>
  <t>Path Element Membership: Identifiers for some or all nodes along the
path, depending on the capabilities of the underlying network layer protocol
to provide this.</t>
</list></t>

<t>Path properties are generally read-only. MTU is a property of the underlying
link-layer technology on each link in the path; latency, loss, and rate
expectations are dynamic properties of the network configuration and network
traffic conditions; path element membership is a function of network topology.
In an explicitly multipath architecture, application and transport layer
requirements can be met by having multiple paths with different properties to
select from. Transport protocol stacks can also provide signaling to devices
along the path, but this signaling is derived from information provided to the
Message abstraction.</t>

</section>
</section>
<section anchor="abstract-programming-interface" title="Abstract Programming Interface">

<t>We now turn to the design of an abstract programming interface to provide a
simple interface to Post’s abstractions, constrained by the following design
principles:</t>

<t><list style="symbols">
  <t>Flexibility is paramount. So is simplicity. Applications must be
given as many controls and as much information as they may need, but they must
be able to ignore controls and information irrelevant to their operation. This
implies that the “default” interface must be no more complicated than BSD
sockets, and must do something reasonable.</t>
  <t>Reception is an inherently asynchronous activity. While the API is
designed to be as platform-independent as possible, one key insight it is
based on is that an Message receiver’s behavior in a packet-switched network is
inherently asynchronous, driven by the receipt of packets, and that this
asynchronicity must be reflected in the API. The actual implementation of
receive and event handling will need to be aligned to the method a given
platform provides for asynchronous I/O.</t>
  <t>A new API cannot be bound to a single transport protocol and expect
wide deployment. As the API is transport-independent and may support runtime
transport selection, it must impose the minimum possible set of constraints on
its underlying transports, though some API features may require underlying
transport features to work optimally. It must be possible to implement Post
over vanilla TCP in the present Internet architecture.</t>
</list></t>

<t>The API we design from these principles is centered around a Carrier, which
can be created actively via initiate() or passively via a listen(); the latter
creates a Listener from which new Carriers can be accept()ed.  Messages may be
created explicitly and passed to this Carrier, or implicitly through a
simplified interface which uses default message properties (reliable transport
without priority or deadline, which guarantees ordered delivery over a single
Carrier when the underlying transport protocol stack supports it).</t>

<t>For each connection between a Local and a Remote a new Carrier is created and 
destroyed when the connection is closed. However, a new Carrier may use an existing
Association if present for the requested Local-Remote pair and permitted by the
PolicyContext that can be provided at Carrier initiation. Further the system-wide
PolicyContext can contain more information that determine when to create or destroy
Associations other than at Carrier initiation. E.g. an Association can be created 
at system start, based on the configured PolicyContext or also by a manual action of 
an single application, for Local-Remote pairs that are known to be likely used soon, and 
to pre-establish, e.g., cryptographic context as well as potentially collect current information
about path capabilities. Every time an actual connection with a specific PSI is established between the 
Local and Remote, the Association learns new Path information and stores them. This
information can be used when a new transient is created, e.g. to decide which PSI
to use (to provide the highest probably for a successful connection attempt) or which
PSIs to probe for (first). A Transient is created when an application actually sends a 
Message over a Carrier. As further explained below this step can actually create multiple 
transients for probing or assign a new transient to an already active PSI, e.g. if multi-streaming
is provided and supported for these kind of use on both sides.</t>

<section anchor="example-connection-patterns" title="Example Connection Patterns">

<t>[EDITOR’S NOTE: ensure these are in line with the <xref target="sec-dynamics"/> below.]</t>

<t>Here, we illustrate the usage of the API for common connection patterns. Note
that error handling is ignored in these illustrations for ease of reading.</t>

<section anchor="client-server" title="Client-Server">

<t>Here’s an example client-server application. The server echoes messages. The
client sends a message and prints what it receives.</t>

<t>The client in <xref target="fig-client"/> connects, sends a message, and sets up a receiver
to print messages received in response. The carrier is inactive after the
Initiate() call; the Send() call blocks until the carrier can be activated.</t>

<figure title="Example client" anchor="fig-client"><artwork><![CDATA[
// connect to a server given a remote
func sayHello() {

    carrier := Initiate(local, remote)

    carrier.Send([]byte("Hello!"))
    carrier.Ready(func (msg InMessage) {
        fmt.Println(string([]byte(msg))
        return false
    })
    carrier.Close()
}
]]></artwork></figure>

<t>The server in <xref target="fig-server"/> creates a Listener, which accepts Carriers and passes them to a server. The server echos the content of each message it receives.</t>

<figure title="Example server" anchor="fig-server"><artwork><![CDATA[
// run a server for a specific carrier, echo all its messages
func runMyServerOn(carrier Carrier) {
    carrier.Ready(func (msg InMessage) {
        carrier.Send(msg)
    })
}

// accept connections forever, spawn servers for them
func acceptConnections() {
    listener := Listen(local)
    listener.Accept(func(carrier Carrier) bool {
        go runMyServerOn(carrier)
        return true
    })
}
]]></artwork></figure>

<t>The Responder allows the server to be significantly simplified, as shown in <xref target="fig-responder"/>.</t>

<figure title="Example responder" anchor="fig-responder"><artwork><![CDATA[
func echo(msg InMessage, reply Sink) {
    reply.Send(msg)
}

Respond(local, echo)
]]></artwork></figure>

</section>
<section anchor="client-server-with-happy-eyeballs-and-0-rtt-establishment" title="Client-Server with Happy Eyeballs and 0-RTT establishment">

<t>The fundamental design of a client need not change at all for happy eyeballs
<xref target="RFC6555"/> (selection of multiple potential protocol stacks through connection
racing); this is handled by the Post Sockets implementation automatically. If
this connection racing is to use 0-RTT data (i.e., as provided by TCP Fast Open
<xref target="RFC7413"/>, the client must mark the outgoing message as idempotent.</t>

<figure><artwork><![CDATA[
// connect to a server given a remote and send some 0-RTT data
func sayHelloQuickly() {

    carrier := Initiate(local, remote)

    carrier.SendMsg(OutMessage{Content: []byte("Hello!"), Idempotent: true}, nil, nil, nil)
    carrier.Ready(func (msg InMessage) {
        fmt.Println(string([]byte(msg)))
        return false
    })
    carrier.Close()
}
]]></artwork></figure>

</section>
<section anchor="peer-to-peer-with-network-address-translation" title="Peer to Peer with Network Address Translation">

<t>In the client-server examples shown above, the Remote given to the Initiate call
refers to the name and port of the server to connect to. This need not be the
case, however; a Remote may also refer to an identity and a rendezvous point for
rendezvous as in ICE <xref target="RFC5245"/>. Here, each peer does its own Initiate call
simultaneously, and the result on each side is a Carrier attached to an
appropriate Association.</t>

</section>
<section anchor="multicast-receiver" title="Multicast Receiver">

<t>A multicast receiver is implemented using a Sink attached to a Local
encapsulating a multicast address on which to receive multicast datagrams. The
following example prints messages received on the multicast address forever.</t>

<figure><artwork><![CDATA[
func receiveMulticast() {
    sink = NewSink(local)
    sink.Ready(func (msg InMessage) {
        fmt.Println(string([]byte(msg)))
        return true
    })
}
]]></artwork></figure>

</section>
<section anchor="association-bootstrapping" title="Association Bootstrapping">

<t>Here, we show how Association state may be initialized without a carrier.
The goal is to create a long-term Association from which Carriers may be derived
and, if possible, used immediately. Per <xref target="I-D.pauly-taps-transport-security"/>,
a first step is to specify trust model constraints, such as pinned public keys
and anchor certificates, which are needed to create Remote connections.</t>

<t>We begin by creating shared security parameters that will be used later for creating
a remote connection.</t>

<figure><artwork><![CDATA[
// create security parameters with a set of trusted certificates
func createParameters(trustedCerts []Certificate) Parameters {
    parameters := Parameters()
    parameters = parameters.SetTrustedCerts(trustedCerts)
    return parameters
}
]]></artwork></figure>

<t>Using these statically configured parameters, we now show how to create an Association
between a Local and Remote using these parameters.</t>

<figure><artwork><![CDATA[
// create an Association using shared parameters
func createAssociation(local Local, remote Remote, parameters Parameters) Association {
    association := NewAssociation(local, remote, parameters)
    return association
}
]]></artwork></figure>

<t>We may also create an Association with a pre-shared key configured out-of-band.</t>

<figure><artwork><![CDATA[
// create an Association using a pre-shared key
func createAssociationWithPSK(local Local, remote Remote, parameters Parameters, preSharedKey []byte) Association {
    association := NewAssociation(local, remote, parameters)
    association = association.SetPreSharedKey(preSharedKey)
    return association
}
]]></artwork></figure>

<t>We now show how to create a Carrier from an existing, pre-configured Association.
This Association may or may not contain shared cryptographic static between the
Local and Remote, depending on how it was configured.</t>

<figure><artwork><![CDATA[
// open a connection to a server using an existing Association and send some data,
// which will be sent early if possible.
func sayHelloWithAssociation(association Association) {
    carrier := association.Initiate()

    carrier.SendMsg(OutMessage{Content: []byte("Hello!"), Idempotent: true}, nil, nil, nil)
    carrier.Ready(func (msg InMessage) {
        fmt.Println(string([]byte(msg)))
        return false
    })
    carrier.Close()
}
]]></artwork></figure>

</section>
</section>
<section anchor="sec-dynamics" title="API Dynamics">

<t>As Carriers provide the central entry point to Post, they are key to API
dynamics. The lifecycle of a carrier is shown in <xref target="fig-carrier-lc"/>. Carriers
are created by active openers by calling Initiate() given a Local and a Remote,
and by passive openers by calling Listen() given a Local; the .Accept() method
on the listener Carrier can then be used to create active carriers. By default,
the underlying Association is automatically created and managed by the
underlying API. This underlying Association can be accessed by the Carrier’s
.Association() method. Alternately, an association can be explicitly created
using NewAssociation(), and a Carrier on the association may be accessed or
initiated by calling the association’s .Initiate() method.</t>

<t>Once a Carrier has been created (via Initiate(), Association.Initiate(),
NewSource(), NewSink(), or Listen()/Accept()), it may be used to send and
receive Messages. The existence of a Carrier does not imply the existence of
an active Transient or associated transport-layer connection; these may be
created when the carrier is, or may be deferred, depending on the network
environment, configuration, and protocol stacks available.</t>

<figure title="Carrier and Association Life Cycle" anchor="fig-carrier-lc"><artwork><![CDATA[
 Listen(local)   Initiate(local,remote)   NewSource(local,remote)
      |                     |             or NewSink(local)
  [ Carrier  ]              |                    |
  [(listener)]              +--------------------+
      |                     V                    
  .Accept()-----------> [Carrier] -+----------> .Close()
                         |     ^   |  close    [ Carrier  ]
                         |     |   +- event -> [ (closed) ]
                         |     |          
              .Association()  .Carriers()
                         |    .Initiate()
                         V     |
                     [Association]   
                           ^
                           |
              NewAssociation(local,remote)
]]></artwork></figure>

<t>Access to more detailed information is possible through accessors on Carriers
and Associations, as shown in <xref target="fig-accessors"/>. The set of currently active
Transients can be accessed through the Carrier’s .Transients() methods. The
active path(s) used by a Transient can be accessed through the Transient’s
.Paths() method, and the set of all paths for which properties are cached by
an Association can be accessed through the Association’s .Paths() method. The
set of active carriers on an association can be accessed through the
Association’s .Carriers() method. Access to transients and paths is not
necessary in normal operation; these accessors are provided primarily for
logging and debugging purposes.</t>

<figure title="Accessors on Carriers and Associations" anchor="fig-accessors"><artwork><![CDATA[
          [Carrier]---.Transients()--->[Transient]
           |     ^                       |
           |     |                       |
.Association()  .Carriers()           .Paths()
           |    .Initiate()              |
           V     |                       V
        [Association]---.Paths()------>[Path]       
]]></artwork></figure>

<t>Each Carrier has a .Send() method, by which Messages can be sent with given
properties, and a .Ready() method, which supplies a callback for reading
Messages from the remote side. .Send() is not available on Sinks, and .Ready()
is not available on Sources. Carriers also provide .OnSent(), .OnAcked(), and
.OnExpired() calls for binding default send event handlers to the Carrier, and
.OnClosed() for handling passive close notifications.</t>

<figure title="Sending and Receiving Messages and Events" anchor="fig-message"><artwork><![CDATA[
                                  +---------[incoming]-----------+
                                  |         [Message ]           V
[outgoing] ---> .Send() --->  [Carrier] <---- .Ready() <---- [Receiver]
[Message ]                        |
                                  +--- .OnSent()
                                  +--- .OnAcked()
                                  +--- .OnExpired()
                                  +--- .OnClosed()       
]]></artwork></figure>

<t>An application may have a global Configuation, as well as more specific
Configurations to apply to the establishment of a given Association or Carrier.
These Configurations are optional arguments to the Association and Carrier
creation calls.</t>

<t>[EDITOR’S NOTE (bht): the text below does not belong here, figure out what to
do with it when
https://github.com/mami-project/draft-trammell-post-sockets/pull/23 lands:
Each Configuration is conceptually a key-value store, where information in
more specific scopes overrides information in less specific scopes:
application defaults can be overriden by specific Configurations bound to
Carriers or Associations, all of which may be overriden by system or
user-scoped configuration parameters. Configurations are also made directly
available to protocol stack instances (PSIs, see <xref target="sec-psi"/>) for fine-grained
control of implementation-specific configuration parameters.]</t>

<t>In order to initiate a connection with a remote endpoint, a user of Post Sockets
must start from a Remote (see <xref target="remote"/>). A Remote encapsulates identifying
information about a remote endpoint at a specific level of resolution. A new
Remote can be wrapped around some identifying information by via the NewRemote()
call. A Remote has a .Resolve() method, which can be iteratively revoked to
increase the level of resolution; a call to Resolve on a given Remote may result
in one to many Remotes, as shown in <xref target="fig-remote"/>.  Remotes at any level of
resolution may be passed to Post Sockets calls; each call will continue
resolution to the point necessary to establish or resume a Carrier.</t>

<figure title="Recursive resolution of Remotes" anchor="fig-remote"><artwork><![CDATA[
                          +----------------------------+
                        n |                            | 1
NewRemote(identifiers) ---+--->[Remote] --.Resolve()---+
]]></artwork></figure>

<t>Information about the local endpoint is also necessary to establish an
Association, whether explicitly or implicitly through the creation of a
Carrier or Listener. This is passed in the form of a Local (see <xref target="local"/>). A
Local is created with a NewLocal() call, which takes a Configuration
(including certificates to present and secret keys associated with them) and
identifying information (interface(s) and port(s) to use).</t>

</section>
</section>
<section anchor="implementation-considerations" title="Implementation Considerations">

<t>Here we discuss an incomplete list of API implementation considerations that
have arisen with experimentation with prototype implementations of Post.</t>

<section anchor="sec-psi" title="Protocol Stack Instance (PSI)">

<t>A PSI encapsulates an arbitrary stack of protocols (e.g., TCP over IPv6,
SCTP over DTLS over UDP over IPv4).  PSIs provide the bridge between the
interface (Carrier) plus the current state (Transients) and the implementation
of a given set of transport services <xref target="I-D.ietf-taps-transports"/>.</t>

<t>A given implementation makes one or more possible protocol stacks available
to its applications. Selection and configuration among multiple PSIs is
based on system-level or application policies, as well as on network
conditions in the provisioning domain in which a connection is made.</t>

<figure title="Example Protocol Stack Instances" anchor="fig-psi"><artwork><![CDATA[
+=========+    +=========+   +==========+      +==========+
| Carrier |    | Carrier |   | Carrier  |      | Carrier  |
+=========+    +=========+   +==========+      +==========+
     |               |              |                 |
+=========+    +=========+   +==========+      +==========+
|Transient|    |Transient|   |Transient |      |Transient |
+=========+    +=========+   +==========+      +==========+
     |                  \     /                 /        \
+=========+           +=========+      +=========+      +=========+
|   PSI   |           |   PSI   |      |   PSI   |      |   PSI   |
+===+-----++          +===+-----++     +===+-----++    ++-----+===+
    |TLS   |              |SCTP  |         |TLS   |    |   TLS|
    |TCP   |              |DTLS  |         |TCP   |    |   TCP|
    |IPv6  |              |UDP   |         |IPv6  |    |  IPv4|
    |802.3 |              |IPv6  |         |802.11|    |802.11|
    +------+              |802.3 |         +------+    +------+
                          +------+
(a) Transient  (b) Carrier multiplexing   (c) Multiple candidates
 bound to PSI   over a multi-streaming     racing during session
                transport protocol         establishment
]]></artwork></figure>

<t>For example, <xref target="fig-psi"/>(a) shows a TLS over TCP stack, usable on most
network connections. Protocols are layered to ensure that the PSI provides
all the transport services required by the application.
A single PSI may be bound to multiple Carriers, as shown in
<xref target="fig-psi"/>(b): a multi-streaming transport protocol like QUIC or SCTP can
support one carrier per stream. Where multi-streaming transport is not
available, these carriers could be serviced by different PSIs on different
flows. On the other hand, multiple PSIs are bound to a single transient
during establishment, as shown in <xref target="fig-psi"/>(c). Here, the losing
PSI in a happy-eyeballs race will be terminated, and the carrier will
continue using the winning PSI.</t>

</section>
<section anchor="message-framing-parsing-and-serialization" title="Message Framing, Parsing, and Serialization">

<t>While some transports expose a byte stream abstraction, most higher level
protocols impose some structure onto that byte stream. That is, the higher
level protocol operates in terms of messages, protocol data units (PDUs),
rather than using unstructured sequences of bytes, with each message being
processed in turn.
Protocols are specified in terms of state machines acting on semantic
messages, with parsing the byte stream into messages being a necessary
annoyance, rather than a semantic concern.
Accordingly, Post Sockets exposes a message-based API to applications as
the primary abstraction. Protocols that deal only in byte streams, such as TCP,
represent their data in each direction as a single, long message. When framing
protocols are placed on top of byte streams, the messages used in the API
represent the framed messages within the stream.</t>

<t>There are other benefits of providing a message-oriented API beyond framing
PDUs that Post Sockets should provide when supported by the underlying
transport. These include:</t>

<t><list style="symbols">
  <t>the ability to associate deadlines with messages, for transports that
care about timing;</t>
  <t>the ability to provide control of reliability, choosing what messages to
retransmit in the event of packet loss, and how best to make use of the
data that arrived;</t>
  <t>the ability to manage dependencies between messages, when some messages
may not be delivered due to either packet loss or missing a deadline, in
particular the ability to avoid (re-)sending data that relies on a previous
transmission that was never received.</t>
</list></t>

<t>All require explicit message boundaries, and application-level framing of
messages, to be effective. Once a message is passed to Post Sockets, it can
not be cancelled or paused, but prioritization as well as lifetime and
retransmission management will provide the protocol stack with all needed
information to send the messages as quickly as possible without blocking
transmission unnecessarily.  Post Sockets provides this by handling
message, with known identity (sequence numbers, in the simple case),
lifetimes, niceness, and antecedents.</t>

<t>Transport protocols such as SCTP provide a message-oriented API that has
similar features to those we describe. Other transports, such as TCP, do
not. To support a message oriented API, while still being compatible with
stream-based transport protocols, Post Sockets must provide APIs for
parsing and serialising messages that understand the protocol data.  That
is, we push message parsing and serialisation down into the Post Sockets
stack, allowing applications to send and receive strongly typed data
objects (e.g., a receive call on an HTTP Message Carrier should return
an object representing the HTTP response, with pre-parsed status code,
headers, and any message body, rather than returning a byte array that
the application has to parse itself).
This is backwards compatible with existing protocols and APIs, since
the wire format of messages does not change, but gives a Post Sockets
stack additional information to allow it to make better use of modern
transport services.</t>

<t>The Post Sockets approach is therefore to raise the semantic level of the
transport API: applications should send and receive messages in the form of
meaningful, strongly typed, protocol data. Parsing and serialising such
messages should be a re-usable function of the protocol stack instance not
the application.  This is well-suited to implementation in modern systems
languages, such as Swift, Go, Rust, or C++, but can also be implemented
with some loss of type safety in C.</t>


</section>
<section anchor="message-size-limitations" title="Message Size Limitations">

<t>Ideally, Messages can be of infinite size. However, protocol stacks and protocol
stack implementations may impose their own limits on message sizing; For
example, SCTP <xref target="RFC4960"/> and TLS <xref target="I-D.ietf-tls-tls13"/> impose record size
limitations of 64kB and 16kB, respectively. Message sizes may also be limited by
the available buffer at the receiver, since a Message must be fully assembled by
the transport layer before it can be passed on to the application layer. Since
not every transport protocol stack implements the signaling necessary to
negotiate or expose message size limitations, these may need to be defined out
of band, and are probably best exposed through the Configuration.</t>

<t>A truly infinite message service – e.g. large file transfer where both
endpoints have committed persistent storage to the message – is probably best
realized as a layer above Post Sockets, and may be added as a new type of
Message Carrier to a future revision of this document.</t>

</section>
<section anchor="back-pressure" title="Back-pressure">

<t>Regardless of how asynchronous reception is implemented, it is important for an
application to be able to apply receiver back-pressure, to allow the protocol
stack to perform receiver flow control. Depending on how asynchronous I/O works
in the platform, this could be implemented by having a maximum number of
concurrent receive callbacks, or by bounding the maximum number of outstanding,
unread bytes at any given time, for example.</t>

</section>
<section anchor="associations-transients-racing-and-rendezvous" title="Associations, Transients, Racing, and Rendezvous">

<t>As the network has evolved, even the simple act of establishing a
connection has become increasingly complex.  Clients now regularly race
multiple connections, for example over IPv4 and IPv6, to determine which
protocol to use.  The choice of outgoing interface has also become more
important, with differential reachability and performance from multiple
interfaces. Name resolution can also give different outcomes depending on
the interface the query was issued from. Finally, but often most
significantly, NAT traversal, relay discovery, and path state maintenance
messages are an essential part of connection establishment, especially for
peer-to-peer applications.</t>

<t>Post Sockets accordingly breaks communication establishment down into
multiple phases:</t>

<t><list style="symbols">
  <t>Gathering Locals  <vspace blankLines='1'/>
The set of possible Locals is gathered.
In the simple case, this merely enumerates the local interfaces and
protocols, and allocates ephemeral source ports for transients. For
example, a system that has WiFi and Ethernet and supports IPv4 and IPv6
might gather four candidate locals (IPv4 on Ethernet, IPv6 on Ethernet,
IPv4 on WiFi, and IPv6 on WiFi) that can form the source for a transient.  <vspace blankLines='1'/>
If NAT traversal is required, the process of gathering locals becomes
broadly equivalent to the ICE candidate gathering phase <xref target="RFC5245"/>.
The endpoint determines its server reflexive locals (i.e., the
translated address of a local, on the other side of a NAT) and relayed
locals (e.g., via a TURN server or other relay), for each interface and
network protocol. These are added to the set of candidate locals for
this association.  <vspace blankLines='1'/>
Gathering locals is primarily an endpoint local operation, although it
might involve exchanges with a STUN server to derive server reflexive
locals, or with a TURN server or other relay to derive relayed locals.
It does not involve communication with the remote.</t>
  <t>Resolving the Remote  <vspace blankLines='1'/>
The remote is typically a name that
needs to be resolved into a set of possible addresses that can be used
for communication. Resolving the remote is the process of recursively
performing such name lookups, until fully resolved, to return the set
of candidates for the remote of this association.  <vspace blankLines='1'/>
How this is done will depend on the type of the Remote, and can also
be specific to each local.
A common case is when the Remote is a DNS name, in which case it is
resolved to give a set of IPv4 and IPv6 addresses representing that
name.
Some types of remote might require more complex resolution. Resolving
the remote for a peer-to-peer connection might involve communication
with a rendezvous server, which in turn contacts the peer to gain
consent to communicate and retrieve its set of candidate locals, which
are returned and form the candidate remote addresses for contacting
that peer.  <vspace blankLines='1'/>
Resolving the remote is <spanx style="emph">not</spanx> a local operation. It will involve
a directory service, and can require communication with the remote to
rendezvous and exchange peer addresses.
This can expose some or all of the candidate locals to the remote.</t>
  <t>Establishing Transients  <vspace blankLines='1'/>
The set of candidate locals and the set of candidate remotes are
paired, to derive a priority ordered set of Candidate Paths that
can potentially be used to establish a connection.  <vspace blankLines='1'/>
Then, communication is attempted over each candidate path, in
priority order. If there are multiple candidates with the same
priority, then transient establishment proceeds simultaneously
and uses the transient that wins the race to be established.
Otherwise, transients establishment is sequential, paced at a
rate that should not congest the network.
Depending on the chosen transport, this phase might involve racing
TCP connections to a server over IPv4 and IPv6 <xref target="RFC6555"/>, or
it could involve a STUN exchange to establish peer-to-peer UDP
connectivity <xref target="RFC5245"/>, or some other means.</t>
  <t>Confirming and Maintaining Transients  <vspace blankLines='1'/>
Once connectivity has been established, unused resources can be
released and the chosen path can be confirmed.
This is primarily required when establishing peer-to-peer connectivity,
where connections supporting relayed locals that were not required can
be closed, and where an associated signalling operation might be needed
to inform middleboxes and proxies of the chosen path.
Keep-alive messages may also be sent, as appropriate, to ensure NAT and
firewall state is maintained, so the transient remains operational.</t>
</list></t>

<t>By encapsulating these four phases of communication establishment into the
PSI, Post Sockets aims to simplify application development.
It can provide reusable implementations of connection racing for TCP, to enable
happy eyeballs, that will be automatically used by all TCP clients, for example.
With appropriate callbacks to drive the rendezvous signalling as part of
resolving the remote, we believe a generic ICE implementation ought also to be
possible. This procedure can even be repeated fully or partially during a
connection to enable seamless hand-over and mobility within the network stack.</t>

</section>
</section>
<section anchor="acknowledgments" title="Acknowledgments">

<t>Many thanks to Laurent Chuat and Jason Lee at the Network Security Group at ETH
Zurich for contributions to the initial design of Post Sockets. Thanks to Joe
Hildebrand, Martin Thomson, and Michael Welzl for their feedback, as well as the
attendees of the Post Sockets workshop in February 2017 in Zurich for the
discussions, which have improved the design described herein.</t>

<t>This work is partially supported by the European Commission under Horizon 2020
grant agreement no. 688421 Measurement and Architecture for a Middleboxed
Internet (MAMI), and by the Swiss State Secretariat for Education, Research, and
Innovation under contract no. 15.0268. This support does not imply endorsement.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>





<reference anchor="I-D.ietf-taps-transports">
<front>
<title>Services provided by IETF transport protocols and congestion control mechanisms</title>

<author initials='G' surname='Fairhurst' fullname='Gorry Fairhurst'>
    <organization />
</author>

<author initials='B' surname='Trammell' fullname='Brian Trammell'>
    <organization />
</author>

<author initials='M' surname='Kuehlewind' fullname='Mirja Kuehlewind'>
    <organization />
</author>

<date month='December' day='6' year='2016' />

<abstract><t>This document describes, surveys, and classifies the protocol mechanisms provided by existing IETF protocols, as background for determining a common set of transport services.  It examines the Transmission Control Protocol (TCP), Multipath TCP, the Stream Control Transmission Protocol (SCTP), the User Datagram Protocol (UDP), UDP-Lite, the Datagram Congestion Control Protocol (DCCP), the Internet Control Message Protocol (ICMP), the Realtime Transport Protocol (RTP), File Delivery over Unidirectional Transport/ Asynchronous Layered Coding Reliable Multicast (FLUTE/ALC), and NACK- Oriented Reliable Multicast (NORM), Transport Layer Security (TLS), Datagram TLS (DTLS), and the Hypertext Transport Protocol (HTTP), when HTTP is used as a pseudotransport.  This survey provides background for the definition of transport services within the TAPS working group.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-taps-transports-14' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-taps-transports-14.txt' />
</reference>




    </references>

    <references title='Informative References'>





<reference  anchor="RFC0793" target='https://www.rfc-editor.org/info/rfc793'>
<front>
<title>Transmission Control Protocol</title>
<author initials='J.' surname='Postel' fullname='J. Postel'><organization /></author>
<date year='1981' month='September' />
</front>
<seriesInfo name='STD' value='7'/>
<seriesInfo name='RFC' value='793'/>
<seriesInfo name='DOI' value='10.17487/RFC0793'/>
</reference>



<reference  anchor="RFC4960" target='https://www.rfc-editor.org/info/rfc4960'>
<front>
<title>Stream Control Transmission Protocol</title>
<author initials='R.' surname='Stewart' fullname='R. Stewart' role='editor'><organization /></author>
<date year='2007' month='September' />
<abstract><t>This document obsoletes RFC 2960 and RFC 3309.  It describes the Stream Control Transmission Protocol (SCTP).  SCTP is designed to transport Public Switched Telephone Network (PSTN) signaling messages over IP networks, but is capable of broader applications.</t><t>SCTP is a reliable transport protocol operating on top of a connectionless packet network such as IP.  It offers the following services to its users:</t><t>--  acknowledged error-free non-duplicated transfer of user data,</t><t>--  data fragmentation to conform to discovered path MTU size,</t><t>--  sequenced delivery of user messages within multiple streams, with an option for order-of-arrival delivery of individual user messages,</t><t>--  optional bundling of multiple user messages into a single SCTP packet, and</t><t>--  network-level fault tolerance through supporting of multi-homing at either or both ends of an association.</t><t> The design of SCTP includes appropriate congestion avoidance behavior and resistance to flooding and masquerade attacks.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='4960'/>
<seriesInfo name='DOI' value='10.17487/RFC4960'/>
</reference>



<reference  anchor="RFC5245" target='https://www.rfc-editor.org/info/rfc5245'>
<front>
<title>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal for Offer/Answer Protocols</title>
<author initials='J.' surname='Rosenberg' fullname='J. Rosenberg'><organization /></author>
<date year='2010' month='April' />
<abstract><t>This document describes a protocol for Network Address Translator (NAT) traversal for UDP-based multimedia sessions established with the offer/answer model.  This protocol is called Interactive Connectivity Establishment (ICE).  ICE makes use of the Session Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using Relay NAT (TURN).  ICE can be used by any protocol utilizing the offer/answer model, such as the Session Initiation Protocol (SIP).  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='5245'/>
<seriesInfo name='DOI' value='10.17487/RFC5245'/>
</reference>



<reference  anchor="RFC6555" target='https://www.rfc-editor.org/info/rfc6555'>
<front>
<title>Happy Eyeballs: Success with Dual-Stack Hosts</title>
<author initials='D.' surname='Wing' fullname='D. Wing'><organization /></author>
<author initials='A.' surname='Yourtchenko' fullname='A. Yourtchenko'><organization /></author>
<date year='2012' month='April' />
<abstract><t>When a server's IPv4 path and protocol are working, but the server's IPv6 path and protocol are not working, a dual-stack client application experiences significant connection delay compared to an IPv4-only client.  This is undesirable because it causes the dual- stack client to have a worse user experience.  This document specifies requirements for algorithms that reduce this user-visible delay and provides an algorithm.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6555'/>
<seriesInfo name='DOI' value='10.17487/RFC6555'/>
</reference>



<reference  anchor="RFC6698" target='https://www.rfc-editor.org/info/rfc6698'>
<front>
<title>The DNS-Based Authentication of Named Entities (DANE) Transport Layer Security (TLS) Protocol: TLSA</title>
<author initials='P.' surname='Hoffman' fullname='P. Hoffman'><organization /></author>
<author initials='J.' surname='Schlyter' fullname='J. Schlyter'><organization /></author>
<date year='2012' month='August' />
<abstract><t>Encrypted communication on the Internet often uses Transport Layer Security (TLS), which depends on third parties to certify the keys used.  This document improves on that situation by enabling the administrators of domain names to specify the keys used in that domain's TLS servers.  This requires matching improvements in TLS client software, but no change in TLS server software.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6698'/>
<seriesInfo name='DOI' value='10.17487/RFC6698'/>
</reference>



<reference  anchor="RFC6824" target='https://www.rfc-editor.org/info/rfc6824'>
<front>
<title>TCP Extensions for Multipath Operation with Multiple Addresses</title>
<author initials='A.' surname='Ford' fullname='A. Ford'><organization /></author>
<author initials='C.' surname='Raiciu' fullname='C. Raiciu'><organization /></author>
<author initials='M.' surname='Handley' fullname='M. Handley'><organization /></author>
<author initials='O.' surname='Bonaventure' fullname='O. Bonaventure'><organization /></author>
<date year='2013' month='January' />
<abstract><t>TCP/IP communication is currently restricted to a single path per connection, yet multiple paths often exist between peers.  The simultaneous use of these multiple paths for a TCP/IP session would improve resource usage within the network and, thus, improve user experience through higher throughput and improved resilience to network failure.</t><t>Multipath TCP provides the ability to simultaneously use multiple paths between peers.  This document presents a set of extensions to traditional TCP to support multipath operation.  The protocol offers the same type of service to applications as TCP (i.e., reliable bytestream), and it provides the components necessary to establish and use multiple TCP flows across potentially disjoint paths.  This  document defines an Experimental Protocol for the Internet community.</t></abstract>
</front>
<seriesInfo name='RFC' value='6824'/>
<seriesInfo name='DOI' value='10.17487/RFC6824'/>
</reference>



<reference  anchor="RFC7258" target='https://www.rfc-editor.org/info/rfc7258'>
<front>
<title>Pervasive Monitoring Is an Attack</title>
<author initials='S.' surname='Farrell' fullname='S. Farrell'><organization /></author>
<author initials='H.' surname='Tschofenig' fullname='H. Tschofenig'><organization /></author>
<date year='2014' month='May' />
<abstract><t>Pervasive monitoring is a technical attack that should be mitigated in the design of IETF protocols, where possible.</t></abstract>
</front>
<seriesInfo name='BCP' value='188'/>
<seriesInfo name='RFC' value='7258'/>
<seriesInfo name='DOI' value='10.17487/RFC7258'/>
</reference>



<reference  anchor="RFC7413" target='https://www.rfc-editor.org/info/rfc7413'>
<front>
<title>TCP Fast Open</title>
<author initials='Y.' surname='Cheng' fullname='Y. Cheng'><organization /></author>
<author initials='J.' surname='Chu' fullname='J. Chu'><organization /></author>
<author initials='S.' surname='Radhakrishnan' fullname='S. Radhakrishnan'><organization /></author>
<author initials='A.' surname='Jain' fullname='A. Jain'><organization /></author>
<date year='2014' month='December' />
<abstract><t>This document describes an experimental TCP mechanism called TCP Fast Open (TFO).  TFO allows data to be carried in the SYN and SYN-ACK packets and consumed by the receiving end during the initial connection handshake, and saves up to one full round-trip time (RTT) compared to the standard TCP, which requires a three-way handshake (3WHS) to complete before data can be exchanged.  However, TFO deviates from the standard TCP semantics, since the data in the SYN could be replayed to an application in some rare circumstances.  Applications should not use TFO unless they can tolerate this issue, as detailed in the Applicability section.</t></abstract>
</front>
<seriesInfo name='RFC' value='7413'/>
<seriesInfo name='DOI' value='10.17487/RFC7413'/>
</reference>



<reference  anchor="RFC7556" target='https://www.rfc-editor.org/info/rfc7556'>
<front>
<title>Multiple Provisioning Domain Architecture</title>
<author initials='D.' surname='Anipko' fullname='D. Anipko' role='editor'><organization /></author>
<date year='2015' month='June' />
<abstract><t>This document is a product of the work of the Multiple Interfaces Architecture Design team.  It outlines a solution framework for some of the issues experienced by nodes that can be attached to multiple networks simultaneously.  The framework defines the concept of a Provisioning Domain (PvD), which is a consistent set of network configuration information.  PvD-aware nodes learn PvD-specific information from the networks they are attached to and/or other sources.  PvDs are used to enable separation and configuration consistency in the presence of multiple concurrent connections.</t></abstract>
</front>
<seriesInfo name='RFC' value='7556'/>
<seriesInfo name='DOI' value='10.17487/RFC7556'/>
</reference>



<reference anchor="I-D.ietf-quic-transport">
<front>
<title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>

<author initials='J' surname='Iyengar' fullname='Janardhan Iyengar'>
    <organization />
</author>

<author initials='M' surname='Thomson' fullname='Martin Thomson'>
    <organization />
</author>

<date month='October' day='14' year='2017' />

<abstract><t>This document defines the core of the QUIC transport protocol.  This document describes connection establishment, packet format, multiplexing and reliability.  Accompanying documents describe the cryptographic handshake and loss detection.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-quic-transport-07' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-quic-transport-07.txt' />
</reference>



<reference anchor="I-D.kuehlewind-taps-crypto-sep">
<front>
<title>Separating Crypto Negotiation and Communication</title>

<author initials='M' surname='Kuehlewind' fullname='Mirja Kuehlewind'>
    <organization />
</author>

<author initials='T' surname='Pauly' fullname='Tommy Pauly'>
    <organization />
</author>

<author initials='C' surname='Wood' fullname='Christopher Wood'>
    <organization />
</author>

<date month='July' day='3' year='2017' />

<abstract><t>Due to the latency involved in connection setup and security handshakes, there is an increasing deployment of cryptographic session resumption mechanisms.  While cryptographic context and endpoint capabilities need to be be known before encrypted application data can be sent, there is otherwise no technical constraint that the crypto handshake must be performed on the same transport connection.  This document recommends a logical separation between the mechanism(s) used to negotiate capabilities and set up encryption context (handshake protocol), the application of encryption and authentication state to data (record protocol), and the associated transport connection(s).</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-kuehlewind-taps-crypto-sep-00' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-kuehlewind-taps-crypto-sep-00.txt' />
</reference>



<reference anchor="I-D.pauly-taps-transport-security">
<front>
<title>A Survey of Transport Security Protocols</title>

<author initials='T' surname='Pauly' fullname='Tommy Pauly'>
    <organization />
</author>

<author initials='C' surname='Wood' fullname='Christopher Wood'>
    <organization />
</author>

<date month='July' day='3' year='2017' />

<abstract><t>This document provides a survey of commonly used or notable network security protocols, with a focus on how they interact and integrate with applications and transport protocols.  Its goal is to supplement efforts to define and catalog transport services [RFC8095] by describing the interfaces required to add security protocols.  It examines Transport Layer Security (TLS), Datagram Transport Layer Security (DTLS), Quick UDP Internet Connections with TLS (QUIC + TLS), MinimalT, CurveCP, tcpcrypt, and Internet Key Exchange with Encapsulating Security Protocol (IKEv2 + ESP).  This survey is not limited to protocols developed within the scope or context of the IETF.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-pauly-taps-transport-security-00' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-pauly-taps-transport-security-00.txt' />
</reference>



<reference anchor="I-D.ietf-tls-tls13">
<front>
<title>The Transport Layer Security (TLS) Protocol Version 1.3</title>

<author initials='E' surname='Rescorla' fullname='Eric Rescorla'>
    <organization />
</author>

<date month='July' day='3' year='2017' />

<abstract><t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol.  TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-ietf-tls-tls13-21' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-ietf-tls-tls13-21.txt' />
</reference>



<reference anchor="I-D.iyengar-minion-protocol">
<front>
<title>Minion - Wire Protocol</title>

<author initials='J' surname='Jana' fullname='Jana'>
    <organization />
</author>

<author initials='S' surname='Cheshire' fullname='Stuart Cheshire'>
    <organization />
</author>

<author initials='J' surname='Graessley' fullname='Josh Graessley'>
    <organization />
</author>

<date month='October' day='21' year='2013' />

<abstract><t>Minion uses TCP-format packets on-the-wire, for compatibility with existing NATs, Firewalls, and similar middleboxes, but provides a richer set of facilities to the application, as described in the Minion Service Model document.  This document specifies the details of the on-the-wire protocol used to provide those services.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-iyengar-minion-protocol-02' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-iyengar-minion-protocol-02.txt' />
</reference>



<reference anchor="I-D.trammell-plus-abstract-mech">
<front>
<title>Abstract Mechanisms for a Cooperative Path Layer under Endpoint Control</title>

<author initials='B' surname='Trammell' fullname='Brian Trammell'>
    <organization />
</author>

<date month='September' day='28' year='2016' />

<abstract><t>draft-trammell-plus-abstract-mech-00  Abstract  This document describes the operation of three abstract mechanisms for supporting an explicitly cooperative path layer in the Internet architecture.  Three mechanisms are described: sender to path signaling with receiver integrity verification; path to receiver signaling with confidential feedback to sender; and direct path to sender signaling.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-trammell-plus-abstract-mech-00' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-trammell-plus-abstract-mech-00.txt' />
</reference>



<reference anchor="I-D.trammell-plus-statefulness">
<front>
<title>Transport-Independent Path Layer State Management</title>

<author initials='M' surname='Kuehlewind' fullname='Mirja Kuehlewind'>
    <organization />
</author>

<author initials='B' surname='Trammell' fullname='Brian Trammell'>
    <organization />
</author>

<author initials='J' surname='Hildebrand' fullname='Joe Hildebrand'>
    <organization />
</author>

<date month='March' day='28' year='2017' />

<abstract><t>This document describes a simple state machine for stateful network devices on a path between two endpoints to associate state with traffic traversing them on a per-flow basis, as well as abstract signaling mechanisms for driving the state machine.  This state machine is intended to replace the de-facto use of the TCP state machine or incomplete forms thereof by stateful network devices in a transport-independent way, while still allowing for fast state timeout of non-established or undesirable flows.</t></abstract>

</front>

<seriesInfo name='Internet-Draft' value='draft-trammell-plus-statefulness-03' />
<format type='TXT'
        target='http://www.ietf.org/internet-drafts/draft-trammell-plus-statefulness-03.txt' />
</reference>


<reference anchor="MinimaLT" >
  <front>
    <title>MinimaLT, Minimal-latency Networking Through Better Security</title>
    <author initials="W.M." surname="Petullo">
      <organization></organization>
    </author>
    <author initials="X." surname="Zhang">
      <organization></organization>
    </author>
    <author initials="J.A." surname="Solworth">
      <organization></organization>
    </author>
    <author initials="D.J." surname="Bernstein">
      <organization></organization>
    </author>
    <author initials="T." surname="Lange">
      <organization></organization>
    </author>
    <date year="2013" month="May" day="22"/>
  </front>
</reference>
<reference anchor="NEAT" >
  <front>
    <title>Towards a Flexible Internet Transport Layer Architecture</title>
    <author initials="K-J." surname="Grinnemo">
      <organization></organization>
    </author>
    <author initials="." surname="Tom Jones">
      <organization></organization>
    </author>
    <author initials="." surname="Gorry Fairhurst">
      <organization></organization>
    </author>
    <author initials="." surname="David Ros">
      <organization></organization>
    </author>
    <author initials="." surname="Anna Brunstrom">
      <organization></organization>
    </author>
    <author initials="." surname="Per Hurtig">
      <organization></organization>
    </author>
    <date year="2016" month="June"/>
  </front>
</reference>


    </references>


<section anchor="open-issues" title="Open Issues">

<t>This document is under active development; a list of current open issues is available at https://github.com/mami-project/draft-trammell-post-sockets/issues</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAE1L81kAA+V9eXMbR5bn//kpatURa3IEQIctt01tbwxNybbals0W6fbE
eDwTBSBBVqtQhakqkIYt7Wff93tHHgWQtqd7IjZiFdFuAqjK4+XLdx/T6dQN
1VD7k+K87Yfiol289UM/KU6b4nTeD125GIrzrr3qyvW6aq6KV83gu1W58MWq
7Yrh2heXXdn0m7Ybiq/Lne9cOZ93/iYfzy3bRVOuaZZlV66G6YDhfF1Ph3LT
Tzf05LSXJ6ePP3TLcvAnbkH/vWq73UlRNavWuWrTnRRDt+2Hp48ff/r4qSs7
X57E6d1t27296trthr48Pb8ovqfPWPIX+M699Tt6YHkiO2j8MH2BpTjXD2Wz
/I+ybhta3s73blOdFD8M7WJS9DRs51cEjn63xh8/Olduh+u2O3FFMaX/FbS4
/qT4bIZ18Jb4S9nrZ11VNvkPbXd1Ury8/LL4121XLa75O78uq5p26YfVPxtg
ZvobnYD3w0nxRd3SYDiPvvfFh8/4x0U1EHQ+efzp03S4RbttBoDt4rYafvZd
TdvLV3s2K849YNMniz1r66rJvue1ftdUN77raaaiXdEyyv6qvc2WdrG4btsa
v5616812AMgvFpVvFj5Zpb5ZFF88eVp88pe/5EulWQa/LL6id5ftOoXKot/8
M/1PljWjJeVbuaStlNt6l2zksl2vd8m3vI3Tzab2dPSLWbb2J/TVqsLkxddt
u0nWe7alOWkv7aQ4K+uKkL2pyuLTZ4+ffHRw6RcDoWsPKJyuPZ1FmW5i2GA1
/1xiEbMFbzDZw+tZ8dXWX9f+tuKTso28rrq/leOf7kGgNZ6fvQ3P//NQvZ15
P/PD9c//3fj0fdumSz+77qo+fvn/wBEsyltaTXIETduty4GQG1f51fTFDPdP
6NFgJKU/IbJDxCd5sijefH72+I+ffhg+fPTpx4/Dh2dPP3oWPnz87Fny4eNP
P4kfPnn6Ufjwx6fP4i9//OhJHPqPz559LB/CAv9zWy3iAuOP8dhlD4tutxna
ae838RnGwtEW6YkFnTXBO59nqHv8zxbD3+98c1V2U+IDVdtMN11LRLKt4wOB
qm/qbT8tlX1M135xfddDPc5sta0b3/fyzGsafV1+fSmfimLb0eldD8OmP3n0
aNHNdpvZ0D4aFptq82jNz9bD9OnjJx8+fvb06WyzXOl7ytVsuIn+VU9rmrFZ
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
fwFs3rVoFfMAAA==

-->

</rfc>

