ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

websocket理解

2022-05-30 13:31:27  阅读:176  来源: 互联网

标签:WebSocket 理解 Sec 服务器 websocket 连接 客户端


简介

在实际开发中,可能会出现一个需求场景,要求网页的数据可以实时更新。在这种情况下,我们一般会采用轮询的方式,间隔性获取数据,即通过定时器间隔性请求相应接口获取数据,此方式由于是不断请求服务器,资源开销相对较大,且由于数据更新是间隔性,会导致数据时效性欠缺,可能会出现部分延迟,因此衍生出另一种方式:长轮询,长轮询一般是客户端请求服务端,但服务器不是即时返回,而当内容有所更新时,服务器会返回相应内容给客户端,从名义上为服务器向客户端推送信息。
综合以上,可以总结出轮询、长轮询的优缺点
轮询:

1.服务器的CPU、带宽资源消耗较大,也可能会存在大量的无效请求
2.由于是间隔性获取数据,数据时效性欠缺,会有部分延迟,当然,间隔时间越短,相对的数据的时效性越好,但会导致资源开销大

长轮询

1.解决了轮询过程中的数据时效性较差的问题
2.由于一直在等待服务器返回,对于内存的消耗会相对较大

轮询、长轮询都或多或少存在一些缺陷,因此websocket协议就此诞生,它就是为了实现消息的实时更新而出现的。

websocket简介

websocket协议是网络传输协议,位于应用层,可在单个tcp连接上进行全双工通信,能够更好的节省资源开销实现消息通讯,websocket基于tcp协议,所以也是需要建立连接和关闭连接的,不像tcp的三次握手,客户端与服务器建立一次连接后即可实现双向通信。
为了实现和HTTP的兼容性,WebSocket握手使用HTTP的Upgrade头将HTTP协议转换成Websocket协议。
作为一种协议,websocket自然也是有其用于协议控制的头部信息的,但是相对于HTTP请求每次都要带上完整的头部信息,传输数据时,websocket数据包的头部信息就相对较小,从而降低了控制开销。

特点

  • 全双工通信;
    在数据传输中,有三种类型;单工通信、半双工通信、全双工通信,
单工通信:只能向一个方向进行传输
半双工通信:可以双向传输,但是不能同时进行
全双工通信:可以双向传输,也可以同时传输
  • 二进制帧
    采用了二进制帧结构,语法、语义与 HTTP 完全不兼容,相比http/2,WebSocket更侧重于“实时通信”,而HTTP/2 更侧重于提高传输效率
  • 协议名与http协议类似
    引入ws和wss分别代表明文和密文的websocket协议,且默认端口使用80或443,与http几乎一致

websocket建立连接的流程

1.建立连接, 客户端与服务器端连接
2.握手:验证服务器是否支持websocket
    发送的数据如下:
    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13
    Origin: http://example.com

    Sec-WebSocket-Key:浏览器随机生成的key,base64生成
    Sec-WebSocket-Protocol:websocket的协议
    Sec-WebSocket-Version:websocket的版本
    其中客户端有一个:Sec-WebSocket-Key字段,服务器有一个:Sec-WebSocket-Accept字段,
        浏览器发送随机生成的key到服务器,
        服务器返回对应Sec-WebSocket-Accept key的原理:
            取出Sec-WebSocket-Key(随机产生),与一个magic string “258EAFA5-E914-47DA-95CA-C5AB0DC85B11” 连接成一个新的key串
            将新的key串SHA1编码,生成一个由多组两位16进制数构成的加密串
            把加密串进行base64编码生成最终的key,这个key就是Sec-WebSocket-Accept
            简化:取出浏览器发送的key 与magic string连接成一个新字符串
                对新key进行sha1加密返回新的加密串
                对新的加密串进行base64加密并将结果返回给浏览器
        浏览器接收到key与自己本地加密的key进行比较,如果验证通过则说明支持websocket协议,则进行下一步收发数据动作
     为了表示服务器同意和客户端进行Socket连接, 服务器端需要使用客户端发送的这个Key进行校验 ,然后返回一个校验过的字符串给客户端,客户端验证通过后才能正式建立Socket连接。       
3.收发数据
4.关闭连接

简易流程如下:

1.建立连接
2.握手:校验服务器是否支持websocket协议:
3.收发数据
4.关闭连接(一般为长连接)

websocket的优点

  • 较少的控制开销:数据包头部协议较小,不同于http每次请求需要携带完整的头部
  • 更强的实时性:相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少
  • 保持连接状态:创建通信后,可省略状态信息,不同于HTTP每次请求需要携带身份验证
  • 更好的二进制支持:定义了二进制帧,更好处理二进制内容
    支持扩展:用户可以扩展websocket协议、实现部分自定义的子协议
  • 更好的压缩效果:Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率

websocket的异常处理

由于websocket可能由于网络波动、连接异常断开导致无法正常进行通信,因此对于一般websocket而言,需要添加异常处理机制,即在出现异常断开时进行重连,因此衍生出心跳重连机制。

心跳重连机制:
    原因:由于网络原因导致的websocket连接未能正常关闭,从而导致服务器继续推送数据导致数据丢失,因此需要一种判断客户端和服务端是否存货的方式
    概念: 心跳机制是每隔一段时间会向服务器发送一个数据包,告诉服务器自己还活着,同时客户端会确认服务器端是否还活着,如果还活着的话,就会回传一个数据包给客户端来确定服务器端也还活着,否则的话,有可能是网络断开连接了。需要重连~

需要注意的是,在websocket的一方出现异常时,需要先将原始连接关闭后再建立新的连接,如果原始连接还在,可能会出现消息数据发送错误的情况

websocket的使用场景

  • 视频平台的弹幕发送
  • 聊天室
  • 协同编辑:例如在线文档的多人协作
  • 服务器推送客户端消息
  • 其他需要保持长时间实时更新的任务或需求

参考文献

https://zhuanlan.zhihu.com/p/481134845
https://baijiahao.baidu.com/s?id=1708209917367051748&wfr=spider&for=pc

标签:WebSocket,理解,Sec,服务器,websocket,连接,客户端
来源: https://www.cnblogs.com/xy-bot/p/16320981.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有