WebSocket就是双向的爱情!
问题:平时我们访问网页,需要点击某些按钮,实现客户端向服务器发送请求后,由服务器将数据返回,这种“客户端主动请求+服务器响应的方式”就是HTTP协议中的请求与响应环节。
这种“舔狗”一样的只会单方向付出的方式,显然不能满足现代网络的需求
解决方式:
补充知识:服务器将数据推送给浏览器的技术---服务器推送技术(comet技术)
-
伪服务器推:在前端页面,不定时发送HTTP请求。
问题:不仅消耗带宽,而且用户会因为访问间隔期间,而体验到卡顿
-
长轮询(消耗、成本更小):在客户端请求时候,将超时时间增大,有结果则立刻将服务器数据返回到客户端网页。若超时仍未接收到数据,则发送下一次请求。
总结:以上两种方法都是客户端主动推送数据,无法支持服务器主动给客户端推送数据。
全双工---同一时间满足双向数据输送
半双工---同一时间只能单向数据输送
半双工出现的原因:一开始设计只是为了网页文本的场景,只需要客户端发送,服务器响应即可,减少成本与能耗。
双向爱情websocket的诞生!!
功能:基于TCP的新协议,位于应用层,用于双向数据传输
怎么建立websocket连接
-
浏览器访问时候,都需要经过TCP三次握手
-
然后通过HTTP进行一次通信,让服务器知晓我们要访问咯
-
在请求头中加入独特的HTTP Header(告诉别人,我要双向爱情!)
-
Conection:Upgrade Upgrade:websocket Sec-WebSocket-Key:xxxx //进行校验 -
服务器端开始协议升级,将101响应码给浏览器
-
“101响应码”为协议切换,此时浏览器进行协议升级
websocket数据帧格式
opcode:标识数据类型
payload:标识传输数据的长度(单位是字节)
问题来咯!什么时候是读前面7位?什么时候用扩展呢?
那就是他会先读取前面,如果前面大于7bit(此时这位置会用十六进制表示,但是数据大于了7bit),此时就知道,装不下啦!要用扩展咯!!
粘包问题
听名字就知道咯,就是数据会粘连在一起,无法解析。
解决方法:消息头+消息体的格式
应用地方:HTTP协议、RPC协议、Websocket协议等等.....
4:表示后面4个为发送的数据
小提示:Websocket只有在建立连接时,使用了一次HTTP协议,所以不应该成为升级版本的HTTP协议
使用场景:客户端与服务器频繁交互的场景,是TCP全双工的升级版本
以上图片素材来源于网络,若有侵权请联系我删除。
第一次发表技术博客,还请多指教,谢谢