WebSocket 协议(RFC6455)中文翻译版(word版)
websocket接口协议书

websocket接口协议书甲方(服务提供方):_____________________乙方(服务使用方):_____________________鉴于甲方拥有合法的Websocket接口服务,乙方需要使用甲方提供的Websocket接口服务进行数据交互,经双方协商一致,特订立本协议书。
#### 第一条定义1.1 Websocket接口:指甲方提供的用于实现乙方与甲方系统之间实时数据交互的接口服务。
1.2 数据交互:指乙方通过Websocket接口与甲方系统进行数据发送和接收的过程。
#### 第二条服务内容2.1 甲方同意向乙方提供Websocket接口服务,以实现乙方系统与甲方系统之间的实时数据交互。
2.2 甲方应保证所提供的Websocket接口服务的稳定性、安全性和可靠性。
#### 第三条服务期限3.1 本协议书服务期限自____年____月____日起至____年____月____日止。
#### 第四条服务费用4.1 乙方应按照双方约定的标准支付给甲方相应的服务费用。
4.2 服务费用的具体金额、支付方式和支付时间由双方另行协商确定。
#### 第五条甲方的权利和义务5.1 甲方有权根据实际情况调整Websocket接口服务的内容和方式。
5.2 甲方有义务提供技术支持,协助乙方解决使用Websocket接口过程中遇到的技术问题。
#### 第六条乙方的权利和义务6.1 乙方有权使用甲方提供的Websocket接口服务进行数据交互。
6.2 乙方有义务按照约定支付服务费用,并保证数据交互的合法性和安全性。
#### 第七条数据安全与保密7.1 双方应遵守相关法律法规,确保通过Websocket接口交互的数据安全。
7.2 双方应对通过Websocket接口交互的数据保密,未经对方书面同意,不得向第三方披露。
#### 第八条违约责任8.1 如一方违反本协议约定,应承担违约责任,并赔偿对方因此遭受的损失。
python之WebSocket协议

python之WebSocket协议⼀、WebSocket理论部分1、websocket是什么Websocket是html5提出的⼀个协议规范,参考rfc6455。
websocket约定了⼀个通信的规范,通过⼀个握⼿的机制,客户端(浏览器)和服务器(webserver)之间能建⽴⼀个类似tcp的连接,从⽽⽅便c-s之间的通信。
在websocket出现之前,web交互⼀般是基于http协议的短连接或者长连接。
WebSocket是为解决客户端与服务端实时通信⽽产⽣的技术。
websocket协议本质上是⼀个基于tcp的协议,是先通过HTTP/HTTPS协议发起⼀条特殊的http请求进⾏握⼿后创建⼀个⽤于交换数据的TCP连接,此后服务端与客户端通过此TCP连接进⾏实时通信。
注意:此时不再需要原HTTP协议的参与了。
2、websocket的优点以前web server实现推送技术或者即时通讯,⽤的都是轮询(polling),在特点的时间间隔(⽐如1秒钟)由浏览器⾃动发出请求,将服务器的消息主动的拉回来,在这种情况下,我们需要不断的向服务器发送请求,然⽽HTTP request 的header是⾮常长的,⾥⾯包含的数据可能只是⼀个很⼩的值,这样会占⽤很多的带宽和服务器资源。
⽽最⽐较新的技术去做轮询的效果是Comet – ⽤了AJAX。
但这种技术虽然可达到全双⼯通信,但依然需要发出请求(reuqest)。
WebSocket API最伟⼤之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。
浏览器和服务器只需要要做⼀个握⼿的动作,在建⽴连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。
此外,服务器与客户端之间交换的标头信息很⼩。
WebSocket并不限于以Ajax(或XHR)⽅式通信,因为Ajax技术需要客户端发起请求,⽽WebSocket服务器和客户端可以彼此相互推送信息;因此从服务器⾓度来说,websocket有以下好处:1. 节省每次请求的headerhttp的header⼀般有⼏⼗字节2. Server Push服务器可以主动传送数据给客户端3、websocket的协议规范1.基于flash的握⼿协议使⽤场景是IE的多数版本,因为IE的多数版本不都不⽀持WebSocket协议,以及FF、CHROME等浏览器的低版本,还没有原⽣的⽀持WebSocket。
WebSocket协议中文版

