draft-ietf-hybi-thewebsocketprotocol-07.txt | draft-ietf-hybi-thewebsocketprotocol-08.txt | |||
---|---|---|---|---|
HyBi Working Group I. Fette | HyBi Working Group I. Fette | |||
Internet-Draft Google, Inc. | Internet-Draft Google, Inc. | |||
Intended status: Standards Track April 22, 2011 | Intended status: Standards Track June 7, 2011 | |||
Expires: October 24, 2011 | Expires: December 9, 2011 | |||
The WebSocket protocol | The WebSocket protocol | |||
draft-ietf-hybi-thewebsocketprotocol-07 | draft-ietf-hybi-thewebsocketprotocol-08 | |||
Abstract | Abstract | |||
The WebSocket protocol enables two-way communication between a user | The WebSocket protocol enables two-way communication between a client | |||
agent running untrusted code running in a controlled environment to a | running untrusted code running in a controlled environment to a | |||
remote host that has opted-in to communications from that code. The | remote host that has opted-in to communications from that code. The | |||
security model used for this is the Origin-based security model | security model used for this is the Origin-based security model | |||
commonly used by Web browsers. The protocol consists of an initial | commonly used by Web browsers. The protocol consists of an opening | |||
handshake followed by basic message framing, layered over TCP. The | handshake followed by basic message framing, layered over TCP. (In | |||
goal of this technology is to provide a mechanism for browser-based | theory, any transport protocol could be used so long as it provides | |||
applications that need two-way communication with servers that does | for reliable transport, is byte clean, and supports relatively large | |||
not rely on opening multiple HTTP connections (e.g. using | message sizes. However, for this document, we consider only 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 <iframe>s and long polling). | XMLHttpRequest or <iframe>s and long polling). | |||
Please send feedback to the hybi@ietf.org mailing list. | Please send feedback to the hybi@ietf.org mailing list. | |||
Status of this Memo | Status of this Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on October 24, 2011. | This Internet-Draft will expire on December 9, 2011. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2011 IETF Trust and the persons identified as the | Copyright (c) 2011 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
1.1. Background . . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.1. Background . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
1.2. Protocol overview . . . . . . . . . . . . . . . . . . . . 4 | 1.2. Protocol Overview . . . . . . . . . . . . . . . . . . . . 4 | |||
1.3. Opening handshake . . . . . . . . . . . . . . . . . . . . 6 | 1.3. Opening Handshake . . . . . . . . . . . . . . . . . . . . 6 | |||
1.4. Closing handshake . . . . . . . . . . . . . . . . . . . . 8 | 1.4. Closing Handshake . . . . . . . . . . . . . . . . . . . . 9 | |||
1.5. Design philosophy . . . . . . . . . . . . . . . . . . . . 9 | 1.5. Design Philosophy . . . . . . . . . . . . . . . . . . . . 9 | |||
1.6. Security model . . . . . . . . . . . . . . . . . . . . . . 10 | 1.6. Security Model . . . . . . . . . . . . . . . . . . . . . 10 | |||
1.7. Relationship to TCP and HTTP . . . . . . . . . . . . . . . 10 | 1.7. Relationship to TCP and HTTP . . . . . . . . . . . . . . 11 | |||
1.8. Establishing a connection . . . . . . . . . . . . . . . . 11 | 1.8. Establishing a Connection . . . . . . . . . . . . . . . . 11 | |||
1.9. Subprotocols using the WebSocket protocol . . . . . . . . 11 | 1.9. Subprotocols Using the WebSocket protocol . . . . . . . . 11 | |||
2. Conformance requirements . . . . . . . . . . . . . . . . . . . 13 | 2. Conformance Requirements . . . . . . . . . . . . . . . . . . . 13 | |||
2.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 13 | 2.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 13 | |||
3. WebSocket URIs . . . . . . . . . . . . . . . . . . . . . . . . 15 | 3. WebSocket URIs . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
3.1. Parsing WebSocket URIs . . . . . . . . . . . . . . . . . . 15 | 4. Data Framing . . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
3.2. Constructing WebSocket URIs . . . . . . . . . . . . . . . 16 | 4.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . 16 | |||
3.3. Valid WebSocket URIs . . . . . . . . . . . . . . . . . . . 16 | 4.2. Base Framing Protocol . . . . . . . . . . . . . . . . . . 16 | |||
4. Data Framing . . . . . . . . . . . . . . . . . . . . . . . . . 17 | 4.3. Client-to-Server Masking . . . . . . . . . . . . . . . . 20 | |||
4.1. Overview . . . . . . . . . . . . . . . . . . . . . . . . . 17 | 4.4. Fragmentation . . . . . . . . . . . . . . . . . . . . . . 21 | |||
4.2. Base Framing Protocol . . . . . . . . . . . . . . . . . . 17 | 4.5. Control Frames . . . . . . . . . . . . . . . . . . . . . 22 | |||
4.3. Client-to-Server Masking . . . . . . . . . . . . . . . . . 20 | ||||
4.4. Fragmentation . . . . . . . . . . . . . . . . . . . . . . 21 | ||||
4.5. Control Frames . . . . . . . . . . . . . . . . . . . . . . 23 | ||||
4.5.1. Close . . . . . . . . . . . . . . . . . . . . . . . . 23 | 4.5.1. Close . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
4.5.2. Ping . . . . . . . . . . . . . . . . . . . . . . . . . 24 | 4.5.2. Ping . . . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
4.5.3. Pong . . . . . . . . . . . . . . . . . . . . . . . . . 24 | 4.5.3. Pong . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
4.6. Data Frames . . . . . . . . . . . . . . . . . . . . . . . 24 | 4.6. Data Frames . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
4.7. Examples . . . . . . . . . . . . . . . . . . . . . . . . . 25 | 4.7. Examples . . . . . . . . . . . . . . . . . . . . . . . . 25 | |||
4.8. Extensibility . . . . . . . . . . . . . . . . . . . . . . 25 | 4.8. Extensibility . . . . . . . . . . . . . . . . . . . . . . 25 | |||
5. Opening Handshake . . . . . . . . . . . . . . . . . . . . . . 27 | 5. Opening Handshake . . . . . . . . . . . . . . . . . . . . . . 27 | |||
5.1. Client Requirements . . . . . . . . . . . . . . . . . . . 27 | 5.1. Client Requirements . . . . . . . . . . . . . . . . . . . 27 | |||
5.2. Server-side requirements . . . . . . . . . . . . . . . . . 31 | 5.2. Server-side Requirements . . . . . . . . . . . . . . . . 32 | |||
5.2.1. Reading the client's opening handshake . . . . . . . . 32 | 5.2.1. Reading the Client's Opening Handshake . . . . . . . . 32 | |||
5.2.2. Sending the server's opening handshake . . . . . . . . 32 | 5.2.2. Sending the Server's Opening Handshake . . . . . . . . 33 | |||
6. Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 36 | 6. Sending and Receiving Data . . . . . . . . . . . . . . . . . . 37 | |||
6.1. Handling errors in UTF-8 from the server . . . . . . . . . 36 | 6.1. Sending Data . . . . . . . . . . . . . . . . . . . . . . 37 | |||
6.2. Handling errors in UTF-8 from the client . . . . . . . . . 36 | 6.2. Receiving Data . . . . . . . . . . . . . . . . . . . . . 37 | |||
7. Closing the connection . . . . . . . . . . . . . . . . . . . . 37 | 7. Closing the connection . . . . . . . . . . . . . . . . . . . . 39 | |||
7.1. Definitions . . . . . . . . . . . . . . . . . . . . . . . 37 | 7.1. Definitions . . . . . . . . . . . . . . . . . . . . . . . 39 | |||
7.1.1. Close the WebSocket Connection . . . . . . . . . . . . 37 | 7.1.1. Close the WebSocket Connection . . . . . . . . . . . . 39 | |||
7.1.2. Start the WebSocket Closing Handshake . . . . . . . . 37 | 7.1.2. Start the WebSocket Closing Handshake . . . . . . . . 39 | |||
7.1.3. The WebSocket Connection Is Closed . . . . . . . . . . 37 | 7.1.3. The WebSocket Closing Handshake is Started . . . . . . 39 | |||
7.1.4. Fail the WebSocket Connection . . . . . . . . . . . . 37 | 7.1.4. The WebSocket Connection is Closed . . . . . . . . . . 40 | |||
7.2. Abnormal closures . . . . . . . . . . . . . . . . . . . . 37 | 7.1.5. The WebSocket Connection Close Code . . . . . . . . . 40 | |||
7.2.1. Client-initiated closure . . . . . . . . . . . . . . . 38 | 7.1.6. The WebSocket Connection Close Reason . . . . . . . . 40 | |||
7.2.2. Server-initiated closure . . . . . . . . . . . . . . . 38 | 7.1.7. Fail the WebSocket Connection . . . . . . . . . . . . 41 | |||
7.3. Normal closure of connections . . . . . . . . . . . . . . 38 | 7.2. Abnormal Closures . . . . . . . . . . . . . . . . . . . . 41 | |||
7.4. Status codes . . . . . . . . . . . . . . . . . . . . . . . 38 | 7.2.1. Client-Initiated Closure . . . . . . . . . . . . . . . 41 | |||
7.4.1. Defined Status Codes . . . . . . . . . . . . . . . . . 38 | 7.2.2. Server-initiated closure . . . . . . . . . . . . . . . 42 | |||
7.4.2. Reserved status code ranges . . . . . . . . . . . . . 39 | 7.3. Normal Closure of Connections . . . . . . . . . . . . . . 42 | |||
8. Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . 41 | 7.4. Status Codes . . . . . . . . . . . . . . . . . . . . . . 42 | |||
8.1. Negotiating extensions . . . . . . . . . . . . . . . . . . 41 | 7.4.1. Defined Status Codes . . . . . . . . . . . . . . . . . 42 | |||
8.2. Known extensions . . . . . . . . . . . . . . . . . . . . . 42 | 7.4.2. Reserved Status Code Ranges . . . . . . . . . . . . . 43 | |||
8.2.1. Compression . . . . . . . . . . . . . . . . . . . . . 42 | 8. Error Handling . . . . . . . . . . . . . . . . . . . . . . . . 45 | |||
9. Security considerations . . . . . . . . . . . . . . . . . . . 44 | 8.1. Handling Errors in UTF-8 from the Server . . . . . . . . 45 | |||
10. IANA considerations . . . . . . . . . . . . . . . . . . . . . 46 | 8.2. Handling Errors in UTF-8 from the Client . . . . . . . . 45 | |||
10.1. Registration of ws: scheme . . . . . . . . . . . . . . . . 46 | 9. Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . 46 | |||
10.2. Registration of wss: scheme . . . . . . . . . . . . . . . 47 | 9.1. Negotiating Extensions . . . . . . . . . . . . . . . . . 46 | |||
10.3. Registration of the "WebSocket" HTTP Upgrade keyword . . . 48 | 9.2. Known Extensions . . . . . . . . . . . . . . . . . . . . 47 | |||
10.4. Sec-WebSocket-Key . . . . . . . . . . . . . . . . . . . . 48 | 9.2.1. Compression . . . . . . . . . . . . . . . . . . . . . 47 | |||
10.5. Sec-WebSocket-Extensions . . . . . . . . . . . . . . . . . 49 | 10. Security Considerations . . . . . . . . . . . . . . . . . . . 49 | |||
10.6. Sec-WebSocket-Accept . . . . . . . . . . . . . . . . . . . 50 | 11. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 51 | |||
10.7. Sec-WebSocket-Origin . . . . . . . . . . . . . . . . . . . 50 | 11.1. Registration of "ws:" Scheme . . . . . . . . . . . . . . 51 | |||
10.8. Sec-WebSocket-Protocol . . . . . . . . . . . . . . . . . . 51 | 11.2. Registration of "wss:" Scheme . . . . . . . . . . . . . . 52 | |||
10.9. Sec-WebSocket-Version . . . . . . . . . . . . . . . . . . 51 | 11.3. Registration of the "WebSocket" HTTP Upgrade Keyword . . 53 | |||
11. Using the WebSocket protocol from other specifications . . . . 53 | 11.4. Sec-WebSocket-Key . . . . . . . . . . . . . . . . . . . . 53 | |||
12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 54 | 11.5. Sec-WebSocket-Extensions . . . . . . . . . . . . . . . . 54 | |||
13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 55 | 11.6. WebSocket Extension Name Registry . . . . . . . . . . . . 55 | |||
13.1. Normative References . . . . . . . . . . . . . . . . . . . 55 | 11.7. Sec-WebSocket-Accept . . . . . . . . . . . . . . . . . . 56 | |||
13.2. Informative References . . . . . . . . . . . . . . . . . . 56 | 11.8. Sec-WebSocket-Origin . . . . . . . . . . . . . . . . . . 56 | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 57 | 11.9. Sec-WebSocket-Protocol . . . . . . . . . . . . . . . . . 57 | |||
11.10. WebSocket Subprotocol Name Registry . . . . . . . . . . . 57 | ||||
11.11. Sec-WebSocket-Version . . . . . . . . . . . . . . . . . . 58 | ||||
11.12. WebSocket Version Number Registry . . . . . . . . . . . . 59 | ||||
11.13. WebSocket Close Code Number Registry . . . . . . . . . . 60 | ||||
11.14. WebSocket Opcode Registry . . . . . . . . . . . . . . . . 61 | ||||
11.15. WebSocket Framing Header Bits Registry . . . . . . . . . 62 | ||||
12. Using the WebSocket protocol from Other Specifications . . . . 63 | ||||
13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 64 | ||||
14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 65 | ||||
14.1. Normative References . . . . . . . . . . . . . . . . . . 65 | ||||
14.2. Informative References . . . . . . . . . . . . . . . . . 66 | ||||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 68 | ||||
1. Introduction | 1. Introduction | |||
1.1. Background | 1.1. Background | |||
_This section is non-normative._ | _This section is non-normative._ | |||
Historically, creating an instant messenger chat client as a Web | Historically, creating an instant messenger chat client as a Web | |||
application has required an abuse of HTTP to poll the server for | application has required an abuse of HTTP to poll the server for | |||
updates while sending upstream notifications as distinct HTTP | updates while sending upstream notifications as distinct HTTP | |||
skipping to change at page 4, line 39 | skipping to change at page 4, line 39 | |||
traffic in both directions. This is what the WebSocket protocol | traffic in both directions. This is what the WebSocket protocol | |||
provides. Combined with the WebSocket API, it provides an | provides. Combined with the WebSocket API, it provides an | |||
alternative to HTTP polling for two-way communication from a Web page | alternative to HTTP polling for two-way communication from a Web page | |||
to a remote server. [WSAPI] | to a remote server. [WSAPI] | |||
The same technique can be used for a variety of Web applications: | The same technique can be used for a variety of Web applications: | |||
games, stock tickers, multiuser applications with simultaneous | games, stock tickers, multiuser applications with simultaneous | |||
editing, user interfaces exposing server-side services in real time, | editing, user interfaces exposing server-side services in real time, | |||
etc. | etc. | |||
1.2. Protocol overview | 1.2. Protocol Overview | |||
_This section is non-normative._ | _This section is non-normative._ | |||
The protocol has two parts: a handshake, and then the data transfer. | The protocol has two parts: a handshake, and then the data transfer. | |||
The handshake from the client looks as follows: | The handshake from the client looks as follows: | |||
GET /chat HTTP/1.1 | GET /chat HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Upgrade: websocket | Upgrade: websocket | |||
Connection: Upgrade | Connection: Upgrade | |||
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== | Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== | |||
Sec-WebSocket-Origin: http://example.com | Sec-WebSocket-Origin: http://example.com | |||
Sec-WebSocket-Protocol: chat, superchat | Sec-WebSocket-Protocol: chat, superchat | |||
Sec-WebSocket-Version: 7 | Sec-WebSocket-Version: 8 | |||
The handshake from the server looks as follows: | The handshake from the server looks as follows: | |||
HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
Upgrade: websocket | Upgrade: websocket | |||
Connection: Upgrade | Connection: Upgrade | |||
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= | Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= | |||
Sec-WebSocket-Protocol: chat | Sec-WebSocket-Protocol: chat | |||
The leading line from the client follows the Request-Line format. | The leading line from the client follows the Request-Line format. | |||
skipping to change at page 5, line 42 | skipping to change at page 5, line 42 | |||
Once the client and server have both sent their handshakes, and if | Once the client and server have both sent their handshakes, and if | |||
the handshake was successful, then the data transfer part starts. | the handshake was successful, then the data transfer part starts. | |||
This is a two-way communication channel where each side can, | This is a two-way communication channel where each side can, | |||
independently from the other, send data at will. | independently from the other, send data at will. | |||
Clients and servers, after a successful handshake, transfer data back | Clients and servers, after a successful handshake, transfer data back | |||
and forth in conceptual units referred to in this specification as | and forth in conceptual units referred to in this specification as | |||
"messages". A message is a complete unit of data at an application | "messages". A message is a complete unit of data at an application | |||
level, with the expectation that many or most applications | level, with the expectation that many or most applications | |||
implementing this protocol (such as web user agents) provide APIs in | implementing this protocol (such as web user agents) provide APIs in | |||
terms of sending and receiving messages. The websocket message does | terms of sending and receiving messages. The WebSocket message does | |||
not necessarily correspond to a particular network layer framing, as | not necessarily correspond to a particular network layer framing, as | |||
a fragmented message may be coalesced, or vice versa, e.g. by an | a fragmented message may be coalesced, or vice versa, e.g. by an | |||
intermediary. | intermediary. | |||
Data is sent on the wire in the form of frames that have an | Data is sent on the wire in the form of frames that have an | |||
associated type. A message is composed of one or more frames, all of | associated type. A message is composed of one or more frames, all of | |||
which contain the same type of data. Broadly speaking, there are | which contain the same type of data. Broadly speaking, there are | |||
types for textual data, which is interpreted as UTF-8 [RFC3629] text, | types for textual data, which is interpreted as UTF-8 [RFC3629] text, | |||
binary data (whose interpretation is left up to the application), and | binary data (whose interpretation is left up to the application), and | |||
control frames, which are not intended to carry data for the | control frames, which are not intended to carry data for the | |||
skipping to change at page 6, line 16 | skipping to change at page 6, line 16 | |||
signal that the connection should be closed. This version of the | signal that the connection should be closed. This version of the | |||
protocol defines six frame types and leaves ten reserved for future | protocol defines six frame types and leaves ten reserved for future | |||
use. | use. | |||
The WebSocket protocol uses this framing so that specifications that | The WebSocket protocol uses this framing so that specifications that | |||
use the WebSocket protocol can expose such connections using an | use the WebSocket protocol can expose such connections using an | |||
event-based mechanism instead of requiring users of those | event-based mechanism instead of requiring users of those | |||
specifications to implement buffering and piecing together of | specifications to implement buffering and piecing together of | |||
messages manually. | messages manually. | |||
1.3. Opening handshake | 1.3. Opening Handshake | |||
_This section is non-normative._ | _This section is non-normative._ | |||
The opening handshake is intended to be compatible with HTTP-based | The opening handshake is intended to be compatible with HTTP-based | |||
server-side software and intermediaries, so that a single port can be | server-side software and intermediaries, so that a single port can be | |||
used by both HTTP clients talking to that server and WebSocket | used by both HTTP clients talking to that server and WebSocket | |||
clients talking to that server. To this end, the WebSocket client's | clients talking to that server. To this end, the WebSocket client's | |||
handshake is an HTTP Upgrade request: | handshake is an HTTP Upgrade request: | |||
GET /chat HTTP/1.1 | GET /chat HTTP/1.1 | |||
Host: server.example.com | Host: server.example.com | |||
Upgrade: websocket | Upgrade: websocket | |||
Connection: Upgrade | Connection: Upgrade | |||
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== | Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== | |||
Sec-WebSocket-Origin: http://example.com | Sec-WebSocket-Origin: http://example.com | |||
Sec-WebSocket-Protocol: chat, superchat | Sec-WebSocket-Protocol: chat, superchat | |||
Sec-WebSocket-Version: 7 | Sec-WebSocket-Version: 8 | |||
Headers in the handshake are sent by the client in a random order; | Headers in the handshake are sent by the client in a random order; | |||
the order is not meaningful. | the order is not meaningful. | |||
The "Request-URI" of the GET method [RFC2616] is used to identify the | The "Request-URI" of the GET method [RFC2616] is used to identify the | |||
endpoint of the WebSocket connection, both to allow multiple domains | endpoint of the WebSocket connection, both to allow multiple domains | |||
to be served from one IP address and to allow multiple WebSocket | to be served from one IP address and to allow multiple WebSocket | |||
endpoints to be served by a single server. | endpoints to be served by a single server. | |||
The client includes the hostname in the Host header of its handshake | The client includes the hostname in the Host header of its handshake | |||
skipping to change at page 7, line 17 | skipping to change at page 7, line 17 | |||
the WebSocket protocol) are acceptable to the client. The server | the WebSocket protocol) are acceptable to the client. The server | |||
selects one of the acceptable protocols and echoes that value in its | selects one of the acceptable protocols and echoes that value in its | |||
handshake to indicate that it has selected that protocol. | handshake to indicate that it has selected that protocol. | |||
Sec-WebSocket-Protocol: chat | Sec-WebSocket-Protocol: chat | |||
The |Sec-WebSocket-Origin| header is used to protect against | The |Sec-WebSocket-Origin| header is used to protect against | |||
unauthorized cross-origin use of a WebSocket server by scripts using | unauthorized cross-origin use of a WebSocket server by scripts using | |||
the |WebSocket| API in a Web browser. The server is informed of the | the |WebSocket| API in a Web browser. The server is informed of the | |||
script origin generating the WebSocket connection request. If the | script origin generating the WebSocket connection request. If the | |||
server does not wish to accept connections from this origin, it can | server does not wish to accept connections from this origin, it can | |||
choose to abort the connection. This header is sent by browser | choose to reject the connection by sending an appropriate HTTP error | |||
clients, for non-browser clients this header may be sent if it makes | code. This header is sent by browser clients, for non-browser | |||
sense in the context of those clients. | clients this header may be sent if it makes sense in the context of | |||
those clients. | ||||
NOTE: It is worth noting that for the attack cases this header | ||||
protects against, the untrusted party is typically the author of a | ||||
JavaScript application that is executing in the context of the | ||||
client. The client itself can contact the server and via the | ||||
mechanism of the |Sec-WebSocket-Origin| header, determine whether to | ||||
extend those communication privileges to the JavaScript application. | ||||
A JavaScript application cannot set a header starting with "Sec-" via | ||||
XHR. The intent is not to prevent non-browsers from establishing | ||||
connections, but rather to ensure that browsers under the control of | ||||
potentially malicious JavaScript cannot fake a WebSocket handshake. | ||||
Finally, the server has to prove to the client that it received the | Finally, the server has to prove to the client that it received the | |||
client's WebSocket handshake, so that the server doesn't accept | client's WebSocket handshake, so that the server doesn't accept | |||
connections that are not WebSocket connections. This prevents an | connections that are not WebSocket connections. This prevents an | |||
attacker from tricking a WebSocket server by sending it carefully- | attacker from tricking a WebSocket server by sending it carefully- | |||
crafted packets using |XMLHttpRequest| or a |form| submission. | crafted packets using |XMLHttpRequest| or a |form| submission. | |||
To prove that the handshake was received, the server has to take two | To prove that the handshake was received, the server has to take two | |||
pieces of information and combine them to form a response. The first | pieces of information and combine them to form a response. The first | |||
piece of information comes from the |Sec-WebSocket-Key| header in the | piece of information comes from the |Sec-WebSocket-Key| header in the | |||
client handshake: | client handshake: | |||
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== | Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== | |||
For this header, the server has to take the value (as present in the | For this header, the server has to take the value (as present in the | |||
header, e.g. the base64-encoded [RFC4648] version minus leading and | header, e.g. the base64-encoded [RFC4648] version minus leading and | |||
trailing whitespace), and concatenate this with the GUID "258EAFA5- | trailing whitespace), and concatenate this with the GUID "258EAFA5- | |||
E914-47DA-95CA-C5AB0DC85B11" in string form, which is unlikely to be | E914-47DA-95CA-C5AB0DC85B11" in string form, which is unlikely to be | |||
used by network endpoints that do not understand the WebSocket | used by network endpoints that do not understand the WebSocket | |||
protocol. A SHA-1 hash, base64-encoded, of this concatenation is | protocol. A SHA-1 hash (160 bits), base64-encoded, of this | |||
then returned in the server's handshake [FIPS.180-2.2002]. | concatenation is then returned in the server's handshake | |||
[FIPS.180-2.2002]. | ||||
Concretely, if as in the example above, header |Sec-WebSocket-Key| | Concretely, if as in the example above, header |Sec-WebSocket-Key| | |||
had the value "dGhlIHNhbXBsZSBub25jZQ==", the server would | had the value "dGhlIHNhbXBsZSBub25jZQ==", the server would | |||
concatenate the string "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" to form | concatenate the string "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" to form | |||
the string "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA- | the string "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA- | |||
C5AB0DC85B11". The server would then take the SHA-1 hash of this, | C5AB0DC85B11". The server would then take the SHA-1 hash of this, | |||
giving the value 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 | giving the value 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 | |||
0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea. This value is | 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea. This value is | |||
then base64-encoded, to give the value "s3pPLMBiTxaQ9kYGzzhZRbK+ | then base64-encoded, to give the value "s3pPLMBiTxaQ9kYGzzhZRbK+ | |||
xOo=". This value would then be echoed in the header |Sec-WebSocket- | xOo=". This value would then be echoed in the header |Sec-WebSocket- | |||
skipping to change at page 8, line 31 | skipping to change at page 8, line 44 | |||
HTTP/1.1 101 Switching Protocols | HTTP/1.1 101 Switching Protocols | |||
Upgrade: websocket | Upgrade: websocket | |||
Connection: Upgrade | Connection: Upgrade | |||
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= | Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= | |||
These fields are checked by the Web browser when it is acting as a | These fields are checked by the Web browser when it is acting as a | |||
|WebSocket| client for scripted pages. If the |Sec-WebSocket-Accept| | |WebSocket| client for scripted pages. If the |Sec-WebSocket-Accept| | |||
value does not match the expected value, or if the header is missing, | value does not match the expected value, or if the header is missing, | |||
or if the HTTP status code is not 101, the connection will not be | or if the HTTP status code is not 101, the connection will not be | |||
established and WebSockets frames will not be sent. | established and WebSocket frames will not be sent. | |||
Option fields can also be included. In this version of the protocol, | Option fields can also be included. In this version of the protocol, | |||
the main option field is |Sec-WebSocket-Protocol|, which indicates | the main option field is |Sec-WebSocket-Protocol|, which indicates | |||
the subprotocol that the server has selected. Web browsers verify | the subprotocol that the server has selected. Web browsers verify | |||
that the server included one of the values as was specified in the | that the server included one of the values as was specified in the | |||
WebSocket client' handshake. A server that speaks multiple | WebSocket client's handshake. A server that speaks multiple | |||
subprotocols has to make sure it selects one based on the client's | subprotocols has to make sure it selects one based on the client's | |||
handshake and specifies it in its handshake. | handshake and specifies it in its handshake. | |||
Sec-WebSocket-Protocol: chat | Sec-WebSocket-Protocol: chat | |||
The server can also set cookie-related option fields to _set_ | The server can also set cookie-related option fields to _set_ | |||
cookies, as in HTTP. | cookies, as in HTTP. | |||
1.4. Closing handshake | 1.4. Closing Handshake | |||
_This section is non-normative._ | _This section is non-normative._ | |||
The closing handshake is far simpler than the opening handshake. | The closing handshake is far simpler than the opening handshake. | |||
Either peer can send a control frame with data containing a specified | Either peer can send a control frame with data containing a specified | |||
control sequence to begin the closing handshake (detailed in | control sequence to begin the closing handshake (detailed in | |||
Section 4.5.1). Upon receiving such a frame, the other peer sends a | Section 4.5.1). Upon receiving such a frame, the other peer sends a | |||
close frame in response, if it hasn't already sent one. Upon | close frame in response, if it hasn't already sent one. Upon | |||
receiving _that_ control frame, the first peer then closes the | receiving _that_ control frame, the first peer then closes the | |||
connection, safe in the knowledge that no further data is | connection, safe in the knowledge that no further data is | |||
forthcoming. | forthcoming. | |||
After sending a control frame indicating the connection should be | After sending a control frame indicating the connection should be | |||
closed, a peer does not send any further data; after receiving a | closed, a peer does not send any further data; after receiving a | |||
control frame indicating the connection should be closed, a peer | control frame indicating the connection should be closed, a peer | |||
discards any further data received. | discards any further data received. | |||
It is safe for both peers to initiate this handshake simultaneously. | It is safe for both peers to initiate this handshake simultaneously. | |||
The closing handshake is intended to replace the TCP closing | The closing handshake is intended to complement the TCP closing | |||
handshake (FIN/ACK), on the basis that the TCP closing handshake is | handshake (FIN/ACK), on the basis that the TCP closing handshake is | |||
not always reliable end-to-end, especially in the presence of man-in- | not always reliable end-to-end, especially in the presence of man-in- | |||
the-middle proxies and other intermediaries. | the-middle proxies and other intermediaries. | |||
By sending a close frame and waiting for a close frame in response, | By sending a close frame and waiting for a close frame in response, | |||
certain cases are avoided where data may be unnecessarily lost. For | certain cases are avoided where data may be unnecessarily lost. For | |||
instance, on some platforms, if a socket is closed with data in the | instance, on some platforms, if a socket is closed with data in the | |||
receive queue, a RST packet is sent, which will then cause recv() to | receive queue, a RST packet is sent, which will then cause recv() to | |||
fail for the party that received the RST, even if there was data | fail for the party that received the RST, even if there was data | |||
waiting to be read. | waiting to be read. | |||
1.5. Design philosophy | 1.5. Design Philosophy | |||
_This section is non-normative._ | _This section is non-normative._ | |||
The WebSocket protocol is designed on the principle that there should | The WebSocket protocol is designed on the principle that there should | |||
be minimal framing (the only framing that exists is to make the | be minimal framing (the only framing that exists is to make the | |||
protocol frame-based instead of stream-based, and to support a | protocol frame-based instead of stream-based, and to support a | |||
distinction between Unicode text and binary frames). It is expected | distinction between Unicode text and binary frames). It is expected | |||
that metadata would be layered on top of WebSocket by the application | that metadata would be layered on top of WebSocket by the application | |||
layer, in the same way that metadata is layered on top of TCP by the | layer, in the same way that metadata is layered on top of TCP by the | |||
application layer (HTTP). | application layer (HTTP). | |||
Conceptually, WebSocket is really just a layer on top of TCP that | Conceptually, WebSocket is really just a layer on top of TCP that | |||
adds a Web "origin"-based security model for browsers; adds an | adds a Web "origin"-based security model for browsers; adds an | |||
addressing and protocol naming mechanism to support multiple services | addressing and protocol naming mechanism to support multiple services | |||
on one port and multiple host names on one IP address; layers a | on one port and multiple host names on one IP address; layers a | |||
framing mechanism on top of TCP to get back to the IP packet | framing mechanism on top of TCP to get back to the IP packet | |||
mechanism that TCP is built on, but without length limits; and re- | mechanism that TCP is built on, but without length limits; and | |||
implements the closing handshake in-band. Other than that, it adds | includes an additional closing handshake in-band that is designed to | |||
nothing. Basically it is intended to be as close to just exposing | work in the presence of proxies and other intermediaries. Other than | |||
raw TCP to script as possible given the constraints of the Web. It's | that, it adds nothing. Basically it is intended to be as close to | |||
also designed in such a way that its servers can share a port with | just exposing raw TCP to script as possible given the constraints of | |||
HTTP servers, by having its handshake be a valid HTTP Upgrade request | the Web. It's also designed in such a way that its servers can share | |||
mechanism also. | a port with HTTP servers, by having its handshake be a valid HTTP | |||
Upgrade request mechanism also. | ||||
The protocol is intended to be extensible; future versions will | The protocol is intended to be extensible; future versions will | |||
likely introduce additional concepts such as multiplexing. | likely introduce additional concepts such as multiplexing. | |||
1.6. Security model | 1.6. Security Model | |||
_This section is non-normative._ | _This section is non-normative._ | |||
The WebSocket protocol uses the origin model used by Web browsers to | The WebSocket protocol uses the origin model used by Web browsers to | |||
restrict which Web pages can contact a WebSocket server when the | restrict which Web pages can contact a WebSocket server when the | |||
WebSocket protocol is used from a Web page. Naturally, when the | WebSocket protocol is used from a Web page. Naturally, when the | |||
WebSocket protocol is used by a dedicated client directly (i.e. not | WebSocket protocol is used by a dedicated client directly (i.e. not | |||
from a Web page through a Web browser), the origin model is not | from a Web page through a Web browser), the origin model is not | |||
useful, as the client can provide any arbitrary origin string. | useful, as the client can provide any arbitrary origin string. | |||
skipping to change at page 11, line 5 | skipping to change at page 11, line 20 | |||
_This section is non-normative._ | _This section is non-normative._ | |||
The WebSocket protocol is an independent TCP-based protocol. Its | The WebSocket protocol is an independent TCP-based protocol. Its | |||
only relationship to HTTP is that its handshake is interpreted by | only relationship to HTTP is that its handshake is interpreted by | |||
HTTP servers as an Upgrade request. | HTTP servers as an Upgrade request. | |||
By default the WebSocket protocol uses port 80 for regular WebSocket | By default the WebSocket protocol uses port 80 for regular WebSocket | |||
connections and port 443 for WebSocket connections tunneled over TLS | connections and port 443 for WebSocket connections tunneled over TLS | |||
[RFC2818]. | [RFC2818]. | |||
1.8. Establishing a connection | 1.8. Establishing a Connection | |||
_This section is non-normative._ | _This section is non-normative._ | |||
When a connection is to be made to a port that is shared by an HTTP | When a connection is to be made to a port that is shared by an HTTP | |||
server (a situation that is quite likely to occur with traffic to | server (a situation that is quite likely to occur with traffic to | |||
ports 80 and 443), the connection will appear to the HTTP server to | ports 80 and 443), the connection will appear to the HTTP server to | |||
be a regular GET request with an Upgrade offer. In relatively simple | be a regular GET request with an Upgrade offer. In relatively simple | |||
setups with just one IP address and a single server for all traffic | setups with just one IP address and a single server for all traffic | |||
to a single hostname, this might allow a practical way for systems | to a single hostname, this might allow a practical way for systems | |||
based on the WebSocket protocol to be deployed. In more elaborate | based on the WebSocket protocol to be deployed. In more elaborate | |||
setups (e.g. with load balancers and multiple servers), a dedicated | setups (e.g. with load balancers and multiple servers), a dedicated | |||
set of hosts for WebSocket connections separate from the HTTP servers | set of hosts for WebSocket connections separate from the HTTP servers | |||
is probably easier to manage. At the time of writing of this | is probably easier to manage. At the time of writing of this | |||
specification, it should be noted that connections on port 80 and 443 | specification, it should be noted that connections on port 80 and 443 | |||
have significantly different success rates, with connections on port | have significantly different success rates, with connections on port | |||
443 being significantly more likely to succeed, though this may | 443 being significantly more likely to succeed, though this may | |||
change with time. | change with time. | |||
1.9. Subprotocols using the WebSocket protocol | 1.9. Subprotocols Using the WebSocket protocol | |||
_This section is non-normative._ | _This section is non-normative._ | |||
The client can request that the server use a specific subprotocol by | The client can request that the server use a specific subprotocol by | |||
including the |Sec-WebSocket-Protocol| field in its handshake. If it | including the |Sec-WebSocket-Protocol| field in its handshake. If it | |||
is specified, the server needs to include the same field and one of | is specified, the server needs to include the same field and one of | |||
the selected subprotocol values in its response for the connection to | the selected subprotocol values in its response for the connection to | |||
be established. | be established. | |||
These subprotocol names do not need to be registered, but if a | These subprotocol names should be registered as per Section 11.10. | |||
subprotocol is intended to be implemented by multiple independent | To avoid potential collisions, it is recommended to use names that | |||
WebSocket servers, potential clashes with the names of subprotocols | contain the domain name of the subprotocol's originator. For | |||
defined independently can be avoided by using names that contain the | example, if Example Corporation were to create a Chat subprotocol to | |||
domain name of the subprotocol's originator. For example, if Example | be implemented by many servers around the Web, they could name it | |||
Corporation were to create a Chat subprotocol to be implemented by | "chat.example.com". If the Example Organization called their | |||
many servers around the Web, they could name it "chat.example.com". | competing subprotocol "example.org's chat protocol", then the two | |||
If the Example Organization called their competing subprotocol | subprotocols could be implemented by servers simultaneously, with the | |||
"example.org's chat protocol", then the two subprotocols could be | server dynamically selecting which subprotocol to use based on the | |||
implemented by servers simultaneously, with the server dynamically | value sent by the client. | |||
selecting which subprotocol to use based on the value sent by the | ||||
client. | ||||
Subprotocols can be versioned in backwards-incompatible ways by | Subprotocols can be versioned in backwards-incompatible ways by | |||
changing the subprotocol name, e.g. going from "bookings.example.net" | changing the subprotocol name, e.g. going from "bookings.example.net" | |||
to "v2.bookings.example.net". These subprotocols would be considered | to "v2.bookings.example.net". These subprotocols would be considered | |||
completely separate by WebSocket clients. Backwards-compatible | completely separate by WebSocket clients. Backwards-compatible | |||
versioning can be implemented by reusing the same subprotocol string | versioning can be implemented by reusing the same subprotocol string | |||
but carefully designing the actual subprotocol to support this kind | but carefully designing the actual subprotocol to support this kind | |||
of extensibility. | of extensibility. | |||
2. Conformance requirements | 2. Conformance Requirements | |||
All diagrams, examples, and notes in this specification are non- | All diagrams, examples, and notes in this specification are non- | |||
normative, as are all sections explicitly marked non-normative. | normative, as are all sections explicitly marked non-normative. | |||
Everything else in this specification is normative. | Everything else in this specification is normative. | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", | |||
"RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this | "RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this | |||
document are to be interpreted as described in RFC2119. [RFC2119] | document are to be interpreted as described in RFC2119. [RFC2119] | |||
Requirements phrased in the imperative as part of algorithms (such as | Requirements phrased in the imperative as part of algorithms (such as | |||
skipping to change at page 13, line 31 | skipping to change at page 13, line 31 | |||
be implemented in any manner, so long as the end result is | be implemented in any manner, so long as the end result is | |||
equivalent. (In particular, the algorithms defined in this | equivalent. (In particular, the algorithms defined in this | |||
specification are intended to be easy to follow, and not intended to | specification are intended to be easy to follow, and not intended to | |||
be performant.) | be performant.) | |||
Implementations MAY impose implementation-specific limits on | Implementations MAY impose implementation-specific limits on | |||
otherwise unconstrained inputs, e.g. to prevent denial of service | otherwise unconstrained inputs, e.g. to prevent denial of service | |||
attacks, to guard against running out of memory, or to work around | attacks, to guard against running out of memory, or to work around | |||
platform-specific limitations. | platform-specific limitations. | |||
The conformance classes defined by this specification are user agents | The conformance classes defined by this specification are clients and | |||
and servers. | servers. | |||
2.1. Terminology | 2.1. Terminology | |||
*ASCII* shall mean the character-encoding scheme defined in | _ASCII_ shall mean the character-encoding scheme defined in | |||
[ANSI.X3-4.1986]. | [ANSI.X3-4.1986]. | |||
*Converting a string to ASCII lowercase* means replacing all | This document makes reference to UTF-8 values and uses UTF-8 | |||
notational formats as defined in STD 63 [RFC3629]. | ||||
Key Terms such as named algorithms or definitions are indicated like | ||||
_this_. | ||||
Names of headers or variables are indicated like |this|. | ||||
Variable values are indicated like /this/. | ||||
_Converting a string to ASCII lowercase_ means replacing all | ||||
characters in the range U+0041 to U+005A (i.e. LATIN CAPITAL LETTER | characters in the range U+0041 to U+005A (i.e. LATIN CAPITAL LETTER | |||
A to LATIN CAPITAL LETTER Z) with the corresponding characters in the | A to LATIN CAPITAL LETTER Z) with the corresponding characters in the | |||
range U+0061 to U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL | range U+0061 to U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL | |||
LETTER Z). | LETTER Z). | |||
Comparing two strings in an *ASCII case-insensitive* manner means | Comparing two strings in an _ASCII case-insensitive_ manner means | |||
comparing them exactly, code point for code point, except that the | comparing them exactly, code point for code point, except that the | |||
characters in the range U+0041 to U+005A (i.e. LATIN CAPITAL LETTER | characters in the range U+0041 to U+005A (i.e. LATIN CAPITAL LETTER | |||
A to LATIN CAPITAL LETTER Z) and the corresponding characters in the | A to LATIN CAPITAL LETTER Z) and the corresponding characters in the | |||
range U+0061 to U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL | range U+0061 to U+007A (i.e. LATIN SMALL LETTER A to LATIN SMALL | |||
LETTER Z) are considered to also match. | LETTER Z) are considered to also match. | |||
The term "URI" is used in this document as defined in [RFC3986]. | The term "URI" is used in this document as defined in [RFC3986]. | |||
When an implementation is required to _send_ data as part of the | When an implementation is required to _send_ data as part of the | |||
WebSocket protocol, the implementation MAY delay the actual | WebSocket protocol, the implementation MAY delay the actual | |||
transmission arbitrarily, e.g. buffering data so as to send fewer IP | transmission arbitrarily, e.g. buffering data so as to send fewer IP | |||
packets. | packets. | |||
3. WebSocket URIs | 3. WebSocket URIs | |||
3.1. Parsing WebSocket URIs | This specification defines two URI schemes, using the ABNF syntax | |||
defined in RFC 5234 [RFC5234], and terminology and ABNF productions | ||||
The steps to *parse a WebSocket URI's components* from a string /uri/ | defined by the URI specification RFC 3986 [RFC3986]. | |||
are as follows. These steps return either a /host/, a /port/, a | ||||
/resource name/, and a /secure/ flag, or they fail. | ||||
1. If the /uri/ string is not an absolute URI, then fail this | ||||
algorithm. [RFC3986] | ||||
2. Resolve the /uri/ string using the resolve a Web address | ||||
algorithm defined by the Web addresses specification, with the | ||||
URI character encoding set to UTF-8. [RFC3629] [RFC3986] | ||||
[RFC3987] | ||||
NOTE: It doesn't matter what it is resolved relative to, since | ||||
we already know it is an absolute URI at this point. | ||||
3. If /uri/ does not have a <scheme> component whose value, when | ||||
converted to ASCII lowercase, is either "ws" or "wss", then fail | ||||
this algorithm. | ||||
4. If /uri/ has a <fragment> component, then fail this algorithm. | ||||
5. If the <scheme> component of /uri/ is "ws", set /secure/ to | ||||
false; otherwise, if the <scheme> component is "wss", set | ||||
/secure/ to true; if neither of the above apply, fail this | ||||
algorithm. | ||||
6. Let /host/ be the value of the <host> component of /uri/, | ||||
converted to ASCII lowercase. | ||||
7. If /uri/ has a <port> component, then let /port/ be that | ||||
component's value; otherwise, there is no explicit /port/. | ||||
8. If there is no explicit /port/, then: if /secure/ is false, let | ||||
/port/ be 80, otherwise let /port/ be 443. | ||||
9. Let /resource name/ be the value of the <path> component (which | ||||
might be empty) of /uri/. | ||||
10. If /resource name/ is the empty string, set it to a single | ||||
character U+002F SOLIDUS (/). | ||||
11. If /uri/ has a <query> component, then append a single U+003F | ||||
QUESTION MARK character (?) to /resource name/, followed by the | ||||
value of the <query> component. | ||||
12. Return /host/, /port/, /resource name/, and /secure/. | ||||
3.2. Constructing WebSocket URIs | ||||
The steps to *construct a WebSocket URI* from a /host/, a /port/, a | ||||
/resource name/, and a /secure/ flag, are as follows: | ||||
1. Let /uri/ be the empty string. | ||||
2. If the /secure/ flag is false, then append the string "ws://" to | ||||
/uri/. Otherwise, append the string "wss://" to /uri/. | ||||
3. Append /host/ to /uri/. | ||||
4. If the /secure/ flag is false and port is not 80, or if the | ||||
/secure/ flag is true and port is not 443, then append the string | ||||
":" followed by /port/ to /uri/. | ||||
5. Append /resource name/ to /uri/. | ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ] | |||
wss-URI = "ws:" "//" host [ ":" port ] path [ "?" query ] | ||||
6. Return /uri/. | host = <host, defined in [RFC3986], Section 3.2.2> | |||
port = <host, defined in [RFC3986], Section 3.2.3> | ||||
path = <path-abempty, defined in [RFC3986], Section 3.3> | ||||
query = <query, defined in [RFC3986], Section 3.4> | ||||
3.3. Valid WebSocket URIs | The port component is OPTIONAL; the default for "ws" is port 80, | |||
while the default for "wss" is port 443. | ||||
For a WebSocket URI to be considered valid, the following conditions | The URI is called "secure" if the scheme component matches "wss" | |||
MUST hold. | case-insensitively. | |||
o The /host/ MUST be ASCII-only (i.e. it MUST have been punycode- | The "resource-name" can be constructed by concatenating | |||
encoded [RFC3492] already if necessary, and MUST NOT contain any | ||||
characters above U+007E). | ||||
o The /resource name/ string MUST be a non-empty string of | "/" if the path component is empty | |||
characters in the range U+0021 to U+007E and MUST start with a | the path component | |||
U+002F SOLIDUS character (/). | "?" if the query component is non-empty | |||
the query component | ||||
Any WebSocket URIs not meeting the above criteria are considered | Fragment identifiers are meaningless in the context of WebSocket | |||
invalid. A client MUST NOT attempt to make a connection to an | URIs, and MUST NOT be used on these URIs. The character "#" in URIs | |||
invalid WebSocket URI. A client SHOULD attempt to parse a URI | MUST be escaped as %23 if used as part of the query component. | |||
obtained from any external source (such as a web site or a user) | ||||
using the steps specified in Section 3.1 to obtain a valid WebSocket | ||||
URI, but MUST NOT attempt to connect with such an unparsed URI, and | ||||
instead only use the parsed version and only if that version is | ||||
considered valid by the criteria above. | ||||
4. Data Framing | 4. Data Framing | |||
4.1. Overview | 4.1. Overview | |||
In the WebSocket protocol, data is transmitted using a sequence of | In the WebSocket protocol, data is transmitted using a sequence of | |||
frames. Frames sent from the client to the server are masked to | frames. Frames sent from the client to the server are masked to | |||
avoid confusing network intermediaries, such as intercepting proxies. | avoid confusing network intermediaries, such as intercepting proxies. | |||
Frames sent from the server to the client are not masked. | Frames sent from the server to the client are not masked. | |||
The base framing protocol defines a frame type with an opcode, a | The base framing protocol defines a frame type with an opcode, a | |||
payload length, and designated locations for extension and | payload length, and designated locations for extension and | |||
application data, which together define the _payload_ data. Certain | application data, which together define the _payload_ data. Certain | |||
bits and opcodes are reserved for future expansion of the protocol. | bits and opcodes are reserved for future expansion of the protocol. | |||
As such, in the absence of extensions negotiated during the opening | ||||
handshake (Section 5), all reserved bits MUST be 0 and reserved | ||||
opcode values MUST NOT be used. | ||||
A data frame MAY be transmitted by either the client or the server at | A data frame MAY be transmitted by either the client or the server at | |||
any time after handshake completion and before that endpoint has sent | any time after opening handshake completion and before that endpoint | |||
a close message (Section 4.5.1). | has sent a close frame (Section 4.5.1). | |||
4.2. Base Framing Protocol | 4.2. Base Framing Protocol | |||
This wire format for the data transfer part is described by the ABNF | This wire format for the data transfer part is described by the ABNF | |||
[RFC5234] given in detail in this section. A high level overview of | [RFC5234] given in detail in this section. A high level overview of | |||
the framing is given in the following figure. | the framing is given in the following figure. | |||
0 1 2 3 | 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 | 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 | |||
+-+-+-+-+-------+-+-------------+-------------------------------+ | +-+-+-+-+-------+-+-------------+-------------------------------+ | |||
skipping to change at page 18, line 12 | skipping to change at page 17, line 12 | |||
| Payload Data continued ... | | | Payload Data continued ... | | |||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | |||
FIN: 1 bit | FIN: 1 bit | |||
Indicates that this is the final fragment in a message. The first | Indicates that this is the final fragment in a message. The first | |||
fragment MAY also be the final fragment. | fragment MAY also be the final fragment. | |||
RSV1, RSV2, RSV3: 1 bit each | RSV1, RSV2, RSV3: 1 bit each | |||
Must be 0 unless an extension is negotiated which defines meanings | MUST be 0 unless an extension is negotiated which defines meanings | |||
for non-zero values | for non-zero values. If a nonzero value is received and none of | |||
the negotiated extensions defines the meaning of such a nonzero | ||||
value, the receiving endpoint MUST ignore that value. | ||||
Opcode: 4 bits | Opcode: 4 bits | |||
Defines the interpretation of the payload data | Defines the interpretation of the payload data. If an unknown | |||
opcode is received, the receiving endpoint MUST ignore that frame. | ||||
The following values are defined. | ||||
* %x0 denotes a continuation frame | ||||
* %x1 denotes a text frame | ||||
* %x2 denotes a binary frame | ||||
* %x3-7 are reserved for further non-control frames | ||||
* %x8 denotes a connection close | ||||
* %x9 denotes a ping | ||||
* %xA denotes a pong | ||||
* %xB-F are reserved for further control frames | ||||
Mask: 1 bit | Mask: 1 bit | |||
Defines whether the payload data is masked. If set to 1, a | Defines whether the payload data is masked. If set to 1, a | |||
masking key is present in Masking-key, and this is used to unmask | masking key is present in masking-key, and this is used to unmask | |||
the payload data as per Section 4.3. All frames sent from client | the payload data as per Section 4.3. All frames sent from client | |||
to server have this bit set to 1. | to server have this bit set to 1. | |||
Payload length: 7 bits, 7+16 bits, or 7+64 bits | Payload length: 7 bits, 7+16 bits, or 7+64 bits | |||
The length of the payload: if 0-125, that is the payload length. | The length of the payload data, in bytes: if 0-125, that is the | |||
If 126, the following 2 bytes interpreted as a 16 bit unsigned | payload length. If 126, the following 2 bytes interpreted as a 16 | |||
integer are the payload length. If 127, the following 8 bytes | bit unsigned integer are the payload length. If 127, the | |||
interpreted as a 64-bit unsigned integer (the most significant bit | following 8 bytes interpreted as a 64-bit unsigned integer (the | |||
MUST be 0) are the payload length. Multibyte length quantities | most significant bit MUST be 0) are the payload length. Multibyte | |||
are expressed in network byte order. The payload length is the | length quantities are expressed in network byte order. The | |||
length of the Extension data + the length of the Application data. | payload length is the length of the extension data + the length of | |||
The length of the Extension data may be zero, in which case the | the application data. The length of the extension data may be | |||
Payload length is the length of the Application data. The length | zero, in which case the payload length is the length of the | |||
of this field is always at least 7 bits. If the value of the | application data. | |||
first 7 bits is 0-125, the length of this field is 7 bits. If the | ||||
value is 126, there exist 16 additional bits with a 16-bit length. | ||||
If the value is 127, there exist 64 additional bits with a 63-bit | ||||
length (the most significant bit MUST be 0). | ||||
Masking-key: 0 or 4 bytes | Masking-key: 0 or 4 bytes | |||
All frames sent from the client to the server are masked by a 32- | All frames sent from the client to the server are masked by a 32- | |||
bit value that is contained within the frame. This field is | bit value that is contained within the frame. This field is | |||
present if the Mask bit is set to 1, and is absent if the Mask bit | present if the mask bit is set to 1, and is absent if the mask bit | |||
is set to 0. See Section 4.3 for further information on client- | is set to 0. See Section 4.3 for further information on client- | |||
to-server masking. | to-server masking. | |||
Payload data: n bytes | Payload data: (x+y) bytes | |||
The payload data is defined as Extension Data concatenated with | The payload data is defined as extension data concatenated with | |||
Application Data. | application data. | |||
Extension data: n bytes | Extension data: x bytes | |||
The extension data is 0 bytes unless an extension has been | The extension data is 0 bytes unless an extension has been | |||
negotiated. Any extension MUST specify the length of the | negotiated. Any extension MUST specify the length of the | |||
extension data, or how that length may be calculated, and how the | extension data, or how that length may be calculated, and how the | |||
extension use MUST be negotiated during the handshake. If | extension use MUST be negotiated during the opening handshake. If | |||
present, the extension data is included in the total payload | present, the extension data is included in the total payload | |||
length. | length. | |||
Application data: n bytes | Application data: y bytes | |||
Arbitrary application data, taking up the remainder of the frame | Arbitrary application data, taking up the remainder of the frame | |||
after any extension data. The length of the Application data is | after any extension data. The length of the application data is | |||
equal to the payload length minus the length of the Extension | equal to the payload length minus the length of the extension | |||
data. | data. | |||
The base framing protocol is formally defined by the following ABNF | The base framing protocol is formally defined by the following ABNF | |||
[RFC5234]: | [RFC5234]: | |||
ws-frame = frame-fin | ws-frame = frame-fin | |||
frame-rsv1 | frame-rsv1 | |||
frame-rsv2 | frame-rsv2 | |||
frame-rsv3 | frame-rsv3 | |||
frame-opcode | frame-opcode | |||
frame-masked | frame-masked | |||
frame-payload-length | frame-payload-length | |||
[ frame-masking-key ] | [ frame-masking-key ] | |||
frame-payload-data | frame-payload-data | |||
frame-fin = %x0 ; more frames of this message follow | frame-fin = %x0 ; more frames of this message follow | |||
/ %x1 ; final frame of message | / %x1 ; final frame of this message | |||
frame-rsv1 = %x0 ; 1 bit, MUST be 0 | frame-rsv1 = %x0 ; 1 bit, MUST be 0 | |||
frame-rsv2 = %x0 ; 1 bit, MUST be 0 | frame-rsv2 = %x0 ; 1 bit, MUST be 0 | |||
frame-rsv3 = %x0 ; 1 bit, MUST be 0 | frame-rsv3 = %x0 ; 1 bit, MUST be 0 | |||
frame-opcode = %x0 ; continuation frame | frame-opcode = %x0 ; continuation frame | |||
/ %x1 ; text frame | / %x1 ; text frame | |||
/ %x2 ; binary frame | / %x2 ; binary frame | |||
/ %3-7 ; reserved for further non-control frames | / %x3-7 ; reserved for further non-control frames | |||
/ %x8 ; connection close | / %x8 ; connection close | |||
/ %x9 ; ping | / %x9 ; ping | |||
/ %xA ; pong | / %xA ; pong | |||
/ %xB-F ; reserved for further control frames | / %xB-F ; reserved for further control frames | |||
frame-masked = %x0 ; frame is not masked, no frame-masking-key | frame-masked = %x0 ; frame is not masked, no frame-masking-key | |||
= %x1 ; frame is masked, frame-masking-key present | / %x1 ; frame is masked, frame-masking-key present | |||
frame-payload-length = %x00-7D | frame-payload-length = %x00-7D | |||
/ %x7E frame-payload-length-16 | / %x7E frame-payload-length-16 | |||
/ %x7F frame-payload-length-63 | / %x7F frame-payload-length-63 | |||
frame-payload-length-16 = %x0000-FFFF | frame-payload-length-16 = %x0000-FFFF | |||
frame-payload-length-63 = %x0000000000000000-7FFFFFFFFFFFFFFF | frame-payload-length-63 = %x0000000000000000-7FFFFFFFFFFFFFFF | |||
frame-masking-key = <4>( %0x00-FF ) ; present only if frame-masked is 1 | frame-masking-key = 4( %0x00-FF ) ; present only if frame-masked is 1 | |||
frame-payload-data = (frame-masked-extension-data | frame-payload-data = (frame-masked-extension-data | |||
frame-masked-application-data) ; frame-masked 1 | frame-masked-application-data) ; frame-masked 1 | |||
/ (frame-unmasked-extension-data | / (frame-unmasked-extension-data | |||
frame-unmasked-application-data) ; frame-masked 0 | frame-unmasked-application-data) ; frame-masked 0 | |||
frame-masked-extension-data = *( %x00-FF ) ; to be defined later | frame-masked-extension-data = *( %x00-FF ) ; to be defined later | |||
frame-masked-application-data = *( %x00-FF ) | frame-masked-application-data = *( %x00-FF ) | |||
skipping to change at page 21, line 4 | skipping to change at page 20, line 23 | |||
in Section 4.2. | in Section 4.2. | |||
The masking key is contained completely within the frame, as defined | The masking key is contained completely within the frame, as defined | |||
in Section 4.2 as frame-masking-key. It is used to mask the payload | in Section 4.2 as frame-masking-key. It is used to mask the payload | |||
data defined in the same section as frame-payload-data, which | data defined in the same section as frame-payload-data, which | |||
includes extension and application data. | includes extension and application data. | |||
The masking key is a 32-bit value chosen at random by the client. | The masking key is a 32-bit value chosen at random by the client. | |||
The masking key MUST be derived from a strong source of entropy, and | The masking key MUST be derived from a strong source of entropy, and | |||
the masking key for a given frame MUST NOT make it simple for a | the masking key for a given frame MUST NOT make it simple for a | |||
server to predict the masking key for a subsequent frame. | server to predict the masking key for a subsequent frame. RFC 4086 | |||
[RFC4086] discusses what entails a suitable source of entropy for | ||||
security-sensitive applications. | ||||
The masking does not affect the length of the payload data. To | The masking does not affect the length of the payload data. To | |||
convert masked data into unmasked data, or vice versa, the following | convert masked data into unmasked data, or vice versa, the following | |||
algorithm is applied. The same algorithm applies regardless of the | algorithm is applied. The same algorithm applies regardless of the | |||
direction of the translation - e.g. the same steps are applied to | direction of the translation - e.g. the same steps are applied to | |||
mask the data as to unmask the data. | mask the data as to unmask the data. | |||
Octet i of the transformed data ("transformed-octet-i") is the XOR of | Octet i of the transformed data ("transformed-octet-i") is the XOR of | |||
octet i of the original data ("original-octet-i") with octet i modulo | octet i of the original data ("original-octet-i") with octet i modulo | |||
4 of the masking key ("masking-key-octet-j"): | 4 of the masking key ("masking-key-octet-j"): | |||
j = i MOD 4 | j = i MOD 4 | |||
transformed-octet-i = original-octet-i XOR masking-key-octet-j | transformed-octet-i = original-octet-i XOR masking-key-octet-j | |||
When preparing a masked frame, the client MUST pick a fresh masking | When preparing a masked frame, the client MUST pick a fresh masking | |||
key uniformly at random from the set of allowed 32-bit values. The | key uniformly at random from the set of allowed 32-bit values. The | |||
unpredictability of the masking-nonce is essential to prevent the | unpredictability of the masking key is essential to prevent the | |||
author of malicious application data from selecting the bytes that | author of malicious applications from selecting the bytes that appear | |||
appear on the wire. | on the wire. | |||
The payload length, indicated in the framing as frame-payload-length, | The payload length, indicated in the framing as frame-payload-length, | |||
does NOT include the length of the masking key. It is the length of | does NOT include the length of the masking key. It is the length of | |||
the payload data, e.g. the number of bytes following the masking key. | the payload data, e.g. the number of bytes following the masking key. | |||
4.4. Fragmentation | 4.4. Fragmentation | |||
The primary purpose of fragmentation is to allow sending a message | The primary purpose of fragmentation is to allow sending a message | |||
that is of unknown size when the message is started without having to | that is of unknown size when the message is started without having to | |||
buffer that message. If messages couldn't be fragmented, then an | buffer that message. If messages couldn't be fragmented, then an | |||
skipping to change at page 22, line 8 | skipping to change at page 21, line 29 | |||
channel. | channel. | |||
The following rules apply to fragmentation: | The following rules apply to fragmentation: | |||
o An unfragmented message consists of a single frame with the FIN | o An unfragmented message consists of a single frame with the FIN | |||
bit set and an opcode other than 0. | bit set and an opcode other than 0. | |||
o A fragmented message consists of a single frame with the FIN bit | o A fragmented message consists of a single frame with the FIN bit | |||
clear and an opcode other than 0, followed by zero or more frames | clear and an opcode other than 0, followed by zero or more frames | |||
with the FIN bit clear and the opcode set to 0, and terminated by | with the FIN bit clear and the opcode set to 0, and terminated by | |||
a single frame with the FIN bit set and an opcode of 0. Its | a single frame with the FIN bit set and an opcode of 0. A | |||
content is the concatenation of the application data (and any | fragmented message is conceptually equivalent to a single larger | |||
extension data that may be present) from each of those frames in | message whose payload is equal to the concatenation of the | |||
order. As an example, for a text message sent as three fragments, | payloads of the fragments in order, however in the presence of | |||
the first fragment would have an opcode of 0x4 and a FIN bit | extensions this may not hold true as the extension defines the | |||
clear, the second fragment would have an opcode of 0x0 and a FIN | interpretation of the extension data present. For instance, | |||
bit clear, and the third fragment would have an opcode of 0x0 and | extension data may only be present at the beginning of the first | |||
a FIN bit that is set. | fragment and apply to subsequent fragments, or there may be | |||
extension data present in each of the fragments that applies only | ||||
to that particular fragment. Setting aside the issue of | ||||
extensions, the following example demonstrates how fragmentation | ||||
works. | ||||
o EXAMPLE: For a text message sent as three fragments, the first | ||||
fragment would have an opcode of 0x1 and a FIN bit clear, the | ||||
second fragment would have an opcode of 0x0 and a FIN bit clear, | ||||
and the third fragment would have an opcode of 0x0 and a FIN bit | ||||
that is set. | ||||
o Control frames MAY be injected in the middle of a fragmented | o Control frames MAY be injected in the middle of a fragmented | |||
message. Control frames themselves MUST NOT be fragmented. | message. Control frames themselves MUST NOT be fragmented. | |||
o Message fragments MUST be delivered to the recipient in the order | ||||
sent by the sender. | ||||
o An endpoint MUST be capable of handling control frames in the | o An endpoint MUST be capable of handling control frames in the | |||
middle of a fragmented message. | middle of a fragmented message. | |||
o _Note: if control frames could not be interjected, the latency of | o _Note: if control frames could not be interjected, the latency of | |||
a ping, for example, would be very long if behind a large message. | a ping, for example, would be very long if behind a large message. | |||
Hence, the requirement of handling control frames in the middle of | Hence, the requirement of handling control frames in the middle of | |||
a fragmented message._ | a fragmented message._ | |||
o A sender MAY create fragments of any size for non control | o A sender MAY create fragments of any size for non-control | |||
messages. | messages. | |||
o Clients and servers MUST support receiving both fragmented and | o Clients and servers MUST support receiving both fragmented and | |||
unfragmented messages. | unfragmented messages. | |||
o As control frames cannot be fragmented, an intermediary MUST NOT | o As control frames cannot be fragmented, an intermediary MUST NOT | |||
attempt to change the fragmentation of a control frame. | attempt to change the fragmentation of a control frame. | |||
o An intermediary MUST NOT change the fragmentation of a message if | o An intermediary MUST NOT change the fragmentation of a message if | |||
any reserved bit values are used and the meaning of these values | any reserved bit values are used and the meaning of these values | |||
skipping to change at page 23, line 12 | skipping to change at page 22, line 44 | |||
a message MUST be either text or binary, or one of the reserved | a message MUST be either text or binary, or one of the reserved | |||
opcodes. | opcodes. | |||
4.5. Control Frames | 4.5. Control Frames | |||
Control frames are identified by opcodes where the most significant | Control frames are identified by opcodes where the most significant | |||
bit of the opcode is 1. Currently defined opcodes for control frames | bit of the opcode is 1. Currently defined opcodes for control frames | |||
include 0x8 (Close), 0x9 (Ping), and 0xA (Pong). Opcodes 0xB-0xF are | include 0x8 (Close), 0x9 (Ping), and 0xA (Pong). Opcodes 0xB-0xF are | |||
reserved for further control frames yet to be defined. | reserved for further control frames yet to be defined. | |||
Control frames are used to communicate state about the websocket. | Control frames are used to communicate state about the WebSocket. | |||
Control frames can be interjected in the middle of a fragmented | Control frames can be interjected in the middle of a fragmented | |||
message. | message. | |||
All control frames MUST have a payload length of 125 bytes or less | All control frames MUST have a payload length of 125 bytes or less | |||
and MUST NOT be fragmented. | and MUST NOT be fragmented. | |||
4.5.1. Close | 4.5.1. Close | |||
The Close message contains an opcode of 0x8. | The Close frame contains an opcode of 0x8. | |||
The Close message MAY contain a body (the "application data" portion | The Close frame MAY contain a body (the "application data" portion of | |||
of the frame) that indicates a reason for closing, such as an | the frame) that indicates a reason for closing, such as an endpoint | |||
endpoint shutting down, an endpoint having received a message too | shutting down, an endpoint having received a frame too large, or an | |||
large, or an endpoint having received a message that does not conform | endpoint having received a frame that does not conform to the format | |||
to the format expected by the other endpoint. If there is a body, | expected by the other endpoint. If there is a body, the first two | |||
the first two bytes of the body MUST be a 2-byte integer (in network | bytes of the body MUST be a 2-byte unsigned integer (in network byte | |||
byte order) representing a status code defined in Section 7.4. | order) representing a status code with value /code/ defined in | |||
Following the 2-byte integer the body MAY contain UTF-8 encoded data, | Section 7.4. Following the 2-byte integer the body MAY contain UTF-8 | |||
the interpretation of which is not defined by this specification. | encoded data with value /reason/, the interpretation of which is not | |||
This data is not necessarily human readable, but may be useful for | defined by this specification. This data is not necessarily human | |||
debugging or passing information relevant to the script that opened | readable, but may be useful for debugging or passing information | |||
the connection. | relevant to the script that opened the connection. | |||
The application MUST NOT send any more data frames after sending a | The application MUST NOT send any more data frames after sending a | |||
close message. | close frame. | |||
If an endpoint receives a Close message and that endpoint did not | If an endpoint receives a Close frame and that endpoint did not | |||
previously send a Close message, the endpoint MUST send a Close | previously send a Close frame, the endpoint MUST send a Close frame | |||
message in response. It SHOULD do so as soon as is practical. | in response. It SHOULD do so as soon as is practical. An endpoint | |||
MAY delay sending a close frame until its current message is sent | ||||
(for instance, if the majority of a fragmented message is already | ||||
sent, an endpoint MAY send the remaining fragments before sending a | ||||
Close frame). However, there is no guarantee that the endpoint which | ||||
has already sent a Close frame will continue to process data. | ||||
After both sending and receiving a close message, an endpoint | After both sending and receiving a close message, an endpoint | |||
considers the websocket connection closed, and SHOULD close the | considers the WebSocket connection closed, and MUST close the | |||
underlying TCP connection. | underlying TCP connection. The server MUST close the underlying TCP | |||
connection immediately; the client SHOULD wait for the server to | ||||
close the connection but MAY close the connection at any time after | ||||
sending and receiving a close message, e.g. if it has not received a | ||||
TCP close from the server in a reasonable time period. | ||||
If a client and server both send a Close message at the same time, | If a client and server both send a Close message at the same time, | |||
both endpoints will have sent and received a Close message and should | both endpoints will have sent and received a Close message and should | |||
consider the websocket connection closed and close the underlying TCP | consider the WebSocket connection closed and close the underlying TCP | |||
connection. | connection. | |||
4.5.2. Ping | 4.5.2. Ping | |||
The Ping message contains an opcode of 0x9. | The Ping frame contains an opcode of 0x9. | |||
Upon receipt of a Ping message, an endpoint MUST send a Pong message | Upon receipt of a Ping frame, an endpoint MUST send a Pong frame in | |||
in response. It SHOULD do so as soon as is practical. The message | response. It SHOULD do so as soon as is practical. Pong frames are | |||
bodies (i.e. both the Extension data (if any) and the Application | discussed in Section 4.5.3. | |||
data) of the Ping and Pong MUST be the same. | ||||
An endpoint MAY send a Ping message any time after the connection is | An endpoint MAY send a Ping frame any time after the connection is | |||
established and before the connection is closed. NOTE: A ping | established and before the connection is closed. NOTE: A ping frame | |||
message may serve either as a keepalive, or to verify that the remote | may serve either as a keepalive, or to verify that the remote | |||
endpoint is still responsive. | endpoint is still responsive. | |||
4.5.3. Pong | 4.5.3. Pong | |||
The Pong message contains an opcode of 0xA. | The Pong frame contains an opcode of 0xA. | |||
Upon receipt of a Ping message, an endpoint MUST send a Pong message | Section 4.5.2 details requirements that apply to both Ping and Pong | |||
in response. It SHOULD do so as soon as is practical. The message | frames. | |||
bodies (i.e. both the Extension data (if any) and the Application | ||||
data) of the Ping and Pong MUST be the same. In the case multiple | ||||
Pings have been received, a Pong MUST be issued only in response to | ||||
the most recent Ping. | ||||
A Pong message MAY be sent unsolicited. This serves as a | A Pong frame sent in response to a Ping frame must have identical | |||
Application Data as found in the message body of the Ping frame being | ||||
replied to. | ||||
If an endpoint receives a Ping frame and has not yet sent Pong | ||||
frame(s) in response to previous Ping frame(s), the endpoint MAY | ||||
elect to send a Pong frame for only the most recently processed Ping | ||||
frame. | ||||
A Pong frame MAY be sent unsolicited. This serves as a | ||||
unidirectional heartbeat. A response to an unsolicited pong is not | unidirectional heartbeat. A response to an unsolicited pong is not | |||
expected. | expected. | |||
4.6. Data Frames | 4.6. Data Frames | |||
Data frames (e.g. non control frames) are identified by opcodes where | Data frames (e.g. non-control frames) are identified by opcodes where | |||
the most significant bit of the opcode is 0. Currently defined | the most significant bit of the opcode is 0. Currently defined | |||
opcodes for data frames include 0x1 (Text), 0x2 (Binary). Opcodes | opcodes for data frames include 0x1 (Text), 0x2 (Binary). Opcodes | |||
0x3-0x7 are reserved for further non-control frames yet to be | 0x3-0x7 are reserved for further non-control frames yet to be | |||
defined. | defined. | |||
Data frames carry application-layer or extension-layer data. The | Data frames carry application-layer or extension-layer data. The | |||
opcode determines the interpretation of the data: | opcode determines the interpretation of the data: | |||
Text | Text | |||
skipping to change at page 25, line 44 | skipping to change at page 25, line 44 | |||
* 0x82 0x7E 0x0100 [256 bytes of binary data] | * 0x82 0x7E 0x0100 [256 bytes of binary data] | |||
o 64KiB binary message in a single unmasked frame | o 64KiB binary message in a single unmasked frame | |||
* 0x82 0x7F 0x0000000000010000 [65536 bytes of binary data] | * 0x82 0x7F 0x0000000000010000 [65536 bytes of binary data] | |||
4.8. Extensibility | 4.8. Extensibility | |||
The protocol is designed to allow for extensions, which will add | The protocol is designed to allow for extensions, which will add | |||
capabilities to the base protocols. The endpoints of a connection | capabilities to the base protocols. The endpoints of a connection | |||
MUST negotiate the use of any extensions during the handshake. This | MUST negotiate the use of any extensions during the opening | |||
specification provides opcodes 0x3 through 0x7 and 0xB through 0xF, | handshake. This specification provides opcodes 0x3 through 0x7 and | |||
the extension data field, and the frame-rsv1, frame-rsv2, and frame- | 0xB through 0xF, the extension data field, and the frame-rsv1, frame- | |||
rsv3 bits of the frame header for use by extensions. The negotiation | rsv2, and frame-rsv3 bits of the frame header for use by extensions. | |||
of extensions is discussed in further detail in Section 8.1. Below | The negotiation of extensions is discussed in further detail in | |||
are some anticipated uses of extensions. This list is neither | Section 9.1. Below are some anticipated uses of extensions. This | |||
complete nor proscriptive. | list is neither complete nor proscriptive. | |||
o Extension data may be placed in the payload before the application | o Extension data may be placed in the payload data before the | |||
data. | application data. | |||
o Reserved bits can be allocated for per-frame needs. | o Reserved bits can be allocated for per-frame needs. | |||
o Reserved opcode values can be defined. | o Reserved opcode values can be defined. | |||
o Reserved bits can be allocated to the opcode field if more opcode | o Reserved bits can be allocated to the opcode field if more opcode | |||
values are needed. | values are needed. | |||
o A reserved bit or an "extension" opcode can be defined which | o A reserved bit or an "extension" opcode can be defined which | |||
allocates additional bits out of the payload area to define larger | allocates additional bits out of the payload data to define larger | |||
opcodes or more per-frame bits. | opcodes or more per-frame bits. | |||
5. Opening Handshake | 5. Opening Handshake | |||
5.1. Client Requirements | 5.1. Client Requirements | |||
User agents running in controlled environments, e.g. browsers on | To _Establish a WebSocket Connection_, a client opens a connection | |||
mobile handsets tied to specific carriers, may offload the management | and sends a handshake as defined in this section. A connection is | |||
of the connection to another agent on the network. In such a | defined to initially be in a CONNECTING state. A client will need to | |||
situation, the user agent for the purposes of conformance is | supply a /host/, /port/, /resource name/, and a /secure/ flag, which | |||
considered to include both the handset software and any such agents. | are the components of a WebSocket URI as discussed in Section 3, | |||
along with a list of /protocols/ and /extensions/ to be used. | ||||
Additionally, if the client is a web browser, an /origin/ MUST be | ||||
supplied. | ||||
When the user agent is to *establish a WebSocket connection* given | Clients running in controlled environments, e.g. browsers on mobile | |||
either a WebSocket URI /uri/ or the constituent components of a URI | handsets tied to specific carriers, may offload the management of the | |||
as specified in Section 11, it MUST meet the following requirements. | connection to another agent on the network. In such a situation, the | |||
In the following text, we will use terms from Section 3 such as | client for the purposes of conformance is considered to include both | |||
"/host/" and "/secure/ flag" as defined in that section. | the handset software and any such agents. | |||
1. The WebSocket URI and its components derived by applying the | When the client is to _Establish a WebSocket Connection_ given a set | |||
steps defined in Section 3.3, or if the following algorithm was | of (/host/, /port/, /resource name/, and /secure/ flag), along with a | |||
supplied with the constituent components as defined in Section 11 | list of /protocols/ and /extensions/ to be used, and an /origin/ in | |||
then those components provided, MUST be valid according to | the case of web browsers, it MUST open a connection, send an opening | |||
Section 3.3. If any of the requirements are not met, the client | handshake, and read the server's handshake in response. The exact | |||
MUST fail the WebSocket connection and abort these steps. | requirements of how the connection should be opened, what should be | |||
sent in the opening handshake, and how the server's response should | ||||
be interpreted, are as follows in this section. In the following | ||||
text, we will use terms from Section 3 such as "/host/" and "/secure/ | ||||
flag" as defined in that section. | ||||
2. If the user agent already has a WebSocket connection to the | 1. The components of the WebSocket URI passed into this algorithm | |||
remote host (IP address) identified by /host/ and port /port/ | (/host/, /port/, /resource name/ and /secure/ flag) MUST be valid | |||
pair, even if the remote host is known by another name, the user | according to the specification of WebSocket URIs specified in | |||
agent MUST wait until that connection has been established or for | Section 3. If any of the components are invalid, the client MUST | |||
that connection to have failed. There MUST be no more than one | _Fail the WebSocket Connection_ and abort these steps. | |||
connection in a CONNECTING state. If multiple connections to the | ||||
same IP address are attempted simultaneously, the user agent MUST | ||||
serialize them so that there is no more than one connection at a | ||||
time running through the following steps. | ||||
If the user agent cannot determine the IP address of the remote | 2. If the client already has a WebSocket connection to the remote | |||
host (for example because all communication is being done through | host (IP address) identified by /host/ and port /port/ pair, even | |||
a proxy server that performs DNS queries itself), then the user | if the remote host is known by another name, the client MUST wait | |||
agent MUST assume for the purposes of this step that each host | until that connection has been established or for that connection | |||
name refers to a distinct remote host, but should instead limit | to have failed. There MUST be no more than one connection in a | |||
the total number of simultaneous connections that are not | CONNECTING state. If multiple connections to the same IP address | |||
established to a reasonably low number (e.g., in a Web browser, | are attempted simultaneously, the client MUST serialize them so | |||
to the number of tabs the user has open). | that there is no more than one connection at a time running | |||
through the following steps. | ||||
If the client cannot determine the IP address of the remote host | ||||
(for example because all communication is being done through a | ||||
proxy server that performs DNS queries itself), then the client | ||||
MUST assume for the purposes of this step that each host name | ||||
refers to a distinct remote host, and should instead limit the | ||||
total number of simultaneous connections that are not established | ||||
to a reasonably low number (e.g., in a Web browser, simultaneous | ||||
pending connections to a.example.com and b.example.com would be | ||||
allowed, but if thirty connections are requested, that may not be | ||||
allowed. The limit should consider the number of tabs the user | ||||
has open. | ||||
NOTE: This makes it harder for a script to perform a denial of | NOTE: This makes it harder for a script to perform a denial of | |||
service attack by just opening a large number of WebSocket | service attack by just opening a large number of WebSocket | |||
connections to a remote host. A server can further reduce the | connections to a remote host. A server can further reduce the | |||
load on itself when attacked by making use of this by pausing | load on itself when attacked by making use of this by pausing | |||
before closing the connection, as that will reduce the rate at | before closing the connection, as that will reduce the rate at | |||
which the client reconnects. | which the client reconnects. | |||
NOTE: There is no limit to the number of established WebSocket | NOTE: There is no limit to the number of established WebSocket | |||
connections a user agent can have with a single remote host. | connections a client can have with a single remote host. Servers | |||
Servers can refuse to accept connections from hosts with an | can refuse to accept connections from hosts with an excessive | |||
excessive number of existing connections, or disconnect resource- | number of existing connections, or disconnect resource-hogging | |||
hogging connections when suffering high load. | connections when suffering high load. | |||
3. _Proxy Usage_: If the user agent is configured to use a proxy | 3. _Proxy Usage_: If the client is configured to use a proxy when | |||
when using the WebSocket protocol to connect to host /host/ | using the WebSocket protocol to connect to host /host/ and/or | |||
and/or port /port/, then the user agent SHOULD connect to that | port /port/, then the client SHOULD connect to that proxy and ask | |||
proxy and ask it to open a TCP connection to the host given by | it to open a TCP connection to the host given by /host/ and the | |||
/host/ and the port given by /port/. | port given by /port/. | |||
EXAMPLE: For example, if the user agent uses an HTTP proxy for | EXAMPLE: For example, if the client uses an HTTP proxy for all | |||
all traffic, then if it was to try to connect to port 80 on | traffic, then if it was to try to connect to port 80 on server | |||
server example.com, it might send the following lines to the | example.com, it might send the following lines to the proxy | |||
proxy server: | server: | |||
CONNECT example.com:80 HTTP/1.1 | CONNECT example.com:80 HTTP/1.1 | |||
Host: example.com | Host: example.com | |||
If there was a password, the connection might look like: | If there was a password, the connection might look like: | |||
CONNECT example.com:80 HTTP/1.1 | CONNECT example.com:80 HTTP/1.1 | |||
Host: example.com | Host: example.com | |||
Proxy-authorization: Basic ZWRuYW1vZGU6bm9jYXBlcyE= | Proxy-authorization: Basic ZWRuYW1vZGU6bm9jYXBlcyE= | |||
If the user agent is not configured to use a proxy, then a direct | If the client is not configured to use a proxy, then a direct TCP | |||
TCP connection SHOULD be opened to the host given by /host/ and | connection SHOULD be opened to the host given by /host/ and the | |||
the port given by /port/. | port given by /port/. | |||
NOTE: Implementations that do not expose explicit UI for | NOTE: Implementations that do not expose explicit UI for | |||
selecting a proxy for WebSocket connections separate from other | selecting a proxy for WebSocket connections separate from other | |||
proxies are encouraged to use a SOCKS proxy for WebSocket | proxies are encouraged to use a SOCKS proxy for WebSocket | |||
connections, if available, or failing that, to prefer the proxy | connections, if available, or failing that, to prefer the proxy | |||
configured for HTTPS connections over the proxy configured for | configured for HTTPS connections over the proxy configured for | |||
HTTP connections. | HTTP connections. | |||
For the purpose of proxy autoconfiguration scripts, the URI to | For the purpose of proxy autoconfiguration scripts, the URI to | |||
pass the function MUST be constructed from /host/, /port/, | pass the function MUST be constructed from /host/, /port/, | |||
/resource name/, and the /secure/ flag using the steps to | /resource name/, and the /secure/ flag using the definition of a | |||
construct a WebSocket URI as given in Section 3.2. | WebSocket URI as given in Section 3. | |||
NOTE: The WebSocket protocol can be identified in proxy | NOTE: The WebSocket protocol can be identified in proxy | |||
autoconfiguration scripts from the scheme ("ws:" for unencrypted | autoconfiguration scripts from the scheme ("ws:" for unencrypted | |||
connections and "wss:" for encrypted connections). | connections and "wss:" for encrypted connections). | |||
4. If the connection could not be opened, either because a direct | 4. If the connection could not be opened, either because a direct | |||
connection failed or because any proxy used returned an error, | connection failed or because any proxy used returned an error, | |||
then the user agent MUST fail the WebSocket connection and abort | then the client MUST _Fail the WebSocket Connection_ and abort | |||
the connection attempt. | the connection attempt. | |||
5. If /secure/ is true, the user agent MUST perform a TLS handshake | 5. If /secure/ is true, the client MUST perform a TLS handshake over | |||
over the connection [RFC2818]. If this fails (e.g. the server's | the connection after opening the connection and before sending | |||
certificate could not be verified), then the user agent MUST fail | the handshake data [RFC2818]. If this fails (e.g. the server's | |||
the WebSocket connection and abort the connection. Otherwise, | certificate could not be verified), then the client MUST _Fail | |||
the WebSocket Connection_ and abort the connection. Otherwise, | ||||
all further communication on this channel MUST run through the | all further communication on this channel MUST run through the | |||
encrypted tunnel. [RFC5246] | encrypted tunnel. [RFC5246] | |||
User agents MUST use the Server Name Indication extension in the | Clients MUST use the Server Name Indication extension in the TLS | |||
TLS handshake. [RFC6066] | handshake. [RFC6066] | |||
Once a connection to the server has been established (including a | Once a connection to the server has been established (including a | |||
connection via a proxy or over a TLS-encrypted tunnel), the client | connection via a proxy or over a TLS-encrypted tunnel), the client | |||
MUST send a handshake to the server. The handshake consists of an | MUST send an opening handshake to the server. The handshake consists | |||
HTTP upgrade request, along with a list of required and optional | of an HTTP upgrade request, along with a list of required and | |||
headers. The requirements for this handshake are as follows. | optional headers. The requirements for this handshake are as | |||
follows. | ||||
1. The handshake MUST be a valid HTTP request as specified by | 1. The handshake MUST be a valid HTTP request as specified by | |||
[RFC2616]. | [RFC2616]. | |||
2. The Method of the request MUST be GET and the HTTP version MUST | 2. The Method of the request MUST be GET and the HTTP version MUST | |||
be at least 1.1. | be at least 1.1. | |||
For example, if the WebSocket URI is "ws://example.com/chat", | For example, if the WebSocket URI is "ws://example.com/chat", | |||
The first line sent should be "GET /chat HTTP/1.1" | The first line sent should be "GET /chat HTTP/1.1" | |||
3. The request MUST contain a "Request-URI" as part of the GET | 3. The request MUST contain a "Request-URI" as part of the GET | |||
method. This MUST match the /resource name/ Section 3. | method. This MUST match the /resource name/ Section 3 (a | |||
relative URI), or be an absolute URI that, when parsed, has a | ||||
matching /resource name/ as well as matching /host/, /port/, and | ||||
appropriate scheme (ws or wss). | ||||
4. The request MUST contain a "Host" header whose value is equal to | 4. The request MUST contain a "Host" header whose value is equal to | |||
/host/ | /host/. | |||
5. The request MUST contain an "Upgrade" header whose value is | 5. The request MUST contain an "Upgrade" header whose value is | |||
equal to "websocket". | equal to "websocket". | |||
6. The request MUST contain a "Connection" header whose value MUST | 6. The request MUST contain a "Connection" header whose value MUST | |||
include the "Upgrade" token. | include the "Upgrade" token. | |||
7. The request MUST include a header with the name "Sec-WebSocket- | 7. The request MUST include a header with the name "Sec-WebSocket- | |||
Key". The value of this header MUST be a nonce consisting of a | Key". The value of this header MUST be a nonce consisting of a | |||
randomly selected 16-byte value that has been base64-encoded | randomly selected 16-byte value that has been base64-encoded | |||
skipping to change at page 30, line 19 | skipping to change at page 30, line 40 | |||
8. The request MUST include a header with the name "Sec-WebSocket- | 8. The request MUST include a header with the name "Sec-WebSocket- | |||
Origin" if the request is coming from a browser client. If the | Origin" if the request is coming from a browser client. If the | |||
connection is from a non-browser client, the request MAY include | connection is from a non-browser client, the request MAY include | |||
this header if the semantics of that client match the use-case | this header if the semantics of that client match the use-case | |||
described here for browser clients. The value of this header | described here for browser clients. The value of this header | |||
MUST be the ASCII serialization of origin of the context in | MUST be the ASCII serialization of origin of the context in | |||
which the code establishing the connection is running, and MUST | which the code establishing the connection is running, and MUST | |||
be lower-case. The value MUST NOT contain letters in the range | be lower-case. The value MUST NOT contain letters in the range | |||
U+0041 to U+005A (i.e. LATIN CAPITAL LETTER A to LATIN CAPITAL | U+0041 to U+005A (i.e. LATIN CAPITAL LETTER A to LATIN CAPITAL | |||
LETTER Z) [I-D.ietf-websec-origin]. | LETTER Z) [I-D.ietf-websec-origin]. The ABNF is as defined in | |||
Section 6.1 of [I-D.ietf-websec-origin]. | ||||
As an example, if code is running on www.example.com attempting | As an example, if code is running on www.example.com attempting | |||
to establish a connection to ww2.example.com, the value of the | to establish a connection to ww2.example.com, the value of the | |||
header would be "http://www.example.com". | header would be "http://www.example.com". | |||
9. The request MUST include a header with the name "Sec-WebSocket- | 9. The request MUST include a header with the name "Sec-WebSocket- | |||
Version". The value of this header MUST be 7. | Version". The value of this header MUST be 8. | |||
10. The request MAY include a header with the name "Sec-WebSocket- | 10. The request MAY include a header with the name "Sec-WebSocket- | |||
Protocol". If present, this value indicates the subprotocol(s) | Protocol". If present, this value indicates the subprotocol(s) | |||
the client wishes to speak. The elements that comprise this | the client wishes to speak, ordered by preference. The elements | |||
value MUST be non-empty strings with characters in the range | that comprise this value MUST be non-empty strings with | |||
U+0021 to U+007E and MUST all be unique strings. The ABNF for | characters in the range U+0021 to U+007E not including separator | |||
the value of this header is 1#(token | quoted-string), where the | characters as defined in [RFC2616], and MUST all be unique | |||
definitions of constructs and rules are as given in [RFC2616]. | strings. The ABNF for the value of this header is 1#token, | |||
where the definitions of constructs and rules are as given in | ||||
[RFC2616]. | ||||
11. The request MAY include a header with the name "Sec-WebSocket- | 11. The request MAY include a header with the name "Sec-WebSocket- | |||
Extensions". If present, this value indicates the protocol- | Extensions". If present, this value indicates the protocol- | |||
level extension(s) the client wishes to speak. The | level extension(s) the client wishes to speak. The | |||
interpretation and format of this header is described in | interpretation and format of this header is described in | |||
Section 8.1. | Section 9.1. | |||
12. The request MAY include headers associated with sending cookies, | 12. The request MAY include headers associated with sending cookies, | |||
as defined by the appropriate specifications | as defined by the appropriate specifications | |||
[I-D.ietf-httpstate-cookie]. | [I-D.ietf-httpstate-cookie]. These headers are referred to as | |||
_Headers to Send Appropriate Cookies_. | ||||
Once the client's opening handshake has been sent, the client MUST | Once the client's opening handshake has been sent, the client MUST | |||
wait for a response from the server before sending any further data. | wait for a response from the server before sending any further data. | |||
The client MUST validate the server's response as follows: | The client MUST validate the server's response as follows: | |||
o If the status code received from the server is not 101, the client | 1. If the status code received from the server is not 101, the | |||
handles the response per HTTP procedures. Otherwise, proceed as | client handles the response per HTTP procedures. Otherwise, | |||
follows. | proceed as follows. | |||
o If the response lacks an Upgrade header or the Upgrade header | 2. If the response lacks an "Upgrade" header or the "Upgrade" header | |||
contains a value that is not an ASCII case-insensitive match for | contains a value that is not an ASCII case-insensitive match for | |||
the value "websocket", the client MUST fail the WebSocket | the value "websocket", the client MUST _Fail the WebSocket | |||
connection. | Connection _. | |||
o If the response lacks a Connection header or the Connection header | 3. If the response lacks a "Connection" header or the "Connection" | |||
contains a value that is not an ASCII case-insensitive match for | header contains a value that is not an ASCII case-insensitive | |||
the value "Upgrade", the client MUST fail the WebSocket | match for the value "Upgrade", the client MUST _Fail the | |||
connection. | WebSocket Connection_. | |||
o If the response lacks a Sec-WebSocket-Accept header or the Sec- | 4. If the response lacks a "Sec-WebSocket-Accept" header or the | |||
WebSocket-Accept contains a value other than the base64-encoded | "Sec-WebSocket-Accept" contains a value other than the base64- | |||
SHA-1 of the concatenation of the Sec-WebSocket-Key (as a string, | encoded SHA-1 of the concatenation of the "Sec-WebSocket-Key" (as | |||
not base64-decoded) with the string "258EAFA5-E914-47DA-95CA- | a string, not base64-decoded) with the string "258EAFA5-E914- | |||
C5AB0DC85B11", the client MUST fail the WebSocket connection. | 47DA-95CA-C5AB0DC85B11", the client MUST _Fail the WebSocket | |||
Connection_ | ||||
Where the algorithm above requires that a user agent fail the | 5. If the response includes a "Sec-WebSocket-Extensions" header, and | |||
WebSocket connection, the user agent MAY first read an arbitrary | this header indicates the use of an extension that was not | |||
number of further bytes from the connection (and then discard them) | present in the client' handshake (the server has indicated an | |||
before actually *failing the WebSocket connection*. Similarly, if a | extension not requested by the client), the client MUST _Fail the | |||
user agent can show that the bytes read from the connection so far | WebSocket Connection_. (The parsing of this header to determine | |||
are such that there is no subsequent sequence of bytes that the | which extensions are requested is discussed in Section 9.1.) | |||
server can send that would not result in the user agent being | ||||
required to *fail the WebSocket connection*, the user agent MAY | ||||
immediately *fail the WebSocket connection* without waiting for those | ||||
bytes. | ||||
NOTE: The previous paragraph is intended to make it conforming for | If the server's response is validated as provided for above, it is | |||
user agents to implement the algorithm in subtly different ways that | said that _The WebSocket Connection is Established_ and that the | |||
are equivalent in all ways except that they terminate the connection | WebSocket Connection is in the OPEN state. The _Extensions In Use_ | |||
at earlier or later points. For example, it enables an | is defined to be a (possibly empty) string, the value of which is | |||
implementation to buffer the entire handshake response before | equal to the value of the |Sec-WebSocket-Extensions| header supplied | |||
checking it, or to verify each field as it is received rather than | by the server's handshake, or the null value if that header was not | |||
collecting all the fields and then checking them as a block. | present in the server's handshake. The _Subprotocol In Use_ is | |||
defined to be the value of the |Sec-WebSocket-Protocol| header in the | ||||
server's handshake, or the null value if that header was not present | ||||
in the server's handshake. Additionally, if any headers in the | ||||
server's handshake indicate that cookies should be set (as defined by | ||||
[I-D.ietf-httpstate-cookie]), these cookies are referred to as | ||||
_Cookies Set During the Server's Opening Handshake_. | ||||
5.2. Server-side requirements | 5.2. Server-side Requirements | |||
_This section only applies to servers._ | _This section only applies to servers._ | |||
Servers MAY offload the management of the connection to other agents | Servers MAY offload the management of the connection to other agents | |||
on the network, for example load balancers and reverse proxies. In | on the network, for example load balancers and reverse proxies. In | |||
such a situation, the server for the purposes of conformance is | such a situation, the server for the purposes of conformance is | |||
considered to include all parts of the server-side infrastructure | considered to include all parts of the server-side infrastructure | |||
from the first device to terminate the TCP connection all the way to | from the first device to terminate the TCP connection all the way to | |||
the server that processes requests and sends responses. | the server that processes requests and sends responses. | |||
EXAMPLE: For example, a data center might have a server that responds | EXAMPLE: For example, a data center might have a server that responds | |||
to WebSocket requests with an appropriate handshake, and then passes | to WebSocket requests with an appropriate handshake, and then passes | |||
the connection to another server to actually process the data frames. | the connection to another server to actually process the data frames. | |||
For the purposes of this specification, the "server" is the | For the purposes of this specification, the "server" is the | |||
combination of both computers. | combination of both computers. | |||
5.2.1. Reading the client's opening handshake | 5.2.1. Reading the Client's Opening Handshake | |||
When a client starts a WebSocket connection, it sends its part of the | When a client starts a WebSocket connection, it sends its part of the | |||
opening handshake. The server must parse at least part of this | opening handshake. The server must parse at least part of this | |||
handshake in order to obtain the necessary information to generate | handshake in order to obtain the necessary information to generate | |||
the server part of the handshake. | the server part of the handshake. | |||
The client handshake consists of the following parts. If the server, | The client's opening handshake consists of the following parts. If | |||
while reading the handshake, finds that the client did not send a | the server, while reading the handshake, finds that the client did | |||
handshake that matches the description below, the server MUST abort | not send a handshake that matches the description below, the server | |||
the WebSocket connection. | MUST stop processing the client's handshake, and return an HTTP | |||
response with an appropriate error code (such as 400 Bad Request). | ||||
1. An HTTP/1.1 or higher GET request, including a "Request-URI" | 1. An HTTP/1.1 or higher GET request, including a "Request-URI" | |||
[RFC2616] that should be interpreted as a /resource name/ | [RFC2616] that should be interpreted as a /resource name/ | |||
Section 3. | Section 3. | |||
2. A "Host" header containing the server's authority. | 2. A "Host" header containing the server's authority. | |||
3. A "Sec-WebSocket-Key" header with a base64-encoded value that, | 3. A "Sec-WebSocket-Key" header with a base64-encoded value that, | |||
when decoded, is 16 bytes in length. | when decoded, is 16 bytes in length. | |||
4. A "Sec-WebSocket-Version" header, with a value of 7. | 4. A "Sec-WebSocket-Version" header, with a value of 8. | |||
5. Optionally, a "Sec-WebSocket-Origin" header. This header is sent | 5. Optionally, a "Sec-WebSocket-Origin" header. This header is sent | |||
by all browser clients. A connection attempt lacking this header | by all browser clients. A connection attempt lacking this header | |||
SHOULD NOT be interpreted as coming from a browser client. | SHOULD NOT be interpreted as coming from a browser client. | |||
6. Optionally, a "Sec-WebSocket-Protocol" header, with a list of | 6. Optionally, a "Sec-WebSocket-Protocol" header, with a list of | |||
values indicating which protocols the client would like to speak, | values indicating which protocols the client would like to speak, | |||
ordered by preference. | ordered by preference. | |||
7. Optionally, a "Sec-WebSocket-Extensions" header, with a list of | 7. Optionally, a "Sec-WebSocket-Extensions" header, with a list of | |||
values indicating which extensions the client would like to | values indicating which extensions the client would like to | |||
speak. The interpretation of this header is discussed in | speak. The interpretation of this header is discussed in | |||
Section 8.1. | Section 9.1. | |||
8. Optionally, other headers, such as those used to send cookies to | 8. Optionally, other headers, such as those used to send cookies to | |||
a server. Unknown headers MUST be ignored. | a server. Unknown headers MUST be ignored. | |||
5.2.2. Sending the server's opening handshake | 5.2.2. Sending the Server's Opening Handshake | |||
When a client establishes a WebSocket connection to a server, the | When a client establishes a WebSocket connection to a server, the | |||
server MUST complete the following steps to accept the connection and | server MUST complete the following steps to accept the connection and | |||
send the server's opening handshake. | send the server's opening handshake. | |||
1. If the server supports encryption, perform a TLS handshake over | 1. If the server supports encryption, perform a TLS handshake over | |||
the connection. If this fails (e.g. the client indicated a host | the connection. If this fails (e.g. the client indicated a host | |||
name in the extended client hello "server_name" extension that | name in the extended client hello "server_name" extension that | |||
the server does not host), then close the connection; otherwise, | the server does not host), then close the connection; otherwise, | |||
all further communication for the connection (including the | all further communication for the connection (including the | |||
server handshake) MUST run through the encrypted tunnel. | server's handshake) MUST run through the encrypted tunnel. | |||
[RFC5246] | [RFC5246] | |||
2. Establish the following information: | 2. Establish the following information: | |||
/origin/ | /origin/ | |||
The |Sec-WebSocket-Origin| header in the client's handshake | The |Sec-WebSocket-Origin| header in the client's handshake | |||
indicates the origin of the script establishing the | indicates the origin of the script establishing the | |||
connection. The origin is serialized to ASCII and converted | connection. The origin is serialized to ASCII and converted | |||
to lowercase. The server MAY use this information as part of | to lowercase. The server MAY use this information as part of | |||
a determination of whether to accept the incoming connection. | a determination of whether to accept the incoming connection. | |||
If the server does not validate the origin, it will accept | If the server does not validate the origin, it will accept | |||
connections from anywhere. For more detail, refer to | connections from anywhere. If the server does not wish to | |||
Section 9. | accept this connection, it MUST return an appropriate HTTP | |||
error code (e.g. 403 Forbidden) and abort the WebSocket | ||||
handshake described in this section. For more detail, refer | ||||
to Section 10. | ||||
/key/ | /key/ | |||
The |Sec-WebSocket-Key| header in the client's handshake | The |Sec-WebSocket-Key| header in the client's handshake | |||
includes a base64-encoded value that, if decoded, is 16 bytes | includes a base64-encoded value that, if decoded, is 16 bytes | |||
in length. This (encoded) value is used in the creation of | in length. This (encoded) value is used in the creation of | |||
the server's handshake to indicate an acceptance of the | the server's handshake to indicate an acceptance of the | |||
connection. It is not necessary for the server to base64- | connection. It is not necessary for the server to base64- | |||
decode the Sec-WebSocket-Key value. | decode the "Sec-WebSocket-Key" value. | |||
/version/ | /version/ | |||
The |Sec-WebSocket-Version| header in the client's handshake | The |Sec-WebSocket-Version| header in the client's handshake | |||
includes the version of the WebSocket protocol the client is | includes the version of the WebSocket protocol the client is | |||
attempting to communicate with. If this version does not | attempting to communicate with. If this version does not | |||
match a version understood by the server, the server MUST | match a version understood by the server, the server MUST | |||
abort the WebSocket connection. The server MAY send a non-200 | abort the websocket handshake described in this section and | |||
response code with a |Sec-WebSocket-Version| header indicating | instead send an appropriate HTTP error code (such as 426 | |||
the version(s) the server is capable of understanding. | Upgrade Required), and a |Sec-WebSocket-Version| header | |||
indicating the version(s) the server is capable of | ||||
understanding. | ||||
/resource name/ | /resource name/ | |||
An identifier for the service provided by the server. If the | An identifier for the service provided by the server. If the | |||
server provides multiple services, then the value should be | server provides multiple services, then the value should be | |||
derived from the resource name given in the client's handshake | derived from the resource name given in the client's handshake | |||
from the Request-URI [RFC2616] of the GET method. | from the Request-URI [RFC2616] of the GET method. If the | |||
requested service is not available, the server MUST send an | ||||
appropriate HTTP error code (such as 404 Not Found) and abort | ||||
the WebSocket handshake. | ||||
/subprotocol/ | /subprotocol/ | |||
Either a single value or null, representing the subprotocol | Either a single value or null, representing the subprotocol | |||
the server is ready to use. If the server supports multiple | the server is ready to use. If the server supports multiple | |||
subprotocols, then the value MUST be derived from the client's | subprotocols, then the value MUST be derived from the client's | |||
handshake, specifically by selecting one of the values from | handshake, specifically by selecting one of the values from | |||
the "Sec-WebSocket-Protocol" field. The absence of such a | the "Sec-WebSocket-Protocol" field. The absence of such a | |||
field is equivalent to the null value. The empty string is | field is equivalent to the null value. The empty string is | |||
not the same as the null value for these purposes, and is not | not the same as the null value for these purposes, and is not | |||
a legal value for this field. The ABNF for the value of this | a legal value for this field. The ABNF for the value of this | |||
header is (token | quoted-string), where the definitions of | header is (token), where the definitions of constructs and | |||
constructs and rules are as given in [RFC2616]. | rules are as given in [RFC2616]. | |||
/extensions/ | /extensions/ | |||
A (possibly empty) list representing the protocol-level | A (possibly empty) list representing the protocol-level | |||
extensions the server is ready to use. If the server supports | extensions the server is ready to use. If the server supports | |||
multiple extensions, then the value MUST be derived from the | multiple extensions, then the value MUST be derived from the | |||
client's handshake, specifically by selecting one or more of | client's handshake, specifically by selecting one or more of | |||
the values from the "Sec-WebSocket-Extensions" field. The | the values from the "Sec-WebSocket-Extensions" field. The | |||
absence of such a field is equivalent to the null value. The | absence of such a field is equivalent to the null value. The | |||
empty string is not the same as the null value for these | empty string is not the same as the null value for these | |||
purposes. Extensions not listed by the client MUST NOT be | purposes. Extensions not listed by the client MUST NOT be | |||
listed. The method by which these values should be selected | listed. The method by which these values should be selected | |||
and interpreted is discussed in Section 8.1. | and interpreted is discussed in Section 9.1. | |||
3. If the server chooses to accept the incoming connection, it MUST | 3. If the server chooses to accept the incoming connection, it MUST | |||
reply with a valid HTTP response indicating the following. | reply with a valid HTTP response indicating the following. | |||
1. A 101 response code. Such a response could look like | 1. A 101 response code. Such a response could look like | |||
"HTTP/1.1 101 Switching Protocols" | "HTTP/1.1 101 Switching Protocols" | |||
2. A "Sec-WebSocket-Accept" header. The value of this header is | 2. A "Sec-WebSocket-Accept" header. The value of this header is | |||
constructed by concatenating /key/, defined above in | constructed by concatenating /key/, defined above in | |||
Paragraph 2 of Section 5.2.2, with the string "258EAFA5-E914- | Paragraph 2 of Section 5.2.2, with the string "258EAFA5-E914- | |||
47DA-95CA-C5AB0DC85B11", taking the SHA-1 hash of this | 47DA-95CA-C5AB0DC85B11", taking the SHA-1 hash of this | |||
concatenated value to obtain a 20-byte value, and base64- | concatenated value to obtain a 20-byte value, and base64- | |||
encoding this 20-byte hash. | encoding this 20-byte hash. | |||
The ABNF of this header is defined as follows: | ||||
accept-value = base64-value | ||||
base64-value = *base64-data [ base64-padding ] | ||||
base64-data = 4base64-character | ||||
base64-padding = (2base64-character "==") / (3base64-character "=") | ||||
base64-character = ALPHA / DIGIT / "+" / "/" | ||||
NOTE: As an example, if the value of the "Sec-WebSocket-Key" | NOTE: As an example, if the value of the "Sec-WebSocket-Key" | |||
header in the client's handshake were | header in the client's handshake were | |||
"dGhlIHNhbXBsZSBub25jZQ==", the server would append the | "dGhlIHNhbXBsZSBub25jZQ==", the server would append the | |||
string "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" to form the | string "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" to form the | |||
string "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA- | string "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA- | |||
C5AB0DC85B11". The server would then take the SHA-1 hash of | C5AB0DC85B11". The server would then take the SHA-1 hash of | |||
this string, giving the value 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 | this string, giving the value 0xb3 0x7a 0x4f 0x2c 0xc0 0x62 | |||
0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe | 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe | |||
0xc4 0xea. This value is then base64-encoded, to give the | 0xc4 0xea. This value is then base64-encoded, to give the | |||
value "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", which would be returned | value "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", which would be returned | |||
in the "Sec-WebSocket-Accept" header. | in the "Sec-WebSocket-Accept" header. | |||
3. Optionally, a "Sec-WebSocket-Protocol" header, with a value | 3. Optionally, a "Sec-WebSocket-Protocol" header, with a value | |||
/subprotocol/ as defined in Paragraph 2 of Section 5.2.2. | /subprotocol/ as defined in Paragraph 2 of Section 5.2.2. | |||
4. Optionally, a "Sec-WebSocket-Extensions" header, with a value | 4. Optionally, a "Sec-WebSocket-Extensions" header, with a value | |||
/extensions/ as defined in Paragraph 2 of Section 5.2.2. | /extensions/ as defined in Paragraph 2 of Section 5.2.2. If | |||
multiple extensions are to be used, they must all be listed | ||||
in a single Sec-WebSocket-Extensions header. This header | ||||
MUST NOT be repeated. | ||||
This completes the server's handshake. If the server finishes these | This completes the server's handshake. If the server finishes these | |||
steps without aborting the WebSocket connection, and if the client | steps without aborting the WebSocket handshake, the server considers | |||
does not then fail the WebSocket connection, then the connection is | the WebSocket connection to be established and that the WebSocket | |||
established and the server may begin sending and receiving data. | connection is in the OPEN state. At this point, the server may begin | |||
sending (and receiving) data. | ||||
6. Error Handling | 6. Sending and Receiving Data | |||
6.1. Handling errors in UTF-8 from the server | 6.1. Sending Data | |||
When a client is to interpret a byte stream as UTF-8 but finds that | To _Send a WebSocket Message_ comprising of /data/ over a WebSocket | |||
the byte stream is not in fact a valid UTF-8 stream, then any bytes | connection, an endpoint MUST perform the following steps. | |||
or sequences of bytes that are not valid UTF-8 sequences MUST be | ||||
interpreted as a U+FFFD REPLACEMENT CHARACTER. | ||||
6.2. Handling errors in UTF-8 from the client | 1. The endpoint MUST ensure the WebSocket connection is in the OPEN | |||
state (cf. Section 5.1 and Section 5.2.2.) If at any point the | ||||
state of the WebSocket connection changes, the endpoint MUST | ||||
abort the following steps. | ||||
When a server is to interpret a byte stream as UTF-8 but finds that | 2. An endpoint MUST encapsulate the /data/ in a WebSocket frame as | |||
the byte stream is not in fact a valid UTF-8 stream, behavior is | defined in Section 4.2. If the data to be sent is large, or if | |||
undefined. A server could close the connection, convert invalid byte | the data is not available in its entirety at the point the | |||
sequences to U+FFFD REPLACEMENT CHARACTERs, store the data verbatim, | endpoint wishes to begin sending the data, the endpoint MAY | |||
or perform application-specific processing. Subprotocols layered on | alternately encapsulate the data in a series of frames as defined | |||
the WebSocket protocol might define specific behavior for servers. | in Section 4.4. | |||
3. The opcode (frame-opcode) of the first frame containing the data | ||||
MUST be set to the appropriate value from Section 4.2 for data | ||||
that is to be interpreted by the recipient as text or binary | ||||
data. | ||||
4. The FIN bit (frame-fin) of the last frame containing the data | ||||
MUST be set to 1 as defined in Section 4.2. | ||||
5. If the data is being sent by the client, the frame(s) MUST be | ||||
masked as defined in Section 4.3. | ||||
6. If any extensions (Section 9) have been negotiated for the | ||||
WebSocket connection, additional considerations may apply as per | ||||
the definition of those extensions. | ||||
7. The frame(s) that have been formed MUST be transmitted over the | ||||
underlying network connection. | ||||
6.2. Receiving Data | ||||
To receive WebSocket data, an endpoint listens on the underlying | ||||
network connection. Incoming data MUST be parsed as WebSocket frames | ||||
as defined in Section 4.2. If a control frame (Section 4.5) is | ||||
received, the frame MUST be handled as defined by Section 4.5. Upon | ||||
receiving a data frame (Section 4.6), the endpoint MUST note the | ||||
/type/ of the data as defined by the Opcode (frame-opcode) from | ||||
Section 4.2. The _Application Data_ from this frame is defined as | ||||
the /data/ of the message. If the frame comprises an unfragmented | ||||
message (Section 4.4), it is said that _A WebSocket Message Has Been | ||||
Received_ with type /type/ and data /data/. If the frame is part of | ||||
a fragmented message, the _Application Data_ of the subsequent data | ||||
frames is concatenated to form the /data/. When the last fragment is | ||||
received as indicated by the FIN bit (frame-fin), it is said that _A | ||||
WebSocket Message Has Been Received_ with data /data/ (comprised of | ||||
the concatenation of the _Application Data_ of the fragments) and | ||||
type /type/ (noted from the first frame of the fragmented message). | ||||
Subsequent data frames MUST be interpreted as belonging to a new | ||||
WebSocket Message. | ||||
Extensions (Section 9) MAY change the semantics of how data is read, | ||||
specifically including what comprises a message boundary. | ||||
Data frames received by a server from a client MUST be unmasked as | ||||
described in Section 4.3. | ||||
7. Closing the connection | 7. Closing the connection | |||
7.1. Definitions | 7.1. Definitions | |||
7.1.1. Close the WebSocket Connection | 7.1.1. Close the WebSocket Connection | |||
To _Close the WebSocket Connection_, an endpoint closes the | To _Close the WebSocket Connection_, an endpoint closes the | |||
underlying TCP connection. An endpoint SHOULD use a method that | underlying TCP connection. An endpoint SHOULD use a method that | |||
cleanly closes the TCP connection, as well as the TLS session, if | cleanly closes the TCP connection, as well as the TLS session, if | |||
applicable, discarding any trailing bytes that may be received. An | applicable, discarding any trailing bytes that may be received. An | |||
endpoint MAY close the connection via any means available when | endpoint MAY close the connection via any means available when | |||
necessary, such as when under attack. | necessary, such as when under attack. | |||
The underlying TCP connection, in most normal cases, SHOULD be closed | ||||
first by the server, so that it holds the TIME_WAIT state and not the | ||||
client (as this would prevent it from re-opening the connection for 2 | ||||
MSL, while there is no corresponding server impact as a TIME_WAIT | ||||
connection is immediately reopened upon a new SYN with a higher seq | ||||
number). In abnormal cases (such as not having received a TCP Close | ||||
from the server after a reasonable amount of time) a client MAY | ||||
initiate the TCP Close. As such, when a server is instructed to | ||||
_Close the WebSocket Connection_ it SHOULD initiate a TCP Close | ||||
immediately, and when a client is instructed to do the same, it | ||||
SHOULD wait for a TCP Close from the server. | ||||
As an example of how to obtain a clean closure in C using Berkeley | As an example of how to obtain a clean closure in C using Berkeley | |||
sockets, one would call shutdown() with SHUT_WR on the socket, call | sockets, one would call shutdown() with SHUT_WR on the socket, call | |||
recv() until obtaining a return value of 0 indicating that the peer | recv() until obtaining a return value of 0 indicating that the peer | |||
has also performed an orderly shutdown, and finally calling close() | has also performed an orderly shutdown, and finally calling close() | |||
on the socket. | on the socket. | |||
7.1.2. Start the WebSocket Closing Handshake | 7.1.2. Start the WebSocket Closing Handshake | |||
To _start the WebSocket closing handshake_, an endpoint MUST send a | To _Start the WebSocket Closing Handshake_ with a status code | |||
Close control frame, as described in Section 4.5.1. Once an endpoint | (Section 7.4) /code/ and an optional close reason (Section 7.1.6) | |||
has both sent and received a Close control frame, that endpoint | /reason/, an endpoint MUST send a Close control frame, as described | |||
SHOULD _Close the WebSocket Connection_ as defined in Section 7.1.1. | in Section 4.5.1 whose status code is set to /code/ and whose close | |||
reason is set to /reason/. Once an endpoint has both sent and | ||||
received a Close control frame, that endpoint SHOULD _Close the | ||||
WebSocket Connection_ as defined in Section 7.1.1. | ||||
7.1.3. The WebSocket Connection Is Closed | 7.1.3. The WebSocket Closing Handshake is Started | |||
When the underlying TCP connection is closed, it is said that _the | Upon either sending or receiving a Close control frame, it is said | |||
WebSocket connection is closed_. If the tcp connection was closed | that _The WebSocket Closing Handshake is Started_ and that the | |||
after the WebSocket closing handshake was completed, the WebSocket | WebSocket connection is in the CLOSING state. | |||
connection is said to have been closed _cleanly_. | ||||
7.1.4. Fail the WebSocket Connection | 7.1.4. The WebSocket Connection is Closed | |||
Certain algorithms and specifications require a user agent to _fail | When the underlying TCP connection is closed, it is said that _The | |||
the WebSocket connection_. To do so, the user agent MUST _Close the | WebSocket Connection is Closed_ and that the WebSocket connection is | |||
in the CLOSED state. If the tcp connection was closed after the | ||||
WebSocket closing handshake was completed, the WebSocket connection | ||||
is said to have been closed _cleanly_. | ||||
If the WebSocket connection could not be established, it is also said | ||||
that _The WebSocket Connection is Closed_, but not cleanly. | ||||
7.1.5. The WebSocket Connection Close Code | ||||
As defined in Section 4.5.1 and Section 7.4, a Close control frame | ||||
may contain a status code indicating a reason for closure. A closing | ||||
of the WebSocket connection may be initiated by either endpoint, | ||||
potentially simultaneously. _The WebSocket Connection Close Code_ is | ||||
defined as the status code (Section 7.4) contained in the first Close | ||||
control frame received by the application implementing this protocol. | ||||
If this Close control frame contains no status code, _The WebSocket | ||||
Connection Close Code_ is considered to be 1005. If _The WebSocket | ||||
Connection is Closed_ and no Close control frame was received by the | ||||
endpoint (such as could occur if the underlying transport connection | ||||
is lost), _The WebSocket Connection Close Code_ is considered to be | ||||
1006. | ||||
NOTE: Two endpoints may not agree on the value of _The WebSocket | ||||
Connection Close Code_. As an example, if the remote endpoint sent a | ||||
Close frame but the local application has not yet read the data | ||||
containing the Close frame from its socket's receive buffer, and the | ||||
local application independently decided to close the connection and | ||||
send a Close frame, both endpoints will have sent and received a | ||||
Close frame, and will not send further Close frames. Each endpoint | ||||
will see the Connection Close Code sent by the other end as the | ||||
_WebSocket Connection Close Code_. As such, it is possible that the | ||||
two endpoints may not agree on the value of _The WebSocket Connection | ||||
Close Code_ in the case that both endpoints _Start the WebSocket | ||||
Closing Handshake_ independently and at roughly the same time. | ||||
7.1.6. The WebSocket Connection Close Reason | ||||
As defined in Section 4.5.1 and Section 7.4, a Close control frame | ||||
may contain a status code indicating a reason for closure, followed | ||||
by UTF-8 encoded data, the interpretation of said data being left to | ||||
the endpoints and not defined by this protocol. A closing of the | ||||
WebSocket connection may be initiated by either endpoint, potentially | ||||
simultaneously. _The WebSocket Connection Close Reason_ is defined as | ||||
the UTF-8 encoded data following the status code (Section 7.4) | ||||
contained in the first Close control frame received by the | ||||
application implementing this protocol. If there is no such data in | ||||
the Close control frame, _The WebSocket Connection Close Reason_ is | ||||
the empty string. | ||||
NOTE: Following the same logic as noted in Section 7.1.5, two | ||||
endpoints may not agree on _The WebSocket Connection Close Reason_. | ||||
7.1.7. Fail the WebSocket Connection | ||||
Certain algorithms and specifications require an endpoint to _Fail | ||||
the WebSocket Connection_. To do so, the client MUST _Close the | ||||
WebSocket Connection_, and MAY report the problem to the user (which | WebSocket Connection_, and MAY report the problem to the user (which | |||
would be especially useful for developers) in an appropriate manner. | would be especially useful for developers) in an appropriate manner. | |||
If _The WebSocket Connection is Established_ prior to the point where | ||||
the endpoint is required to _Fail the WebSocket Connection_, the | ||||
endpoint SHOULD send a Close frame with an appropriate status code | ||||
Section 7.4 before proceeding to _Close the WebSocket Connection_. | ||||
An endpoint MAY omit sending a Close frame if it believes the other | ||||
side is unlikely to be able to receive and process the close frame, | ||||
due to the nature of the error that led to the WebSocket connection | ||||
being failed in the first place. An endpoint MUST NOT continue to | ||||
attempt to process data (including a responding Close frame) from the | ||||
remote endpoint after being instruted to _Fail the WebSocket | ||||
Connection_. | ||||
Except as indicated above or as specified by the application layer | Except as indicated above or as specified by the application layer | |||
(e.g. a script using the WebSocket API), user agents SHOULD NOT close | (e.g. a script using the WebSocket API), clients SHOULD NOT close the | |||
the connection. | connection. | |||
7.2. Abnormal closures | 7.2. Abnormal Closures | |||
7.2.1. Client-initiated closure | ||||
Certain algorithms, namely during the initial handshake, require the | 7.2.1. Client-Initiated Closure | |||
user agent to *fail the WebSocket connection*. To do so, the user | ||||
agent MUST _Close the WebSocket connection_ as previously defined, | Certain algorithms, namely during the opening handshake, require the | |||
and MAY report the problem to the user via an appropriate mechanism | client to _Fail the WebSocket Connection_. To do so, the client MUST | |||
(which would be especially useful for developers). | _Fail the WebSocket Connection_ as defined in Section 7.1.7. | |||
If at any point the underlying transport layer connection is | ||||
unexpectedly lost, the client MUST _Fail the WebSocket Connection_. | ||||
Except as indicated above or as specified by the application layer | Except as indicated above or as specified by the application layer | |||
(e.g. a script using the WebSocket API), user agents SHOULD NOT close | (e.g. a script using the WebSocket API), clients SHOULD NOT close the | |||
the connection. | connection. | |||
7.2.2. Server-initiated closure | 7.2.2. Server-initiated closure | |||
Certain algorithms require or recommend that the server _abort the | Certain algorithms require or recommend that the server _Abort the | |||
WebSocket connection_ during the opening handshake. To do so, the | WebSocket Connection_ during the opening handshake. To do so, the | |||
server MUST simply _close the WebSocket connection_ (Section 7.1.1). | server MUST simply _Close the WebSocket Connection_ (Section 7.1.1). | |||
7.3. Normal closure of connections | 7.3. Normal Closure of Connections | |||
Servers MAY close the WebSocket connection whenever desired. User | Servers MAY close the WebSocket connection whenever desired. Clients | |||
agents SHOULD NOT close the WebSocket connection arbitrarily. In | SHOULD NOT close the WebSocket connection arbitrarily. In either | |||
either case, an endpoint initiates a closure by following the | case, an endpoint initiates a closure by following the procedures to | |||
procedures to _start the WebSocket closing handshake_ | _Start the WebSocket Closing Handshake_ (Section 7.1.2). | |||
(Section 7.1.2). | ||||
7.4. Status codes | 7.4. Status Codes | |||
When closing an established connection (e.g. when sending a Close | When closing an established connection (e.g. when sending a Close | |||
frame, after the handshake has completed), an endpoint MAY indicate a | frame, after the opening handshake has completed), an endpoint MAY | |||
reason for closure. The interpretation of this reason by an | indicate a reason for closure. The interpretation of this reason by | |||
endpoint, and the action an endpoint should take given this reason, | an endpoint, and the action an endpoint should take given this | |||
are left undefined by this specification. This specification defines | reason, are left undefined by this specification. This specification | |||
a set of pre-defined status codes, and specifies which ranges may be | defines a set of pre-defined status codes, and specifies which ranges | |||
used by extensions, frameworks, and end applications. The status | may be used by extensions, frameworks, and end applications. The | |||
code and any associated textual message are optional components of a | status code and any associated textual message are optional | |||
Close frame. | components of a Close frame. | |||
7.4.1. Defined Status Codes | 7.4.1. Defined Status Codes | |||
Endpoints MAY use the following pre-defined status codes when sending | Endpoints MAY use the following pre-defined status codes when sending | |||
a Close frame. | a Close frame. | |||
1000 | 1000 | |||
1000 indicates a normal closure, meaning whatever purpose the | 1000 indicates a normal closure, meaning whatever purpose the | |||
connection was established for has been fulfilled. | connection was established for has been fulfilled. | |||
skipping to change at page 39, line 25 | skipping to change at page 43, line 15 | |||
1003 | 1003 | |||
1003 indicates that an endpoint is terminating the connection | 1003 indicates that an endpoint is terminating the connection | |||
because it has received a type of data it cannot accept (e.g. an | because it has received a type of data it cannot accept (e.g. an | |||
endpoint that understands only text data MAY send this if it | endpoint that understands only text data MAY send this if it | |||
receives a binary message). | receives a binary message). | |||
1004 | 1004 | |||
1004 indicates that an endpoint is terminating the connection | 1004 indicates that an endpoint is terminating the connection | |||
because it has received a message that is too large. | because it has received a frame that is too large. | |||
7.4.2. Reserved status code ranges | 1005 | |||
1005 is a reserved value and MUST NOT be set as a status code in a | ||||
Close control frame by an endpoint. It is designated for use in | ||||
applications expecting a status code to indicate that no status | ||||
code was actually present. | ||||
1006 | ||||
1006 is a reserved value and MUST NOT be set as a status code in a | ||||
Close control frame by an endpoint. It is designated for use in | ||||
applications expecting a status code to indicate that the | ||||
connection was closed abnormally, e.g. without sending or | ||||
receiving a Close control frame. | ||||
7.4.2. Reserved Status Code Ranges | ||||
0-999 | 0-999 | |||
Status codes in the range 0-999 are not used. | Status codes in the range 0-999 are not used. | |||
1000-1999 | 1000-1999 | |||
Status codes in the range 1000-1999 are reserved for definition by | Status codes in the range 1000-1999 are reserved for definition by | |||
this protocol. | this protocol. | |||
skipping to change at page 41, line 5 | skipping to change at page 45, line 5 | |||
frameworks. The interpretation of these codes is undefined by | frameworks. The interpretation of these codes is undefined by | |||
this protocol. End applications MUST NOT use status codes in this | this protocol. End applications MUST NOT use status codes in this | |||
range. | range. | |||
4000-4999 | 4000-4999 | |||
Status codes in the range 4000-4999 MAY be used by application | Status codes in the range 4000-4999 MAY be used by application | |||
code. The interpretation of these codes is undefined by this | code. The interpretation of these codes is undefined by this | |||
protocol. | protocol. | |||
8. Extensions | 8. Error Handling | |||
8.1. Handling Errors in UTF-8 from the Server | ||||
When a client is to interpret a byte stream as UTF-8 but finds that | ||||
the byte stream is not in fact a valid UTF-8 stream, then any bytes | ||||
or sequences of bytes that are not valid UTF-8 sequences MUST be | ||||
interpreted as a U+FFFD REPLACEMENT CHARACTER. | ||||
8.2. Handling Errors in UTF-8 from the Client | ||||
When a server is to interpret a byte stream as UTF-8 but finds that | ||||
the byte stream is not in fact a valid UTF-8 stream, behavior is | ||||
undefined. A server could close the connection, convert invalid byte | ||||
sequences to U+FFFD REPLACEMENT CHARACTERs, store the data verbatim, | ||||
or perform application-specific processing. Subprotocols layered on | ||||
the WebSocket protocol might define specific behavior for servers. | ||||
9. Extensions | ||||
WebSocket clients MAY request extensions to this specification, and | WebSocket clients MAY request extensions to this specification, and | |||
WebSocket servers MAY accept some or all extensions requested by the | WebSocket servers MAY accept some or all extensions requested by the | |||
client. A server MUST NOT respond with any extension not requested | client. A server MUST NOT respond with any extension not requested | |||
by the client. If extension parameters are included in negotiations | by the client. If extension parameters are included in negotiations | |||
between the client and the server, those parameters MUST be chosen in | between the client and the server, those parameters MUST be chosen in | |||
accordance with the specification of the extension to which the | accordance with the specification of the extension to which the | |||
parameters apply. | parameters apply. | |||
8.1. Negotiating extensions | 9.1. Negotiating Extensions | |||
A client requests extensions by including a "Sec-WebSocket- | A client requests extensions by including a "Sec-WebSocket- | |||
Extensions" header, which follows the normal rules for HTTP headers | Extensions" header, which follows the normal rules for HTTP headers | |||
(see [RFC2616] section 4.2) and the value of the header is defined by | (see [RFC2616] section 4.2) and the value of the header is defined by | |||
the following ABNF. Note that unlike other section of the document | the following ABNF. Note that unlike other section of the document | |||
this section is using ABNF syntax/rules from [RFC2616]. | this section is using ABNF syntax/rules from [RFC2616]. If a value | |||
is received by either the client or the server during negotiation | ||||
that does not conform to the ABNF below, the recipient of such | ||||
malformed data MUST immediately _Fail the WebSocket Connection_. | ||||
extension-list = 1#extension | extension-list = 1#extension | |||
extension = extension-token *( ";" extension-param ) | extension = extension-token *( ";" extension-param ) | |||
extension-token = registered-token | private-use-token | extension-token = registered-token / private-use-token | |||
registered-token = token | registered-token = token | |||
private-use-token = "x-" token | private-use-token = "x-" token | |||
extension-param = token [ "=" ( token | quoted-string ) ] | extension-param = token [ "=" token ] | |||
Note that like other HTTP headers, this header MAY be split or | Note that like other HTTP headers, this header MAY be split or | |||
combined across multiple lines. Ergo, the following are equivalent: | combined across multiple lines. Ergo, the following are equivalent: | |||
Sec-WebSocket-Extensions: foo | Sec-WebSocket-Extensions: foo | |||
Sec-WebSocket-Extensions: bar; baz=2 | Sec-WebSocket-Extensions: bar; baz=2 | |||
is exactly equivalent to | is exactly equivalent to | |||
Sec-WebSocket-Extensions: foo, bar; baz=2 | Sec-WebSocket-Extensions: foo, bar; baz=2 | |||
skipping to change at page 42, line 29 | skipping to change at page 47, line 32 | |||
Sec-WebSocket-Extensions: mux; max-channels=4; flow-control, deflate-stream | Sec-WebSocket-Extensions: mux; max-channels=4; flow-control, deflate-stream | |||
Sec-WebSocket-Extensions: x-private-extension | Sec-WebSocket-Extensions: x-private-extension | |||
A server accepts one or more extensions by including a |Sec- | A server accepts one or more extensions by including a |Sec- | |||
WebSocket-Extensions| header containing one or more extensions which | WebSocket-Extensions| header containing one or more extensions which | |||
were requested by the client. The interpretation of any extension | were requested by the client. The interpretation of any extension | |||
parameters, and what constitutes a valid response by a server to a | parameters, and what constitutes a valid response by a server to a | |||
requested set of parameters by a client, will be defined by each such | requested set of parameters by a client, will be defined by each such | |||
extension. | extension. | |||
8.2. Known extensions | 9.2. Known Extensions | |||
Extensions provide a mechanism for implementations to opt-in to | Extensions provide a mechanism for implementations to opt-in to | |||
additional protocol features. This section defines the meaning of | additional protocol features. This section defines the meaning of | |||
well-known extensions but implementations MAY use extensions defined | well-known extensions but implementations MAY use extensions defined | |||
separately as well. | separately as well. | |||
8.2.1. Compression | 9.2.1. Compression | |||
The registered extension token for this compression extension is | The registered extension token for this compression extension is | |||
"deflate-stream". | "deflate-stream". | |||
The extension does not have any per message extension data and it | The extension does not have any per frame extension data and it does | |||
does not define the use of any WebSocket reserved bits or op codes. | not define the use of any WebSocket reserved bits or op codes. | |||
Senders using this extension MUST apply RFC 1951 encodings to all | Senders using this extension MUST apply [RFC1951] encodings to all | |||
bytes of the data stream following the handshake including both data | bytes of the data stream following the opening handshake including | |||
and control messages. The data stream MAY include multiple blocks of | both data and control frames. The data stream MAY include multiple | |||
both compressed and uncompressed types as defined by [RFC1951]. | blocks of both compressed and uncompressed types as defined by | |||
[RFC1951]. | ||||
Senders MUST NOT delay the transmission of any portion of a WebSocket | Senders MUST NOT delay the transmission of any portion of a WebSocket | |||
message because the deflate encoding of the message does not end on a | frame because the deflate encoding of the frame does not end on a | |||
byte boundary. The encodings for adjacent messages MAY appear in the | byte boundary. The encodings for adjacent frames MAY appear in the | |||
same byte if no delay in transmission is occurred by doing so. | same byte if no delay in transmission is occurred by doing so. | |||
Historically there have been some confusion and interoperability | Historically there have been some confusion and interoperability | |||
problems around the specification of compression algorithms. In this | problems around the specification of compression algorithms. In this | |||
specification "deflate-stream" requires a [RFC1951] deflate encoding. | specification "deflate-stream" requires a [RFC1951] deflate encoding. | |||
It MUST NOT be wrapped in any of the header formats often associated | It MUST NOT be wrapped in any of the header formats often associated | |||
with RFC 1951 such as "zlib" [RFC1950]. This requirement is given | with RFC 1951 such as "zlib" [RFC1950]. This requirement is given | |||
special attention with this note because of confusion in this area, | special attention with this note because of confusion in this area, | |||
the presence of some popular open source libraries that create both | the presence of some popular open source libraries that create both | |||
formats under a single API call with confusing naming conventions, | formats under a single API call with confusing naming conventions, | |||
and the fact that the popular HTTP [RFC2616] specification defines | and the fact that the popular HTTP [RFC2616] specification defines | |||
"deflate" compression differently than this specification. | "deflate" compression differently than this specification. | |||
9. Security considerations | 10. Security Considerations | |||
While this protocol is intended to be used by scripts in Web pages, | While this protocol is intended to be used by scripts in Web pages, | |||
it can also be used directly by hosts. Such hosts are acting on | it can also be used directly by hosts. Such hosts are acting on | |||
their own behalf, and can therefore send fake "Origin" fields, | their own behalf, and can therefore send fake "Origin" fields, | |||
misleading the server. Servers should therefore be careful about | misleading the server. Servers should therefore be careful about | |||
assuming that they are talking directly to scripts from known | assuming that they are talking directly to scripts from known | |||
origins, and must consider that they might be accessed in unexpected | origins, and must consider that they might be accessed in unexpected | |||
ways. In particular, a server should not trust that any input is | ways. In particular, a server should not trust that any input is | |||
valid. | valid. | |||
skipping to change at page 44, line 30 | skipping to change at page 49, line 30 | |||
Servers that are not intended to process input from any Web page but | Servers that are not intended to process input from any Web page but | |||
only for certain sites SHOULD verify the "Origin" field is an origin | only for certain sites SHOULD verify the "Origin" field is an origin | |||
they expect, and should only respond with the corresponding "Sec- | they expect, and should only respond with the corresponding "Sec- | |||
WebSocket-Origin" if it is an accepted origin. Servers that only | WebSocket-Origin" if it is an accepted origin. Servers that only | |||
accept input from one origin can just send back that value in the | accept input from one origin can just send back that value in the | |||
"Sec-WebSocket-Origin" field, without bothering to check the client's | "Sec-WebSocket-Origin" field, without bothering to check the client's | |||
value. | value. | |||
If at any time a server is faced with data that it does not | If at any time a server is faced with data that it does not | |||
understand, or that violates some criteria by which the server | understand, or that violates some criteria by which the server | |||
determines safety of input, or when the server sees a handshake that | determines safety of input, or when the server sees an opening | |||
does not correspond to the values the server is expecting (e.g. | handshake that does not correspond to the values the server is | |||
incorrect path or origin), the server SHOULD just disconnect. It is | expecting (e.g. incorrect path or origin), the server SHOULD just | |||
always safe to disconnect. | disconnect. It is always safe to disconnect. | |||
The biggest security risk when sending text data using this protocol | The biggest security risk when sending text data using this protocol | |||
is sending data using the wrong encoding. If an attacker can trick | is sending data using the wrong encoding. If an attacker can trick | |||
the server into sending data encoded as ISO-8859-1 verbatim (for | the server into sending data encoded as ISO-8859-1 verbatim (for | |||
instance), rather than encoded as UTF-8, then the attacker could | instance), rather than encoded as UTF-8, then the attacker could | |||
inject arbitrary frames into the data stream. | inject arbitrary frames into the data stream. | |||
In addition to endpoints being the target of attacks via WebSockets, | In addition to endpoints being the target of attacks via WebSockets, | |||
other parts of web infrastructure, such as proxies, may be the | other parts of web infrastructure, such as proxies, may be the | |||
subject of an attack. In particular, an intermediary may interpret a | subject of an attack. In particular, an intermediary may interpret a | |||
WebSocket message from a client as a request, and a message from the | WebSocket frame from a client as a request, and a frame from the | |||
server as a response to that request. For instance, an attacker | server as a response to that request. For instance, an attacker | |||
could get a browser to establish a connection to its server, get the | could get a browser to establish a connection to its server, get the | |||
browser to send a message that looks to an intermediary like a GET | browser to send a frame that looks to an intermediary like a GET | |||
request for a common piece of JavaScript on another domain, and send | request for a common piece of JavaScript on another domain, and send | |||
back a message that is interpreted as a cacheable response to that | back a frame that is interpreted as a cacheable response to that | |||
request, thus poisioning the cache for other users. To prevent this | request, thus poisioning the cache for other users. To prevent this | |||
attack, messages sent from clients are masked on the wire with a 32- | attack, frames sent from clients are masked on the wire with a 32-bit | |||
bit value, to prevent an attacker from controlling the bits on the | value, to prevent an attacker from controlling the bits on the wire | |||
wire and thus lessen the probability of an attacker being able to | and thus lessen the probability of an attacker being able to | |||
construct a message that can be misinterpreted by a proxy as a non- | construct a frame that can be misinterpreted by a proxy as a non- | |||
WebSocket request. | WebSocket request. | |||
As mentioned in Section 6.2, servers must be extremely cautious | As mentioned in Section 8.2, servers must be extremely cautious | |||
interpreting invalid UTF-8 data from the client. A naive UTF-8 | interpreting invalid UTF-8 data from the client. A naive UTF-8 | |||
parsing implementation can result in buffer overflows in the case of | parsing implementation can result in buffer overflows in the case of | |||
invalid input data. | invalid input data. | |||
10. IANA considerations | For connections using TLS (wss: URIs), the amount of benefit provided | |||
by TLS depends greatly on the strength of the algorithms negotiated | ||||
during the TLS handshake. To achieve reasonable levels of | ||||
protections, clients should use only Strong TLS algorithms. "Web | ||||
Security Context: User Interface Guidelines" | ||||
[W3C.REC-wsc-ui-20100812] discusses what constitutes Strong TLS | ||||
algorithms. | ||||
10.1. Registration of ws: scheme | 11. IANA Considerations | |||
11.1. Registration of "ws:" Scheme | ||||
A |ws:| URI identifies a WebSocket server and resource name. | A |ws:| URI identifies a WebSocket server and resource name. | |||
URI scheme name. | URI scheme name. | |||
ws | ws | |||
Status. | Status. | |||
Permanent. | Permanent. | |||
URI scheme syntax. | URI scheme syntax. | |||
skipping to change at page 47, line 17 | skipping to change at page 52, line 17 | |||
Contact. | Contact. | |||
HYBI WG <hybi@ietf.org> | HYBI WG <hybi@ietf.org> | |||
Author/Change controller. | Author/Change controller. | |||
IETF <iesg@ietf.org> | IETF <iesg@ietf.org> | |||
References. | References. | |||
RFC XXXX | RFC XXXX | |||
10.2. Registration of wss: scheme | 11.2. Registration of "wss:" Scheme | |||
A |wss:| URI identifies a WebSocket server and resource name, and | A |wss:| URI identifies a WebSocket server and resource name, and | |||
indicates that traffic over that connection is to be encrypted. | indicates that traffic over that connection is to be protected via | |||
TLS (including standard benefits of TLS such as confidentiality, | ||||
integrity, and authentication). | ||||
URI scheme name. | URI scheme name. | |||
wss | wss | |||
Status. | Status. | |||
Permanent. | Permanent. | |||
URI scheme syntax. | URI scheme syntax. | |||
In ABNF terms using the terminals from the URI specifications: | In ABNF terms using the terminals from the URI specifications: | |||
[RFC5234] [RFC3986] | [RFC5234] [RFC3986] | |||
skipping to change at page 48, line 24 | skipping to change at page 53, line 26 | |||
Contact. | Contact. | |||
HYBI WG <hybi@ietf.org> | HYBI WG <hybi@ietf.org> | |||
Author/Change controller. | Author/Change controller. | |||
IETF <iesg@ietf.org> | IETF <iesg@ietf.org> | |||
References. | References. | |||
RFC XXXX | RFC XXXX | |||
10.3. Registration of the "WebSocket" HTTP Upgrade keyword | 11.3. Registration of the "WebSocket" HTTP Upgrade Keyword | |||
This section defines a keyword for registration in the "HTTP Upgrade | ||||
Tokens" registry as per RFC 2817 [RFC2817]. | ||||
Name of token. | Name of token. | |||
WebSocket | WebSocket | |||
Author/Change controller. | Author/Change controller. | |||
IETF <iesg@ietf.org> | IETF <iesg@ietf.org> | |||
Contact. | Contact. | |||
HYBI <hybi@ietf.org> | HYBI <hybi@ietf.org> | |||
References. | References. | |||
RFC XXXX | RFC XXXX | |||
10.4. Sec-WebSocket-Key | 11.4. Sec-WebSocket-Key | |||
This section describes a header field for registration in the | This section describes a header field for registration in the | |||
Permanent Message Header Field Registry. [RFC3864] | Permanent Message Header Field Registry. [RFC3864] | |||
Header field name | Header field name | |||
Sec-WebSocket-Key | Sec-WebSocket-Key | |||
Applicable protocol | Applicable protocol | |||
http | http | |||
Status | Status | |||
standard | standard | |||
Author/Change controller | Author/Change controller | |||
skipping to change at page 49, line 15 | skipping to change at page 54, line 20 | |||
Status | Status | |||
standard | standard | |||
Author/Change controller | Author/Change controller | |||
IETF | IETF | |||
Specification document(s) | Specification document(s) | |||
RFC XXXX | RFC XXXX | |||
Related information | Related information | |||
This header field is only used for WebSocket handshake. | This header field is only used for WebSocket opening handshake. | |||
The |Sec-WebSocket-Key| header is used in the WebSocket handshake. | The |Sec-WebSocket-Key| header is used in the WebSocket opening | |||
It is sent from the client to the server to provide part of the | handshake. It is sent from the client to the server to provide part | |||
information used by the server to prove that it received a valid | of the information used by the server to prove that it received a | |||
WebSocket handshake. This helps ensure that the server does not | valid WebSocket opening handshake. This helps ensure that the server | |||
accept connections from non-WebSocket clients (e.g. HTTP clients) | does not accept connections from non-WebSocket clients (e.g. HTTP | |||
that are being abused to send data to unsuspecting WebSocket servers. | clients) that are being abused to send data to unsuspecting WebSocket | |||
servers. | ||||
10.5. Sec-WebSocket-Extensions | 11.5. Sec-WebSocket-Extensions | |||
This section describes a header field for registration in the | This section describes a header field for registration in the | |||
Permanent Message Header Field Registry. [RFC3864] | Permanent Message Header Field Registry. [RFC3864] | |||
Header field name | Header field name | |||
Sec-WebSocket-Extensions | Sec-WebSocket-Extensions | |||
Applicable protocol | Applicable protocol | |||
http | http | |||
Status | Status | |||
standard | standard | |||
Author/Change controller | Author/Change controller | |||
IETF | IETF | |||
Specification document(s) | Specification document(s) | |||
RFC XXXX | RFC XXXX | |||
Related information | Related information | |||
This header field is only used for WebSocket handshake. | This header field is only used for WebSocket opening handshake. | |||
The |Sec-WebSocket-Extensions| header is used in the WebSocket | The |Sec-WebSocket-Extensions| header is used in the WebSocket | |||
handshake. It is initially sent from the client to the server, and | opening handshake. It is initially sent from the client to the | |||
then subsequently sent from the server to the client, to agree on a | server, and then subsequently sent from the server to the client, to | |||
set of protocol-level extensions to use for the duration of the | agree on a set of protocol-level extensions to use for the duration | |||
connection. | of the connection. | |||
10.6. Sec-WebSocket-Accept | 11.6. WebSocket Extension Name Registry | |||
This specification requests the creation of a new IANA registry for | ||||
WebSocket Extension names to be used with the WebSocket protocol in | ||||
accordance with the principles set out in RFC 5226 [RFC5226]. | ||||
As part of this registry IANA will maintain the following | ||||
information: | ||||
Extension Identifier | ||||
The identifier of the extension, as will be used in the Sec- | ||||
WebSocket-Extension header registered in Section 11.5 of this | ||||
specification. The value must conform to the requirements for an | ||||
extension-token as defined in Section 9.1 of this specification. | ||||
Extension Common Name | ||||
The name of the extension, as the extension is generally referred | ||||
to. | ||||
Extension Definition | ||||
A reference to the document in which the extension being used with | ||||
the WebSocket protocol is defined. | ||||
Known Incompatible Extensions | ||||
A list of extension identifiers with which this extension is known | ||||
to be incompatible. | ||||
WebSocket Extension names are to be subject to First Come First Serve | ||||
as per RFC5226 [RFC5226], with the exception of WebSocket Extension | ||||
names whose Extension Identifier matches a private-use-token as | ||||
defined in Section 9.1 (values beginning with "x-"). These Extension | ||||
Identifiers matching private-use-token are reserved for Experimental | ||||
Use as per RFC5226 [RFC5226]. | ||||
IANA is asked to add an initial value to the registry (there are no | ||||
known incompatible extensions for this initial entry): | ||||
Extension Identifier | Extension Common Name | Extension Definition | ||||
-+---------------------+------------------------+----------------------- | ||||
| deflate-stream | Deflate Stream | Section 9.2.1 of this | ||||
| | Compression | document. | ||||
-+---------------------+------------------------+----------------------- | ||||
11.7. Sec-WebSocket-Accept | ||||
This section describes a header field for registration in the | This section describes a header field for registration in the | |||
Permanent Message Header Field Registry. [RFC3864] | Permanent Message Header Field Registry. [RFC3864] | |||
Header field name | Header field name | |||
Sec-WebSocket-Accept | Sec-WebSocket-Accept | |||
Applicable protocol | Applicable protocol | |||
http | http | |||
Status | Status | |||
standard | standard | |||
Author/Change controller | Author/Change controller | |||
IETF | IETF | |||
Specification document(s) | Specification document(s) | |||
RFC XXXX | RFC XXXX | |||
Related information | Related information | |||
This header field is only used for WebSocket handshake. | This header field is only used for WebSocket opening handshake. | |||
The |Sec-WebSocket-Accept| header is used in the WebSocket handshake. | The |Sec-WebSocket-Accept| header is used in the WebSocket opening | |||
It is sent from the server to the client to confirm that the server | handshake. It is sent from the server to the client to confirm that | |||
is willing to initiate the connection. | the server is willing to initiate the connection. | |||
10.7. Sec-WebSocket-Origin | 11.8. Sec-WebSocket-Origin | |||
This section describes a header field for registration in the | This section describes a header field for registration in the | |||
Permanent Message Header Field Registry. [RFC3864] | Permanent Message Header Field Registry. [RFC3864] | |||
Header field name | Header field name | |||
Sec-WebSocket-Origin | Sec-WebSocket-Origin | |||
Applicable protocol | Applicable protocol | |||
http | http | |||
Status | Status | |||
standard | standard | |||
Author/Change controller | Author/Change controller | |||
IETF | IETF | |||
Specification document(s) | Specification document(s) | |||
RFC XXXX | RFC XXXX | |||
Related information | Related information | |||
This header field is only used for WebSocket handshake. | This header field is only used for WebSocket opening handshake. | |||
The |Sec-WebSocket-Origin| header is used in the WebSocket handshake. | The |Sec-WebSocket-Origin| header is used in the WebSocket opening | |||
It is sent from the server to the client to confirm the origin of the | handshake. It is sent from the server to the client to confirm the | |||
script that opened the connection. This enables user agents to | origin of the script that opened the connection. This enables | |||
verify that the server is willing to serve the script that opened the | clients to verify that the server is willing to serve the script that | |||
connection. | opened the connection. | |||
10.8. Sec-WebSocket-Protocol | 11.9. Sec-WebSocket-Protocol | |||
This section describes a header field for registration in the | This section describes a header field for registration in the | |||
Permanent Message Header Field Registry. [RFC3864] | Permanent Message Header Field Registry. [RFC3864] | |||
Header field name | Header field name | |||
Sec-WebSocket-Protocol | Sec-WebSocket-Protocol | |||
Applicable protocol | Applicable protocol | |||
http | http | |||
Status | Status | |||
standard | standard | |||
Author/Change controller | Author/Change controller | |||
IETF | IETF | |||
Specification document(s) | Specification document(s) | |||
RFC XXXX | RFC XXXX | |||
Related information | Related information | |||
This header field is only used for WebSocket handshake. | This header field is only used for WebSocket opening handshake. | |||
The |Sec-WebSocket-Protocol| header is used in the WebSocket | The |Sec-WebSocket-Protocol| header is used in the WebSocket opening | |||
handshake. It is sent from the client to the server and back from | handshake. It is sent from the client to the server and back from | |||
the server to the client to confirm the subprotocol of the | the server to the client to confirm the subprotocol of the | |||
connection. This enables scripts to both select a subprotocol and be | connection. This enables scripts to both select a subprotocol and be | |||
sure that the server agreed to serve that subprotocol. | sure that the server agreed to serve that subprotocol. | |||
10.9. Sec-WebSocket-Version | 11.10. WebSocket Subprotocol Name Registry | |||
This specification requests the creation of a new IANA registry for | ||||
WebSocket Subprotocol names to be used with the WebSocket protocol in | ||||
accordance with the principles set out in RFC 5226 [RFC5226]. | ||||
As part of this registry IANA will maintain the following | ||||
information: | ||||
Subprotocol Identifier | ||||
The identifier of the subprotocol, as will be used in the Sec- | ||||
WebSocket-Protocol header registered in Section 11.9 of this | ||||
specification. The value must conform to the requirements given | ||||
in Paragraph 10 of Paragraph 4 of Section 5.1 of this | ||||
specification, namely the value must be a token as defined by RFC | ||||
2616 [RFC2616]. | ||||
Subprotocol Common Name | ||||
The name of the subprotocol, as the subprotocol is generally | ||||
referred to. | ||||
Subprotocol Definition | ||||
A reference to the document in which the subprotocol being used | ||||
with the WebSocket protocol is defined. | ||||
WebSocket Subprotocol names are to be subject to First Come First | ||||
Serve as per RFC5226 [RFC5226]. | ||||
11.11. Sec-WebSocket-Version | ||||
This section describes a header field for registration in the | This section describes a header field for registration in the | |||
Permanent Message Header Field Registry. [RFC3864] | Permanent Message Header Field Registry. [RFC3864] | |||
Header field name | Header field name | |||
Sec-WebSocket-Version | Sec-WebSocket-Version | |||
Applicable protocol | Applicable protocol | |||
http | http | |||
Status | Status | |||
standard | standard | |||
Author/Change controller | Author/Change controller | |||
IETF | IETF | |||
Specification document(s) | Specification document(s) | |||
RFC XXXX | RFC XXXX | |||
Related information | Related information | |||
This header field is only used for WebSocket handshake. | This header field is only used for WebSocket opening handshake. | |||
The |Sec-WebSocket-Version| header is used in the WebSocket | The |Sec-WebSocket-Version| header is used in the WebSocket opening | |||
handshake. It is sent from the client to the server to indicate the | handshake. It is sent from the client to the server to indicate the | |||
protocol version of the connection. This enables servers to | protocol version of the connection. This enables servers to | |||
correctly interpret the handshake and subsequent data being sent from | correctly interpret the opening handshake and subsequent data being | |||
the data, and close the connection if the server cannot interpret | sent from the data, and close the connection if the server cannot | |||
that data in a safe manner. | interpret that data in a safe manner. | |||
11. Using the WebSocket protocol from other specifications | 11.12. WebSocket Version Number Registry | |||
This specification requests the creation of a new IANA registry for | ||||
WebSocket Version Numbers to be used with the WebSocket protocol in | ||||
accordance with the principles set out in RFC 5226 [RFC5226]. | ||||
As part of this registry IANA will maintain the following | ||||
information: | ||||
Version Number | ||||
The version number to be used in the Sec-WebSocket-Version as | ||||
specified in Section 5.1 of this specification. The value must be | ||||
a whole number (zero or higher). | ||||
Reference | ||||
The RFC requesting a new version number. | ||||
WebSocket Version Numbers are to be subject to RFC Required as per | ||||
RFC5226 [RFC5226]. | ||||
IANA is asked to add initial values to the registry, with suggested | ||||
numerical values as these have been used in past versions of this | ||||
protocol. | ||||
Version Number | Reference | ||||
-+----------------+-----------------------------------------+- | ||||
| 0 + draft-ietf-hybi-thewebsocketprotocol-00 | | ||||
-+----------------+-----------------------------------------+- | ||||
| 1 + draft-ietf-hybi-thewebsocketprotocol-01 | | ||||
-+----------------+-----------------------------------------+- | ||||
| 2 + draft-ietf-hybi-thewebsocketprotocol-02 | | ||||
-+----------------+-----------------------------------------+- | ||||
| 3 + draft-ietf-hybi-thewebsocketprotocol-03 | | ||||
-+----------------+-----------------------------------------+- | ||||
| 4 + draft-ietf-hybi-thewebsocketprotocol-04 | | ||||
-+----------------+-----------------------------------------+- | ||||
| 5 + draft-ietf-hybi-thewebsocketprotocol-05 | | ||||
-+----------------+-----------------------------------------+- | ||||
| 6 + draft-ietf-hybi-thewebsocketprotocol-06 | | ||||
-+----------------+-----------------------------------------+- | ||||
| 7 + draft-ietf-hybi-thewebsocketprotocol-07 | | ||||
-+----------------+-----------------------------------------+- | ||||
| 8 + draft-ietf-hybi-thewebsocketprotocol-08 | | ||||
-+----------------+-----------------------------------------+- | ||||
11.13. WebSocket Close Code Number Registry | ||||
This specification requests the creation of a new IANA registry for | ||||
WebSocket Connection Close Code Numbers in accordance with the | ||||
principles set out in RFC 5226 [RFC5226]. | ||||
As part of this registry IANA will maintain the following | ||||
information: | ||||
Status Code | ||||
The Status Code which denotes a reson for a WebSocket connection | ||||
closure as per Section 7.4 of this document. The status code is | ||||
an integer number. | ||||
Meaning | ||||
The meaning of the status code. | ||||
Contact | ||||
A contact for the entity reserving the status code. | ||||
Reference | ||||
The stable document requesting the status codes and defining their | ||||
meaning, required for status codes in the range 1000-2999. | ||||
WebSocket Close Code Numbers are to be subject to different | ||||
registration requirements depending on their range. Unless otherwise | ||||
specified, requests are subject to Standards Action as per RFC5226 | ||||
[RFC5226]. Requests for status codes for use by this protocol or | ||||
subsequent versions are subject to Standards Action and should be | ||||
granted status codes in the range 1000-1999. Requests for status | ||||
codes for use by extensions are subject to Specification Required and | ||||
should be granted Status Codes in the range 2000-2999. Requests for | ||||
status codes for use by libraries and frameworks are subject to First | ||||
Come First Served and should be granted in the range 3000-3999. The | ||||
range of status codes from 4000-4999 is designated for Private Use by | ||||
application code. Requests should indicate whether they are | ||||
requesting status codes for use by the WebSocket protocol (or a | ||||
future version of the protocol), by extensions, or by libraries and | ||||
frameworks. | ||||
IANA is asked to add initial values to the registry, with suggested | ||||
numerical values as these have been used in past versions of this | ||||
protocol. | ||||
|Status Code | Meaning | Contact | Reference | | ||||
-+------------+-----------------+---------------+-----------| | ||||
| 1000 | Normal Closure | hybi@ietf.org | RFC XXXX | | ||||
-+------------+-----------------+---------------+-----------| | ||||
| 1001 | Going Away | hybi@ietf.org | RFC XXXX | | ||||
-+------------+-----------------+---------------+-----------| | ||||
| 1002 | Protocol error | hybi@ietf.org | RFC XXXX | | ||||
-+------------+-----------------+---------------+-----------| | ||||
| 1003 | Unsupported Data| hybi@ietf.org | RFC XXXX | | ||||
-+------------+-----------------+---------------+-----------| | ||||
| 1004 | Frame Too Large | hybi@ietf.org | RFC XXXX | | ||||
-+------------+-----------------+---------------+-----------| | ||||
| 1005 | No Status Rcvd | hybi@ietf.org | RFC XXXX | | ||||
-+------------+-----------------+---------------+-----------| | ||||
| 1006 | Abnormal Closure| hybi@ietf.org | RFC XXXX | | ||||
-+------------+-----------------+---------------+-----------| | ||||
11.14. WebSocket Opcode Registry | ||||
This specification requests the creation of a new IANA registry for | ||||
WebSocket Opcodes in accordance with the principles set out in RFC | ||||
5226 [RFC5226]. | ||||
As part of this registry IANA will maintain the following | ||||
information: | ||||
Opcode | ||||
The opcode denotes the frame type of the WebSocket frame, as | ||||
defined in Section 4.2. The status code is an integer number | ||||
between 0 and 15, inclusive. | ||||
Meaning | ||||
The meaning of the opcode code. | ||||
Reference | ||||
The specification requesting the opcode. | ||||
WebSocket Opcode numbers are subject to Standards Action as per | ||||
RFC5226 [RFC5226]. | ||||
IANA is asked to add initial values to the registry, with suggested | ||||
numerical values as these have been used in past versions of this | ||||
protocol. | ||||
|Opcode | Meaning | Reference | | ||||
-+--------+-------------------------------------+-----------| | ||||
| 0 | Continuation Frame | RFC XXXX | | ||||
-+--------+-------------------------------------+-----------| | ||||
| 1 | Text Frame | RFC XXXX | | ||||
-+--------+-------------------------------------+-----------| | ||||
| 2 | Binary Frame | RFC XXXX | | ||||
-+--------+-------------------------------------+-----------| | ||||
| 8 | Connection Close Frame | RFC XXXX | | ||||
-+--------+-------------------------------------+-----------| | ||||
| 9 | Ping Frame | RFC XXXX | | ||||
-+--------+-------------------------------------+-----------| | ||||
| 10 | Pong Frame | RFC XXXX | | ||||
-+--------+-------------------------------------+-----------| | ||||
11.15. WebSocket Framing Header Bits Registry | ||||
This specification requests the creation of a new IANA registry for | ||||
WebSocket Framing Header Bits in accordance with the principles set | ||||
out in RFC 5226 [RFC5226]. This registry controls assignment of the | ||||
bits marked RSV1, RSV2, and RSV3 in Section 4.2. | ||||
These bits are reserved for future versions or extensions of this | ||||
specification. | ||||
WebSocket Framing Header Bits assignments are subject to Standards | ||||
Action per RFC 5226 [RFC5226]. | ||||
12. Using the WebSocket protocol from Other Specifications | ||||
The WebSocket protocol is intended to be used by another | The WebSocket protocol is intended to be used by another | |||
specification to provide a generic mechanism for dynamic author- | specification to provide a generic mechanism for dynamic author- | |||
defined content, e.g. in a specification defining a scripted API. | defined content, e.g. in a specification defining a scripted API. | |||
Such a specification first needs to "establish a WebSocket | Such a specification first needs to _Establish a WebSocket | |||
connection", providing that algorithm with: | Connection_, providing that algorithm with: | |||
o The destination, consisting of a /host/ and a /port/. | o The destination, consisting of a /host/ and a /port/. | |||
o A /resource name/, which allows for multiple services to be | o A /resource name/, which allows for multiple services to be | |||
identified at one host and port. | identified at one host and port. | |||
o A /secure/ flag, which is true if the connection is to be | o A /secure/ flag, which is true if the connection is to be | |||
encrypted, and false otherwise. | encrypted, and false otherwise. | |||
o An ASCII serialization of an origin that is being made responsible | o An ASCII serialization of an origin that is being made responsible | |||
for the connection. [I-D.ietf-websec-origin] | for the connection. [I-D.ietf-websec-origin] | |||
o Optionally a string identifying a protocol that is to be layered | o Optionally a string identifying a protocol that is to be layered | |||
over the WebSocket connection. | over the WebSocket connection. | |||
The /host/, /port/, /resource name/, and /secure/ flag are usually | The /host/, /port/, /resource name/, and /secure/ flag are usually | |||
obtained from a URI using the steps to parse a WebSocket URI's | obtained from a URI using the steps to parse a WebSocket URI's | |||
components. These steps fail if the URI does not specify a | components. These steps fail if the URI does not specify a | |||
WebSocket. | WebSocket. | |||
If a connection can be established, then it is said that the | ||||
"WebSocket connection is established". | ||||
If at any time the connection is to be closed, then the specification | If at any time the connection is to be closed, then the specification | |||
needs to use the "close the WebSocket connection" algorithm. | needs to use the _Close the WebSocket Connection_ algorithm | |||
(Section 7.1.1). | ||||
When the connection is closed, for any reason including failure to | Section 7.1.4 defines when _The WebSocket Connection is Closed_. | |||
establish the connection in the first place, it is said that the | ||||
"WebSocket connection is closed". | ||||
While a connection is open, the specification will need to handle the | While a connection is open, the specification will need to handle the | |||
cases when "a WebSocket message has been received" with text /data/. | cases when _A WebSocket Message Has Been Received_ (Section 6.2). | |||
To send some text /data/ to an open connection, the specification | To send some data /data/ to an open connection, the specification | |||
needs to "send /data/ using the WebSocket". | needs to _Send a WebSocket Message_ (Section 6.1). | |||
12. Acknowledgements | 13. Acknowledgements | |||
Special thanks are due to Ian Hickson, who was the original author | Special thanks are due to Ian Hickson, who was the original author | |||
and editor of this protocol. The initial design of this | and editor of this protocol. The initial design of this | |||
specification benefitted from the participation of many people in the | specification benefitted from the participation of many people in the | |||
WHATWG and WHATWG mailing list. Contributions to that specification | WHATWG and WHATWG mailing list. Contributions to that specification | |||
are not tracked by section, but a list of all who contributed to that | are not tracked by section, but a list of all who contributed to that | |||
specification is given in the WHATWG HTML specification at | specification is given in the WHATWG HTML specification at | |||
http://whatwg.org/html5. | http://whatwg.org/html5. | |||
Special thanks also to John Tamplin for providing a significant | Special thanks also to John Tamplin for providing a significant | |||
amount of text for the Data Framing section of this specification. | amount of text for the Data Framing section of this specification. | |||
Special thanks also to Adam Barth for providing a significant amount | Special thanks also to Adam Barth for providing a significant amount | |||
of text and background research for the Data Masking section of this | of text and background research for the Data Masking section of this | |||
specification. | specification. | |||
13. References | 14. References | |||
13.1. Normative References | 14.1. Normative References | |||
[ANSI.X3-4.1986] | [ANSI.X3-4.1986] | |||
American National Standards Institute, "Coded Character | American National Standards Institute, "Coded Character | |||
Set - 7-bit American Standard Code for Information | Set - 7-bit American Standard Code for Information | |||
Interchange", ANSI X3.4, 1986. | Interchange", ANSI X3.4, 1986. | |||
[FIPS.180-2.2002] | [FIPS.180-2.2002] | |||
National Institute of Standards and Technology, "Secure | National Institute of Standards and Technology, "Secure | |||
Hash Standard", FIPS PUB 180-2, August 2002, <http:// | Hash Standard", FIPS PUB 180-2, August 2002, <http:// | |||
csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf>. | csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf>. | |||
skipping to change at page 55, line 29 | skipping to change at page 65, line 29 | |||
[RFC1951] Deutsch, P., "DEFLATE Compressed Data Format Specification | [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format Specification | |||
version 1.3", RFC 1951, May 1996. | version 1.3", RFC 1951, May 1996. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
[RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | |||
Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | |||
Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | |||
[RFC2817] Khare, R. and S. Lawrence, "Upgrading to TLS Within | ||||
HTTP/1.1", RFC 2817, May 2000. | ||||
[RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000. | |||
[RFC3490] Faltstrom, P., Hoffman, P., and A. Costello, | [RFC3490] Faltstrom, P., Hoffman, P., and A. Costello, | |||
"Internationalizing Domain Names in Applications (IDNA)", | "Internationalizing Domain Names in Applications (IDNA)", | |||
RFC 3490, March 2003. | RFC 3490, March 2003. | |||
[RFC3492] Costello, A., "Punycode: A Bootstring encoding of Unicode | ||||
for Internationalized Domain Names in Applications | ||||
(IDNA)", RFC 3492, March 2003. | ||||
[RFC3548] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC3548] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
Encodings", RFC 3548, July 2003. | Encodings", RFC 3548, July 2003. | |||
[RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO | |||
10646", STD 63, RFC 3629, November 2003. | 10646", STD 63, RFC 3629, November 2003. | |||
[RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration | |||
Procedures for Message Header Fields", BCP 90, RFC 3864, | Procedures for Message Header Fields", BCP 90, RFC 3864, | |||
September 2004. | September 2004. | |||
[RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform | |||
Resource Identifier (URI): Generic Syntax", STD 66, | Resource Identifier (URI): Generic Syntax", STD 66, | |||
RFC 3986, January 2005. | RFC 3986, January 2005. | |||
[RFC3987] Duerst, M. and M. Suignard, "Internationalized Resource | [RFC3987] Duerst, M. and M. Suignard, "Internationalized Resource | |||
Identifiers (IRIs)", RFC 3987, January 2005. | Identifiers (IRIs)", RFC 3987, January 2005. | |||
[RFC4086] Eastlake, D., Schiller, J., and S. Crocker, "Randomness | ||||
Requirements for Security", BCP 106, RFC 4086, June 2005. | ||||
[RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
(TLS) Protocol Version 1.2", RFC 5246, August 2008. | (TLS) Protocol Version 1.2", RFC 5246, August 2008. | |||
[RFC6066] Eastlake, D., "Transport Layer Security (TLS) Extensions: | [RFC6066] Eastlake, D., "Transport Layer Security (TLS) Extensions: | |||
Extension Definitions", RFC 6066, January 2011. | Extension Definitions", RFC 6066, January 2011. | |||
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
Encodings", RFC 4648, October 2006. | Encodings", RFC 4648, October 2006. | |||
[RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an | ||||
IANA Considerations Section in RFCs", BCP 26, RFC 5226, | ||||
May 2008. | ||||
[RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | |||
Specifications: ABNF", STD 68, RFC 5234, January 2008. | Specifications: ABNF", STD 68, RFC 5234, January 2008. | |||
13.2. Informative References | 14.2. Informative References | |||
[WSAPI] Hickson, I., "The Web Sockets API", August 2010, | [WSAPI] Hickson, I., "The Web Sockets API", August 2010, | |||
<http://dev.w3.org/html5/websockets/>. | <http://dev.w3.org/html5/websockets/>. | |||
[I-D.ietf-httpstate-cookie] | [I-D.ietf-httpstate-cookie] | |||
Barth, A., "HTTP State Management Mechanism", | Barth, A., "HTTP State Management Mechanism", | |||
draft-ietf-httpstate-cookie-20 (work in progress), | draft-ietf-httpstate-cookie-20 (work in progress), | |||
December 2010. | December 2010. | |||
[I-D.ietf-websec-origin] | [I-D.ietf-websec-origin] | |||
skipping to change at page 57, line 5 | skipping to change at page 66, line 51 | |||
Specification version 3.3", RFC 1950, May 1996. | Specification version 3.3", RFC 1950, May 1996. | |||
[RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | [RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | |||
October 2008. | October 2008. | |||
[RFC6202] Loreto, S., Saint-Andre, P., Salsano, S., and G. Wilkins, | [RFC6202] Loreto, S., Saint-Andre, P., Salsano, S., and G. Wilkins, | |||
"Known Issues and Best Practices for the Use of Long | "Known Issues and Best Practices for the Use of Long | |||
Polling and Streaming in Bidirectional HTTP", RFC 6202, | Polling and Streaming in Bidirectional HTTP", RFC 6202, | |||
April 2011. | April 2011. | |||
[W3C.REC-wsc-ui-20100812] | ||||
Saldhana, A. and T. Roessler, "Web Security Context: User | ||||
Interface Guidelines", World Wide Web Consortium | ||||
Recommendation REC-wsc-ui-20100812, August 2010, | ||||
<http://www.w3.org/TR/2010/REC-wsc-ui-20100812>. | ||||
Author's Address | Author's Address | |||
Ian Fette | Ian Fette | |||
Google, Inc. | Google, Inc. | |||
Email: ifette+ietf@google.com | Email: ifette+ietf@google.com | |||
URI: http://www.ianfette.com/ | URI: http://www.ianfette.com/ | |||
End of changes. 203 change blocks. | ||||
574 lines changed or deleted | 1057 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |