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


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC6455 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6455.xml">
<!ENTITY RFC7231 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7231.xml">
<!ENTITY RFC7540 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7540.xml">
<!ENTITY RFC7692 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7692.xml">
<!ENTITY RFC9110 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9110.xml">
<!ENTITY RFC9114 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9114.xml">
]>


<rfc ipr="trust200902" docName="draft-yoshino-wish-04" category="std" consensus="true" submissionType="IETF">
  <front>
    <title>web-stream: A General Purpose Message Framing over Byte-Stream Oriented Wire Protocols</title>

    <author initials="T." surname="Yoshino" fullname="Takeshi Yoshino">
      <organization></organization>
      <address>
        <email>tyoshino+ietf@starlancer.org</email>
      </address>
    </author>
    <author initials="W." surname="Zhu" fullname="Wenbo Zhu">
      <organization>Google, Inc.</organization>
      <address>
        <email>wenboz@google.com</email>
      </address>
    </author>

    <date year="2026" month="June" day="29"/>

    
    
    

    <abstract>


<?line 78?>

<t>This document defines <spanx style="verb">web-stream</spanx>, a general-purpose message framing designed to support message-based communication over any byte-stream oriented L4 or L7 protocols, in particular HTTP as in its standard semantics <xref target="RFC9110"/>.</t>

<t><spanx style="verb">web-stream</spanx> can be viewed as a binary alternative to the framing defined for the server-sent events (SSE) <xref target="SSE"/>. This was the original goal when the initial version of this proposal was published in 2017.</t>



    </abstract>



  </front>

  <middle>


<?line 85?>

<section anchor="background"><name>Background</name>

<t>There have been several attempts to improve message-based streaming communication on the Web.</t>

<t>The server-sent events (SSE) <xref target="SSE"/> realized message-based streaming communication in the server-to-client direction. It introduced a new Web API and a special text-based framing format while using HTTP as the wire protocol.</t>

<t>WebSockets realized native client-server full-duplex message-based communication for the Web by introducing both a new Web API and a new wire protocol (the WebSocket Protocol). While widely deployed, the wire protocol is incompatible with the broad HTTP ecosystem <xref target="BidiwebSurvey"/>. Consequently, intermediaries and frameworks have to be upgraded to understand the wire protocol to support WebSockets.</t>

<t>This Internet-Draft addresses the aforementioned problem space with a solution fully compliant with the standard HTTP semantics, informally referred to as "Web in Strict HTTP" (WiSH).</t>

</section>
<section anchor="introduction"><name>Introduction</name>

<t><spanx style="verb">web-stream</spanx> offers a general-purpose message framing over a byte-stream. The framing is compatible with the well-adopted and security-proven base framing of the WebSocket Protocol <xref target="RFC6455"/>. The underlying communication protocols providing the standard HTTP semantics can be HTTP/1.1 <xref target="RFC7231"/>, HTTP/2 <xref target="RFC7540"/>, HTTP/3 <xref target="RFC9114"/>. The <spanx style="verb">web-stream</spanx> framing can also be used over any other byte-stream oriented protocols (over TCP or QUIC <xref target="QUIC"/>).</t>

<t>Transport-level features such as multiplexing and session priority are provided by the underlying byte-stream protocol <xref target="TransportAbstraction"/>.</t>

<t>HTTP implementations may not allow earlier 2xx responses <xref target="RFC7540"/> or full-duplex communication <xref target="FullDuplexHTTP"/>, particularly when HTTP/1.1 is used as the underlying byte-stream protocol. In such cases, parallel HTTP requests can be used to support full-duplex messaging between the client and server. Separately, when HTTP body streaming is unsupported by the Web client <xref target="FetchBody"/> or blocked by intermediaries, multiple short-lived HTTP requests can be used to send messages between the client and server.</t>

<t><spanx style="verb">web-stream</spanx> strictly complies with the HTTP semantics. Consequently, while <spanx style="verb">web-stream</spanx> utilizes the base framing of the WebSocket Protocol, <spanx style="verb">web-stream</spanx> drops the opening handshake and the closing handshake of the WebSocket Protocol.</t>

</section>
<section anchor="conformance-requirements-and-terminology"><name>Conformance Requirements and Terminology</name>

<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>Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and abort these steps") are to be interpreted with the meaning of the key word ("MUST", "SHOULD", "MAY", etc.) used in introducing the algorithm.</t>

