websocket协议

原创 2016年08月30日 15:09:06

URI方案:

      ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]
      wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]

本协议有两部分:握手和数据传输。

来自客户端的握手看起来像如下形式:

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: http://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13

来自服务器的握手看起来像如下形式:

  HTTP/1.1 101 Switching Protocols 
  Upgrade: websocket 
  Connection: Upgrade 
  Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 
  Sec-WebSocket-Protocol: chat

来自客户端的首行遵照Request-Line格式。来自服务器的首行遵照Status-Line格式。详情见(https://tools.ietf.org/html/rfc2616)

打开阶段握手:

  打开阶段握手目的是兼容基于HTTP的服务器软件和中间件,以便单个端口可以用于与服务器交流的HTTP客户端和与服务器交流的WebSocket客户端。
最后,WebSocket客户端的握手是一个HTTP Upgrade请求:

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: http://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13
握手中的头字段可能由客户端按照任意顺序发送,因此在接收的不同头字段中的顺序是不重要的。

来自服务器的握手比客户端握手更简单。首行是一个HTTP Status-Line,具有状态码101:

  HTTP/1.1 101 Switching Protocols 
  Upgrade: websocket 
  Connection: Upgrade 
  Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 
  Sec-WebSocket-Protocol: chat
关闭阶段握手:

  关闭阶段握手比打开阶段握手简单得多。两个节点中的任一个都能发送一个控制帧与包含一个指定控制序列的数据来开始关闭阶段握手。在收到这样一个帧时,另一个节点在响应中发送一个Close帧,如果还没有发送一个。在收到那个控制帧时,第一个节点接着关闭连接,安全地知道没有更多的数据到来。 

----------------------------------------------------------------------------------------------------

客户端请求字段:

一旦一个到服务器的连接连接(包括通过代理或在TLS加密隧道之上的连接),客户端必须发送一个打开阶段握手到服务器。该握手包括一个HTTP Upgrade请求,连同一个必需的和可选的头字段列表。该握手的要求如下所示:

1.握手必须是有效的HTTP请求。

2.请求方法必须是GET、且HTTP版本必须是至少1.1。
  例如,如果WebSocket URI是“ws://example.com/chat”,发送的第一行应该是“GET /chat HTTP/1.1”。

3.请求的“Request-URI”部分必须匹配定义在第三章的(一个相对URI)/resource name/或是一个绝对的http/https URI,当解析时,有一个/resource name/、/host/、和/port/匹配相应的ws/wss URI。

4.请求必须包含一个|Host|头字段,其值包含/host/加上可选的“:”后跟/port/(当没用默认端口时)。

5.请求必须包含一个|Upgrade|头字段,其值必须包含“websocket”关键字。

6.请求必须包含一个|Connection|头字段,其值必须包含“Upgrade”标记。

7.请求必须包含一个名字为| Sec-WebSocket-Key |的头字段,这个头字段的值必须是临时(nonce)组成的一个随机选择的已经base64编码的(参见[RFC4648]第4章)16位的值。临时必须是为每个连接随机选择的。

8.如果请求来自一个浏览器客户端,请求必须包含一个名字为|Origin|[RFC6454]的头字段。如果连接是来自非浏览器客户端,如果该客户端的语义匹配描述在这的用于浏览器的使用情况时,请求可以包含这个字段。该头字段的值是在建立正运行的连接代码中的环境的origin 的ASCII序列化。参考[RFC6454]获取如果构造该头字段的值的详细信息。

9.请求必须包含一个名字为|Sec-WebSocket-Version|的头字段。该头字段的值必须是13。

10.请求可以包含一个名字为|Sec-WebSocket-Protocol|的头字段。如果存在,该值表示一个或多个逗号分割的客户端想要表达的子协议,按优先顺序排列。包含该值的元素必须是非空字符串,且字符在U+0021到U+007E范围内但不包含定义在[RFC2616]中的分割字符且必须所有是唯一的字符串。用于该头字段值的ABNF是1#token,其构造和规则定义在[RFC2616]给出。

11.请求可以包含一个名字为|Sec-WebSocket-Extensions|的头字段。如果存在,该值表示客户端想要表达的协议级的扩展。

12.请求可以包含任意其他头字段,例如,cookie[RFC6265]和/或验证相关的头字段例如|Authorization|头字段[RFC2616],其根据定义它们的文档处理。

客户端验证字段:

一旦客户端的打开阶段握手已经发送,客户端在发送任何进一步数据之前必须等待自服务器的一个响应。客户端必须验证服务器的响应,如下所示:

1.如果收到的服务器的状态码不是101,客户端处理每个HTTP[RFC2616]程序的响应。尤其是,如果收到一个401状态码客户端可能执行身份验证;服务器可能使用一个3xx状态码重定向客户端(但客户端不需要跟随他们),等等。否则,按以下步骤处理。

2.如果响应缺少一个|Upgrade|头字段或|Upgrade|头字段包含的值不是一个不区分大小写的ASCII匹配值“websocket”,客户端必须_失败WebSocket连接_。

3.如果响应缺少一个|Connection|头字段或|Connection|头字段不包含一个不区分大小的ASCII匹配值“Upgrade”符号,客户端必须_失败WebSocket连接_。

4.如果响应缺少一个|Sec-WebSocket-Accept|头字段或|Sec-WebSocket-Accept|包含一个不是|Sec-WebSocket-Key|(一个字符串,不是base64编码的)与字符串“258EAFA5- E914-47DA-95CA-C5AB0DC85B11”但忽略任何前导和结尾空格相关联的base64编码的SHA-1值,客户端必须_失败WebSocket连接_。

5.如果响应包含一个|Sec-WebSocket-Extensions|头字段且此头字段表示使用一个扩展但没有出现在客户端握手中(服务器表示的一个扩展,不是客户端请求的),
客户端必须_失败WebSocket连接_。

6.如果响应包含一个|Sec-WebSocket-Protocol|头字段且该头字段表示使用一个子协议但没出现在客户端握手中(服务器表示的一个子协议,不是客户端请求的),客户端必须_失败WebSocket连接_。

服务器端验证字段:

  当客户端开始一个WebSocket连接,它发送它的打开阶段握手部分。服务器必须至少解析这个握手为了获取必要的信息来生成服务器握手部分。

1.一个HTTP/1.1或更高版本的GET请求,包括一个“Request-URI” [RFC2616]应该被解释为定义在第3章的/resource name/(或一个包含/resource name/的绝对HTTP/HTTPS URI)。

2.一个|Host|头字段包含服务器的权限。

3.一个|Upgrade|头字段包含值“websocket”,视为一个不区分大小写的ASCII值。

4.一个|Connection|头字段包含符号“Upgrade”,视为一个不区分大小写的ASCII值。

5.一个|Sec-WebSocket-Key|头字段,带有一个base64编码的值(参见[RFC4648]第4章),当解码时,长度是16字节。

6.一个|Sec-WebSocket-Version|头字段,带有值13。

7.可选的,一个|Origin|头字段。该头字段由所有浏览器客户端发送。一个试图缺失此头字段的连接不应该被解释为来自浏览器客户端。

8.可选的,一个|Sec-WebSocket-Protocol|头字段,带有表示客户端想要表达的协议的值列表,按优先顺序排列。

9.可选的,一个|Sec-WebSocket-Extensions|头字段,带有表示客户端想要表达的扩展的值列表

10.可选的,其他头字段,例如这些用于发送cookie或请求服务器身份验证的。




例子地址:http://download.csdn.net/detail/xiaoming_zhong/9605478

原文地址:http://jinnianshilongnian.iteye.com/blog/1898350


深入WebSocket通信协议细节

传统“长轮询”实现Web端即时通讯的问题 WebSocket出现之前,Web端为了实现即时通讯,所用的技术都是Ajax轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发...
  • Erica_1230
  • Erica_1230
  • 2017年04月23日 20:05
  • 1040

WebSocket协议详解

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图...
  • Newpidian
  • Newpidian
  • 2016年03月11日 14:07
  • 8295

WebSocket协议详解

什么是WebSocket?看过html5的同学都知道,WebSocket protocol 是HTML5一种新的协议。它是实现了浏览器与服务器全双工通信(full-duplex)。HTML5定义了We...
  • marvel_cheng
  • marvel_cheng
  • 2017年01月07日 16:15
  • 1297

(转)Websocket是啥子协议?

一、WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有1.1和1.0之说,也就是所谓的k...
  • grace666
  • grace666
  • 2016年10月08日 16:08
  • 849

WebSocket协议深入理解

1.WebSocket和HTTP的关系WebSocket只有在建立握手连接的时候借用了HTTP协议的头,连接成功后的通信部分都是基于TCP的连接。总体来说,WebSocket协议是HTTP协议的升级版...
  • fareise
  • fareise
  • 2016年08月11日 20:30
  • 5271

websocket最新协议的握手实现

websocket通讯过程: websocket客户端首先发起一个连接请求,发送的数据格式如下: GET /10.15.1.218:12345/chat?key=value\r\n HTTP/...
  • chuanyu
  • chuanyu
  • 2015年06月11日 11:50
  • 2263

WebSocket协议详解及应用

标签:websocket WebSocket协议详解及应用(七)-WebSocket协议关闭帧 本篇介绍WebSocket协议的关闭帧,包括客户端及服务器如何发送并处理关闭帧、关闭帧错...
  • u014520745
  • u014520745
  • 2016年09月23日 16:16
  • 4530

H5笔记-WebSocket协议

啥是websocket?websocket是一种基于TCP协议的一种新的协议,和HTTP是并存的两者不同协议。 既然是协议,就必然像HTTP那样涉及到客户端和服务端。 目前客户端的实现比较统一,各...
  • quanyechalaila
  • quanyechalaila
  • 2017年06月13日 16:55
  • 1315

TCP/IP协议,HTTP协议与webSocket协议区别

http协议(识别数据内容)与webSocket协议 同:建立在TCP之上,同http一样通过TCP来传输数据 不同: HTTP协议为单向协议,即浏览器只能向服务器请求资源,服务器才能将数据传送给...
  • zr15829039341
  • zr15829039341
  • 2017年03月20日 15:00
  • 4044

AJP协议不支持websocket,Apache整合Tomcat问题

WebSocket connection to 'wss://test.xingzhiy.cn/websocket.do?08351' failed: Error during WebSocket h...
  • bz151531223
  • bz151531223
  • 2016年12月02日 12:25
  • 1043
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:websocket协议
举报原因:
原因补充:

(最多只允许输入30个字)