点击关注公众号,回复“2T”获取2TB学习资源!

互联网架构师后台回复 2T 有特别礼包

上一篇:一篇搞懂TCP、HTTP、Socket、Socket连接池

作者:peaktan
链接:https://www.jianshu.com/p/86a550a521c5

缘起

了解http的人都知道,HTTP 协议有一个缺陷:通信只能由客户端发起 ,例如,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果,HTTP 协议做不到服务器主动向客户端推送信息 这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦 我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息, 最典型的场景就是聊天室 。轮询的效率低,非常浪费资源。
在http1.1中,Connection默认为Keep-alive参数,官方的说法是可以用这个来作为长连接。那么问题来了,既然http1.1支持长连接,为什么还要搞出一个WebSocket呢?

关于Keep-alive的缺点

Keep-alive的确可以实现长连接,但是这个长连接是有问题的,本质上依然是客户端主动发起-服务端应答的模式,是没法做到服务端主动发送通知给客户端的。也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但是一个request只能有一个response。而且这个response也是被动的,不能主动发起。放上一张图,图左为没开启Keep-alive,图右为开启了Keep-alive,可以看出依然是一问一答的模式,相较左边只是省略了每次的关闭和打开操作。

但是WebSocket就不同,WebSocket是可以互相主动发起的。

上图对比可以看出,相对于传统 HTTP 每次请求-应答都需要客户端与服务端建立连接的模式,WebSocket 是类似 TCP 长连接的通讯模式,一旦 WebSocket 连接建立后,后续数据都以帧序列的形式传输。在客户端断开 WebSocket 连接或 Server 端断掉连接前,不需要客户端和服务端重新发起连接请求。另外搜索公众号互联网架构师后台回复“2T”,获取一份惊喜礼包。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势,且客户端发送和接受消息是在同一个持久连接上发起,实时性优势明显。

详细说说WebSocket

WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用。
在WebSocket中,只需要服务器和浏览器通过HTTP协议进行一个握手的动作,然后单独建立一条TCP的通信通道进行数据的传送。WebSocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,是建立在TCP之上的。WebSocket的流程大概是以下几步

浏览器、服务器建立TCP连接,三次握手。这是通信的基础,传输控制层,若失败后续都不执行。

TCP连接成功后,浏览器通过HTTP协议向服务器传送WebSocket支持的版本号等信息。(开始前的HTTP握手)服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据。

当收到了连接成功的消息后,通过TCP通道进行传输通信。

也就是说WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。

看看一次websocket的握手请求与应答的报文

WebSocket 客户端连接报文

GET /webfin/websocket/ HTTP/1.1
Host: localhost
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: xqBt3ImNzJbYqRINxEFlkg==
Origin:
http://localhost
:8080
Sec-WebSocket-Version: 13

可以看到,客户端发起的 WebSocket 连接报文类似传统 HTTP 报文,”Upgrade:websocket”参数值表明这是 WebSocket 类型请求,“Sec-WebSocket-Key”是 WebSocket 客户端发送的一个 base64 编码的密文,要求服务端必须返回一个对应加密的“Sec-WebSocket-Accept”应答,否则客户端会抛出“Error during WebSocket handshake”错误,并关闭连接。

服务端收到报文后返回的数据格式类似:
WebSocket 服务端响应报文

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: K7DJLdLooIwIG/MOpvWFB3y3FE8=

“Sec-WebSocket-Accept”的值是服务端采用与客户端一致的密钥计算出来后返回客户端的,“HTTP/1.1 101 Switching Protocols”表示服务端接受 WebSocket 协议的客户端连接,经过这样的请求-响应处理后,客户端服务端的 WebSocket 连接握手成功, 后续就可以进行 TCP 通讯了。

-End-

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.心态崩了!税前2万4,到手1万4,年终奖扣税方式1月1日起施行~

2.深圳一普通中学老师工资单曝光,秒杀程序员,网友:敢问是哪个学校毕业的?

3.从零开始搭建创业公司后台技术栈

4.程序员一般可以从什么平台接私活?

5.清华大学:2021 元宇宙研究报告!

6.为什么国内 996 干不过国外的 955呢?

7.这封“领导痛批95后下属”的邮件,句句扎心!

8.15张图看懂瞎忙和高效的区别!

