您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 工作范文 > WebSocket协议介绍
WebSocket协议介绍Jade2020/01目录概述打开握手阶段帧格式说明附录概述本胶片描述RFC6455定义的WebSocket协议WebSocket在利旧HTTP组网拓扑前提下,为HTTP应用提供了一种TCP双向连接传递Message的方式。本胶片系作者出于个人需要,对RFC6455的阅读总结,能力有限,仅作为该规范的导读和参考材料。背景WHYBS架构下的即时通讯、游戏等应用需要Client和Server间的双向通信,而HTTP的Request/Response模型并不适合这种场景,导致了如下问题:Server要为每个客户端使用多个不同的TCP连接交互上下行数据通信协议开销过大,每个HTTPRequest/Response都需要携带HTTP头客户端脚本被强制维护从传出连接到传入连接的映射以跟踪应答How使用一个单一的TCP连接承载双向通信,WebSocket应运而生应用场景WEB应用:游戏、股票行情、即时通讯、及其他需要实时暴露Server端服务的用户接口程序其他应用:其他依赖于TCP的应用协议,通过定义WebSocket的子协议扩展支持,比如sip(rfc7118)、mqtt、xmpp、CoAP等等协议栈说明连接发起(握手):指的是WebSocket连接的建立过程,通过HTTPGet/STATUS101协商建立;业务通信:WebSocket将上层的Message,根据需要分帧后,交给TCP发送;对端组帧后,交给上层应用连接关闭:WebSocket定义了close管理帧,用于终止WebSocket连接说明连接发起基于HTTP(/s),其服务侧端口默认使用80/443,但可以使用其他端口;WebSocket只是连接发起通过HTTP协商建立,后续业务通信和连接关闭都是基于TCP完成MACIPTCPHTTP/HTTPsWebSocketAPP协议过程ClientServerGET/chatHTTP/1.1Host:server.example.comUpgrade:websocketConnection:UpgradeSec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==Origin::13HTTP/1.1101SwitchingProtocolsUpgrade:websocketConnection:UpgradeSec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Protocol:chat数据传输阶段:WebSocket基于TCP,将来自上层的Message按需分帧传送WebSocketFrameWebSocketFrameWebSocketcloseWebSocketclose连接发起(打开握手)阶段:1.握手阶段是一个双方协商扩展和支持的子协议的,并建立连接的过程;2.支持HTTP的basic/MD5摘要认证3.101是正常的返回,同样支持其他4xx/5xx等状态码注:红色头域是WebSocket对HTTP的扩展连接关闭(关闭握手):双方通过close管理帧结束通信,关闭底层TCP连接术语定义_this_:表示命名算法或定义之类的关键术语|this|:表示头域或变量定义/this/:表示变量值WebSocketURI:对标HTTPURI,不过schema为ws/wss,对应http/https/resourcename/:出现Get请求的Request-URI中:目录概述打开握手阶段帧格式说明附录握手过程Upgrade和Connection为HTTP协议现有头域,取值新增websocket/Upgrade用于指示协议切换到WebSocket协议;Sec-WebSocket-Key/Accept/Protocol/Version等为本规范新增的HTTP头域;ClientServerGET/chatHTTP/1.1Host:server.example.comUpgrade:websocketConnection:UpgradeSec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==Origin::13HTTP/1.1101SwitchingProtocolsUpgrade:websocketConnection:UpgradeSec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=Sec-WebSocket-Protocol:chatClient端要求输入:/Host/:主机名,可以是IP或域名/Port/:端口,ws默认是80,wss默认是443,可选/Resourcename/:资源名,可以以此区分相同host上不同的WebSocket服务/Secureflag/:是否overTLS,可选Sub/Protocols/:扩展子协议集合,可选;/Extensions/:扩展项集合,可选/origin/:针对浏览器应用,用于跨域访问的安全检查Client端要求Client发起连接:根据/Host/和/Port/打开TCP连接,如果/Secureflag/为true,则在TCP连接建立后,进行TLS连接建立过程;发送WebSocketHTTPRequest:参考RFC2616构造合法的HTTPGetRequest:Request方法必须是Get,Version至少是HTTP1.1;Request-URI必须是/ResourceName/或者是由/Host/、/Port/、/ResourceName/组成的HTTP/s绝对路径;HTTPheader中必须包含|Host|头域,由/Host/加可选的:/Port/组成;HTTPheader中必须包含|Upgrade|头域,取值必须是”websocket”;HTTPheader中必须包含|Connection|头域,取值必须是”Upgrade”;HTTPheader中必须包含|Sec-WebSocket-Key|头域,该值为Client选择的16Byte随机数的Base64编码值;HTTPheader中必须包含|Sec-WebSocket-Version|头域,取值13HTTPheader中可选包含|Sec-WebSocket-Protocol|头域,指示Client期望协商的由逗号分隔的一个或多个子协议HTTPheader中可选包含|Sec-WebSocket-Extensions|头域,指示Client期望的当前子协议支持的扩展集;根据HTTP规范,可选包含|Authorization|、cookies(RFC6265)等其他合法头域Client端要求Client检查响应:如果Sever返回的StatusCode不是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认为WebSocket连接建立成功,Client端和Server端协商出了子协议和扩展集合,注意两者均可能为空上文中失败处理,参考“_FailtheWebSocketConnection”页Server端要求Server检查请求:RequestMethod必须是Get,且Request-URI必须是/Resourcename/或者是包含/Resourcename/的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等头域以上任一一个头域违反协议定义的规范,Server侧停止处理,并返回400BadRequestServer端要求Server生成应答:如果连接是HTTPs,则进行TLS协商,如果失败,则关闭连接,否则继续;Server可以通过返回401并携带||,进行HTTP客户端认证;Server可以返回3xx,重定向Client到其他Server。注意此步可以先于返回401应答;建立Websocket协议信息/origin/:Server可以据此决定是否处理该请求,返回合适的statuscode,比如403Forbidden,并终止连接;/key/:来自Request的|Sec-WebSocket-Key|/version/:来自Request的|Sec-WebSocket-Version|,如果Server无法接受该版本号,返回426UpgradeRequired并携带|Sec-WebSocket-Version|指示自身支持的版本/resourcename/:Server某个服务的标识,来自Request中的RequestURI,如果Server没有此服务,返回404NotFoundServer端要求建立Websocket协议信息/subprotocol/:根据Request中的|Sec-WebSocket-Protocol|头域,结合Server侧实际支持情况,选择本次连接使用的的子协议;如果Request未携带|Sec-WebSocket-Protocol|头域或者Server不同意使用任意一个,则设置为null,返回Client时不携带该头域,表示Server不同意Client指示的子协议;/extensions/:根据Request中的|Sec-WebSocket-Extensions|,结合Server侧对子协议的实际支持情况,生成扩展集合,集合可能为null;Server发送应答ResponseStatuscode为101:HTTP/1.1101SwitchingProtocols;Response中|Upgrade|头域设置为“websocket”;Response中|Connection|设置为“Upgrade”;Response中|Sec-WebSocket-Accept|设置为base64(sha-1(|Sec-WebSocketKey|+258EAFA5-E914-47DA-95CA-C5AB0DC85B11))Server端要求Server发送应答可选:Response中|S
本文标题:WebSocket协议介绍
链接地址:https://www.777doc.com/doc-5465233 .html