<t>Conformance requirements phrased as algorithms or specific steps can be implemented in any manner, so long as the end result is equivalent.</t>

<t>In particular, the algorithms defined in this specification are intended to be easy to understand and are not intended to be performant.</t>

</section>
<section anchor="web-stream-over-http"><name>Web-Stream over HTTP</name>

<t>This section describes how to use <spanx style="verb">web-stream</spanx> over HTTP <xref target="RFC9110"/>.</t>

<t>To use <spanx style="verb">web-stream</spanx> with an HTTP request or response, the content part (i.e. body part) MUST be a sequence of zero or more <spanx style="verb">web-stream</spanx> frames, as defined in <xref target="framing"/>.</t>

<t>The <spanx style="verb">Content-Type</spanx> header for an HTTP request or response using <spanx style="verb">web-stream</spanx> MUST be set to the <spanx style="verb">web-stream</spanx> media type, <spanx style="verb">application/web-stream</spanx>, which includes an optional <spanx style="verb">message</spanx> parameter.</t>

<t>Example:</t>

<t><spanx style="verb">Content-Type: application/web-stream; message="application/json"</spanx></t>

<t>The <spanx style="verb">message</spanx> parameter specifies the content type of the <spanx style="verb">web-stream</spanx> message payload.</t>

<t>The standard HTTP semantics should be followed, particularly regarding the choice of HTTP method and headers.</t>

<t>Certain HTTP semantics, such as <spanx style="verb">Cache-Control</spanx>, may not be applicable when the HTTP body is streamed to the application. These limitations are intrinsic to streaming, not <spanx style="verb">web-stream</spanx> specifically. It's also possible to use <spanx style="verb">web-stream</spanx> without application-level streaming, such as sending batched messages over HTTP.</t>

</section>
<section anchor="framing"><name>Framing</name>

<t>The <spanx style="verb">web-stream</spanx> framing is designed to be compatible with the base framing protocol of the WebSocket Protocol <xref target="RFC6455"/>.</t>

<t>A high-level overview of the framing is provided in the figure below.</t>

<figure><artwork><![CDATA[
   `0                   1                   2                   3`  
    `0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1`  
   `+-+-+-+-+-------+-+-------------+-------------------------------+`  
   `|F|C|0|0|opcode |0|Payload      |Extended payload length        |`  
   `|I|M| | |4 bit  | |length       |16 bit if payload length is 126|`  
   `|N|P| | |       | |7 bit        |64 bit if payload length is 127|`  
   `+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +`  
   `|                                                               |`  
   `+ - - - - - - - - - - - - - - - +-------------------------------+`  
   `|                               |Payload Data                   |`  
   `+-------------------------------+ - - - - - - - - - - - - - - - +`  
   `|                                                               |`  
   `+---------------------------------------------------------------+`
]]></artwork></figure>

<section anchor="payload-length"><name>Payload length</name>

<t>The payload length and extended payload length fields are used to determine the length of the Payload Data field of the frame, following the exact mechanism defined in the WebSocket Protocol.</t>

</section>
<section anchor="fragmentation"><name>Fragmentation</name>

<t>The FIN bit and the continuation frame opcode enable a fragmentation mechanism, which is identical to that of the WebSocket Protocol. One or more continuous frames constitute a <spanx style="verb">web-stream</spanx> message. The FIN bit indicates that the frame is the final frame of a <spanx style="verb">web-stream</spanx> message. For the second and following frames of a <spanx style="verb">web-stream</spanx> message, the opcode field MUST be set to the continuation frame opcode.</t>

<t>The mechanism allows for sending portions of a <spanx style="verb">web-stream</spanx> message with a large payload before the total size of the message is determined.</t>

</section>
<section anchor="payload-compression"><name>Payload Compression</name>

<t><spanx style="verb">web-stream</spanx> defines the CMP bit as the second most significant bit of the first octet of a frame. The CMP bit in the first frame of a message indicates whether that message's payload is compressed. When the message payload is compressed, the CMP bit of the first frame MUST be set to 1; otherwise, it MUST be set to 0. The CMP bit MUST always be set to 0 for all non-first frames. See <xref target="compression"/> for details of the payload compression.</t>

</section>
<section anchor="opcode"><name>Opcode</name>

