Websocket Posted 2022-08-27 fengxiaoyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Websocket相关的知识,希望对你有一定的参考价值。
1.Websocket解决了什么问题?
WebSocket是一种在单个TCP 连接上进行全双工 通信的协议;WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
以前是通过轮询的方式来查看服务器是否由内容更新,现在服务器可以直接将数据推送给客户端。可以节约很多的请求次数和带宽的消耗。
2.Websocket的约束
为什么说牺牲了简单性和可见性?
因为HTTP每一次请求都会带有大量的请求头部信息,每一次请求都是独立的。而Webscocket如果发来第二次请求的话,可能需要结合第一次请求的信息。所以在做负载均衡的时候会更麻烦一些。如上图:
兼容HTTP协议
默认使用80或443端口
协议升级
元数据对比:HTTP协议头部会存放元数据;由websocket上传输的应用层存放元数据。
基于帧:不是基于流(HTTP、TCP),每一帧要么承载字符数据,要么承载二进制数据
基于浏览器的同源策略模型(非浏览器无效),可以使用Access-Control-Allow-Origin等头部
基于URI、子协议不同支持同主机、同端口上的多个服务
子协议:Sec-Websocket-Protocol:
代理服务器可以简单支持
3.Websocket的协议格式:
前两个字节一定是会存在的,即FIN、RSV1、RSV2、RSV3、opcode(4)、MASK、Payload len(7)
FIN:代表着消息的结尾。当存在消息分片的时候,即一个消息由多个数据帧组成,FIN=0代表消息还没有结束,FIN=1代表着一个消息结束。如果一个消息由一个数据帧构成。FIN直接等于1。
RSV1、RSV2、RSV3:默认为0,仅当使用extension扩展时,由扩展决定其值。
opcode:持续帧:数据格式和上一个相同;非控制帧:1代表传输的是文本,2代表传输的是二进制。控制帧:8代表关闭,9心跳帧ping,A心跳帧pong。心跳检测时会发送这两个帧。
4.如何从HTTP升级到Websocket
建立握手:
下图中的红色的信息是必选的,改请求必须是一个GET方法,基于HTTP/1.1的;头部必须是HOST头部;目前Sec-WebSocket-Version:后面都应该传13;Connection后面是keep-alive,Upgrade;Upgrade可能是websocket。(HTTP2.0时是不一样的?)
绿色的信息也是必选的,
通过下图的方式,使用Sec-Websocket-Key.其中GUID是写死的一段magic数字。
5.Websocket传递消息时的格式编码
6.掩码及其针对的代理污染攻击
浏览器的客户端消息一定要传递掩码的,即MASK为1,在MASKING-KEY中传递无法预测的随机数。服务器端传递的MASK为0时,不用传递掩码。
7.如何保持会话心跳
长连接的心跳保持:HTTP长连接只能基于简单的超时(例如65s),Websocket连接基于ping/pong心跳机制维持。
在定时器到达以后,可以发送心跳ping/pong。如果心跳存在我们依然保持连接。心跳不存在了,我们即可关闭连接。
心跳帧可以穿插在数据帧中传输,ping帧 opcode=9,可以包含数据;pong帧 opcode=A,必须与ping帧数据相同
8.如何关闭?
关闭会话的方式:
控制帧的关闭帧:正常情况下在TCP连接之上的双向关闭,发送关闭帧之后,不能再发送任何数据,接受到关闭帧后,不再接受任何到达的数据。如果TCP连接意外中断了,websocket的连接也就自然断了。
关闭帧:opcode=8,可以含有数据,但仅用于解释关闭会话的原因。前两个字节必须是无符号整型。
9.webscoket的状态?
0 :对应常量CONNECTING (numeric value 0) 正在建立连接连接,还没有完成。The connection has not yet been established. 1 :对应常量OPEN (numeric value 1), 连接成功建立,可以进行通信。The WebSocket connection is established and communication is possible. 2 :对应常量CLOSING (numeric value 2) 连接正在进行关闭握手,即将关闭。The connection is going through the closing handshake. 3 : 对应常量CLOSED (numeric value 3) 连接已经关闭或者根本没有建立。The connection has been closed or could not be opened.
以上是关于Websocket的主要内容,如果未能解决你的问题,请参考以下文章
WebSocket的简单入门使用
WebSocket的简单入门使用
WebSocket的简单入门使用
学习cocoscreator 接触到的WebSocket的学习笔记
WebSocket的简单入门使用
websocket原理