HTTP1.1之后的长连接和WebSocket的长连接之间的区别相关推荐

  1. qt websocket android,QT使用websocket进行长连接

    一般我们用的最多的就是http请求,但是频繁的请求可能对服务造成的压力很大,所以今天谈谈websocket长连接,一句话:简单 1.什么是长连接? A:一次请求连接,终身使用,就可以长久的保持信息的交 ...

  2. Vue笔记-Ant Design Vue构建前端连接后端WebSocket

    运行结果如下: 程序结构如下: 关键代码: App.vue <template><a-layout class="layout"><a-layout- ...

  3. websocket 实现长连接原理

    一.前文介绍 WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)首先HTTP有1.1和1.0之说,也就是 ...

  4. 石墨文档Websocket百万长连接技术实践

    内容简介:Web 服务端推送技术经过了长轮询.短轮询的发展,最终到 HTML5 标准带来的 WebSocket 规范逐步成为了目前业内主流技术方案.它使得消息推送.消息通知等功能的实现变得异常简单,那 ...

  5. html5 长链接,Vue通过WebSocket建立长连接,连接

    Vue通过WebSocket建立长连接,连接 使用场景: 在项目开发中,后端需要处理一连串的逻辑,或者等待第三方的数据返回来进行处理之后在返回给前端,可能时间会很长,而且前端也不知道后端什么时候能处理 ...

  6. Websocket 百万长连接技术,在石墨文档中的实践

    今日推荐 推荐一个 Java 接口快速开发框架干掉Random:这个类已经成为获取随机数的王者Docker + Intellij IDEA,提升 10 倍生产力!笑出腹肌的注释,都是被代码耽误的诗人! ...

  7. Spring MVC使用webSocket保持长连接

    说明 客户端需要与服务器保持长连接 配置 在pom.xml中加入包依赖 <!-- webSocket start Add by zhangxueliang 2019-02-22 -->&l ...

  8. 不要小看 WebSocket!长连接、有状态、双向、全双工都是王炸技能

    MQTT 是一种长连接的技术,所谓的长连接,就是保持长久的连接,每次连接可以传输多次数据,并且连接双方有保活机制维持连接.就好比异地办公室一样,有台设备一直保持在线,有问题需要沟通的时候,通过这台一直 ...

  9. 安卓中socket长连接和websocket长连接的实现

    现在一款成熟的app一般都会具备长连接推送功能,那么我们要想项目具备长连接的功能现在又两种选择的方案,一种基于原生tcp协议的socket长连接,另外一种基于ws协议的websocket的长连接,今天 ...

  10. Android的autobahn框架使用实例:实现WebSocket的长连接

    Android的autobahn框架使用实例:实现WebSocket的长连接 WebSocket三方框架: 01.Java-WebSocket:存在断开之后无法重新连接的问题 02.autobahn: ...

最新文章

  1. SAP CRM Product workflow debug
  2. python与sap_Python结合SAP GUI Script操作sap的简易教程
  3. 无法获取未定义或 null 引用的属性“text”_【CSS】是时候开始用 CSS 自定义属性了...
  4. SystemVerilog中根据系统时间产生随机数的函数
  5. 互联网行业哪个职位比较有前途?
  6. L2-2 口罩发放 (25 分)
  7. ansys19.2安装教程
  8. java生成word带多级标题,word文档怎样设置自动生成多级标题
  9. 教你如何用python轻轻松松解析XML和PDF,一文就够了,赶紧码住!!!
  10. linux通过top和iostat查找io性能瓶颈
  11. JVM MAT分析器中的shallow heap 和 retained heap详解
  12. Hyperopt 超参数调优
  13. 因果卷积(causal)与扩展卷积(dilated)
  14. NVP6124I北京冠宇铭通 芯片
  15. 最小安装CentOS 7.6 Linux系统(无UI界面纯命令行,虚拟机教学)
  16. (附源码)计算机毕业设计ssm爱音乐网站
  17. 计算机网络的互联设备主要有,网络互联设备主要有哪些?各有哪些特点?
  18. c语言程序设计教程第二版李春葆,C语言程序设计教程.第2版
  19. C语言笔记(三)常量、变量
  20. 优化函数SGD/AdaGrad/AdaDelta/Adam/Nadam

热门文章

  1. 在FL Studio中如何使用混音器的效果
  2. vue+vuex的应用笔记
  3. Python Django 初试手记
  4. 解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)
  5. ios7中的UILabel自适决定大小
  6. 在CentOS上安装7zip和使用
  7. KeyBlaze for mac(专业打字练习软件)激活版
  8. 苹果mac图像编辑和设计工具:Photoshop 2021
  9. 苹果Mac摄影照片降噪工具:ON1 NoNoise AI
  10. Mac电脑上非常好用的英汉互译词典软件