<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY rfc2119 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY rfc2327 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2327.xml">
<!ENTITY rfc3264 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3264.xml">
<!ENTITY rfc3550 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3550.xml">
<!ENTITY rfc3725 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3725.xml">
<!ENTITY rfc4566 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4566.xml">
<!ENTITY rfc4796 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4796.xml">
<!ENTITY rfc4960 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4960.xml">
<!ENTITY rfc5245 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5245.xml">
<!ENTITY rfc5761 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5761.xml">
<!ENTITY rfc5764 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5764.xml">
<!ENTITY rfc5888 PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5888.xml">
<!ENTITY draft-alvestrand-mmusic-msid PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.alvestrand-mmusic-msid.xml">
<!ENTITY draft-alvestrand-one-rtp PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.alvestrand-one-rtp.xml">
<!ENTITY draft-ejzak-mmusic-bundle-alternatives PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ejzak-mmusic-bundle-alternatives.xml">
<!ENTITY draft-holmberg-mmusic-sdp-mmt-negotiation PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.holmberg-mmusic-sdp-mmt-negotiation.xml">
<!ENTITY draft-ietf-avtcore-multi-media-rtp-session PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-avtcore-multi-media-rtp-session.xml">
<!ENTITY draft-ietf-mmusic-sdp-bundle-negotiation PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-mmusic-sdp-bundle-negotiation.xml">
<!ENTITY draft-jennings-mmusic-media-req PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.jennings-mmusic-media-req.xml">
<!ENTITY draft-roach-mmusic-mlines PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.roach-mmusic-mlines.xml">
<!ENTITY draft-westerlund-avtcore-transport-multiplexing PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.westerlund-avtcore-transport-multiplexing.xml">
<!ENTITY draft-worley-service-example PUBLIC ""
  "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.worley-service-example.xml">

]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<?rfc strict="yes" ?>
<?rfc toc="yes" ?>
<rfc ipr="trust200902" category="std" docName="draft-worley-sdp-bundle-06">

<!-- To-do:

- Need IPv6 example.

- Can Trickle ICE be used to supply addresses to a line which has a null address?
  How about a zero port?
  Is Trickle ICE already using null addresses for something?

- Check out what null addresses are allowed and where they are in the SDPspec. 
- E-mail Cullen about ports in first SDP. 
- What is CLUE doing? 

- How do I spec application media? 

- Learn enough about ICE to write the examples correctly.
- Add references for any referenced protocols.

-->

<front>
  <title abbrev="SDP Bundling">
    A Generic Bundle Mechanism for the Session Description Protocol (SDP)
  </title>
  <author initials="D. R." surname="Worley" fullname="Dale R. Worley">
    <organization abbrev="Ariadne">
      Ariadne Internet Services, Inc.
    </organization>
    <address>
      <postal>
        <street>738 Main St.</street>
        <city>Waltham</city>
        <region>MA</region>
        <code>02451</code>
        <country>US</country>
      </postal>
      <phone>+1 781 647 9199</phone>
      <email>worley@ariadne.com</email>
    </address>
  </author>
  <date day="15" month="March" year="2013" />
  <area>RAI</area>
  <workgroup>rtcweb</workgroup>
  <keyword>WebRTC</keyword>
  <keyword>SDP</keyword>
  <keyword>SDP bundling</keyword>
  <abstract>
    <t>
      This document defines a generic bundle mechanism for the Session
      Description Protocol (SDP) by which the media described by a
      number of media descriptions ("m= lines") are multiplexed and
      transmitted over a single transport association.  The single
      transport association is described by an additional media
      description, allowing SDP attributes to be applied to the
      aggregate, independently of attributes applied to the
      constituents.  In offer/answer usage, the bundle mechanism is
      backward compatible with SDP processors that do not understand
      the mechanism.  The mechanism is designed to be compatible with
      the limitations of the existing Internet infrastructure.
    </t>
  </abstract>
</front>