<t>For the "opcode" field, <spanx style="verb">web-stream</spanx> uses the following opcodes:</t>

<t><list style="symbols">
  <t>%x0 denotes a continuation frame</t>
  <t>%x1 denotes the first frame of a text message</t>
  <t>%x2 denotes the first frame of a binary message</t>
  <t>%x3 denotes the first frame of a metadata message</t>
  <t>%x9 denotes a ping</t>
  <t>%xA denotes a pong</t>
</list></t>

<t>Any values not listed above are reserved.</t>

<t>The opcodes for continuation frames, text messages, and binary messages are identical to those specified in the WebSocket Protocol.</t>

<t><spanx style="verb">web-stream</spanx> introduces the metadata message opcode (%x3), which is used for exchanging in-stream metadata between the client and server. When the opcode field of the first frame is set to %x3, the message contains metadata. The application-level protocol determines the encoding of the metadata message payload. Support for metadata is optional; <spanx style="verb">web-stream</spanx> implementations that do not support or consume metadata messages MAY discard them.</t>

<t>We don't expect the WebSocket Protocol to introduce any new opcodes in future.</t>

<t>The WebSocket Protocol's connection close frame opcode (%x8) is ignored for <spanx style="verb">web-stream</spanx>. The ping (%x9) and pong (%xA) control frames are retained from the WebSocket Protocol. <spanx style="verb">web-stream</spanx> endpoints MAY alternatively rely on keep-alive mechanisms provided by the underlying transport.</t>

</section>
</section>
<section anchor="compression"><name>Compression over HTTP</name>

<section anchor="general-guidelines-about-compression"><name>General Guidelines about Compression</name>

<t>For short-lived streaming, the content codings (for HTTP body) MAY be applied in the underlying HTTP layer for <spanx style="verb">web-stream</spanx> as specified in Section 8.4. Content-Encoding of <xref target="RFC9110"/>. HTTP compression is transparent to the <spanx style="verb">web-stream</spanx> framing and is generally efficient for short-lived streaming.</t>

<t>For long-lived streaming, Per-message Compression for WebSocket (PMCE) <xref target="RFC7692"/> may provide better performance. Implementations may port PMCE to <spanx style="verb">web-stream</spanx> as described in the following section.</t>

<t><spanx style="verb">web-stream</spanx> compression and HTTP compression SHOULD NOT be enabled simultaneously to avoid redundant compression.</t>

</section>
<section anchor="web-stream-compression"><name><spanx style="verb">web-stream</spanx> Compression</name>

<t><xref target="RFC7692"/> defined a general framework on how to implement message-oriented compression for <xref target="RFC6455"/> using its extension framework. This is named Per-message Compression for WebSocket (PMCE). The <spanx style="verb">web-stream</spanx> compression is an adaptation (port) of PMCE for <spanx style="verb">web-stream</spanx>.</t>

<section anchor="negotiation"><name>Negotiation</name>

<t>Enabling the <spanx style="verb">web-stream</spanx> compression requires the participating endpoints to perform the extension negotiation defined in <xref target="RFC7692"/> through HTTP request and response headers. The name of the header MUST be <spanx style="verb">Web-Stream-Extensions</spanx> instead of <spanx style="verb">Sec-WebSocket-Extensions</spanx>.</t>

<t>Example negotiation:</t>

<t>The client includes the following header in HTTP request to offer use of a compression that is equivalent to the <spanx style="verb">permessage-deflate</spanx> PMCE for the WebSocket Protocol.</t>

<t><spanx style="verb">Web-Stream-Extensions: permessage-deflate</spanx></t>

<t>Some parameters can be added to the <spanx style="verb">permessage-deflate</spanx> entry as follows:</t>

<t><spanx style="verb">Web-Stream-Extensions: permessage-deflate; client_max_window_bits=10</spanx></t>

<t>The server includes the following header in HTTP response to accept use of the compression as follows:</t>

<t><spanx style="verb">Web-Stream-Extensions: permessage-deflate</spanx></t>

</section>
<section anchor="framing-1"><name>Framing</name>

<t><spanx style="verb">web-stream</spanx> compression uses the second significant bit of the first octet of a frame to indicate whether the message payload is compressed. This bit is referred to as the "Per-Message Compressed" bit in the PMCE specification. In the <spanx style="verb">web-stream</spanx> framing, this bit is named the <strong>CMP bit</strong>.</t>