Internet Engineering Task Force (IETF) I. Fette Request for Comments: 6455 Google, Inc. Category: Standards Track A. Melnikov ISSN: 2070-1721 Isode Ltd. December 2011张开涛[译]WebSocket协议摘要WebSocket协议实现在受控环境中运行不受信任代码的一个客户端到一个从该代码已经选择加入通信的远程主机之间的全双工通信。
用于这个的安全模型是通常由web浏览器使用的基于来源的安全模型。
该协议包括一个打开阶段握手、接着是基本消息帧、TCP之上的分层(layered over TCP)。
该技术的目标是为需要与服务器全双工通信且不需要依赖打开多个HTTP连接(例如,使用XMLHttpRequest或<iframe>和长轮询)的基于浏览器应用的提供一种机制。
本备忘录状态这是一个Internet标准跟踪文档。
本文档是互联网工程任务组(IETF)的一个产物。
它代表了IETF社区的共识。
它已接受公共审查和已经被互联网工程指导委员会(IESG)认可发布。
Internet 标准的更多信息可在RFC 5741第2节找到。
本文档的当前状态信息、任何勘误表以及如何提供它的反馈,可于/info/rfc6455获取。
版权声明版权所有(C) 2011 IETF信托和确认为文档作者的人。
保留所有权利。
本文档遵守BCP 78和涉及IETF文档(/license-info)的在本文档发布之日起生效的IETF信托的法律条文。
请仔细阅读这些文档,因为他们描述了关于本文档的你的权利和限制。
从本文档中提取的代码组件必须包括描述在第四章的简体BSD License文件。
e的信托法律条文并提供,不保证描述在简体BSD License中。
目录摘要 (2)本备忘录状态 (2)版权声明 (2)目录 (3)1.引言 (6)1.1.背景 (6)1.2.协议概述 (7)1.3.打开阶段握手 (8)1.4.关闭阶段握手 (10)1.5.设计理念 (11)1.6.安全模型 (12)1.7.与TCP和HTTP的关系 (12)1.8.建立连接 (12)1.9.使用WebSocket协议的子协议 (13)2.一致性要求 (14)2.1.术语和其他约定 (14)3.WebSocket URI (16)4.打开阶段握手 (17)4.1.客户端要求 (17)4.2.服务器端要求 (21)4.2.1.读取客户端的打开阶段握手 (21)4.2.2.发送服务器的打开阶段握手 (22)4.3.为握手中使用的新的头字段整理的ABNF (25)4.4.支持多个版本的WebSocket协议 (27)5.数据帧 (29)5.1概述 (29)5.2基本帧协议 (29)5.3.客户端到服务器掩码 (35)5.4.分片(Fragmentation) (36)5.5.控制帧 (37)5.5.1.Close (38)5.5.2. Ping (38)5.5.3. Pong (39)5.6.数据帧 (39)5.7.示例 (40)5.8.可扩展性 (40)6.发送和接收数据 (42)6.1.发送数据 (42)6.2.接收数据 (42)7.关闭连接 (44)7.1.定义 (44)7.1.1.关闭WebSocket连接 (44)7.1.2.启动WebSocket关闭阶段握手 (44)7.1.3. WebSocket关闭阶段握手已启动 (44)7.1.4. WebSocket已关闭 (44)7.1.5.WebSocket连接关闭代码 (45)7.1.6. WebSocket连接关闭原因 (45)7.1.7.失败WebSocket连接 (45)7.2.异常关闭 (46)7.2.1.客户端发起的关闭 (46)7.2.2.服务端发起的关闭 (46)7.2.3.从异常关闭中恢复 (46)7.3.正常连接关闭 (47)7.4.状态码 (47)7.4.1 定义的状态码 (47)7.4.2. 保留的状态码范围 (49)8.错误处理 (50)8.1.处理UTF-8编码数据的错误 (50)9.扩展 (50)9.1.协商扩展 (50)9.2.已知扩展 (52)10.安全注意事项 (52)10.1.非浏览器客户端 (52)10.2. Origin注意事项 (52)10.3.攻击基础设施(掩码) (52)10.4.实现特定限制 (54)10.5.WebSocket客户端验证 (54)10.6.连接的保密性和完整性 (54)10.7.处理无效数据 (54)10.8.使用SHA-1的WebSocket握手 (55)11. IANA考虑 (55)11.1.注册新的URI模式 (55)11.1.1.注册“ws“模式 (55)11.1.2.注册”wss“模式 (56)11.2.注册”WebSocket“ HTTP Upgrade关键字 (58)11.3.注册新的HTTP头字段 (58)11.3.1. Sec-WebSocket-Key (58)11.3.2. Sec-WebSocket-Extensions (59)11.3.3. Sec-WebSocket-Accept (60)11.3.4. Sec-WebSocket-Protocol (61)11.3.5.Sec-WebSocket-Version (62)11.4.WebSocket扩展名注册 (63)11.5.WebSocket子协议名注册 (63)11.6.WebSocket版本号注册 (64)11.7.WebSocket关闭代码注册 (65)11.8.WebSocket操作码注册 (67)11.9.WebSocket帧头位注册 (68)12.其他规范使用WebSocket协议 (68)13.致谢 (69)14.参考资料 (70)14.1.参考标准 (70)14.2.参考资料 (70)1.引言1.1.背景本节是非规范的。
WebSocket协议全双工通信的网络协议

