WebSocket协议介绍
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Server
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
如上检查通过后,Client认为WebSocket连接建立成功, Client端和Server端协商出了子协议 和扩展集合,注意两者均可能为空
上文中失败处理,参考“_Fail the WebSocket Connection”页
Server端要求
Server检查请求: Request Method必须是Get,且Request-URI必须是/Resource name/或者是包含 /Resource name/的HTTP(/s)绝对路径; |Host|头域内容Server可接受; |Upgrade|头域包含大小写不敏感的“websoket”字串; |Connection|头域包含大小写不敏感的“Upgrade”字串; |Sec-WebSocket-Key|头域内容debase64后,长度为16Byte; |Sec-WebSocket-Version|头域指示版本号为13; |Origin|可选头域,指示的内容Server可接受; |Sec-WebSocket-Protocol|可选头域,包含Server可接受的子协议集合; |Sec-WebSocket-Extensions|可选头域,包含Server可接受的扩展结合; 其他RFC2616定义的cookies、authentication等头域
协议栈
APP WebSocket HTTP/HTTPs
TCP IP MAC
说明
连接发起(握手):指的是WebSocket连接 的建立过程,通过HTTP Get /STATUS 101协商建立;
业务通信:WebSocket将上层的 Message,根据需要分帧后,交给TCP 发送;对端组帧后,交给上层应用
Upgrade和Connection为HTTP协议现有头域,取值新增websocket/Upgrade用于指 示协议切换到WebSocket协议;
Sec-WebSocket-Key/Accept/Protocol/Version等为本规范新增的HTTP头域;
Client端要求
输入: /Host/:主机名,可以是IP或域名 /Port/:端口,ws默认是80, wss默认是443,可选 /Resource name/:资源名,可以以此区分相同host上不同的WebSocket服务 /Secure flag/:是否over TLS,可选 Sub /Protocols/:扩展子协议集合,可选; /Extensions/:扩展项集合,可选 /origin/:针对浏览器应用,用于跨域访问的安全检查
背景
WHY BS架构下的即时通讯、游戏等应用需要Client和Server间的双向通信,而HTTP 的Request/Response模型并不适合这种场景,导致了如下问题: Server要为每个客户端使用多个不同的TCP连接交互上下行数据 通信协议开销过大,每个HTTP Request/Response都需要携带HTTP 头 客户端脚本被强制维护从传出连接到传入连接的映射以跟踪应答
以上任一一个头域违反协议定义的规范,Server侧停止处理,并返回400 Bad Request
Server端要求
Server生成应答: 如果连接是HTTPs,则进行TLS协商,如果失败,则关闭连接,否则继续; Server可以通过返回401并携带|WWW-Authenticate|,进行HTTP客户端认证; Server可以返回3xx,重定向Client到其他Server。注意此步可以先于返回401应答; 建立Websocket协议信息 /origin/:Server可以据此决定是否处理该请求,返回合适的status code,比如403 Forbidden,并终止连接; /key/:来自Request的|Sec-WebSocket-Key| /version/:来自Request的|Sec-WebSocket-Version|,如果Server无法接受该版本 号,返回426 Upgrade Required并携带|Sec-WebSocket-Version| 指示自身支持的 版本 /resource name/:Server某个服务的标识,来自Request中的Request URI,如果 Server没有此服务,返回404 Not Found
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协议介绍
Jade 2020/01
目录
概述 打开握手阶段 帧格式说明 附录
概述
本胶片描述RFC6455定义的WebSocket协议 WebSocket在利旧HTTP组网拓扑前提下,为HTTP应用提供了一种TCP双向连接传
递Messa源自文库e的方式。
本胶片系作者出于个人需要,对RFC6455的阅读总结,能力有限,仅作为该规范的 导读和参考材料。
Server端要求
建立Websocket协议信息 /subprotocol/:根据Request中的|Sec-WebSocket-Protocol|头域,结合Server侧实 际支持情况,选择本次连接使用的的子协议;如果Request未携带|Sec-WebSocketProtocol|头域或者Server不同意使用任意一个,则设置为null,返回Client时不携带 该头域,表示Server不同意Client指示的子协议; /extensions/:根据Request中的|Sec-WebSocket-Extensions|,结合Server侧对子 协议的实际支持情况,生成扩展集合,集合可能为null;
/resource name/:出现Get请求的Request-URI中:
目录
概述 打开握手阶段 帧格式说明 附录
握手过程
Client
Server
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
连接关闭:WebSocket定义了close管理 帧,用于终止WebSocket连接
说明 连接发起基于HTTP(/s),其服务侧端口默认使用80/443,但可以使用其他端口; WebSocket只是连接发起通过HTTP协商建立,后续业务通信和连接关闭都是基于 TCP完成
协议过程
Client
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
数据传输阶段: WebSocket基于TCP,将来自上层的Message按需分帧 传送
WebSocket close WebSocket close
连接关闭(关闭握手): 双方通过close管理帧结束通信,关闭底层TCP连接
术语定义
_this_:表示命名算法或定义之类的关键术语 |this|:表示头域或变量定义 /this/:表示变量值 WebSocket URI:对标HTTP URI,不过schema为ws/wss,对应http/https
连接发起(打开握手)阶段: 1. 握手阶段是一个双方协商扩展和支持的子协议的, 并建立连接的过程; 2. 支持HTTP的basic/MD5摘要认证 3. 101是正常的返回,同样支持其他4xx/5xx等状态码
注:红色头域是WebSocket对HTTP的扩展
WebSocket Frame WebSocket Frame
子协议 HTTP header中可选包含|Sec-WebSocket-Extensions|头域,指示Client期望的当前子协议支持的扩展集; 根据HTTP规范,可选包含|Authorization|、cookies(RFC6265)等其他合法头域
Client端要求
Client检查响应: 如果Sever返回的Status Code不是101,参考RFC2616处理;如果是101,转下步; 如果Response缺少|Upgrade|头域,或者取值不是“websocket”,则认为失败; 如果Response缺少|Connection|头域,或者取值不是“Upgrade”,则认为失败; 如果Response缺少|Sec-WebSocket-Accept|头域,或者取值非法(见备注),则认为失败; 如果Response包括|Sec-WebSocket-Extensions|头域,但是取值不是Request中 Extension的子集,则认为失败; 如果Response包含|Sec-WebSocket-Protocol| 头域,但是取值不是Request中Protocol的 子集,则认为失败;
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绝对路径;
How 使用一个单一的TCP连接承载双向通信,WebSocket应运而生
应用场景 WEB应用:游戏、股票行情、即时通讯、及其他需要实时暴露Server端服务的 用户接口程序 其他应用:其他依赖于TCP的应用协议,通过定义WebSocket的子协议扩展支 持,比如sip(rfc7118)、mqtt、xmpp、CoAP等等