<middle>

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

    <t>
      The central idea of bundling is to multiplex the media that would be
      several transport flows into one transport flow, with particular emphasis on
      allowing one transport association to carry media that are presented
      to the higher, application layer, as multiple transport flows.
    </t>

    <t>
      At the interface between the SDP-configured layer and the lower,
      transport layer, the media are organized into a single transport flow.
      The transport-related properties of the RTP session (e.g., transport
      5-tuple, encryption, ICE) are described by the transport-related
      attributes of a single media description.
    </t>

    <t>
      At the interface between the SDP-configured layer and the higher,
      application layer, the media are organized into several transport
      flows.  The application-related properties of the transport flow
      (e.g., media type and label) are described by the
      application-related attributes of separate media descriptions.
    </t>

    <t>
      (There are some attributes (e.g., bandwidth limitation) that can
      apply separately to both the bundled transport flow and the
      constituent transport flows.)
    </t>

    <t>
      However, we do not include the payload type numbers as information
      available to the application; only the encoding name and its
      parameters are accessible to the application.  This gives the bundle
      mechanism freedom to place constraints on the use of payload types.
    </t>

    <t>
      The bundle is signaled in the session description by a "group"
      attribute with semantics "BUNDLE".  The first media description
      listed in the group is the "bundle" media description (MD),
      whose transport information describes the transport association
      via which the packets will be sent.  The remaining (zero or
      more) media descriptions listed in the group are the
      "constituent" MDs.  Packets (either RTP/RTCP/SRTP/SRTCP, SCTP,
      or SCTP-over-DTLS) received from the applications for these MDs
      are sent (unaltered) on the transport association for the bundle
      MD.  Packets received from the transport association for the
      bundle MD are demultiplexed (based on particular features of the
      constituent transport flow protocols and the payload types and
      SCTP ports specified in the constituent MDs) and sent to the
      applications for the constituent MDs.
    </t>

    <t>
      In offer/answer usage, we must arrange that the bundle mechanism is
      backward compatible with entities that do not understand the bundle
      mechanism.  This requirement drives many features of this solution.
      <xref target="compat-oa"/>
    </t>

    <t>
      In addition, many devices in current usage (especially SBCs) apply
      more restrictions on the usage of SDP than one would expect from
      abstract consideration of their roles in the network.  Some features
      of this solution are constructed to avoid these restrictions.
      <xref target="compat-devices"/>
    </t>

  </section>

  <section title="Terminology" anchor="term">

    <t>
      The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref target="RFC2119"/>.
    </t>

    <t>
      The important RFCs in this area use inconsistent terminology.  Here,
      we use:
    </t>

    <t>
      <list style="hanging">

        <t hangText="media">
          Media is (1) media content, considered in an abstract way,
          that is, without consideration of its particular encoding or the
          framing information around it, and (2) the particular bits and octets
          used to encode and transmit the abstract media content.
        </t>

        <t hangText="media stream">
          (Taken from <xref target="RFC3550"/>.)
          A media stream is a set of RTP packets that are generated by and
          interpreted by one codec.  The RTP packets of a media stream
          are identified by a unique SSRC.
        </t>

        <t hangText="capture">
          (Taken from CLUE's work.)
          A capture is a set of media streams that originate from 
          one (physical or virtual) media source and should be composed to
          provide rendering of that source.
          For example, media streams from one origin including layered encodings,
          forward error correction streams, recovery streams, and
          simulcasted media streams of varying bit rates compose one capture.
        </t>

        <t hangText="transport association">
          (Taken from <xref target="I-D.alvestrand-mmusic-msid"/>.)
          A transport association is a single data path between two hosts,
          such as a TCP connection, or a pair of UDP ports that send packets
          to each other.  A transport association is identified by the
          identity of the protocol being used, the relevant host addresses,
          and the relevant port numbers.
          In the case of unicast communications, these form a "5-tuple",
          namely, the protocol, the host addresses of the two hosts, and the
          port numbers used on the two hosts.
          In the case of multicast sessions, these form a "3-tuple", namely,
          the protocol, the multicast address, and the port number.
          In SDP, a transport association is specified by the address and
          port of a media description (and possibly the same information
          from the matching offer/answer SDP).
          If a media description specifies multiple addresses or ports,
          each address or port specifies one transport association.
        </t>

        <t hangText="transport flow">
          (Taken from <xref target="I-D.ietf-avtcore-multi-media-rtp-session"/>.)
          (This is called an "RTP session" by <xref target="RFC3264"/>.)
          A transport flow is the data that flows across a transport
          association.
        </t>

        <t hangText="media description">
          (Taken from <xref target="RFC4566"/>.)
          A media description is one group of lines in a session
          description demarcated by an m= line.
          By synecdoche, a media description is often referred to as "an
          m= line".
        </t>

        <t hangText="transport association group">
          A transport association group is the set of transport
          associations denoted by one media description.
          Usually the m= line specifies only one port and the c= line
          specifies only one address, and so the media description's
          transport association group contains only one transport association.
        </t>

        <t hangText="transport flow group">
          A transport flow group is the set of transport flows of the
          transport associations of a transport association group.
        </t>

        <t hangText="session description">
          (Taken from <xref target="RFC4566"/> section 2.)
          A session description is an SDP instance.
        </t>

        <t hangText="multimedia session">
          (Taken from <xref target="RFC4566"/> section 2.)
          A multimedia session is the totality of the media that is
          transmitted/received as described by a particular session description.
        </t>

        <t hangText="RTP session">
          (Taken from <xref target="RFC3550"/>.)
          An RTP session is a group of media streams which must not have
          duplicated SSRC values because the endpoints share RTCP
          reporting information.
          Note that an RTP session may encompass more than one multimedia
          session.  RTP sessions are not fully described by session descriptions.
        </t>

      </list>
    </t>

  </section>

  <section title="Desiderata" anchor="desiderata">

    <t>
      This section lists desiderata for the bundle mechanism in SDP.
      (I use the term "desiderata" -- "things that are desired" -- rather
      than "requirements", because we may discover that we can't optimally
      satisfy all of these criteria at the same time.)
      The first section lists desiderata that are arise from considering the
      ways applications may wish to bundling.
      The second section lists desiderata that arise from compatibility with
      existing Internet infrastructure.
    </t>

    <section title="Feature Desiderata" anchor="abs-des">

      <t>
        These desiderata describe features that we would like the bundling
        mechanism to provide.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES F1">
            For each bundle, there is a group of media descriptions which
            describe the application-level RTP sessions.
            This specification must allow the same granularity of
            description as when the media flows were not multiplexed.
            This description includes identifiers which connect the media
            flows with the application and with each other.
          </t>
        </list>
      </t>

      <t>
        This requirement is taken from <xref target="I-D.jennings-mmusic-media-req"/>.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES F2">
            For each bundle, there is a media description that describes
            the transport-level RTP session.
          </t>
        </list>
      </t>

      <t>
        DES F1 and DES F2 do not specify whether the transport-level media
        description may or may not also be one of the application-level media
        descriptions.
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F3">
            There must be a uniform way to deal with new SDP parameters,
            so that newly defined SDP parameters do not require a specific
            updating of the bundling procedures.
          </t>
        </list>
      </t>

      <t>
        This desideratum is taken from slides-interim-2013-rtcweb-1-10.pdf.
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F4">
            Multiple separate bundles within one SDP must be supported.
          </t>
        </list>
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES F5">
            Bundles may contain other bundles as constituents.
          </t>
        </list>
      </t>

      <t>
        Of course, no bundle may directly or indirectly contain itself.
        (I don't expect any current implementation to implement bundles within
        bundles, but we should design the mechanism to allow this, as some day
        we will likely need it.)
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F6">
            A bundle may contain zero constituents.
          </t>
        </list>
      </t>

      <t>
        A bundle with no constituents serves no purpose for the transport of
        media, but we are likely to someday need to describe such a bundle.
        (Compare that an SDP m= line is syntactically constrained to specify
        at least one payload type.  When SDP was used only to specify
        multicast sessions, this constraint was common sense.  But once SDP
        offer/answer was invented, when a media description was rejected, the
        natural representation would be an m= line with a zero port and no
        payload types.  But a payload type was syntactically required, so we
        now have to provide at least one token payload type in rejected m=
        lines.)
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F7">
            If an answerer that does understand the bundle mechanism
            processes an offer that contains a bundle, it must be able to (1)
            accept the bundle and selectively accept or reject each constituent
            RTP session within it, (2) reject the bundle as a whole, or (3)
            reject the bundling and selectively accept or reject each constituent
            RTP session as separate RTP sessions.
          </t>
        </list>
      </t>

      <t>
        Presumably answer (3) resembles that which would be produced by an
        answerer that does not understand the bundle mechanism.
        It is a lower priority that the answerer can distinguish between
        accepting the bundle while rejecting all of its constituents, and
        rejecting the bundle as a whole.  But those two conditions differ
        conceptually regarding whether any "framing" actions of the bundle are
        performed.
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F8">
            There must be a reliable way to demultiplex incoming RTP
            into the separate application-level RTP sessions.  Similarly,
            there must be a reliable way to demultiplex the associated RTCP
            information.
          </t>
        </list>
      </t>

      <t>
        The RTCP information for each media stream is
        tagged with the SSRC about which it reports, and the SSRC is used to
        correlate the RTCP reports with the RTP sessions containing media with
        the same SSRC.  So regarding RTCP, this desideratum appears to be
        straightforward to
        satisfy.
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F9">
            The specification must specify any needed additional
            procedures for handling SSRC collisions between media sources
            within different application-level RTP sessions, as those can now
            collide.
          </t>
        </list>
      </t>

      <t>
        In the terminology of <xref target="RFC3550"/>, the constituent media descriptions are now
        part of one RTP session.
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F10">
            When an offer is constructed, the offerer must not need to
            preallocate TURN relays for constituent media descriptions.
            When both endpoints support bundling, the mechanism must
            not require the offerer to allocate
            TURN relays for constituent media descriptions.
          </t>
        </list>
      </t>

      <t>
        This desideratum was suggested by Andrew Hutton.
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F11">
            It must be possible to add and remove one way video flows
            within the bundle without requiring an additional offer/answer cycle.
          </t>
        </list>
      </t>

      <t>
        Presumably this can be accomplished as it is now, with a single media
        description carrying multiple video flows that are distinguished
        only by their SSRCs.
        This desideratum is taken from slides-interim-2013-rtcweb-1-10.pdf.
      </t>
      
      <t>
        <list style="hanging">
          <t hangText="DES F12">
            Bundling must not interfere with ICE usage, and in
            particular, ICE's ability to negotiate both IPv4 and IPv6 addresses
            simultaneously.
          </t>
        </list>
      </t>

      <t>
        This desideratum was suggested by Andrew Hutton.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES F13">
            It is desirable for RTP media to appear on the wire as
            (encrypted) SRTP packets and for RTCP reports to appear on the
            wire as (authenticated but not encrypted) SRTCP packets.
            Thus, encryption of RTP/RTCP via DTLS and encapsulation of
            multiplexed packets is not desirable.
          </t>
        </list>
      </t>

      <t>
        This desideratum was suggested by Martin Thompson
        (http://www.ietf.org/mail-archive/web/mmusic/current/msg10400.html)
        and Dan Wing
        (http://www.ietf.org/mail-archive/web/mmusic/current/msg10408.html).
      </t>

    </section>

    <section title="Compatibility Desiderata" anchor="compat-des">

      <t>
        These desiderata describe compatibility of the bundling mechanism
        with with non-supporting endpoints or with existing entities in
        the Internet infrastructure.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES C1">
            In offer/answer usage, an endpoint using the bundle
            mechanism must interwork correctly with an endpoint that does not
            understand the bundle mechanism.
          </t>
        </list>
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES C2">
            Interworking must continue when SDP endpoints are replaced with
            other endpoints during a sequence of offer/answer exchanges (such as
            happens in 3PCC or call transfers "behind an SBC"), including
            when a supporting endpoint is replaced by a non-supporting
            endpoint or vice-versa.
          </t>
        </list>
      </t>

      <t>
        SDP features (e.g., the codec set and ICE) are generally designed
        so that an offerer always offers every facility it is willing to
        support in the current situation, regardless of whether it was
        agreed to by the answerer in a preceding exchange.  Thus, if the
        current answerer is a different endpoint than the previous
        answerer, the new answerer will negotiate a compatible set of
        facilities without needing knowledge of its predecessor's SDP.
        The offerer will smoothly transition to the new facilities.  This
        property is required to support 3PCC situations (e.g., <xref
        target="RFC3725"/> and <xref target="I-D.worley-service-example"/>).  This
        desideratum was suggested by Richard Ejzak.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES C3">
            Avoid using media types in m= lines other than audio and video
            unless required for user media, as some
            SBCs reject SDP that uses other media types.
          </t>
        </list>
      </t>

      <t>
        This desideratum was suggested by Hadriel Kaplan.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES C4">
            Any additional m= lines prescribed by the bundle mechanism
            should be ordered after the constituent m= lines.
          </t>
        </list>
      </t>

      <t>
        Many devices that have only one audio
        or video channel accept the first m= line with that media type and
        reject any further ones
      </t>

      <t>
        <list style="hanging">
          <t hangText="non-DES C5">
            SBCs generally pass through attributes that they do not
            understand.  SBCs generally pass through codec specifications that
            they do not understand, even if they are configured to transcode
            certain specific codecs.
          </t>
        </list>
      </t>

      <t>
        This non-desideratum was suggested by Hadriel Kaplan.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES C6">
            After offer/answer processing is finished, if the exchanged SDP
            is examined by a non-supporting SBC, the
            set of transport associations that it sees being specified for media
            exchange should be the set that are actually used for media transfer.
          </t>
        </list>
      </t>

      <t>
        This is needed because SBCs monitor the packet traffic on the
        transport associations and if
        no media is seen on one of the associations for a significant period of
        time, the SBC will tear down the call.
        This desideratum was suggested by Hadriel Kaplan.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES C7">
            In a session description, no endpoint of a transport
            association may be used multiple times.
          </t>
        </list>
      </t>

      <t>
        Such duplication is not defined by <xref target="RFC4566"/>.
        Some SBCs do not support such duplication (ultimately, because it was
        not supported by <xref target="RFC2327"/>), and they reject SDP specifying
        duplicated transport association endpoints.
        This desideratum was suggested by Cullen Jennings.
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES C8">
            Offer/answer processing between supporting processors must
            be completed in one exchange.  When interworking between
            supporting and non-supporting processors, it is less desirable but
            admissible that a second offer/answer
            exchange may be needed to complete configuring the multimedia session.
          </t>
        </list>
      </t>

      <t>
        <list style="hanging">
          <t hangText="DES C9">
            If an intermediate entity provides transcoding between codecs,
            and if the offer/answer does not specify encryption of a
            media stream, the media stream should be able to take
            advantage of the transcoding facility.
          </t>
        </list>
      </t>

      <t>
        The non-encrypted case is not expected to be very common.
        Encrypted media can't be transcoded by an intermediate entity.
      </t>

    </section>

  </section>

  <section title="Tutorial Examples" anchor="intro-pictures">

    <t>
      This section is non-normative.
      (This section was suggested by Charles Eckel.)
    </t>

    <t>
      This is an introduction to SDP bundling via a
      series of examples of offer/answer processing.  Some mandatory SDP
      lines have been omitted from the examples for brevity.
      Long SDP lines have been folded by using trailing backslashes.
      Blank lines have been inserted for clarity.
    </t>

    <section title="One Audio Stream and One Video Stream">

      <section title="Offer without Bundling">

        <t>
          Here is a typical, non-bundled SDP example with both audio and video media:
        </t>

        <figure>
          <artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 host.example.com

This SDP media description (MD) provides the transport information
about the audio and also identifies the role of the audio from the
application's point of view.  In this case, the fact that it is the
first audio m= line suffices to tell the application how to treat it.
In more complex cases, label or content attributes might be used to
communicate the proper handling to the application.

        m=audio 10000 RTP/AVP 0 8 97
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31000 typ relay

This MD provides the transport information about the video and also
identifies the role of the video from the application's point of view.

        m=video 10002 RTP/AVP 31 32
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31002 typ relay
          </artwork>
        </figure>

        <t>
          We call the RTP that is described by each media description (MD) a
          transport flow (TF).  The audio and video are carried in separate
          TFs, which each have a separate transport association (address/port).
        </t>

      </section>

      <section title="Offer with Bundling">

        <t>
          With SDP bundling, we add an additional MD to describe a single "bundle"
          TF to carry both the audio and video information, and a group
          attribute to show the association of the bundle MD with the
          constituent MDs:
        </t>

        <figure>
          <artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 host.example.com

The following group attribute declares which MDs are included in the
multiplexed MD:  mid:con1 and mid:con2 are the constituent MDs whose
TFs (from the application point of view) will be carried by the TF of
the first-designed MD, mid:bundle, which is the bundle MD.  In order
to allow demultiplexing of the packets on the bundle TF, the
constituent MDs must use disjoint sets of payload types.

        a=group:BUNDLE bundle con1 con2

This MD provides the application-level description of the audio TF.
As in the previous example, it is the first audio m= line.  It
includes any attributes which apply to the audio media from the
application point of view, including the payload type definitions.
When interpreted by a supporting processor, the transport information
is ignored.  When interpreted by a processor that does not support
bundling, the transport information sets up the transport association
for the audio TF.  But to avoid the overhead of preallocating TURN
relays that will probably not be used, ICE relay candidates are not
provided.

        m=audio 10000 RTP/AVP 0 8 97
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx

This MD provides the application-level description of the video TF.
As in the previous example, it is the first video m= line.  It
includes any attributes which apply to the video media from the
application point of view.  As in the audio MD, the association
information is used only by a processor that does not support
bundling.

        m=video 10002 RTP/AVP 31 32
        a=mid:con2
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx

This MD provides the transport information for the bundle TF,
including any attributes which apply to the transport.  We use RTCP
multiplexing [RFC5761], so only one set of ICE candidates (and only
one TURN relay) is needed for this MD.

The MD is artificially given the media type "audio" (which is ugly,
but it avoids rejection by SBCs) and it is placed after all of the
constituent MDs so as to not affect their positions as "first audio
MD", etc.  The MD has a proto value of "bundle" to describe the packet
traffic (which in general can be a mixture of RTP/SRTP/RTCP/SRTCP,
SCTP, and DTLS).  A single, dummy fmt value of 0 is used.  The proto
value ensures that an answerer that does not support bundling will not
accept this MD.

The packets sent on this transport flow are the packets provided by
the applications for the constituent transport flows.

        m=audio 10004 bundle 0
        a=mid:bundle
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10004 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51004 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31004 typ relay
          </artwork>
        </figure>

        <t>
          If this SDP bundle is accepted, RTP provided by the
          application for the audio TF will be sent from port 10004.
          RTP provided by the application for the video TF will be
          also be sent from port 10004.
        </t>

        <t>
          RTP that is received on port 10004 is interpreted according
          to the payload type number.  Since the payload type numbers
          used in the two constituent transport flows are disjoint,
          incoming RTP packets can be directed to the proper
          applications based on payload type number.
        </t>

      </section>

      <section title="Answer from an Answerer that Supports Bundling">

        <t>
          If the answerer supports SDP bundling, and desires to accept
          the offered bundle and its constituent MDs, the answerer
          signals that it accepts the SDP bundling by providing a
          matching group:BUNDLE attribute in the answer.  As always in
          offer/answer, the MDs in the answer correspond to the MDs in
          the offer by ordinal position.
        </t>

        <t>
          The answerer provides the necessary transport information
          for the bundle MD.  The answerer understands that MDs
          mid:con1 and mid:con2 are incorporated into MD mid:bundle,
          and ignores their transport information.  It accepts each
          constituent MD as part of the bundle by providing an answer
          MD for each of them that specifies an attribute
          "a=bundleaccept" and a port number of 0 (so intermediate
          entities see the MD as being rejected).
        </t>

	<t>
	  Note that the constituent MDs, despite having zero port
	  numbers, are still incorporated in the "a=group:BUNDLE"
	  attribute.  This contravenes <xref target="RFC5888"/>
	  section 9.2, and so this proposal requires an extension of
	  RFC 5888.
	</t>

        <figure>
          <artwork>
        o=- 2890844526 2890844526 IN IP4 answer.example.com
        c=IN IP4 answer.example.com

        a=group:BUNDLE bundle con1 con2

        m=audio 0 RTP/AVP 0 8 97
        a=mid:con1
        a=bundleaccept
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

        m=video 0 RTP/AVP 31 32
        a=mid:con2
        a=bundleaccept
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000

        m=audio 20000 bundle 0
        a=mid:bundle
        a=candidate:0 1 UDP 2113601791 10.0.2.1 20000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.35 51090 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 32000 typ relay
          </artwork>
        </figure>

      </section>

      <section title="Answer from an Answerer that Does Not Support Bundling">

        <t>
          SDP bundling allows for backward compatibility in case the
          answerer does not understand bundling.  If the answerer does
          not understand bundling, it ignores the group attribute, and
          effectively sees the offer as:
        </t>

        <figure>
          <artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 host.example.com

        m=audio 10000 RTP/AVP 0 8 97
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx

        m=video 10002 RTP/AVP 31 32
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx

        m=audio 10004 bundle 0
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10004 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51004 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31004 typ relay
          </artwork>
        </figure>

        <t>
          If the answerer wishes to accept the first audio and video streams, it
          assembles this answer:
        </t>

        <figure>
          <artwork>
        o=- 2890844526 2890844526 IN IP4 answer.example.com
        c=IN IP4 answer.example.com

The absence of the group attribute informs the offerer that bundling
was rejected.

The audio MD is accepted.  Transport information is provided,
including ICE candidates.

        m=audio 20000 RTP/AVP 0 8 97
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.2.1 20000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.128 52000 typ srflx

The video MD is accepted.  Transport information (using a different
port) is provided.

        m=audio 20002 RTP/AVP 31 32
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.2.1 20002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.128 52002 typ srflx

The bundle MD is rejected by the answerer because the proto value is
"bundle", and the answerer does not implement it.

        m=audio 0 bundle 0
          </artwork>
        </figure>

        <t>
          Because the group attribute is not present in the response,
          the offerer knows that the answerer does not support
          bundling (or does not want to consider the offered bundle).
          The offerer knows that the answerer wants to establish one
          audio TF and one video TF, and formally, that has been done.
          But if transport requires ICE relay candidates on the
          offerer's side, the offerer must send an updated offer
          containing those ICE candidates for the constituent MDs:
        </t>

        <figure>
          <artwork>
        o=- 2890844526 2890844527 IN IP4 host.example.com
        c=IN IP4 host.example.com

No group attribute is included, to ensure that this update only
revises transport attributes, and does not trigger bundle-supporting
behavior if the answering entity has changed in the meantime.

Provide ICE relay candidates for the audio MD.

        m=audio 10000 RTP/AVP 0 8 97
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31000 typ relay

Provide a separate TURN relay for the video MD.

        m=video 10002 RTP/AVP 31 32
        a=mid:con2
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31002 typ relay

The bundle MD must still be listed, but it is disabled.

        m=audio 0 bundle 0
        a=mid:bundle
          </artwork>
        </figure>

        <t>
          The answerer provides the same answer as before.
        </t>

        <t>
          The ICE renegotiation proceeds, the transport associations
          are established, and RTP flows.
        </t>

      </section>

      <section title="Fast-Start Offer">

        <t>
          The baseline procedure requires the offerer to update its
          offer when it discovers that the answerer does not support
          SDP bundling if TURN relays are needed to support the
          constituent MDs.  The offerer can avoid this delay by
          providing TURN relays for the constituent MDs as well as for
          the bundle MD.  The penalty is that the offerer must
          preallocate TURN relays for both the constituent MDs as well
          as the bundle MD.
        </t>

        <figure>
          <artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 host.example.com

        a=group:BUNDLE bundle con1 con2

        m=audio 10000 RTP/AVP 0 8 97
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31000 typ relay

        m=video 10002 RTP/AVP 31 32
        a=mid:con2
        a=rtcp-mux
        a=rtpmap:31 H261/90000
        a=rtpmap:32 MPV/90000
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10002 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51002 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31002 typ relay

        m=audio 10004 bundle 0
        a=mid:bundle
        a=rtcp-mux
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10004 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51004 typ srflx
        a=candidate:2 1 UDP 1006633215 10.0.100.1 31004 typ relay
          </artwork>
        </figure>

        <t>
          If the answerer understands bundling and accepts the bundle,
          it accepts the constituent MDs within the bundle (with
          "a=bundleaccept" and port 0) and accepts the bundle MD.  If
          the answerer does not understand bundling, it accepts the
          constituent MDs and rejects the bundle MD.  In either case,
          ICE relay candidates are in place and ICE negotiation
          proceeds.
        </t>

      </section>

    </section>

    <section title="Two Audio Streams and Two Video Streams">

      <t>
        In this example, a presentation involves four media roles:
        the speaker's audio, the floor microphone, the video of the
        speaker, and the video of the speaker's slides.  We use
        separate MDs for each media stream because each TF has a
        different role; the application will handle each of them in
        distinctly different ways.
      </t>

      <figure>
        <artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 host.example.com

        a=group:BUNDLE b c1 c2 c3 c4

        m=audio 10000 RTP/AVP 0 8 97
        a=mid:c1
        a=label:speaker-audio
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

Note that different constituent MDs must use different payload types
(even for the same codec), because incoming RTP is demultiplexed based
on payload type.

        m=audio 10002 RTP/AVP 98 99 100
        a=mid:c2
        a=label:floor-mic
        a=rtcp-mux
        a=rtpmap:98 PCMU/8000
        a=rtpmap:99 PCMA/8000
        a=rtpmap:100 G722

        m=video 10004 RTP/AVP 101 102
        a=mid:c3
        a=label:speaker-video
        a=rtcp-mux
        a=rtpmap:101 H261/90000
        a=rtpmap:102 MPV/90000

        m=video 10006 RTP/AVP 103 104
        a=mid:c4
        a=label:slides
        a=rtcp-mux
        a=rtpmap:103 H261/90000
        a=rtpmap:104 MPV/90000

        m=multipart 10008 bundle 0
        a=mid:b
        </artwork>
      </figure>

    </section>

    <section title="Virtual Classroom with One Audio Stream, Two Video
                    Streams, and a Group of Video Streams">

      <t>
        This example is the teacher's connection to a virtual classroom
        server.  The media descriptions are tagged using the "content"
        attribute. <xref target="RFC4796"/>  The media comprises:
        <list style="numbers">
          <t>
            1. one audio channel, for sending the teacher's voice and
            receiving the voice of a selected student
          </t>
          <t>
            2. one video channel, for sending the teacher's presentation
          </t>
          <t>
            3. one video channel, for sending the teacher's face
          </t>
          <t>
            4. one video channel, for receiving a dynamically varying set of
            students' faces
          </t>
        </list>
      </t>

      <t>
        The fourth TF (for students' faces) contains a large and
        dynamically varying set of video
        captures.  These can be handled by a single TF because they all have
        essentially similar roles -- the application will process them as a
        set.  As Adam Roach would say, "no control surfaces are necessary to
        talk about and/or manipulate the individual streams".  In particular,
        this allows a large number of captures to be handled without
        mentioning them in the SDP, at the expense of not allowing the SDP to
        describe any of them individually.  Similarly, the number of captures
        can vary without having to renegotiate the SDP.
      </t>

      <t>
        (In contrast, the third TF (the teacher's face) is a separate
        TF because it is processed in a different role than that of
        the students' faces.)
      </t>

      <t>
        In unbundled usage, there would be one transport association
        for the fourth TF.  Incoming RTP from that association would
        be demultiplexed by the application based on the SSRC values,
        which would be unique for each student.  With bundling, once
        the single transport TF is demultiplexed based on the RTP
        payload type, packets destined for the fourth TF (index = 3)
        would be further demultiplexed by their SSRC values.  The
        demultiplexing by SSRC is considered to be an application
        layer function in the context of SDP bundling.
      </t>

      <t>
        The offered SDP is:
      </t>

      <figure>
        <artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 host.example.com

        a=group:BUNDLE b c1 c2 c3 c4

The audio channel is send/receive.

        m=audio 10000 RTP/AVP 0 8 97
        a=mid:c1
        a=label:speaker-audio
        a=content:speaker
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

The teacher's face and presentation are send-only.

        m=video 10002 RTP/AVP 103 104
        a=mid:c2
        a=label:speaker-video
        a=content:speaker
        a=sendonly
        a=rtcp-mux
        a=rtpmap:103 H261/90000
        a=rtpmap:104 MPV/90000

        m=video 10004 RTP/AVP 105 106
        a=mid:c3
        a=label:presentation
        a=content:slides
        a=sendonly
        a=rtcp-mux
        a=rtpmap:105 H261/90000
        a=rtpmap:106 MPV/90000

The student video input is receive-only and is limited to 24
simultaneous SSRCs.

        m=video 10006 RTP/AVP 107 108
        a=mid:c4
        a=label:student-thumbnails
        a=recvonly
        a=max-recv-ssrc:* 24
        a=rtcp-mux
        a=rtpmap:107 H261/90000
        a=rtpmap:108 MPV/90000

        m=audio 10000 RTP/AVP 127
        a=mid:b
        a=rtcp-mux
        a=rtpmap:127 bundle
        a=candidate:0 1 UDP 2113601791 10.0.1.1 10000 typ host
        a=candidate:1 1 UDP 1694194431 198.51.100.32 51000 typ srflx
        </artwork>
      </figure>

    </section>

    <section title="One Audio Stream and Two SCTP Streams"
             anchor="sctp-example">

      <t>
        This example contains one audio MD and two SCTP MDs, which are
        used for Webrtc datachannels.
      </t>

      <figure>
        <artwork>
        o=- 2890844526 2890844526 IN IP4 host.example.com
        c=IN IP4 host.example.com

        a=group:BUNDLE bundle con1 con2 con3

        m=audio 10000 RTP/AVP 0 8 97
        a=mid:con1
        a=rtcp-mux
        a=rtpmap:0 PCMU/8000
        a=rtpmap:8 PCMA/8000
        a=rtpmap:97 iLBC/8000

These MDs provides the the SCTP TFs.  Because packets are not
encapsulated, the two SCTP TFs must use different (nominal) SCTP ports
to allow their packets to be distinguished.

        m=application 10002 DTLS/SCTP 5000
        a=mid:con2
        a=sctpmap:5000 webrtc-datachannel 16

        m=application 10004 DTLS/SCTP 5001
        a=mid:con3
        a=sctpmap:5001 webrtc-datachannel 16

        m=audio 10006 bundle 0
        a=mid:bundle
        </artwork>
      </figure>

    </section>

  </section>

<section title="Syntax and Semantics" anchor="syntax">

<t>
  TBD (Here lies the real description.)
</t>

<section title="Constructing an Offer" anchor="offering">

<t>
  TBD
</t>

</section>

<section title="Constructing an Answer" anchor="answering">

<t>
  TBD
</t>

</section>

<section title="Offer/Answer Considerations" anchor="oa">

<t>
  TBD
</t>

</section>

<section title="RTCP, SSRC, and RTP Sessions" anchor="rtcp">

<t>
  TBD
</t>

</section>

<section title="ICE considerations" anchor="ice">

<t>
  TBD
</t>

</section>

<section title="Encryption considerations" anchor="encryption">

<t>
  TBD
  Need to discuss here how the encryption associations are set up.
  For SRTP/SRTCP, it would be possible to have either one association
  for all multiplexed streams, or one for each constituent MD, because
  SRTP preserves the PTs.  (Have to verify that and check whether
  SRTCP preserves SSRCs.)  But SCTP-over-DTLS can't be demultiplexed before it's
  decrypted, so there can be only one DTLS crypto association.
</t>

</section>

</section>

<section title="Compatibility Considerations" anchor="compat">

<section title="Backward Compatibility during Offer/Answer"
         anchor="compat-oa">

<t>
  TBD
</t>

</section>

<section title="Backward Compatibility with Existing Devices"
         anchor="compat-devices">

<t>
  TBD
</t>

</section>

</section>

<section title="Design Features and Comparison" anchor="comparison">

  <t>
    <figure>
      <artwork>
Key:

      x = feature present in proposal
      - = feature not present in proposal
      . = feature not discussed in proposal
    N/A = feature is not relevant because of another feature choice

                worley-sdp-bundle-06
                |   ietf-mmusic-sdp-bundle-negotiation-03 (BUNDLE)
                |   |   holmberg-mmusic-sdp-mmt-negotiation-00 (MMT)
                |   |   |   alvestrand-one-rtp-02 (TOGETHER)
                |   |   |   |   ejzak-mmusic-bundle-alternatives-01
                |   |   |   |   |   Roach alternative 1a
                |   |   |   |   |   |(roach-mmusic-mlines-00)
                |   |   |   |   |   |   Roach alternative 1b
                |   |   |   |   |   |   |   Roach alternative 2
                |   |   |   |   |   |   |   |   westerlund-avtcore-
                |   |   |   |   |   |   |   |   |transport-multiplexing-05
                |   |   |   |   |   |   |   |   |(SHIM)
                V   V   V   V   V   V   V   V   V
MD grouping:
    one         -   -   -   -   -   -   x   -   -
    per type    -   -   -   -   -   x   -   -   -
    none        x   x   x   x   x   -   -   x   x

Separate bundle MD:
    no          -   x   -   x   x   x   x   x   x
    m=anymedia  -   -   x   -   -   -   -   -   -
    m=audio     x   -   -   -   -   -   -   -   -
    m=multipart -   -   -   -   -   -   -   -   -
                                         
Immediate update:                        
    none        -   -   x   x   x   x   x   x   x
    for support -   x   -   -   -   -   -   -   -
    for compat. x   -   -   -   -   -   -   -   -
    
Constituent MD ports after establishment:
    N/A         -   -   -   -   -   x   x   -   -
    same        -   x   -   x   -   -   -   x   x
    different   -   -   -   -   -   -   -   -   -
    null        -   -   -   -   -   -   -   -   -
    rejected    x   -   x   -   x   -   -   -   -
                                         
Bundle MD payload types:                 
    N/A         x   -   -   -   -   x   x   -   -
    one MD      -   x   -   x   .   -   -   x   x
    all MDs     -   -   x   -   .   -   -   -   -
    one value   -   -   -   -   .   -   -   -   -
                                         
Constituent MD payload types:            
    N/A         -   -   -   -   -   x   x   -   -
    overlapping -   -   -   -   .   -   -   x   x
    distinct    x   x   x   x   .   -   -   -   -

Demultiplexing based on:
    N/A         -   -   -   -   -   x   x   -   -
    PT          x   x   x   x   .   -   -   x   -
    encap.      -   -   -   -   .   -   -   -   x

Rejection of bundle MD based on:
    N/A         -   x   -   x   x   x   x   x   x
    media type  -   -   x   -   -   -   -   -   -
    proto       x   -   -   -   -   -   -   -   -
    codec       -   -   -   -   -   -   -   -   -

Addresses/ports in constituent MDs in offer:               
    N/A         -   -   -   -   -   x   x   -   -
    NA,ZP       -   -   -   -   -   -   -   -   -
    NA,NZP      -   -   -   -   x   -   -   -   -
    RA,ZP       -   -   -   -   -   -   -   -   -
    RA,NZP,U    x   x   x   -   x   -   -   -   -
    RA,NZP,S    -   x   -   x   -   -   -   x   x
NA = null address, RA = real address
ZP = zero port, NZP = non-zero port
U = unique ports, S = shared port
      </artwork>
    </figure>
  </t>

  <section title="Aggregation of Constituent Media Descriptions">

    <t>
      Are the constituent media descriptions combined into grouped media
      descriptions?
      <list style="symbols">
        <t>
          All media are combined into one media description.
        </t>
        <t>
          All media of each media type are combined into one media
          description (which has that type).
        </t>
        <t>
          Each constituent media description is separate in the session
          description.
        </t>
      </list>
    </t>

    <t>
      This proposal does not aggregate constituent MDs so that
      attributes can be provided directly for each constituent MD.
    </t>

  </section>

  <section title="Presence of a Bundle Media Description and Its Media Type">

    <t>
      Is there a separate bundle media description, and if so, what
      media type does it have?
      <list style="symbols">
        <t>
          There is no separate bundle media description.
        </t>
        <t>
          There is a separate bundle media description of type "anymedia".
        </t>
        <t>
          There is a separate bundle media description of type "audio".
        </t>
        <t>
          There is a separate bundle media description of type "multipart".
        </t>
      </list>
    </t>

    <t>
      This proposal has a separate bundle MD so that attributes can be
      provided for the bundle MD independently of any constituent MD.
    </t>

  </section>

  <section title="Immediate Update">

    <t>
      Is an immediate updated offer/answer used during session establishment?
      <list style="symbols">
        <t>
          No.
        </t>
        <t>
          Yes, when establishing a session using bundling.
        </t>
        <t>
          Yes, when establishing a session not using bundling.
        </t>
      </list>
    </t>

    <t>
      This proposal can require immediate updates for
      non-bundle-supporting answers to provide ICE TURN candidates, if
      the offerer has not preallocated them.
    </t>

  </section>

  <section title="Effective Media Description Ports after Session Establishment">

    <t>
      What are the effective port numbers in MDs after the session is
      established?
      <list style="symbols">
        <t>
          There are not multiple media descriptions because constituent MDs
          are combined.
        </t>
        <t>
          Port numbers in the MDs are the same.
        </t>
        <t>
          Port numbers in the MDs are different.
        </t>
        <t>
          All but one MD have null addresses.
        </t>
        <t>
          All but one MD have a zero port number (and thus are
          formally rejected).
        </t>
      </list>
    </t>

    <t>
      This proposal uses a zero port number for constituent MDs to
      prevent intermediate entities from expecting to see media for
      the constituent transport associations.
    </t>

  </section>

  <section title="Payload Types in the Bundled Media Description">

    <t>
      What payload types are listed for the bundled MD?
      <list style="symbols">
        <t>
          There is no MD describing the bundle as a whole.
        </t>
        <t>
          The bundle MD lists the payload types of one constituent MD.
        </t>
        <t>
          The bundle MD lists the payload types of all constituent MDs.
        </t>
        <t>
          The bundle MD lists one payload type.
        </t>
      </list>
    </t>

    <t>
      This proposal uses a distinct proto value that does not use
      payload type numbers.
    </t>

  </section>

  <section title="Relationship of Payload Types of Constituent Media
                  Descriptions">

    <t>
      What is the relationship between the payload types of the constituent MDs?
      <list style="symbols">
        <t>
          There are not multiple media descriptions because constituent MDs
          are combined.
        </t>
        <t>
          Different constituent MDs may have overlapping payload type numbers.
        </t>
        <t>
          Different constituent MDs may not have overlapping payload
          type numbers.
        </t>
      </list>
    </t>

    <t>
      This proposal requires constituent MDs to use distinct payload
      types in order to demultiplex the constituent MDs.
    </t>

  </section>

  <section title="Basis of Demultiplexing">

    <t>
      What is the basis for the demultiplexing of RTP?
      <list style="symbols">
        <t>
          Demultiplexing is not done because incoming RTP is not
          attributed to specific constituent MDs (possibly because
          constituent MDs are combined).
        </t>
        <t>
          Demultiplexing is done based on payload type numbers.
        </t>
        <t>
          Demultiplexing is done based on data carried in an encapsulation.
        </t>
      </list>
    </t>

    <t>
      This proposal does demultiplexing based on information in the
      encapsulated payload format.
    </t>

  </section>

  <section title="Basis of Rejection of the Bundle MD">

    <t>
      We must ensure that the bundle MD is rejected by non-supporting
      endpoints.  What method is used to ensure rejection?
      <list style="symbols">
        <t>
          There is no bundle MD.
        </t>
        <t>
          The bundle MD uses a special media type value.
        </t>
        <t>
          The bundle MD uses a special proto value.
        </t>
        <t>
          The bundle MD uses (only) a special codec name.
        </t>
      </list>
    </t>

    <t>
      This proposal uses a distinct proto type in the bundle media
      description to ensure that answerers that do not implement
      bundling reject this MD.
    </t>

  </section>

  <section title="How Constituent MDs Are Offered" anchor="offer-details">

    <t>
      There are a number of alternative ways that the offerer can
      configure the constituent media descriptions.
    </t>

    <texttable>
      <ttcol align="left">Method</ttcol>
      <ttcol align="left">1</ttcol>
      <ttcol align="left">2</ttcol>
      <ttcol align="left">3</ttcol>
      <ttcol align="left">4</ttcol>
      <ttcol align="left">5</ttcol>
      <ttcol align="left">6</ttcol>
      <ttcol align="left">7</ttcol>
      <ttcol align="left">8</ttcol>
      <c>Coded in chart as</c><c>NA,ZP</c><c>NA,NZP</c><c>RA,ZP</c><c>RA,NZP,U</c><c>RA,NZP,U</c><c>RA,NZP,U</c><c>RA,NZP,U</c><c>RA,NZP,S</c>
      <c>Offered address</c><c>null</c><c>null</c><c>real</c><c>real</c><c>real</c><c>real</c><c>real</c><c>real</c>
      <c>Offered port</c><c>zero</c><c>non-zero</c><c>zero</c><c>non-zero, unique</c><c>non-zero, unique</c><c>non-zero, unique</c><c>non-zero, unique</c><c>non-zero, shared</c>
      <c>TURN candidates?</c><c>N/A</c><c>N/A</c><c>N/A</c><c>no</c><c>yes</c><c>no</c><c>yes</c><c>yes</c>
      <c>Supporting answerer accepts?</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c><c>no</c><c>no</c><c>yes</c>
      <c>Update needed for supporting answerer?</c><c>no</c><c>no</c><c>possibly</c><c>yes</c><c>yes</c><c>no</c><c>no</c><c>no</c>
      <c>Non-supporting answerer accepts?</c><c>no</c><c>probably</c><c>no</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c>
      <c>Update needed for non-supporting answerer?</c><c>yes</c><c>yes</c><c>yes</c><c>yes</c><c>no</c><c>yes</c><c>no</c><c>no</c>
      <c>Disadvantages</c><c>ACE</c><c>CD</c><c>ABCE</c><c>BC</c><c>BG</c><c>C</c><c>G</c><c>BFG</c>
    </texttable>

    <t>
      <list style="hanging">
        <t hangText="Offered address">
          This is the address offered for the MD.  There are two
          choices, a null address (0.0.0.0 for IPv4 or "invalid." for
          IPv6 or mixed IPv4/IPv6) or a real address of
          the offerer.
        </t>
        <t hangText="Offered port">
          This is the port that is offered.  It can be either non-zero
          or zero (which indicates a stream that is not being offered).
          If the offered port is non-zero and the offered address is
          real, the port can be either unique, or shared with the other
          media descriptions in the bundle.
        </t>
        <t hangText="TURN candidates?">
          If the offered address is real and the offered port is
          non-zero, are TURN candidates for the address provided (if
          they are needed)?
        </t>
        <t hangText="Supporting answerer accepts?">
          If the answerer supports bundling, does it accept the
          constituent media description (with a non-zero port in the
          answer)?  If not, the answerer must have some other method
          of indicating acceptance of the constituent of the bundle.
        </t>
        <t hangText="Update needed for supporting answerer?">
          Is an SDP update needed to complete session setup if the
          answerer supports bundling?  If an update is needed, it is
          needed to inform intermediaries that there will be no media
          sent based on the connection information in this media
          description; the update is not needed to establish
          communications and does not delay the application.
        </t>
        <t hangText="Non-supporting answerer accepts?">
          If the answerer does not support bundling, does it accept this media
          description (without a further update)?
        </t>
        <t hangText="Update needed for non-supporting answerer?">
          Is an SDP update needed to complete session setup if the
          answerer does not support bundling?  If an update is needed,
          in all cases, it is needed to establish communication.
        </t>
        <t hangText="Flaws">
          The disadvantages of each alternative:
          <list style="hanging">
            <t hangText="A">
              Media descriptions that are rejected (have zero ports) are
              not allowed to be members of a group (in the
              offer).<xref target="RFC5888"/>
            </t>
            <t hangText="B">
              An SDP update is needed for a supporting answerer to prevent
              intermediaries from timing out the multimedia session.
            </t>
            <t hangText="C">
              An SDP update is needed for a non-supporting answerer to 
              establish communications.
            </t>
            <t hangText="D">
              Although a media description with a non-zero port but a
              null address is formally offered (although shown as
              on-hold via the old method), it is possible that the
              answerer will not consider it to be offered and many not
              accept it even if it otherwise wood.
            </t>
            <t hangText="E">
              If the offered port is zero, the media description is not
              formally offered and the answerer should not accept it.
            </t>
            <t hangText="F">
              SDP offers with multiple media descriptions that use the
              same port number (for the same real address) may be
              rejected by intermediaries.
            </t>
            <t hangText="G">
              A TURN relay must be allocated for the constituent media
              description before the offer is sent.
            </t>
          </list>
        </t>
      </list>
    </t>

    <t>
      In my estimation, the worst disadvantages are A (zero port in
      offer), E (acceptance of offer with zero port), and F (duplicate
      port numbers), because they involve violations of <xref
      target="RFC4566"/> or are known to trigger limitations of large
      numbers of intermediate devices.  Disadvantage D (offering a MD
      with a null address) is nearly as severe, as we expect it to
      cause undesired behavior in many non-supporting answerers.
      Disadvantages C (update
      needed to communicate with non-supporting answerer) and G (TURN
      relay must be preallocated) are moderate, and disadvantage B
      (updated needed to prevent intermediaries from timing out) is the
      least severe (because it never delays the establishment of
      communication).
    </t>

    <t>
      Applying these priorities to the possible solutions, methods 6
      and 7 (offer real address, non-zero unique port, with/without
      TURN candidates, answer has zero port for constituent MDs) are
      tied for the best choices, with the choice made based on the
      relative importance of minimizing preallocation of TURN relays
      compared to quickly establishing communication with
      non-supporting answerers.
    </t>

  </section>

</section>

<section title="Demultiplexing Considerations" anchor="demux">

  <t>
    This section discusses the constraints regarding demultiplexing
    datagrams from multiple protocols that are presented on one
    transport flow.  This is an expansion of the analysis in <xref
    target="RFC5764"/> section 5.1.2.
  </t>

  <t>
    The first octets of datagrams generated by particular protocols
    are:
  </t>

  <texttable>
    <ttcol align="left">Protocol</ttcol>
    <ttcol align="left">First octet</ttcol>
    <ttcol align="left">Second octet</ttcol>
    <ttcol align="left">Third octet</ttcol>
    <ttcol align="left">Fourth octet</ttcol>
    <c>STUN</c><c>0x00, 0x01</c><c>0x00, 0x01</c><c></c><c></c>
    <c>RTP</c><c>0x80 to 0xBF</c><c>0x00 to 0xC7, 0xCD to 0xFF</c><c></c><c></c>
    <c>RTCP</c><c>0x80 to 0xBF</c><c>0xC8 to 0xCC</c><c></c><c></c>
    <c>RTP/RTCPv3</c><c>0xC0 to 0xFF</c><c></c><c></c><c></c>
    <c>DTLS</c><c>0x14 to 0x17</c><c>0x03</c><c>0x03</c><c></c>
    <c>SCTP</c><c>source port high</c><c>source port
    low</c><c>dest. port high</c><c>dest. port low</c>
  </texttable>

  <t>
    TBD RFC 5764 specifies that the first octet of a DTLS packet is in
    the range 0x14 to 0x3F.  RFC 5246 and RFC 6374 together specify
    the first octet is a "ContentType", with the range 0x14 to 0x17.
    Are additional octet values reserved for expansion?  What is the
    range that should be reserved in practice?
  </t>

  <t>
    The most generalized stack of protocols we consider is this:
  </t>

  <figure>
    <artwork>
Layer 6:  ... application interfaces ...
           |||      |||     |||     |||
            V        V       V       V
            |        |       |       |
            |        |       |       |
Layer 5:    |        |       |      SCTP
            |        |       |       |
            |        |       |       |
           RTP     SRTP      |       |
Layer 4:   RTCP    SRTCP    SCTP    DTLS   [ STUN ]
             \       |       |       |        /
              --------------- ----------------
                             V
                             |
                             |
Layer 3:              [ encapsulation      STUN ]  
                      [      \              /   ]
                      [       ---- ---------    ]
                      [           V             ]
                                  |
                                  |
Layer 2:                       [ DTLS               STUN ]  
                               [   \                 /   ]
                               [    ------- ---------    ]
                               [           V             ]
                                           |
                                           |
Layer 1:                                [ TURN ]
                                           |
                                           |
Layer 0:                                  UDP
    </artwork>
  </figure>

  <t>
    <list style="hanging">
      <t hangText="Layer 0:  UDP">
        This is the base layer of this analysis, where
        packets are carried by UDP.
      </t>
      <t hangText="Layer 1:  TURN (optional)">
        If a packet arrives from a TURN relay for which we
        are a client, the TURN encapsulation must be removed before
        further processing.  This need can be detected because the packet
        arrives from the client-facing address/port of a TURN server of
        which this entity is a client.
      </t>
      <t hangText="Layer 2:  DTLS applied to the bundle transport flow
                   (optional)">
        If DTLS is applied to the bundle transport flow as a whole,
        that use of DTLS will have been negotiated.  However, before
        deciphering, STUN packets need to be separated.  STUN packets
        can be distinguished from DTLS packets by their first or
        second octets.
      </t>
      <t hangText="Layer 3:  Decapsulation (depending on the bundling method">
        If the bundling method uses encapsulation, decapsulation is
        done at this point in the protocol stack.  However, before
        decapsulating, STUN packets need to be separated.  The
        encapsulation method must allow encapsulated packets to be
        distinguished from STUN packets, if STUN packets have not been
        demultiplexed at layer 2 (due to DTLS encryption of
        the entire transport stream).
        <vspace blankLines="1"/>
        All proposed encapsulation techniques ensure the first octet
        of the encapsulation is in the range allowed for the first
        octet of RTP, 0x80 to 0xBF, and thus is distinguishable from STUN.
      </t>
      <t hangText="Layer 4:  Core demultiplexing">
        At this layer, most of the protocols are demultiplexed.
        RTP/SRTP, SRTP/SRTCP, DTLS, and STUN are distinguished by the
        values of the first two octets of the packet.
        SRTP/SRTCP is distinguished from RTP/RTCP by negotiation with
        the other endpoint -- SRTP/SRTCP is never multiplexed with
        RTP/RTCP.
        <vspace blankLines="1"/>
        SCTP can be distinguished from the other protocols if the
        other endpoint agrees to use only SCTP port numbers in the
        range 0x4000 to 0x7FFF.
        This restriction can be specified here, because this
        limitation is only needed when bundling is implemented, which
        happens only when when both endpoints support bundling.
        (This particular range is chosen to avoid collision with a
        future RTP/RTCP version 3.  The range of SCTP ports can be
        chosen arbitrarily because the SCTP ports are not used to
        route packets to this entity, as they are encapsulated in UDP.)
      </t>
      <t hangText="Layer 5:  SCTP over DTLS">
        If the layer 4 protocol is DTLS, the protocol above it will
        always be SCTP.
      </t>
      <t hangText="Layer 6:  Application interface demultiplexing">
        The method used to demultiplex the various application
        interface streams varies depending whether encapsulation is
        used and if not, on the layer 4/5 protocol.
        If the layer 4 protocol is encapsulated, the encapsulation
        determines which constituent media description is to be assigned
        to this packet, and then application demultiplexing is done as
        normal for for that particular media description.
        Otherwise, the constituent media description must be
        determined by a method that is specific to the layer 4/5 protocol:
        <list style="hanging">
          <t hangText="RTP/SRTP">
            An RTP/SRTP packet is assigned to the constituent media
            description which specifies its payload type number.
            (If encapsulation is not used, the constituent media
            descriptions must specify distinct payload type numbers.)
          </t>
          <t hangText="RTCP/SRTCP">
            An RTCP/SRTCP sub-packet is dispatched to the application
            which receives the RTP media stream containing the SSRC that is
            carried in the RTCP sub-packet.
          </t>
          <t hangText="SCTP">
            An SCTP packet is assigned to the constituent media
            description which specifies its destination port number.
            (If encapsulation is not used, the constituent media
            descriptions must specify distinct SCTP port numbers.)
          </t>
        </list>
      </t>
    </list>
  </t>

</section>

<section title="Security Considerations" anchor="security">

<t>
  If an SBC wishes to prevent positively the transport of certain
  media types or codecs, and enforces that by examining the content of
  RTP packets, the use of kumquat encoding may defeat the examination.
</t>

<t>
  TBD
</t>

</section>

<section title="IANA Considerations" anchor="IANA">

<t>
  TBD
</t>

</section>

<section title="Acknowledgments" anchor="ack">

<t>
  Many people have provided input for this proposal regarding
  both the
  technical aspects and the organization of the presentation.
  Chief among them are the authors of the predecessor proposals
  (<xref target="I-D.alvestrand-one-rtp"/> (TOGETHER),
  <xref target="I-D.holmberg-mmusic-sdp-mmt-negotiation"/> (MMT),
  and <xref target="I-D.ietf-mmusic-sdp-bundle-negotiation"/> (BUNDLE)):
  Harald Alvestrand, Jonathan Lennox, and Christer Holmberg.
  In addition, input was provided by 
  Charles Eckel,
  Andrew Hutton,
  Cullen Jennings,
  Hadriel Kaplan,
  Paul Kyzivat,
  Adam Roach, and
  Robert Sparks.
</t>

<t>
</t>

</section>

<section title="Revision History" anchor="revision">

  <t>
    Note to RFC Editor:  Please remove this section before publication.
  </t>

  <section title="draft-worley-sdp-bundle-00" anchor="change-00">

    <t>
      Initial version.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-00 to draft-worley-sdp-bundle-01" anchor="change-00-01">

    <t>
      Thoroughly revise the text and structure of the document.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-01 to draft-worley-sdp-bundle-02" anchor="change-01-02">

    <t>
      Heavily revise Terminology regarding media flows.
    </t>

    <t>
      Revise Desiderata, including adding that multiple separate bundles
      must be possible, and noninterference with ICE negotiation.
    </t>

    <t>
      Add section on ICE considerations.
    </t>

    <t>
      Change "fusion" to "bundle".
    </t>

    <t>
      Use a=rtcp-mux in examples to be more realistic (and to shorten
      the examples).
    </t>

    <t>
      Correct the use of ICE in answers; ICE candidates are not
      provided if an offered MD does not contain ICE candidates.
    </t>

    <t>
      Add an example of a fast-start offer.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-02 to draft-worley-sdp-bundle-03" anchor="change-02-03">
    
    <t>
      Add design comparison <xref target="comparison"/>.
    </t>

    <t>
      Use bibxml references.
    </t>

    <t>
      Add DES C9, regarding continued usage of transcoding facilities
      offered by intermediate entities.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-03 to draft-worley-sdp-bundle-04" anchor="change-03-04">
    
    <t>
      Add demultiplexing considerations <xref target="demux"/>.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-04 to draft-worley-sdp-bundle-05" anchor="change-04-05">
    
    <t>
      Change recommendation for SCTP port numbers from 0xC000-0xFFFF
      to 0x4000-0x7FFF to avoid collision with a future RTP/RTCP version 3.
    </t>

    <t>
      Add the transport flow index to the KUMQUAT encapsulation.
    </t>

    <t>
      Add section on choices for offering constituent MDs
      <xref target="offer-details"/>.
      Revise the examples to show offering "real address, non-zero port, no
      ICE candidates".
    </t>

    <t>
      Add note to DES C9 (support intermediate transcoding facilities)
      saying that intermediate transcoding facilities are not expected
      to be very useful, given that encryption will be the normal use
      case.
    </t>

    <t>
      Add an example<xref target="sctp-example"/> with SCTP MDs.
    </t>

    <t>
      Add a section for encryption considerations.<xref target="encryption"/>
    </t>

    <t>
      Revise generalized demultiplexing diagram to make explicit the
      optional RTP encapsulation layer.
    </t>

    <t>
      Update comparison chart<xref target="comparison"/> for
      draft-ejzak-mmusic-bundle-alternatives-01<xref
      target="I-D.ejzak-mmusic-bundle-alternatives"/> and
      draft-westerlund-avtcore-transport-multiplexing-05<xref
      target="I-D.westerlund-avtcore-transport-multiplexing"/>.
    </t>

    <t>
      Update comparison chart<xref target="comparison"/> to discuss
      alternative address/port/candidate policies for offering
      constituent MDs.
    </t>

  </section>

  <section title="Changes from draft-worley-sdp-bundle-05 to draft-worley-sdp-bundle-06" anchor="change-05-06">
    
    <t>
      Add desideratum that we want the RTP media to be visible on the
      wire as SRTP.
    </t>

    <t>
      Remove the encapsulation.
    </t>

    <t>
      Change acceptance-within-bundle in an answer to use a zero port
      number with a=bundleaccept attribute.  Revise the the table
      <xref target="offer-details"/> to include this method.
    </t>

    <t>
      Change c= lines in examples to use host names, which is what
      would be done in a dual-stack environment.  (ICE candidates
      carry the actual addresses used.)
    </t>

    <t>
      Add TURN ICE candidates to the examples with ICE candidates, as
      described by the existing text.
    </t>

  </section>

</section>

</middle>

<back>

<references title="Normative References">

  &rfc2119;
  &rfc3264;
  &rfc3550;
  &rfc4566;
  &rfc5245;
  &rfc5888;

</references>

<references title="Informative References">

  &rfc2327;
  &rfc3725;
  &rfc4796;
  &rfc4960;
  &rfc5761;
  &rfc5764;
  &draft-alvestrand-mmusic-msid;
  &draft-alvestrand-one-rtp;
  &draft-ejzak-mmusic-bundle-alternatives;
  &draft-holmberg-mmusic-sdp-mmt-negotiation;
  &draft-ietf-avtcore-multi-media-rtp-session;
  &draft-ietf-mmusic-sdp-bundle-negotiation;
  &draft-jennings-mmusic-media-req;
  &draft-roach-mmusic-mlines;
  &draft-westerlund-avtcore-transport-multiplexing;
  &draft-worley-service-example;

</references>

</back>

</rfc>