WebSocket协议全双工通信的网络协议WebSocket协议是一种在Web应用程序中实现全双工通信的网络协议。
它通过在客户端和服务器之间建立持久连接,允许双方实时地发送和接收数据。
与传统的HTTP请求-响应模式相比,WebSocket具有更低的延迟和更高的效率,使得实时性要求较高的应用程序能够更好地运行。
一、WebSocket协议的特点WebSocket协议具有以下几个特点:1. 全双工通信:WebSocket协议允许客户端和服务器之间的双向数据传输,双方可以同时发送和接收数据。
2. 持久连接:与HTTP请求-响应模式中的每次请求都要建立和断开连接不同,WebSocket协议在初始握手完成后保持连接,使得实时通信成为可能。
3. 基于TCP协议:WebSocket协议基于TCP协议运行,保证了传输的可靠性和稳定性。
4. 较低的延迟:由于WebSocket协议的持久连接和全双工通信特性,数据传输的延迟较低,适用于实时性要求较高的应用场景。
5. 轻量级:WebSocket协议的报文头较小,减少了传输的负载,在一定程度上降低了网络传输的开销。
二、WebSocket协议的工作原理WebSocket协议的工作原理可以概括为以下几个步骤:1. 客户端发起握手请求:客户端通过发送一个HTTP请求到服务器来发起WebSocket连接。
请求中包含协议升级头部字段Upgrade,请求成功后服务器将返回101状态码表示切换到WebSocket协议。
2. 服务器进行握手响应:服务器接收到客户端的握手请求后,验证请求头信息、生成响应报文,并将响应报文返回给客户端。
3. 建立连接:一旦握手成功,客户端和服务器之间建立起持久的连接,双方可以通过该连接进行实时的数据传输。
4. 双向数据传输:连接建立后,客户端和服务器都可以通过发送和接收数据帧的方式进行实时的双向数据传输。
三、WebSocket协议的应用场景WebSocket协议适用于以下几种应用场景:1. 实时聊天:WebSocket协议可以帮助实现实时聊天功能,用户可以即时收到其他用户的消息并进行回复。
基于RFC6455协议的高性能实时Web服务

