<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" consensus="true" docName="draft-ietf-bfcpbis-bfcp-websocket-15" indexInclude="true" ipr="trust200902" number="8857" prepTime="2021-01-18T22:45:44" scripts="Common,Latin" sortRefs="true" submissionType="IETF" symRefs="true" tocDepth="4" tocInclude="true" xml:lang="en">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-bfcpbis-bfcp-websocket-15" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc8857" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="WebSocket as a Transport for BFCP">The WebSocket Protocol as a Transport for the Binary Floor Control Protocol (BFCP)</title>
    <seriesInfo name="RFC" value="8857" stream="IETF"/>
    <author fullname="Victor Pascual" initials="V." surname="Pascual">
      <organization showOnFrontPage="true">Nokia</organization>
      <address>
        <postal>
          <city>Barcelona</city>
          <country>Spain</country>
        </postal>
        <email>victor.pascual_avila@nokia.com</email>
      </address>
    </author>
    <author fullname="Antón Román" initials="A." surname="Román">
      <organization showOnFrontPage="true">Quobis</organization>
      <address>
        <postal>
          <extaddr>Pol. Ind. A Granxa, Casa de Pedra</extaddr>
          <city>O Porriño</city>
          <code>36475</code>
          <country>Spain</country>
        </postal>
        <email>anton.roman@quobis.com</email>
      </address>
    </author>
    <author fullname="Stéphane Cazeaux" initials="S." surname="Cazeaux">
      <organization showOnFrontPage="true">Orange</organization>
      <address>
        <postal>
          <street>42 rue des Coutures</street>
          <city>Caen</city>
          <code>14000</code>
          <country>France</country>
        </postal>
        <email>stephane.cazeaux@orange.com</email>
      </address>
    </author>
    <author fullname="Gonzalo Salgueiro" initials="G." surname="Salgueiro">
      <organization abbrev="Cisco" showOnFrontPage="true">Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <street>7200-12 Kit Creek Road</street>
          <city>Research Triangle Park</city>
          <region>NC</region>
          <code>27709</code>
          <country>US</country>
        </postal>
        <email>gsalguei@cisco.com</email>
      </address>
    </author>
    <author initials="R." surname="Ravindranath" fullname="Ram Mohan Ravindranath">
      <organization abbrev="Cisco" showOnFrontPage="true">Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <extaddr>Cessna Business Park</extaddr>
          <extaddr>Kadabeesanahalli Village, Varthur Hobli,</extaddr>
          <street>Sarjapur-Marathahalli Outer Ring Road</street>
          <city>Bangalore</city>
          <region>Karnataka</region>
          <code>560103</code>
          <country>India</country>
        </postal>
        <email>rmohanr@cisco.com</email>
      </address>
    </author>
    <date month="01" year="2021"/>
    <area>IETF</area>
    <workgroup>BFCPBIS Working Group</workgroup>
    <keyword>BFCP</keyword>
    <keyword>WebSocket</keyword>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1"> The WebSocket protocol enables two-way real-time communication
      between clients and servers. This document specifies the use of Binary Floor
       Control Protocol (BFCP) as a new WebSocket subprotocol enabling a reliable 
       transport mechanism between BFCP entities in new scenarios. </t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            This document is a product of the Internet Engineering Task Force
            (IETF).  It represents the consensus of the IETF community.  It has
            received public review and has been approved for publication by
            the Internet Engineering Steering Group (IESG).  Further
            information on Internet Standards is available in Section 2 of 
            RFC 7841.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc8857" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2021 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Simplified BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Simplified BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-terminology">Terminology</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.2.2">
              <li pn="section-toc.1-1.2.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.2.2.1.1"><xref derivedContent="2.1" format="counter" sectionFormat="of" target="section-2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-definitions">Definitions</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-the-websocket-protocol">The WebSocket Protocol</xref></t>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-the-websocket-bfcp-subproto">The WebSocket BFCP Subprotocol</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2">
              <li pn="section-toc.1-1.4.2.1">
                <t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent="4.1" format="counter" sectionFormat="of" target="section-4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-handshake">Handshake</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.2">
                <t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent="4.2" format="counter" sectionFormat="of" target="section-4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-bfcp-encoding">BFCP Encoding</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-transport-reliability">Transport Reliability</xref></t>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdp-considerations">SDP Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2">
              <li pn="section-toc.1-1.6.2.1">
                <t indent="0" pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" format="counter" sectionFormat="of" target="section-6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-transport-negotiation">Transport Negotiation</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.2">
                <t indent="0" pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" format="counter" sectionFormat="of" target="section-6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdp-media-attributes">SDP Media Attributes</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdp-offer-answer-procedures">SDP Offer/Answer Procedures</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2">
              <li pn="section-toc.1-1.7.2.1">
                <t indent="0" pn="section-toc.1-1.7.2.1.1"><xref derivedContent="7.1" format="counter" sectionFormat="of" target="section-7.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-general">General</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.2">
                <t indent="0" pn="section-toc.1-1.7.2.2.1"><xref derivedContent="7.2" format="counter" sectionFormat="of" target="section-7.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-usage-of-websocket-">Example Usage of 'websocket-uri' SDP Attribute</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-authentication">Authentication</xref></t>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter" sectionFormat="of" target="section-9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.10">
            <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" format="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.10.2">
              <li pn="section-toc.1-1.10.2.1">
                <t indent="0" pn="section-toc.1-1.10.2.1.1"><xref derivedContent="10.1" format="counter" sectionFormat="of" target="section-10.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-registration-of-the-websock">Registration of the WebSocket BFCP Subprotocol</xref></t>
              </li>
              <li pn="section-toc.1-1.10.2.2">
                <t indent="0" pn="section-toc.1-1.10.2.2.1"><xref derivedContent="10.2" format="counter" sectionFormat="of" target="section-10.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-registration-of-the-tcp-ws-">Registration of the 'TCP/WS/BFCP' and 'TCP/WSS/BFCP' SDP "proto" Values</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.11">
            <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="11" format="counter" sectionFormat="of" target="section-11"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.11.2">
              <li pn="section-toc.1-1.11.2.1">
                <t indent="0" pn="section-toc.1-1.11.2.1.1"><xref derivedContent="11.1" format="counter" sectionFormat="of" target="section-11.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.11.2.2">
                <t indent="0" pn="section-toc.1-1.11.2.2.1"><xref derivedContent="11.2" format="counter" sectionFormat="of" target="section-11.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.12">
            <t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.a"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgements</xref></t>
          </li>
          <li pn="section-toc.1-1.13">
            <t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.b"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="include" removeInRFC="false" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">The WebSocket (WS) protocol <xref target="RFC6455" format="default" sectionFormat="of" derivedContent="RFC6455"/> enables
      two-way message exchange between clients and servers on top of a
      persistent TCP connection, optionally secured with Transport Layer Security (TLS) 
      <xref target="RFC8446" format="default" sectionFormat="of" derivedContent="RFC8446"/>. The initial protocol handshake makes use of
      Hypertext Transfer Protocol (HTTP) <xref target="RFC7230" format="default" sectionFormat="of" derivedContent="RFC7230"/> semantics, allowing the WebSocket
      protocol to reuse existing HTTP infrastructure.</t>
      <t indent="0" pn="section-1-2">The Binary Floor Control Protocol (BFCP) is a protocol to
      coordinate access to shared resources in a conference. It is
      defined in <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/> and is
      used between floor participants and floor control servers, and
      between floor chairs (i.e., moderators) and floor control
      servers.</t>
      <t indent="0" pn="section-1-3">Modern web browsers include a WebSocket client stack
      complying with the WebSocket API <xref target="WS-API" format="default" sectionFormat="of" derivedContent="WS-API"/> as
      specified by the W3C. It is expected that other client
      applications (those running in personal computers and devices
      such as smartphones) will also make a WebSocket client stack
      available. This document extends the applicability of 
      <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/> and 
      <xref target="RFC8856" format="default" sectionFormat="of" derivedContent="RFC8856"/> to enable the
      usage of BFCP in these scenarios.</t>
      <t indent="0" pn="section-1-4">The transport over which BFCP entities exchange messages
      depends on how the clients obtain information to contact the
      floor control server (e.g., using a Session Description Protocol (SDP)
      offer/answer exchange per <xref target="RFC8856" format="default" sectionFormat="of" derivedContent="RFC8856"/> or the
      procedure described in RFC 5018 <xref target="RFC5018" format="default" sectionFormat="of" derivedContent="RFC5018"/>). 
      <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/> defines two transports
      for BFCP: TCP and UDP. This specification defines a new
      WebSocket subprotocol (as defined in 
      <xref target="RFC6455" section="1.9" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc6455#section-1.9" derivedContent="RFC6455"/>) for transporting BFCP messages between a
      WebSocket client and server. This subprotocol provides a reliable and 
      boundary-preserving transport for BFCP when run on top of TCP. Since WebSocket provides 
      a reliable transport, the extensions defined in <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/> for sending BFCP over unreliable 
          transports are not applicable. </t>
    </section>
    <section anchor="terminology" numbered="true" toc="include" removeInRFC="false" pn="section-2">
      <name slugifiedName="name-terminology">Terminology</name>
      <t indent="0" pn="section-2-1">The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", 
      "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", 
      "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", 
      "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 
      in this document are to be interpreted as described in BCP 14
      <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, 
      they appear in all capitals, as shown here.</t>
      <section anchor="definitions" numbered="true" toc="include" removeInRFC="false" pn="section-2.1">
        <name slugifiedName="name-definitions">Definitions</name>
        <dl newline="false" spacing="normal" indent="6" pn="section-2.1-1">
          <dt pn="section-2.1-1.1">BFCP WebSocket Client:</dt>
          <dd pn="section-2.1-1.2">Any BFCP entity capable
            of opening outbound connections to WebSocket servers and
            communicating using the WebSocket BFCP subprotocol as
            defined by this document.</dd>
          <dt pn="section-2.1-1.3">BFCP WebSocket Server:</dt>
          <dd pn="section-2.1-1.4">Any BFCP entity capable
            of listening for inbound connections from WebSocket
            clients and communicating using the WebSocket BFCP
            subprotocol as defined by this document.</dd>
        </dl>
      </section>
    </section>
    <section anchor="the_websocket_protocol" numbered="true" toc="include" removeInRFC="false" pn="section-3">
      <name slugifiedName="name-the-websocket-protocol">The WebSocket Protocol</name>
      <t indent="0" pn="section-3-1">The WebSocket protocol <xref target="RFC6455" format="default" sectionFormat="of" derivedContent="RFC6455"/> is a
      transport layer on top of TCP (optionally secured with 
      TLS <xref target="RFC8446" format="default" sectionFormat="of" derivedContent="RFC8446"/>) in which both client and server exchange
      message units in both directions. The protocol defines a
      connection handshake, WebSocket subprotocol and extensions
      negotiation, a frame format for sending application and control
      data, a masking mechanism, and status codes for indicating
      disconnection causes.</t>
      <t indent="0" pn="section-3-2">The WebSocket connection handshake is based on 
      HTTP <xref target="RFC7230" format="default" sectionFormat="of" derivedContent="RFC7230"/> and utilizes the HTTP GET method with an
      Upgrade header field. This is sent by the client and then answered
      by the server (if the negotiation succeeded) with an HTTP 101
      status code. Once the handshake is completed, the connection
      upgrades from HTTP to the WebSocket protocol. This handshake
      procedure is designed to reuse the existing HTTP infrastructure.
      During the connection handshake, the client and server agree on the
      application protocol to use on top of the WebSocket transport.
      Such an application protocol (also known as a "WebSocket
      subprotocol") defines the format and semantics of the messages
      exchanged by the endpoints. This could be a custom protocol or a
      standardized one (as the WebSocket BFCP subprotocol defined in
      this document). Once the HTTP 101 response is processed, both
      the client and server reuse the underlying TCP connection for
      sending WebSocket messages and control frames to each other.
      Unlike plain HTTP, this connection is persistent and can be used
      for multiple message exchanges.</t>
      <t indent="0" pn="section-3-3">The WebSocket protocol defines message units to be used by
      applications for the exchange of data, so it provides a message
      boundary-preserving transport layer.</t>
    </section>
    <section anchor="the_websocket_bfcp_subprotocol" numbered="true" toc="include" removeInRFC="false" pn="section-4">
      <name slugifiedName="name-the-websocket-bfcp-subproto">The WebSocket BFCP Subprotocol</name>
      <t indent="0" pn="section-4-1">The term WebSocket subprotocol refers to an
      application-level protocol layered on top of a WebSocket
      connection. This document specifies the WebSocket BFCP
      subprotocol for carrying BFCP messages over a WebSocket
      connection.</t>
      <section anchor="handshake" numbered="true" toc="include" removeInRFC="false" pn="section-4.1">
        <name slugifiedName="name-handshake">Handshake</name>
        <t indent="0" pn="section-4.1-1">The BFCP WebSocket client and BFCP WebSocket server
        negotiate usage of the WebSocket BFCP subprotocol during the
        WebSocket handshake procedure as defined in 
        <xref target="RFC6455" section="1.3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc6455#section-1.3" derivedContent="RFC6455"/>. 
        The client <bcp14>MUST</bcp14> include the value
        "bfcp" in the Sec-WebSocket-Protocol header field in its handshake
        request. The 101 reply from the server <bcp14>MUST</bcp14> contain "bfcp" in
        its corresponding Sec-WebSocket-Protocol header field.</t>
        <t indent="0" pn="section-4.1-2">Below is an example of a WebSocket handshake in which the
        client requests the WebSocket BFCP subprotocol support from
        the server:</t>
        <artwork name="" type="" align="left" alt="" pn="section-4.1-3">
  GET / HTTP/1.1
  Host: bfcp-ws.example.com
  Upgrade: websocket
  Connection: Upgrade
  Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
  Origin: http://www.example.com
  Sec-WebSocket-Protocol: bfcp 
  Sec-WebSocket-Version: 13
</artwork>
        <t indent="0" pn="section-4.1-4">The handshake response from the server accepting the
        WebSocket BFCP subprotocol would look as follows:</t>
        <artwork name="" type="" align="left" alt="" pn="section-4.1-5">
  HTTP/1.1 101 Switching Protocols
  Upgrade: websocket
  Connection: Upgrade
  Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
  Sec-WebSocket-Protocol: bfcp
</artwork>
        <t indent="0" pn="section-4.1-6">Once the negotiation has been completed, the WebSocket
        connection is established and can be used for the transport of
        BFCP messages. </t>
      </section>
      <section anchor="bfcp_encoding" numbered="true" toc="include" removeInRFC="false" pn="section-4.2">
        <name slugifiedName="name-bfcp-encoding">BFCP Encoding</name>
        <t indent="0" pn="section-4.2-1">BFCP messages use a TLV (Type-Length-Value) binary
        encoding, therefore BFCP WebSocket clients and BFCP WebSocket
        servers <bcp14>MUST</bcp14> be transported in unfragmented binary WebSocket
        frames (FIN: 1, opcode: %x2) to exchange BFCP messages. The
        WebSocket frame data <bcp14>MUST</bcp14> be a valid BFCP message, so the
        length of the payload of the WebSocket frame <bcp14>MUST</bcp14> be lower
        than the maximum size allowed (2<sup>16</sup> +12 bytes) for a BFCP
        message as described in <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/>. In addition, the
        encoding rules for reliable protocols defined in <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/>
          <bcp14>MUST</bcp14> be followed.</t>
        <t indent="0" pn="section-4.2-2">While this specification assumes that BFCP encoding is only TLV binary, 
          future documents may define other mechanisms, like JSON serialization. 
         If encoding changes, a new subprotocol identifier would need to be selected.</t>
        <t indent="0" pn="section-4.2-3">Each BFCP message <bcp14>MUST</bcp14> be carried within a single WebSocket
      message, and a WebSocket message <bcp14>MUST NOT</bcp14> contain more than one
      BFCP message.</t>
      </section>
    </section>
    <section anchor="bfcp_websocket_transport" numbered="true" toc="include" removeInRFC="false" pn="section-5">
      <name slugifiedName="name-transport-reliability">Transport Reliability</name>
      <t indent="0" pn="section-5-1">The WebSocket protocol <xref target="RFC6455" format="default" sectionFormat="of" derivedContent="RFC6455"/> provides a reliable transport, and
      therefore the BFCP WebSocket subprotocol defined by this
      document also provides reliable BFCP transport. Thus, client and server
      transactions using the WebSocket protocol for transport <bcp14>MUST</bcp14> follow the
      procedures for reliable transports as defined in <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/> 
      and <xref target="RFC8856" format="default" sectionFormat="of" derivedContent="RFC8856"/>.</t>
      <t indent="0" pn="section-5-2">BFCP WebSocket clients cannot receive incoming WebSocket
      connections initiated by any other peer. This means that a BFCP
      WebSocket client <bcp14>MUST</bcp14> actively initiate a connection towards a
      BFCP WebSocket server. The BFCP server will have a globally routable address
      and thus does not require ICE, as clients always initiate connections to it. </t>
    </section>
    <section anchor="sdp_con" numbered="true" toc="include" removeInRFC="false" pn="section-6">
      <name slugifiedName="name-sdp-considerations">SDP Considerations</name>
      <section anchor="updates_to_rfc_4583bis" numbered="true" toc="include" removeInRFC="false" pn="section-6.1">
        <name slugifiedName="name-transport-negotiation">Transport Negotiation</name>
        <t indent="0" pn="section-6.1-1">Rules to generate an "m=" line for a BFCP stream are described
      in <xref target="RFC8856" section="4" sectionFormat="comma" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8856#section-4" derivedContent="RFC8856"/>.</t>
        <t indent="0" pn="section-6.1-2">New values are defined for the SDP "proto" field: 'TCP/WS/BFCP'
      and 'TCP/WSS/BFCP'. </t>
        <ul empty="true" spacing="normal" bare="false" indent="3" pn="section-6.1-3">
          <li pn="section-6.1-3.1">'TCP/WS/BFCP' is used when BFCP runs on top of WS, which in
          turn runs on top of TCP.</li>
          <li pn="section-6.1-3.2">'TCP/WSS/BFCP' is used when BFCP runs on top of secure WebSocket (WSS), which
          in turn runs on top of TLS and TCP.</li>
        </ul>
        <t indent="0" pn="section-6.1-4">The "port" field is set following the rules in Section 
      <xref target="RFC8856" section="4" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8856#section-4" derivedContent="RFC8856"/> and Section 
      <xref target="RFC8856" section="7.1" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8856#section-7.1" derivedContent="RFC8856"/> 
      of <xref target="RFC8856" format="default" sectionFormat="of" derivedContent="RFC8856"/>. Depending on the value
      of the SDP 'setup' attribute defined in <xref target="RFC4145" format="default" sectionFormat="of" derivedContent="RFC4145"/>, 
      the "port" field contains the port to which the remote endpoint will 
      direct BFCP messages, or it is irrelevant (i.e., the endpoint will initiate the connection
      towards the remote endpoint) and should be set to a value of '9',
      which is the discard port. The 'connection' attribute and port <bcp14>MUST</bcp14>
      follow the rules of <xref target="RFC4145" format="default" sectionFormat="of" derivedContent="RFC4145"/>.</t>
        <t indent="0" pn="section-6.1-5">While this document recommends the use of secure  WebSocket (i.e., TCP/WSS) 
        for security reasons, TCP/WS is also permitted so as to achieve maximum 
        compatibility among clients.</t>
      </section>
      <section anchor="attribute" numbered="true" toc="include" removeInRFC="false" pn="section-6.2">
        <name slugifiedName="name-sdp-media-attributes">SDP Media Attributes</name>
        <t indent="0" pn="section-6.2-1"><xref target="RFC8124" format="default" sectionFormat="of" derivedContent="RFC8124"/> defines a new SDP attribute 
      to indicate the connection Uniform Resource Identifier (URI) for the WebSocket client. 
      The SDP attribute 'websocket-uri' defined in <xref target="RFC8124" section="3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8124#section-3" derivedContent="RFC8124"/>
          <bcp14>MUST</bcp14> be used when BFCP runs on top of WS or WSS. 
      When the 'websocket-uri' attribute is present in the media section of the SDP, 
      the procedures mentioned in <xref target="RFC8124" section="4" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8124#section-4" derivedContent="RFC8124"/>
          <bcp14>MUST</bcp14> be followed.</t>
      </section>
    </section>
    <section numbered="true" toc="include" removeInRFC="false" pn="section-7">
      <name slugifiedName="name-sdp-offer-answer-procedures">SDP Offer/Answer Procedures</name>
      <section anchor="general" numbered="true" toc="include" removeInRFC="false" pn="section-7.1">
        <name slugifiedName="name-general">General</name>
        <t indent="0" pn="section-7.1-1"> An endpoint (i.e., both the offerer and the answerer) <bcp14>MUST</bcp14> create an SDP media description ("m=" line) 
      for each BFCP-over-WebSocket media stream and <bcp14>MUST</bcp14> assign either a 'TCP/WSS/BFCP' or 'TCP/WS/BFCP' value to the 
      "proto" field of the "m=" line depending on whether the endpoint wishes to use secure WebSocket or WebSocket. 
      Furthermore, the server side, which could be either the offerer or answerer, <bcp14>MUST</bcp14> add a 'websocket-uri'
      attribute in the media section depending on whether it wishes to use WebSocket or secure WebSocket. This new 
      attribute <bcp14>MUST</bcp14> follow the syntax defined in <xref target="RFC8124" format="default" sectionFormat="of" derivedContent="RFC8124"/>. Additionally, 
      the SDP offer/answer procedures defined in <xref target="RFC8124" section="4" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8124#section-4" derivedContent="RFC8124"/> <bcp14>MUST</bcp14> 
      be followed for the "m=" line associated with a BFCP-over-WebSocket media stream.</t>
      </section>
      <section anchor="example" numbered="true" toc="include" removeInRFC="false" pn="section-7.2">
        <name slugifiedName="name-example-usage-of-websocket-">Example Usage of 'websocket-uri' SDP Attribute</name>
        <t indent="0" pn="section-7.2-1">The following is an example of an "m=" line for a BFCP connection. 
In this example, the offerer sends the SDP with the "proto" field having a 
value of 'TCP/WSS/BFCP', indicating that the offerer wishes to use secure 
WebSocket as a transport for the media stream, and the "fmt" field having 
a value of '*' (for details on the "fmt" field, see 
<xref target="RFC8856" section="4" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8856#section-4" derivedContent="RFC8856"/>).</t>
        <sourcecode type="sdp" markers="false" pn="section-7.2-2">
Offer (browser):
m=application 9 TCP/WSS/BFCP *
a=setup:active
a=connection:new
a=floorctrl:c-only
m=audio 55000 RTP/AVP 0
m=video 55002 RTP/AVP 31

Answer (server):
m=application 50000 TCP/WSS/BFCP *
a=setup:passive
a=connection:new
a=websocket-uri:wss://bfcp-ws.example.com?token=3170449312
a=floorctrl:s-only
a=confid:4321
a=userid:1234
a=floorid:1 m-stream:10
a=floorid:2 m-stream:11
m=audio 50002 RTP/AVP 0
a=label:10
m=video 50004 RTP/AVP 31
a=label:11
</sourcecode>
        <t indent="0" pn="section-7.2-3">
          It is possible that an endpoint (e.g., a browser) sends an offerless INVITE to the server. 
          In such cases, the server will act as SDP offerer. The server <bcp14>MUST</bcp14> assign the SDP 'setup' 
          attribute with a value of 'passive'. The server <bcp14>MUST</bcp14> have a 'websocket-uri' attribute 
          with a 'ws-URI' or 'wss-URI' value depending on whether the server wishes to use WebSocket or secure WebSocket. 
          This attribute <bcp14>MUST</bcp14> follow the syntax defined in 
          <xref target="RFC8124" section="3" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8124#section-3" derivedContent="RFC8124"/>. 
          For BFCP application, the "proto"  value in the "m=" line <bcp14>MUST</bcp14> be 'TCP/WSS/BFCP' if WebSocket is over TLS, 
          else it <bcp14>MUST</bcp14> be 'TCP/WS/BFCP'.
        </t>
      </section>
    </section>
    <section anchor="authentication" numbered="true" toc="include" removeInRFC="false" pn="section-8">
      <name slugifiedName="name-authentication">Authentication</name>
      <t indent="0" pn="section-8-1"><xref target="RFC8855" section="9" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8855#section-9" derivedContent="RFC8855"/>
      states that BFCP clients and floor control servers <bcp14>SHOULD</bcp14>
      authenticate each other prior to accepting messages, and
      RECOMMENDS that mutual TLS/DTLS authentication be used. However,
      browser-based WebSocket clients have no control over the use of
      TLS in the WebSocket API <xref target="WS-API" format="default" sectionFormat="of" derivedContent="WS-API"/>, so it is
      <bcp14>RECOMMENDED</bcp14> that standard web-based methods for client and
      server authentication are used, as follows.</t>
      <t indent="0" pn="section-8-2">When a BFCP WebSocket client connects to a BFCP WebSocket
      server, it <bcp14>SHOULD</bcp14> use TCP/WSS as its transport. If the signaling 
      or control protocol traffic used to set up the conference is authenticated 
      and confidentiality and integrity protected, secure WebSocket (WSS) <bcp14>MUST</bcp14> be used, 
      and the floor control server <bcp14>MUST</bcp14> authenticate the client. The WebSocket client 
      <bcp14>MUST</bcp14> follow the procedures in <xref target="RFC7525" format="default" sectionFormat="of" derivedContent="RFC7525"/> while setting up TLS 
      connection with the WebSocket server. 
      The BFCP client validates the server by means of verifying the server certificate. 
      This means the 'websocket-uri' value <bcp14>MUST</bcp14> contain a hostname. 
      The verification process does not use "a=fingerprint".</t>
      <t indent="0" pn="section-8-3">A floor control server that receives a message over TCP/WS
      can mandate the use of TCP/WSS by generating an Error message,
      as described in <xref target="RFC8855" section="13.8" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8855#section-13.8" derivedContent="RFC8855"/>, 
      with an error code with a value of 9 (Use TLS).</t>
      <t indent="0" pn="section-8-4">Prior to sending BFCP requests, a BFCP WebSocket client
      connects to a BFCP WebSocket server and performs the connection
      handshake. As described in <xref target="handshake" format="default" sectionFormat="of" derivedContent="Section 4.1"/>, the handshake procedure
      involves an HTTP GET method request from the client and a
      response from the server including an HTTP 101 status code.</t>
      <t indent="0" pn="section-8-5">In order to authorize the WebSocket connection, the BFCP
      WebSocket server <bcp14>SHOULD</bcp14> inspect any cookie header fields 
      <xref target="RFC6265" format="default" sectionFormat="of" derivedContent="RFC6265"/> present in the HTTP GET request. For many web
      applications, the value of such a cookie is provided by the web
      server once the user has authenticated themselves to the web
      server, which could be done by many existing mechanisms. As an
      alternative method, the BFCP WebSocket server could request HTTP
      authentication by replying to the client's GET method request
      with an HTTP 401 status code. The WebSocket protocol <xref target="RFC6455" format="default" sectionFormat="of" derivedContent="RFC6455"/> 
      covers this usage in Section <xref target="RFC6455" section="4.1" sectionFormat="bare" format="default" derivedLink="https://rfc-editor.org/rfc/rfc6455#section-4.1" derivedContent="RFC6455"/>: 
      </t>
      <ul empty="true" spacing="normal" bare="false" indent="3" pn="section-8-6">
        <li pn="section-8-6.1">If the status code received from the server is not 101,
          the WebSocket client stack handles the response per HTTP
          <xref target="RFC7230" format="default" sectionFormat="of" derivedContent="RFC7230"/> procedures; in particular, the
          client might perform authentication if it receives an 401
          status code.  The WebSocket clients are vulnerable to the attacks
         of basic authentication (mentioned in <xref target="RFC7617" section="4" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7617#section-4" derivedContent="RFC7617"/>) and
        digest authentication (mentioned in <xref target="RFC7616" section="5" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7616#section-5" derivedContent="RFC7616"/>). To overcome
        some of these weaknesses, WebSocket clients can use the 
        HTTP Origin-Bound Authentication (HOBA) mechanism mentioned in 
        <xref target="RFC7486" format="default" sectionFormat="of" derivedContent="RFC7486"/>, for example.</li>
      </ul>
    </section>
    <section anchor="security_considerations" numbered="true" toc="include" removeInRFC="false" pn="section-9">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-9-1">Considerations from <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/>, 
      <xref target="RFC8856" format="default" sectionFormat="of" derivedContent="RFC8856"/>, and <xref target="RFC5018" format="default" sectionFormat="of" derivedContent="RFC5018"/> apply.</t>
      <t indent="0" pn="section-9-2">BFCP relies on lower-layer security mechanisms to provide
      replay and integrity protection and confidentiality. It is
      <bcp14>RECOMMENDED</bcp14> that the BFCP traffic transported over WebSocket
      be protected by using a Secure WebSocket
      connection (using TLS <xref target="RFC8446" format="default" sectionFormat="of" derivedContent="RFC8446"/> over TCP). The security
      considerations in <xref target="RFC6455" format="default" sectionFormat="of" derivedContent="RFC6455"/> apply for BFCP over WebSocket as well.
      The security model here is a typical webserver-client model 
      where the client validates the server certificate and then connects to the server. 
      <xref target="authentication" format="default" sectionFormat="of" derivedContent="Section 8"/> describes the authentication procedures between client 
      and server.</t>
      <t indent="0" pn="section-9-3">When using BFCP over WebSocket, the security mechanisms defined in
    <xref target="RFC8855" format="default" sectionFormat="of" derivedContent="RFC8855"/> are not used. Instead, the 
    application is required to build and rely on the security mechanisms in <xref target="RFC6455" format="default" sectionFormat="of" derivedContent="RFC6455"/>.</t>
      <t indent="0" pn="section-9-4">The rest of this section analyses the threats described in 
      <xref target="RFC8855" section="14" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8855#section-14" derivedContent="RFC8855"/> when WebSocket is used as a transport 
      protocol for BFCP.</t>
      <t indent="0" pn="section-9-5">An attacker attempting to impersonate a floor control server is
      avoided by having servers accept BFCP messages over WSS
      only. As with any other web connection, the clients will verify the server's 
      certificate. The BFCP WebSocket client <bcp14>MUST</bcp14> follow the
      procedures in <xref target="RFC7525" format="default" sectionFormat="of" derivedContent="RFC7525"/> (including hostname verification as per 
      <xref target="RFC7525" section="6.1" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc7525#section-6.1" derivedContent="RFC7525"/>) while setting up a TLS connection with floor 
      control WebSocket server.</t>
      <t indent="0" pn="section-9-6">An attacker attempting to impersonate a floor control client is avoided by 
        having servers accept BFCP messages over WSS only. As described in 
        <xref target="RFC6455" section="10.5" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc6455#section-10.5" derivedContent="RFC6455"/> the floor control server can use 
        any client authentication mechanism and follow the steps in <xref target="authentication" format="default" sectionFormat="of" derivedContent="Section 8"/> 
        of this document.</t>
      <t indent="0" pn="section-9-7">Attackers may attempt to modify messages exchanged by a client and a 
      floor control server. This can be prevented by having WSS between client and server.</t>
      <t indent="0" pn="section-9-8">An attacker trying to replay the messages is prevented by
   having floor control servers check that messages arriving over a
   given WSS connection use an authorized user ID. </t>
      <t indent="0" pn="section-9-9">Attackers may eavesdrop on the network to get access
   to confidential information between the floor control server and a
   client (e.g., why a floor request was denied).  In order to ensure that
   BFCP users are getting the level of protection that they would get using
   BFCP directly, applications need to have a way to
   control the WebSocket libraries to use encryption algorithms specified in 
   <xref target="RFC8855" section="7" sectionFormat="of" format="default" derivedLink="https://rfc-editor.org/rfc/rfc8855#section-7" derivedContent="RFC8855"/>. Since the 
   WebSocket API <xref target="WS-API" format="default" sectionFormat="of" derivedContent="WS-API"/> does not have a way to allow an 
   application to select the encryption algorithm to be used, the protection level 
   provided when WSS is used is limited to the underlying TLS algorithm used by 
   the WebSocket library.</t>
    </section>
    <section anchor="iana_considerations" numbered="true" toc="include" removeInRFC="false" pn="section-10">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-10.1">
        <name slugifiedName="name-registration-of-the-websock">Registration of the WebSocket BFCP Subprotocol</name>
        <t indent="0" pn="section-10.1-1">IANA has registered the WebSocket
        BFCP subprotocol under the "WebSocket Subprotocol Name Registry"
        as follows:</t>
        <dl newline="false" spacing="normal" indent="3" pn="section-10.1-2">
          <dt pn="section-10.1-2.1">Subprotocol Identifier:</dt>
          <dd pn="section-10.1-2.2">bfcp</dd>
          <dt pn="section-10.1-2.3">Subprotocol Common Name:</dt>
          <dd pn="section-10.1-2.4">WebSocket Transport
            for BFCP (Binary Floor Control Protocol)</dd>
          <dt pn="section-10.1-2.5">Subprotocol Definition:</dt>
          <dd pn="section-10.1-2.6">RFC 8857</dd>
        </dl>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-10.2">
        <name slugifiedName="name-registration-of-the-tcp-ws-">Registration of the 'TCP/WS/BFCP' and 'TCP/WSS/BFCP' SDP "proto" Values</name>
        <t indent="0" pn="section-10.2-1">This document defines two new values for the SDP "proto"
        subregistry within the "Session Description Protocol (SDP) Parameters" 
        registry. The resulting entries are shown in <xref target="IANA_SDP_proto" format="default" sectionFormat="of" derivedContent="Table 1"/>:</t>
        <table anchor="IANA_SDP_proto" align="center" pn="table-1">
          <name slugifiedName="name-values-for-the-sdp-proto-fi">Values for the SDP "proto" Field</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Value</th>
              <th align="left" colspan="1" rowspan="1">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">TCP/WS/BFCP</td>
              <td align="left" colspan="1" rowspan="1">RFC 8857</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">TCP/WSS/BFCP</td>
              <td align="left" colspan="1" rowspan="1">RFC 8857</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references pn="section-11">
      <name slugifiedName="name-references">References</name>
      <references pn="section-11.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="1997" month="March"/>
            <abstract>
              <t indent="0">In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC4145" target="https://www.rfc-editor.org/info/rfc4145" quoteTitle="true" derivedAnchor="RFC4145">
          <front>
            <title>TCP-Based Media Transport in the Session Description Protocol (SDP)</title>
            <author initials="D." surname="Yon" fullname="D. Yon">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="G." surname="Camarillo" fullname="G. Camarillo">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2005" month="September"/>
            <abstract>
              <t indent="0">This document describes how to express media transport over TCP using the Session Description Protocol (SDP).  It defines the SDP 'TCP' protocol identifier, the SDP 'setup' attribute, which describes the connection setup procedure, and the SDP 'connection' attribute, which handles connection reestablishment.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4145"/>
          <seriesInfo name="DOI" value="10.17487/RFC4145"/>
        </reference>
        <reference anchor="RFC5018" target="https://www.rfc-editor.org/info/rfc5018" quoteTitle="true" derivedAnchor="RFC5018">
          <front>
            <title>Connection Establishment in the Binary Floor Control Protocol (BFCP)</title>
            <author initials="G." surname="Camarillo" fullname="G. Camarillo">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2007" month="September"/>
            <abstract>
              <t indent="0">This document specifies how a Binary Floor Control Protocol (BFCP) client establishes a connection to a BFCP floor control server outside the context of an offer/answer exchange.  Client and server authentication are based on Transport Layer Security (TLS).  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5018"/>
          <seriesInfo name="DOI" value="10.17487/RFC5018"/>
        </reference>
        <reference anchor="RFC6455" target="https://www.rfc-editor.org/info/rfc6455" quoteTitle="true" derivedAnchor="RFC6455">
          <front>
            <title>The WebSocket Protocol</title>
            <author initials="I." surname="Fette" fullname="I. Fette">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="A." surname="Melnikov" fullname="A. Melnikov">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2011" month="December"/>
            <abstract>
              <t indent="0">The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code.  The security model used for this is the origin-based security model commonly used by web browsers.  The protocol consists of an opening handshake followed by basic message framing, layered over TCP.  The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or &lt;iframe&gt;s and long polling).  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6455"/>
          <seriesInfo name="DOI" value="10.17487/RFC6455"/>
        </reference>
        <reference anchor="RFC7525" target="https://www.rfc-editor.org/info/rfc7525" quoteTitle="true" derivedAnchor="RFC7525">
          <front>
            <title>Recommendations for Secure Use of Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS)</title>
            <author initials="Y." surname="Sheffer" fullname="Y. Sheffer">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="R." surname="Holz" fullname="R. Holz">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2015" month="May"/>
            <abstract>
              <t indent="0">Transport Layer Security (TLS) and Datagram Transport Layer Security (DTLS) are widely used to protect data exchanged over application protocols such as HTTP, SMTP, IMAP, POP, SIP, and XMPP.  Over the last few years, several serious attacks on TLS have emerged, including attacks on its most commonly used cipher suites and their modes of operation.  This document provides recommendations for improving the security of deployed services that use TLS and DTLS. The recommendations are applicable to the majority of use cases.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="195"/>
          <seriesInfo name="RFC" value="7525"/>
          <seriesInfo name="DOI" value="10.17487/RFC7525"/>
        </reference>
        <reference anchor="RFC8124" target="https://www.rfc-editor.org/info/rfc8124" quoteTitle="true" derivedAnchor="RFC8124">
          <front>
            <title>The Session Description Protocol (SDP) WebSocket Connection URI Attribute</title>
            <author initials="R." surname="Ravindranath" fullname="R. Ravindranath">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="G." surname="Salgueiro" fullname="G. Salgueiro">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2017" month="March"/>
            <abstract>
              <t indent="0">The WebSocket protocol enables bidirectional real-time communication between clients and servers in web-based applications.  This document specifies extensions to Session Description Protocol (SDP) for application protocols using WebSocket as a transport.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8124"/>
          <seriesInfo name="DOI" value="10.17487/RFC8124"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="B. Leiba">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2017" month="May"/>
            <abstract>
              <t indent="0">RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8855" target="https://www.rfc-editor.org/info/rfc8855" quoteTitle="true" derivedAnchor="RFC8855">
          <front>
            <title>The Binary Floor Control Protocol (BFCP)</title>
            <author initials="G." surname="Camarillo" fullname="Gonzalo Camarillo">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="K." surname="Drage" fullname="Keith Drage">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="T." surname="Kristensen" fullname="Tom Kristensen">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="J." surname="Ott" fullname="Jörg Ott">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="C." surname="Eckel" fullname="Charles Eckel">
              <organization showOnFrontPage="true"/>
            </author>
            <date month="January" year="2021"/>
          </front>
          <seriesInfo name="RFC" value="8855"/>
          <seriesInfo name="DOI" value="10.17487/RFC8855"/>
        </reference>
        <reference anchor="RFC8856" target="https://www.rfc-editor.org/info/rfc8856" quoteTitle="true" derivedAnchor="RFC8856">
          <front>
            <title>Session Description Protocol (SDP) Format for Binary Floor Control Protocol (BFCP) Streams</title>
            <author initials="G" surname="Camarillo" fullname="Gonzalo Camarillo">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="T" surname="Kristensen" fullname="Tom Kristensen">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="C." surname="Holmberg" fullname="Christer Holmberg">
              <organization showOnFrontPage="true"/>
            </author>
            <date month="January" year="2021"/>
          </front>
          <seriesInfo name="RFC" value="8856"/>
          <seriesInfo name="DOI" value="10.17487/RFC8856"/>
        </reference>
      </references>
      <references pn="section-11.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="RFC6265" target="https://www.rfc-editor.org/info/rfc6265" quoteTitle="true" derivedAnchor="RFC6265">
          <front>
            <title>HTTP State Management Mechanism</title>
            <author initials="A." surname="Barth" fullname="A. Barth">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2011" month="April"/>
            <abstract>
              <t indent="0">This document defines the HTTP Cookie and Set-Cookie header fields. These header fields can be used by HTTP servers to store state (called cookies) at HTTP user agents, letting the servers maintain a stateful session over the mostly stateless HTTP protocol.  Although cookies have many historical infelicities that degrade their security and privacy, the Cookie and Set-Cookie header fields are widely used on the Internet.  This document obsoletes RFC 2965.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6265"/>
          <seriesInfo name="DOI" value="10.17487/RFC6265"/>
        </reference>
        <reference anchor="RFC7230" target="https://www.rfc-editor.org/info/rfc7230" quoteTitle="true" derivedAnchor="RFC7230">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing</title>
            <author initials="R." surname="Fielding" fullname="R. Fielding" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="J." surname="Reschke" fullname="J. Reschke" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2014" month="June"/>
            <abstract>
              <t indent="0">The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems.  This document provides an overview of HTTP architecture and its associated terminology, defines the "http" and "https" Uniform Resource Identifier (URI) schemes, defines the HTTP/1.1 message syntax and parsing requirements, and describes related security concerns for implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7230"/>
          <seriesInfo name="DOI" value="10.17487/RFC7230"/>
        </reference>
        <reference anchor="RFC7486" target="https://www.rfc-editor.org/info/rfc7486" quoteTitle="true" derivedAnchor="RFC7486">
          <front>
            <title>HTTP Origin-Bound Authentication (HOBA)</title>
            <author initials="S." surname="Farrell" fullname="S. Farrell">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="P." surname="Hoffman" fullname="P. Hoffman">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M." surname="Thomas" fullname="M. Thomas">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2015" month="March"/>
            <abstract>
              <t indent="0">HTTP Origin-Bound Authentication (HOBA) is a digital-signature-based design for an HTTP authentication method.  The design can also be used in JavaScript-based authentication embedded in HTML.  HOBA is an alternative to HTTP authentication schemes that require passwords and therefore avoids all problems related to passwords, such as leakage of server-side password databases.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7486"/>
          <seriesInfo name="DOI" value="10.17487/RFC7486"/>
        </reference>
        <reference anchor="RFC7616" target="https://www.rfc-editor.org/info/rfc7616" quoteTitle="true" derivedAnchor="RFC7616">
          <front>
            <title>HTTP Digest Access Authentication</title>
            <author initials="R." surname="Shekh-Yusef" fullname="R. Shekh-Yusef" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="D." surname="Ahrens" fullname="D. Ahrens">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="S." surname="Bremer" fullname="S. Bremer">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2015" month="September"/>
            <abstract>
              <t indent="0">The Hypertext Transfer Protocol (HTTP) provides a simple challenge- response authentication mechanism that may be used by a server to challenge a client request and by a client to provide authentication information.  This document defines the HTTP Digest Authentication scheme that can be used with the HTTP authentication mechanism.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7616"/>
          <seriesInfo name="DOI" value="10.17487/RFC7616"/>
        </reference>
        <reference anchor="RFC7617" target="https://www.rfc-editor.org/info/rfc7617" quoteTitle="true" derivedAnchor="RFC7617">
          <front>
            <title>The 'Basic' HTTP Authentication Scheme</title>
            <author initials="J." surname="Reschke" fullname="J. Reschke">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2015" month="September"/>
            <abstract>
              <t indent="0">This document defines the "Basic" Hypertext Transfer Protocol (HTTP) authentication scheme, which transmits credentials as user-id/ password pairs, encoded using Base64.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7617"/>
          <seriesInfo name="DOI" value="10.17487/RFC7617"/>
        </reference>
        <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446" quoteTitle="true" derivedAnchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author initials="E." surname="Rescorla" fullname="E. Rescorla">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2018" month="August"/>
            <abstract>
              <t indent="0">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>
              <t indent="0">This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961.  This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
        <reference anchor="WS-API" target="https://www.w3.org/TR/2012/CR-websockets-20120920/" quoteTitle="true" derivedAnchor="WS-API">
          <front>
            <title>The WebSocket API</title>
            <author fullname="Ian Hickson" initials="I." role="editor" surname="Hickson">
            </author>
          </front>
          <refcontent>W3C Candidate Recommendation, September 2012</refcontent>
        </reference>
      </references>
    </references>
    <section anchor="acknowledgements" numbered="false" toc="include" removeInRFC="false" pn="section-appendix.a">
      <name slugifiedName="name-acknowledgements">Acknowledgements</name>
      <t indent="0" pn="section-appendix.a-1">The authors want to thank <contact fullname="Robert Welbourn"/> from Acme Packet and 
        <contact fullname="Sergio Garcia Murillo"/>,
        who made significant contributions to the first draft version of
        this document. This work benefited from the thorough review 
        and constructive comments of <contact fullname="Charles Eckel"/>, <contact fullname="Christer Holmberg"/>, 
        <contact fullname="Paul Kyzivat"/>, <contact fullname="Dan Wing"/>, and <contact fullname="Alissa Cooper"/>.
        Thanks to <contact fullname="Bert Wijnen"/>, <contact fullname="Robert Sparks"/>, and <contact fullname="Mirja Kühlewind"/> 
        for their reviews and comments on this document.
      </t>
      <t indent="0" pn="section-appendix.a-2"> Thanks to <contact fullname="Spencer Dawkins"/>, <contact fullname="Ben Campbell"/>, 
        <contact fullname="Kathleen Moriarty"/>, <contact fullname="Alexey Melnikov"/>, <contact fullname="Jari Arkko"/>, 
        and <contact fullname="Stephen Farrell"/> for
        their feedback and comments during IESG reviews. </t>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.b">
      <name slugifiedName="name-authors-addresses">Authors' Addresses</name>
      <author fullname="Victor Pascual" initials="V." surname="Pascual">
        <organization showOnFrontPage="true">Nokia</organization>
        <address>
          <postal>
            <city>Barcelona</city>
            <country>Spain</country>
          </postal>
          <email>victor.pascual_avila@nokia.com</email>
        </address>
      </author>
      <author fullname="Antón Román" initials="A." surname="Román">
        <organization showOnFrontPage="true">Quobis</organization>
        <address>
          <postal>
            <extaddr>Pol. Ind. A Granxa, Casa de Pedra</extaddr>
            <city>O Porriño</city>
            <code>36475</code>
            <country>Spain</country>
          </postal>
          <email>anton.roman@quobis.com</email>
        </address>
      </author>
      <author fullname="Stéphane Cazeaux" initials="S." surname="Cazeaux">
        <organization showOnFrontPage="true">Orange</organization>
        <address>
          <postal>
            <street>42 rue des Coutures</street>
            <city>Caen</city>
            <code>14000</code>
            <country>France</country>
          </postal>
          <email>stephane.cazeaux@orange.com</email>
        </address>
      </author>
      <author fullname="Gonzalo Salgueiro" initials="G." surname="Salgueiro">
        <organization abbrev="Cisco" showOnFrontPage="true">Cisco Systems, Inc.</organization>
        <address>
          <postal>
            <street>7200-12 Kit Creek Road</street>
            <city>Research Triangle Park</city>
            <region>NC</region>
            <code>27709</code>
            <country>US</country>
          </postal>
          <email>gsalguei@cisco.com</email>
        </address>
      </author>
      <author initials="R." surname="Ravindranath" fullname="Ram Mohan Ravindranath">
        <organization abbrev="Cisco" showOnFrontPage="true">Cisco Systems, Inc.</organization>
        <address>
          <postal>
            <extaddr>Cessna Business Park</extaddr>
            <extaddr>Kadabeesanahalli Village, Varthur Hobli,</extaddr>
            <street>Sarjapur-Marathahalli Outer Ring Road</street>
            <city>Bangalore</city>
            <region>Karnataka</region>
            <code>560103</code>
            <country>India</country>
          </postal>
          <email>rmohanr@cisco.com</email>
        </address>
      </author>
    </section>
  </back>
</rfc>
