HTTP的长连接和短连接详解(HTTP 请求头中的Connection字段) || HTTP响应头中的connection字段作用详解
HTTP的长连接和短连接详解(HTTP 请求头中的Connection字段)
前言:
HTTP的长连接和短连接本质上是TCP的长连接和短连接。
HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。
IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。
当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。
【例如获取某一页面的某一资源后还想要获取同一页面的其他资源时,但是此时TCP连接已经关闭,所以需要重新TCP连接,然后才可以请求和响应。】
而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:
Connection:keep-alive
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
原理:
HTTP协议既可以实现长连接,也可以实现短连接。
在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端访问的某个HTML或其他类型的web页中包含有其他的web资源,如JavaScript文件、图像文件、CSS文件等,当浏览器每遇到这样一个web资源,就会建立一个HTTP会话。HTTP1.0需要在request中增加“Connection: keep-alive”,header才能够支持长连接。
HTTP1.0 KeepAlive支持的数据交互流程如下:
1)Client发出request,其中该request的HTTP版本号为1.0。同时在request请求头中包含一个header:“Connection: keep-alive”。【在HTTP/1.0的时候必须在请求头上加上Connection: keep-alive这个字段,服务端才会知道这是一个长连接请求】
2)web sever收到request中的HTTP协议为1.0及“Connection: keep-alive”就认为是一个长连接请求,其将在response的header中也增加“Conection: keep-alive”。同时不会关闭已建立的TCP连接。
3)Client收到web server的response中包含“Connection: keep-alive”,就认为是一个长连接,不关闭TCP连接。并用该TCP连接再发送request。(跳转到1))
但从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在请求头和响应头加入这行代码。Connection: keep-alive。
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP链接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接(HTTP长连接利用同一个TCP连接处理多个HTTP请求和响应)。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。长连接中关闭连接通过Connection:closed头部字段。如果请求或响应中的Connection被指定为closed,表示在当前请求或相应完成后将关闭TCP连接。TCP的keep-alive是检查当前TCP连接是否活着;HTTP的Keep-Alive是要让一个TCP连接活久点。
HTTP1.1 Keep-Alive支持的数据交互流程如下:
1)Client发出request,其中该request的HTTP版本号为1.1。
2)web server收到request中的协议为1.1就认为是一个长连接请求【请求头不需要添加Connection: keep-alive,服务端就认为其请求是长连接】,其将在response的header中也增加“Connection: keep-alive”。同时不会关闭已建立的TCP连接。
3)Client收到 web server的response中包含“Connection:keep-alive”,就认为是一个长连接,不会关闭TCP请求,并用该TCP连接再发送request。(跳转到 1))
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
HTTP长连接的优点:
1)通过开启和关闭更少的TCP连接,节约CPU时间和内存。
2)通过减少TCP开启和关闭引起的包的数目,降低网络阻塞。
HTTP长连接的缺点:
服务器维护一个长连接会增加开销。
HTTP短连接的优点:
服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,节省服务器端资源,以更高效地去处理业务。
HTTP短连接的缺点:
如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
HTTP响应头中的connection字段作用详解
前言
有的网站会在服务器运行一段时间后down掉,有不少缘由可能形成这种现象:好比tomcat堆和非堆内存设置不足,程序没能释放内存空间形成内存溢出,或者某些进程一直运行没能释放,形成cup资源大量消耗。但除了程序自己的缘由,还有多是客服端访问形成的(固然这个客户端也包含如蜘蛛软件等搜索引擎),若是服务器和客户端创建的是长连接(能够用"netstat -a"命令查看网络访问信息),这就须要对http响应头的connection作必定的设置。
解释
①在http1.1中request headers和reponse headers中都有可能出现一个connection头字段,此字段的含义是当客户端和服务端通讯时对于长连接如何进行处理。
②在http1.1中,客户端和服务端都是默认对方支持长连接的; 若是客户端使用http1.1协议,但又不但愿使用长连接,则须要在请求头中指明connection的值为close;若是服务端也不想支持长连接,则在响应头中也须要明确说明connection的值为close。
③不论请求头还是响应头中包含了值为close的connection,都代表当前正在使用的tcp连接在请求处理完毕后会被断掉。之后客户端再进行新的请求时就必须建立新的tcp连接了。
HTTP Connection的 close设置容许客户端或服务器中任何一方关闭底层的链接双方都会要求在处理请求后关闭它们的TCP链接。
如何在程序中设置
能够在过滤器中加入: response.setHeader("connection", "close");