基于RFC6455协议的高性能实时Web服务随着互联网的发展,实时Web服务已经变得越来越重要。
这个领域的主要挑战是要能够快速地处理大量的实时数据,同时确保服务的高性能和可靠性。
为了满足这些要求,RFC6455协议成为了实时Web服务的一种重要的解决方案。
本文将介绍基于RFC6455协议的高性能实时Web服务,并探讨它的关键技术和应用场景。
一. RFC6455协议简介RFC6455是WebSocket协议的标准规范,支持双向通信,可以在客户端和服务器之间建立持久连接。
相较于HTTP协议,WebSocket具有更优秀的性能和更低的延迟。
WebSocket协议通过一个握手过程来建立连接,之后数据传输就可以变得非常快速和高效。
与传统Web服务不同,WebSocket可以实现实时数据的传输,可以处理移动应用程序、游戏和视频流等实时数据。
同时,WebSocket还可以在Web浏览器中使用,使得实时数据的处理和展示变得更加灵活和自由。
二. 基于RFC6455协议的高性能实时Web服务的关键技术1. 前端技术前端技术是实现实时Web服务的基础。
前端技术包括JavaScript和HTML/CSS,可以实现对实时数据的监测、快速响应和数据可视化等功能。
2. 服务器端技术服务器端技术是Web服务的核心。
WebSocket服务器端技术包括Java、Python和Node.js等,其中Node.js是一种高效的服务器端解决方案,可以实现异步I/O操作,提高系统性能和响应速度。
3. 数据传输数据传输是实时Web服务的关键环节。
WebSocket可以通过两种方式进行数据传输:文本数据传输和二进制数据传输。
文本数据传输可以支持Unicode字符集,使得传输的数据更具有表现力和功能性。
二进制数据传输可以处理海量数据和图像等复杂类型的数据,具有更高的传输效率。
三. 基于RFC6455协议的高性能实时Web服务的应用场景1. 游戏WebSocket可以在游戏中实现实时交互和实时数据传输,可以大幅度提升游戏的体验和流畅度。
wss协议

wss协议WebSocket是一种基于TCP协议的全双工通信协议,可以在浏览器和服务器之间建立持久连接,实现实时的双向通信。
它允许浏览器和服务器之间进行低延迟的数据交换,支持服务器主动推送消息给客户端,大大提高了Web应用的实时性和效率。
与传统的HTTP协议相比,WebSocket协议的优势主要体现在以下几个方面:1.建立连接速度快:WebSocket采用了HTTP握手建立连接的方式,但连接一旦建立成功后,后续的数据传输过程就不再需要HTTP协议的部分,因此可以大大减少握手的开销,提高连接的建立速度。
2.数据传输效率高:WebSocket采用了二进制帧传输数据,相对于HTTP的文本传输,可以更高效地传输数据,减少带宽的占用。
3.双向通信实时性好:WebSocket支持服务器主动推送消息给客户端,实时性更高,特别适用于需要实时交互的应用,如聊天室、股票行情等。
WebSocket协议的核心就是WebSocket API,通过JavaScript 代码调用WebSocket API可以实现与服务器的连接、数据的发送和接收。
使用WebSocket协议的基本过程如下:1.客户端发起握手请求:浏览器向服务器发送HTTP请求,请求协议为"Upgrade: websocket",服务器收到请求后返回101状态码表示允许使用WebSocket协议。
2.建立连接:握手成功后,浏览器和服务器之间建立WebSocket连接,连接的URL由浏览器提供。
3.数据传输:连接建立成功后,浏览器和服务器之间可以通过send()方法发送数据,也可以通过onmessage事件接收服务器发送的数据。
4.关闭连接:通信结束后,可以调用close()方法关闭连接。
WebSocket协议的应用场景非常广泛,特别是在实时通信和协作开发中有着重要的作用。
比如在线聊天系统中可以使用WebSocket实现实时的双向通信,使聊天内容实时更新;在在线协作开发中可以利用WebSocket实现多人实时编辑同一份文档,提高团队的协作效率。
WebSocket协议介绍

