首先介绍一下HTTP的工作原理。HTTP是超文本传输协议的简称,在TCP/IP协议中位于第四层或者说是第七层,属于应用层协议。HTTP作为客户端与服务器交互的应用协议,工作方式是先由客户端发起请求到服务器,服务器接收到请求响应数据,即完成一次HTTP的交互。因此,可以说HTTP实际上就是用户web浏览器与web服务器请求与响应的交互方式。一次请求就是一次HTTP交互,交互完成,本次HTTP交互就结束了。那么,HTTP有长连接和短连接的说法吗?
HTTP的交互,到底是怎样的呢?简单的文字描述:
在浏览器输入url地址,浏览器解析url对应的ip,然后封装数据包,与服务器建立TCP连接,完成三次握手和四次挥手后开始进行数据传输,数据传输完成后,关闭TCP连接,结束本次请求。细心观察的同学,在浏览器的下方,可以看到交互的几个阶段: 发起请求,建立连接,响应,结束。一次HTTP请求的基本过程就是上面说的。那么继续回答HTTP有长连接和短连接吗?长连接,顾名思义就是保持连接不断,那么一次HTTP请求要一直保持吗?数据传输完了还继续保持HTTP连接有意义吗? apparently,HTTP不应该保持长连接,因为一次HTTP交互完成了数据的请求响应,没必要保持,因为下一次HTTP交互可能请求的不是之前的资源,保持连接也是浪费。那么我们常说的HTTP长连接与短链接是指什么呢? 前面也提到了,HTTP是应用层的协议,按照协议栈的设计思想,下层协议为上次提供服务,应用层是最高层,因此是服务使用方,使用下层,也就是TCP的服务,TCP提供啥服务呢——可靠传输服务。另外,TCP层提供的服务,在应用层是可以共享的,也就是说多个HTTP是可以共享一个TCP连接的。到这里,渐渐的明了,实际上HTTP所谓的长短连接,其实是TCP的长短连接。因为TCP为上层提供服务,因此维护长连接TCP是由意义的,TCP的建立过程需要三次握手和四次挥手,过程比较费时。
长连接与短连接,实际上是TCP采用长连接还是短连接,换句话说是维持TCP一段实际还是立即关闭TCP连接。熟悉java线程池的同学,可以回顾一下创建线程池对象的方法,里面有一个参数:表示当线程空闲多长时间后,就回收线程的参数,其实这里也有一点那个意思。
长短连接有什么优缺点呢?
长连接:一直保持连接,复用连接,连接池用的就是长连接。比如说我们常用的数据库连接池,TCP连接就是长连接。长连接的优点就是复用,但是复用是在同一客户端和服务器的连接上复用,如果连接过多,服务端的连接会不够用;
短连接:用完就释放。短连接的优点就是不占用连接,可以接受更多的连接请求,确定就是频繁的创建TCP,开销大。如果请求过多,会有大量的TCP建立释放,如果服务端处理不过来的话,就会常出现很多TIME_WAIT 状态,出现服务不可用的情况。
总结:频繁的请求,还是不要用短连接,不然处理不过来;如果请求不频繁,视情况而定吧。
长短连接遇到的问题: 数据库没有连接池,频繁的做insert,近每分钟10W的insert量,结果一会就出现了连接不够用的情况,系统的load持续彪,出现了大量的TIME_WAIT状态,系统基本死了。 用数据库连接池后,问题就解决了。