HTTP是工作在应用层的文本传输协议,它在底层的实现是基于TCP协议的,今天说的HTTP的长连接和短连接实质上是TCP的长连接和短连接。
TCP的长连接和短连接:
- TCP的连接
在客户端和服务器端之间进行数据传输时,首先需要在client和server之间建立一条通信链路,如果client和server之间不需要再传输数据或者不再需要这条链路时,就可以释放连接。
- TCP短连接
简单来讲,短连接就是传输一次数据完成之后就释放连接。当client和server之间建立好连接后,client会向server传输数据,server会给client一个回应,这就相当于完成了一次读写过程(也就是一次数据传输的过程),然后client和server之间的连接就会被释放(释放时可以由任何一方发起,但一般都是client),下次如果client还要再次访问这个服务器,就得重新建立一次连接。
- TCP长连接
与短连接相反,client和server之间完成一次数据传输后,这条连接不会立即断开,如果下次这个client还要访问server,那就用之前建立好的这条连接(前提是这条连接还在)。
HTTP的长连接和短连接:
一、什么是长连接和短连接
- 短连接
当浏览器和服务器每进行一次HTTP操作时,都会建立一次连接,当任务结束以后就中断。如果客户端浏览器访问的某个HTML或其他类型的Web页中含有其他的Web资源,比如JavaScript文件、图像文件、CSS文件等,当浏览器每遇到这样一个Web资源时都会建立一次HTTP会话。HTTP/1.0中默认使用的是短连接
- 长连接
与短连接相反,长连接是指当数据传输完成后,保证TCP连接不会立刻断开,等待在同域名下继续使用这个通道传输数据。也就是说,在使用长连接的情况下,当一个网页打开完成后,客户端可服务器之间用于传输数据的TCP连接不会关闭,如果客户端再一次访问这个服务器上的网页,就会使用这条已经建立好的连接。从HTTP/1.1起,默认使用的是长连接。
- 在使用长连接的HTTP协议中,会在相应头加入如下的代码:
Connection:Keep-alive
二、长连接的时间
客户端的长连接不可能永久保持连接,它会有一个保持时间。
下面这个图片是用HTTP请求访问百度页面时的回应:
另外还有可能在Connection底下还会有一行:Keep-Alive:timeout=20,表明这个长连接存在的时间可以保持20秒,除此之外还有可能有max=xxx,表明这个长连接最多接收xxx次请求就断开。
三、区分TCP中的keepalive和HTTP中的Keep-alive
- TCP中的keepalive
TCP中的保活功能,主要服务于服务器,即检查当前TCP连接是否还活着。
表现:当一个连接上一段时间内没有数据传输时,服务器会发送探测报文来检测客户端主机是否还在。(参考TCP中的四个计时器中的保活计时器)
- HTTP中的Keep-alive:
保持TCP连接持久连接。这两者是不同层次的概念。
四、长连接和短连接的优缺点比较
- 短连接:
对于服务器来说,管理比较简单,而且不会有多余的连接,存在的都是有用的连接。
如果客户端请求频繁,将会在TCP建立连接和释放连接操作上耗费太多时间和带宽。
- 长连接:
由上可以看出,长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。对于频繁请求资源的客户来说,较适用长连接。不过这里存在一个问题,存活功能的探测周期太长,还有就是它只是探测TCP连接的存活,属于比较斯文的做法,遇到恶意的连接时,保活功能就不够使了。在长连接的应用场景下,client端一般不会主动关闭它们之间的连接,Client与server之间的连接如果一直不关闭的话,会存在一个问题,随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,如关闭一些长时间没有读写事件发生的连接,这样可 以避免一些恶意连接导致server端服务受损;如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,这样可以完全避免某个蛋疼的客户端连累后端服务。