Client端要求
Client发起连接:
根据/Host/和/Port/打开TCP连接,如果/Secure flag/为true,则在TCP连接建立后,进行TLS连接建 立过程;
发送WebSocket HTTP Request:
参考RFC2616构造合法的HTTP Get Request:Request方法必须是Get,Version至少是HTTP1.1; Request-URI必须是/Resource Name/或者是由/Host/、/Port/、/Resource Name/组成的HTTP/s绝对路径;
Server端要求
建立Websocket协议信息 /subprotocol/:根据Request中的|Sec-WebSocket-Protocol|头域,结合Server侧实 际支持情况,选择本次连接使用的的子协议;如果Request未携带|Sec-WebSocketProtocol|头域或者Server不同意使用任意一个,则设置为null,返回Client时不携带 该头域,表示Server不同意Client指示的子协议; /extensions/:根据Request中的|Sec-WebSocket-Extensions|,结合Server侧对子 协议的实际支持情况,生成扩展集合,集合可能为null;
HTTP header中必须包含|Host|头域,由/Host/加可选的:/Port/组成; HTTP header中必须包含|Upgrade|头域,取值必须是”websocket”; HTTP header中必须包含|Connection|头域,取值必须是”Upgrade”; HTTP header中必须包含|Sec-WebSocket-Key|头域,该值为Client选择的16Byte随机数的Base64编码值; HTTP header中必须包含|Sec-WebSocket-Version|头域,取值13 HTTP header中可选包含|Sec-WebSocket-Protocol|头域,指示Client期望协商的由逗号分隔的一个或多个
详解websocket协议

