WebSocket就是双向的爱情!!

113 阅读3分钟

WebSocket就是双向的爱情!

问题:平时我们访问网页,需要点击某些按钮,实现客户端向服务器发送请求后,由服务器将数据返回,这种“客户端主动请求+服务器响应的方式”就是HTTP协议中的请求与响应环节。

这种“舔狗”一样的只会单方向付出的方式,显然不能满足现代网络的需求

解决方式:

补充知识:服务器将数据推送给浏览器的技术---服务器推送技术(comet技术)

  1. 伪服务器推:在前端页面,不定时发送HTTP请求。

    问题:不仅消耗带宽,而且用户会因为访问间隔期间,而体验到卡顿

  2. 长轮询(消耗、成本更小):在客户端请求时候,将超时时间增大,有结果则立刻将服务器数据返回到客户端网页。若超时仍未接收到数据,则发送下一次请求。

    总结:以上两种方法都是客户端主动推送数据,无法支持服务器主动给客户端推送数据。

全双工---同一时间满足双向数据输送

全双工.png

半双工---同一时间只能单向数据输送

半双工.png

半双工出现的原因:一开始设计只是为了网页文本的场景,只需要客户端发送,服务器响应即可,减少成本与能耗。

双向爱情websocket的诞生!!

功能:基于TCP的新协议,位于应用层,用于双向数据传输

怎么建立websocket连接

  1. 浏览器访问时候,都需要经过TCP三次握手

  2. 然后通过HTTP进行一次通信,让服务器知晓我们要访问咯

  3. 在请求头中加入独特的HTTP Header(告诉别人,我要双向爱情!)

  4. Conection:Upgrade
    Upgrade:websocket
    Sec-WebSocket-Key:xxxx //进行校验
    
  5. 服务器端开始协议升级,将101响应码给浏览器

  6. “101响应码”为协议切换,此时浏览器进行协议升级

websocket建立链接.png

websocket数据帧格式

websocket数据帧格式.png

opcode:标识数据类型

payload:标识传输数据的长度(单位是字节)

问题来咯!什么时候是读前面7位?什么时候用扩展呢?

那就是他会先读取前面,如果前面大于7bit(此时这位置会用十六进制表示,但是数据大于了7bit),此时就知道,装不下啦!要用扩展咯!!

粘包问题

听名字就知道咯,就是数据会粘连在一起,无法解析。

解决方法:消息头+消息体的格式

应用地方:HTTP协议、RPC协议、Websocket协议等等.....

粘包问题.png

4:表示后面4个为发送的数据

小提示:Websocket只有在建立连接时,使用了一次HTTP协议,所以不应该成为升级版本的HTTP协议

使用场景:客户端与服务器频繁交互的场景,是TCP全双工的升级版本

以上图片素材来源于网络,若有侵权请联系我删除。

第一次发表技术博客,还请多指教,谢谢