<t>When the CMP bit is set in the first frame of a message, the message payload MUST be compressed.</t>

</section>
<section anchor="compression-methods-other-than-deflate"><name>Compression Methods other than DEFLATE</name>

<t>While DEFLATE is the only compression algorithm supported by the WebSocket Protocol, <spanx style="verb">web-stream</spanx> may support additional compression algorithms, such as Zstandard. A separate Internet-Draft will be published in the future to specify these <spanx style="verb">web-stream</spanx> compression methods.</t>

</section>
</section>
</section>
<section anchor="utf-8-vallidation"><name>UTF-8 Vallidation</name>

<t>The WebSocket Protocol <xref target="RFC6455"/> requires the endpoints to _Fail the WebSocket Connection_ when they encounter an invalid UTF-8 byte sequence in a text message. Consequently, <xref target="RFC6455"/> server frameworks typically check for UTF-8 validity.</t>

<t>While the contents of <spanx style="verb">web-stream</spanx> text messages also MUST be a valid UTF-8 sequence, <spanx style="verb">web-stream</spanx> endpoints are not REQUIRED to perform UTF-8 validation. This design choice provides greater flexibility to server implementations, which may, for example, choose to perform UTF-8 validation within a JSON parser.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>The authors gratefully acknowledge the feedback received on the original version of this draft from the <eref target="https://datatracker.ietf.org/wg/hybi/about/">IETF BiDirectional or Server-Initiated HTTP (hybi) Working Group</eref> and <eref target="https://httpwg.org/">the IETF HTTP Working Group</eref> during 2016-2017.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC6455;
&RFC7231;
&RFC7540;
&RFC7692;
&RFC9110;
&RFC9114;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

<reference anchor="FetchBody" target="https://fetch.spec.whatwg.org/#concept-body-stream">
  <front>
    <title>Fetch Standard - body stream</title>
    <author >
      <organization>WHATWG</organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="QUIC" target="https://www.rfc-editor.org/rfc/rfc9000">
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar">
      <organization></organization>
    </author>
    <author initials="M." surname="Thomson" fullname="Martin Thomson">
      <organization></organization>
    </author>
    <date year="2021" month="May"/>
  </front>
  <seriesInfo name="RFC" value="9000"/>
</reference>
<reference anchor="SSE" target="https://html.spec.whatwg.org/multipage/comms.html#server-sent-events">
  <front>
    <title>HTML Living Standard - Server-sent events</title>
    <author >
      <organization>WHATWG</organization>
    </author>
    <date year="2017" month="May"/>
  </front>
</reference>
<reference anchor="FullDuplexHTTP" target="https://datatracker.ietf.org/doc/html/draft-zhu-http-fullduplex">
  <front>
    <title>Implications of Full-Duplex HTTP</title>
    <author initials="W." surname="Zhu" fullname="Wenbo Zhu">
      <organization></organization>
    </author>
    <author initials="M." surname="Jennings" fullname="Mike Jennings">
      <organization></organization>
    </author>
    <date year="2013" month="November"/>
  </front>
</reference>
<reference anchor="BidiwebSurvey" target="https://github.com/bidiweb/bidiweb-semantics/blob/master/SurveyOfProtocolGaps.md">
  <front>
    <title>Non Request-Response Communication over the Web, and What's Missing</title>
    <author initials="T." surname="Yoshino" fullname="Takeshi Yoshino">
      <organization></organization>
    </author>
    <author initials="W." surname="Zhu" fullname="Wenbo Zhu">
      <organization></organization>
    </author>
    <date year="2014" month="January"/>
  </front>
</reference>
<reference anchor="TransportAbstraction" target="https://github.com/bidiweb/http-transport-abstraction">
  <front>
    <title>http-transport-abstraction</title>
    <author initials="W." surname="Zhu" fullname="Wenbo Zhu">
      <organization></organization>
    </author>
    <date year="2016" month="July"/>
  </front>
</reference>
<reference anchor="WebStreamReferecenImplementation" target="https://github.com/bidiweb/web-stream-reference-implementation">
  <front>
    <title>web-stream reference implementation in C++</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>


    </references>

</references>



  </back>

<!-- ##markdown-source:
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
NgAA

-->

</rfc>

