HTTP keep-alive
传统的HTTP/1.0应用里都是一次TCP连接一次request,这样子效率低并且造成服务器负载增加。协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive
,而HTTP/1.1默认是支持长连接的。如果HTTP/1.1版本的http请求报文不希望使用长连接,则要在请求头中加上Connection: close
,接收到这个请求头的对端服务就会主动关闭连接。
但是http长连接会一直保持吗?肯定是不会的,不然会造成服务端端口被长期占用释放不了。一般服务端都会设置keep-alive超时时间。超过指定的时间间隔,服务端就会主动关闭连接。同时服务端还会设置一个参数叫最大请求数,只要超过了最大请求次数,即使还没到超时时间,服务端也会主动关闭连接。
当然了,协议是这样规定的,至于支不支持还得看服务器(比如tomcat)和客户端(比如浏览器)的具体实现。在实践过程中发现谷歌浏览器使用HTTP/1.1协议时请求头中总会带上Connection: keep-alive,另外通过httpclient使用HTTP/1.0协议去请求tomcat时,即使带上Connection: keep-alive请求头也保持不了长连接。
HTTP keep-alive和TCP keepalive的区别
TCP keepalive指的是TCP保活计时器(keepalive timer)。设想有这样的情况:客户已主动与服务器建立了TCP连接。但后来**客户端的主机突然出故障。**显然,服务器以后就不能再收到客户发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就是使用保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两小时。若两小时没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75秒发送一次。若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。
针对linux系统,TCP保活超时时间、探测报文段发送间隔、探测报文段最大发送次数都是可以设置的,如下
# cat /proc/sys/net/ipv4/tcp_keepalive_time 7200 当keepalive启用的时候,TCP发送keepalive消息的频度。缺省是2小时
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75 当探测没有确认时,重新发送探测的频度。缺省是75秒
# cat /proc/sys/net/ipv4/tcp_keepalive_probes 9 探测尝试的次数。如果第1次探测包就收到响应了,则后8次的不再发