详解websocket协议WebSocket协议是一种在Web应用程序中实现双向通信的协议。
它允许服务器和客户端之间建立持久的连接,实现实时数据传输。
本文将详细介绍WebSocket协议的原理、特点、使用方法以及相关安全性措施。
一、协议原理WebSocket协议基于HTTP协议,通过在HTTP握手阶段升级协议来实现双向通信。
在握手过程中,客户端发送一个特殊的HTTP请求,服务器返回一个特殊的HTTP响应,然后双方之间的通信就可以通过全双工的方式进行。
二、协议特点1. 实时性:WebSocket协议支持实时数据传输,可以在服务器和客户端之间实现低延迟的双向通信。
2. 双向通信:WebSocket协议允许服务器主动向客户端推送数据,而不需要客户端发送请求。
3. 低开销:WebSocket协议使用较少的网络流量和计算资源,因为它使用的是二进制数据格式,而不是文本数据格式。
4. 跨域支持:WebSocket协议支持跨域通信,可以在不同域名之间进行通信。
三、使用方法1. 建立连接:客户端通过创建WebSocket对象来建立与服务器的连接。
可以使用JavaScript的WebSocket API来创建WebSocket对象,并指定服务器的URL。
2. 发送数据:客户端可以通过WebSocket对象的send()方法向服务器发送数据。
发送的数据可以是文本数据或二进制数据。
3. 接收数据:客户端可以通过WebSocket对象的onmessage事件来接收服务器发送的数据。
通过监听onmessage事件,客户端可以实时获取服务器推送的数据。
4. 关闭连接:客户端可以通过WebSocket对象的close()方法关闭与服务器的连接。
关闭连接后,客户端将无法再发送和接收数据。
四、安全性措施1. 加密传输:为了保护数据的安全性,可以使用SSL/TLS协议对WebSocket通信进行加密。
通过使用wss://而不是ws://来指定WebSocket的URL,可以将通信升级为加密通信。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WebSocket 协议(RFC6455)中文翻译版(word版)翻译自:/rfc/rfc6455.txtInternet Engineering Task Force (IETF) I. FetteRequest for Comments: 6455 Google, Inc.Category: Standards Track A. MelnikovISSN: 2070-1721 Isode Ltd. December 2011WebSocket 协议摘要WebSocket协议使在控制环境下运行不受信任代码的客户端和能够选择与那些代码通信的远程主机之间能够双向通信。
用于这个的安全模型是以origin为基础的安全模型,一般被浏览器使用。
协议包含打开握手,其次是基本消息框架,在 TCP 之上。
这项技术的目的是为基于浏览器的、需要与服务器双向通信的应用程序提供一种不依赖于打开多个HTTP连接的机制(例如,使用XMLHttpRequest或<iframe>和长轮询)。
本备忘录的状态这是一个Internet标准跟踪文件。
这个文档是因特网工程师任务组(IETF)的一个产品。
它代表了IETF社区的共识。
它已接受公众审查,因特网工程指导组(IESG)证明可出版。
关于互联网标准的进一步信息在RFC5741的第2章节。
关于本文档当前状态的信息、勘误表和如何提供反馈,可以在/info/rfc6455找到。
版权声明Copyright (c) 2011 IETF Trust and the persons identified as the document authors. All rights reserved.This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating to IETF Documents (/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.1 介绍1.1 背景这部分是不规范的。
历史上,创建需要在客户端和服务器间双向通信的网络应用程序(如即时消息和游戏程序)要求滥用 HTTP 来轮询服务器来获得更新,通过不同 HTTP 请求来发送上行通知。
这导致各种问题:•服务器被迫为每个客户端使用一些不同的底层TCP连接:一个用来向客户端发送消息,为每个到来的消息使用一个新的。
•通信(wire)协议具有很高的开销,因为每个客户端到服务器的消息有HTTP 头。
•客户端侧的脚本被迫维护输出连接到输入连接的映射来追踪响应。
一个简单的解决方法是为双向传输使用单一的TCP连接。
这是WebSocket协议提供的。
结合WebSocket API(WSAPI),它为web页面到远程服务器的双向通信提供了HTTP轮询的替代方案。
同样的技术也可用于各种web应用程序:游戏,股票行情,多用户协同编辑的应用程序,用户界面实时展示服务器侧服务等。
WebSocket协议设计用来取代使用HTTP作为传输层的双向通信技术,并从现有的基础设施(代理、过滤、认证)受益。
这些技术作为效率与可靠性的平衡而实现,因为HTTP最初并不是用于双向通信的(见RFC6202有多更讨论)。
WebSocket尝试解决在现有HTTP基础设施的环境下现有HTTP双向通信技术的目标;像这样,它设计来工作于HTTP 80、443端口上,并支持HTTP代理和中间设施,即使这意味着增加现有环境的一些复杂性。
然而,设计并没有将WebSocket局限于HTTP,未来的实现可以在特定的端口上使用更简单的握手,而不需要重新发明整个协议。
最后一点是重要的,因为交互式消息的传输模式并不紧密符合标准的HTTP传输,会在一些部件上引起异常的负载。
1.2 协议概览这部分是不规范的。
WebSocket 协议有两部分:握手和数据传输。
来自客户端的握手开起来像下面:来自服务器的握手开起来像下面:来自客户端的引导行遵从Request-Line格式,来自服务器的引导行遵从Status-Line格式。
Request-Line和Status-Line在RFC2616定义。
在两种情况下,引导行后面跟着一组未排序的头域。
这些头域的意义在本文档的第4章指定。
额外的头域也可能出现,如cookie RFC6265。
头的格式和解析在RFC2616定义。
一旦客户端和服务器都发送了他们的握手,如果握手成功,传输数据部分开始。
这是一个双向传输通道,每个端都能独立、随意发送数据。
在成功握手后,客户端和服务器来回传输数据是以消息message为概念单位的。
在传输介质上(on the wire),一个消息由一个或多个帧frame组成。
WebSocket 消息不需要对应到特定网络层的帧,因为分帧后的消息可能被中间设施合并或拆分。
一帧都有一个关联的类型。
属于同一个消息的帧拥有相同的数据类型,广义地说,有文本数据(解释为UTF-8 RFC3629文本)、二进制数据(它的解释留给了应用程序)和控制帧(不打算携带应用数据,携带的是协议层的信号,如连接关闭信号)类型。
这个版本的协议定义了6种帧类型,并保留了10种为以后使用。
1.3 打开握手这部分是不规范的。
打开握手为了兼容基于HTTP的服务器端软件和中间设施,使同一个端口能够接受HTTP客户端和WebSocket客户端,为了这个目的,WebSocket客户端的握手是HTTP请求的升级。
为了兼容RFC2616,客户端握手里的头域可能以任意的顺序发送,因此不同头域接收到的顺序是不重要的。
GET方法(RFC2616)的Request-URI用于识别WebSocket连接的终端,允许一个IP 地址服务多个域domain,和允许单个服务器提供多个WebSocket终端。
客户端在握手的Host头域里包含主机名,这样,客户端和服务器能够验证他们同意使用哪个主机。
额外的头域用于选择WebSocket协议的选项。
此版本中典型的可用选项有子协议选择器Sec-WebSocket-Protocol,Sec-WebSocket-Protocol列出客户端支持的扩展,Origin头域等等。
Sec-WebSocket-Protocol请求头域可用来表明客户端可接受的子协议(WebSocket协议之上的应用程序层协议)。
服务器选择1个或0个可接受的协议,输出到它的握手,来指明它选择了那个协议。
Sec-WebSocket-Protocol: chatOrigin头域(RFC6454)用于保护WebSocket服务器不被未授权的运行在浏览器的脚本跨源使用WebSocket API。
如果服务器不想接受来自这个源的连接,它可以拒绝连接,并发送一个合适的HTTP错误码。
这个头域由浏览器客户端发送;对于非浏览器客户端,这个头域可能发送,如果它在客户端上下文环境中有意义。
最后,服务器得向客户端证明它接收到了客户端的WebSocket握手,为使服务器不接受非WebSocket连接。
这防止攻击者通过XMLHttpRequest发送或表单提交精心构造的包来欺骗WebSocket服务器。
为了证明握手被接收,服务器把两块信息合并来形成响应。
第一块信息来自客户端握手头域Sec-WebSocket-Key,如Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==对于这个头域,服务器取头的值(由于出现在头域,例如,base64编码[RFC4648]后的版本,消除任何前面后面的空白符),以字符串的形式拼接全局唯一的(GUID,[RFC4122])标识:258EAFA5-E914-47DA-95CA-C5AB0DC85B11,此值不大可能被不明白WebSocket协议的网络终端使用。
然后进行SHA-1 hash(160位)编码,再进行base64编码,将结果作为服务器的握手返回。
具体如下:请求头:Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==取值,字符串拼接后得到:"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11";SHA-1后得到:0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x460x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xeaBase64后得到:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=最后的结果值作为响应头Sec-WebSocket-Accept的值。
来自服务器的握手比客户端的简单很多。
首先是HTTP 状态行,状态码是101:HTTP/1.1 101 Switching Protocols任何非101的状态码表示WebSocket握手还没有完成,HTTP语义仍然生效。
Connection和Upgrade头域完成HTTP升级。
Sec-WebSocket-Accept头表明服务器是否愿意接受连接。
如果有,值必须是前面提到的算法得到的值,否则不能解释为服务器接受连接。
这些字段由WebSocket客户端为脚本页面检测,如果Sec-WebSocket-Accept的值不符合预期的值,如果头缺失,或HTTP状态码不是101,连接不会建立,WebSocket帧不会发送。
还可以包含一些可选字段。
在协议的这个版本里,主要的可选字段是Sec-WebSocket-Protocol,表示服务器选择的子协议。
WebSocket客户端验证服务器选择了一个客户端握手中指定的值。
支持多个子协议的服务器必须确保它选择了一个基于客户端握手并在它自己的握手里指定了它。
服务器也可以设置cookie有关的可选头。