知识储备:
(1)http1.1与http2.0
首先要了解长连接与短连接指的是TCP连接。现在使用最多的还是http1.1,虽然http2.0早已诞生,但是我不明白为什么现在不是以http2.0为主。所以我查了百科资料发现有这样的解释:
在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。
由于http1.1使用在http协议上,而http2.0使用在https协议上,虽然如今https已经日渐成为标准,但是由http向https过渡还需要很长一段时间。首先笔者之前也写过一个小网站,https配置不难,只要到对应的机构申请SSL证书,然后配置在自己服务器上即可,而且是免费的,缺点是需要一年更新一次SSL证书。因为我配置过https协议,明白https只能接受https的资源数据,所有http资源数据都会被屏蔽掉,当然有少数浏览器可能不会屏蔽,但是谷歌、edge这些浏览器是把http数据认为是不安全的,所以会屏蔽,现在市场上大量存在http网站的原因并不是这些企业以及机构不想升级为https协议,而是不能这样做,如果升级,那么这些企业及机构网站使用到的数据都要更换为https协议的,当然如果是自己的数据,那么只要遍历自己的数据库,更新即可,但是如果是依赖于第三方的数据的话,那么还要第三方数据也更新为https协议,而如果第三方还依赖于第四方数据的话,那么还需要第四方也更新为https协议,这样无限套娃,还是非常可怕的,所以从http到https协议还需要一段时间要走。
(2)网络七层
七层模型介绍
eg:RJ45等将数据转化成0和1;
可以简单的理解为:规定了0和1的分包形式,确定了网络数据包的形式;
可以理解为,此处需要确定计算机的位置,怎么确定?IPv4,IPv6!
可以理解为:每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP)协议;
建立一个连接(自动的手机信息、自动的网络寻址);
可以理解为:解决不同系统之间的通信,eg:Linux下的QQ和Windows下的QQ可以通信;
规定数据的传输协议;
值得注意的是http与https协议都是应用层协议,而tcp协议才是传输层协议,所以通常长短连接指的是tcp连接而非http连接。打个形象的比喻: 拿你在网上购物来说,HTTP协议是指的那个快递单,你寄件的时候填的单子就像是发了一个HTTP请求,等货物运到地方了,快递员会根据你发的请求把货物送给相应的收货人。而TCP协议就是中间运货的那个大货车,也可能是火车或者飞机,但不管是什么,它是负责运输的,因此必须要有路,不管是地上还是天上。那么这个路就是所谓的TCP连接,也就是一个双向的数据通道。
(3)关于http请求头的connection
通常我们如果看见http的请求头里面有connection:keepalive
此处的作用并不是http协议实现长连接,事实上http是无连接的,指的是并不能把http认为具有连接性,http只是由客户端发起请求,服务端返回响应,随即结束。至于为什么要把这个属性设置为keep-alive是因为要通知传输层的tcp协议为长连接的,这样达到多个http协议复用一个tcp连接的目的,达到了tcp为长连接,这样就可以持续客户端的发送http请求并得到服务器的http响应。为什么要设置tcp协议为长连接?我的理解是每一次tcp连接都需要建立三次握手,每一次断开tcp连接都需要经历四次挥手。如果tcp为短连接,那么将会频繁的建立tcp连接,不断的建立三次握手与四次挥手,造成服务器负担与客户端的负担,这样会造成数据响应非常慢,导致用户体验非常糟糕。
TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程。
三次握手为连接的建立过程,握手失败则连接建立失败。
四次挥手为连接的完整释放过程,也会发生某个消息丢失或者超时的情况,有一方主动发送FIN消息即表示连接即将释放。
注:SYN、ACK、FIN消息具有哪些含义,以及连接的状态,请参考《TCP/IP详解 卷1》第18章。
长连接,也叫持久连接,在TCP层握手成功后,不立即断开连接,并在此连接的基础上进行多次消息(包括心跳)交互,直至连接的任意一方(客户端OR服务端)主动断开连接,此过程称为一次完整的长连接。HTTP 1.1相对于1.0最重要的新特性就是引入了长连接。
短连接,顾名思义,与长连接的区别就是,客户端收到服务端的响应后,立刻发送FIN消息,主动释放连接。也有服务端主动断连的情况,凡是在一次消息交互(发请求-收响应)之后立刻断开连接的情况都称为短连接。
注:短连接是建立在TCP协议上的,有完整的握手挥手流程,区别于UDP协议。
1、凡是在一次完整的消息交互(发请求-收响应)之后,立刻断开连接(有一方发送FIN消息)的情况都称为短连接;
2、长连接的一个明显特征是会有心跳消息(也有没有心跳的情况),且一般心跳间隔都在30S或者1MIN左右,用wireshark抓包可以看到有规律的心跳消息交互(可能会存在毫秒级别的误差)。
1、需要频繁交互的场景使用长连接,如即时通信工具(微信/QQ,QQ也有UDP),相反则使用短连接,比如普通的web网站,只有当浏览器发起请求时才会建立连接,服务器返回相应后,连接立即断开。
2、维持长连接会有一定的系统开销,用户量少不容易看出系统瓶颈,一旦用户量上去了,就很有可能把服务器资源(内存/CPU/网卡)耗尽,所以使用需谨慎。
参考文章:
【1】https://blog.csdn.net/qq_22238021/article/details/81197157
【2】https://blog.csdn.net/maquealone/article/details/87345795
【3】https://www.cnblogs.com/sunsky303/p/10647255.html
原文:https://www.cnblogs.com/hmy-666/p/14792469.html