原文地址:http://blog.csdn.net/oceanperfect/article/details/51064574html
一、HTTP Keep-Alive
在http早期,每一个http请求都要求打开一个tpc socket链接,而且使用一次以后就断开这个tcp链接。
使用keep-alive能够改善这种状态,即在一次TCP链接中能够持续发送多份数据而不会断开链接。经过使用keep-alive机制,能够减小tcp链接创建次数,也意味着能够减小TIME_WAIT状态链接,以此提升性能和提升httpd服务器的吞吐率(更少的tcp链接意味着更少的系统内核调用,socket的accept()和close()调用)。
可是,keep-alive并非免费的午饭,长时间的tcp链接容易致使系统资源无效占用。配置不当的keep-alive,有时比重复利用链接带来的损失还更大。因此,正确地设置keep-alive timeout时间很是重要。
keepalvie timeout
Httpd守护进程,通常都提供了keep-alive timeout时间设置参数。好比nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个keepalive_timout时间值意味着:一个http产生的tcp链接在传送完最后一个响应后,还须要hold住keepalive_timeout秒后,才开始关闭这个链接。
当httpd守护进程发送完一个响应后,理应立刻主动关闭相应的tcp链接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,即是keepalive_timeout时间。若是守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http链接。
二、TCP KEEPALIVE
连接创建以后,若是应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当连接好久没有数据报文传输时如何去肯定对方还在线,究竟是掉线了仍是确实没有数据传输,连接还需不须要保持,这种状况在TCP协议设计中是须要考虑到的。
TCP协议经过一种巧妙的方式去解决这个问题,当超过一段时间以后,TCP自动发送一个数据为空的报文给对方,若是对方回应了这个报文,说明对方还在线,连接能够继续保持,若是对方没有报文返回,而且重试了屡次以后则认为连接丢失,没有必要保持连接。
三、http keep-alive与tcp keep-alive
http keep-alive与tcp keep-alive,不是同一回事,意图不同。http keep-alive是为了让tcp活得更久一点,以便在同一个链接上传送多个http,提升socket的效率。而tcp keep-alive是TCP的一种检测TCP链接情况的保鲜机制。tcp keep-alive保鲜定时器,支持三个系统内核配置参数:
1 echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
2 echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
3 echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
keepalive是TCP保鲜定时器,当网络两端创建了TCP链接以后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,来判断TCP链接情况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。若是没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,若是一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。若是尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP链接。TCP链接默认闲置时间是2小时,通常设置为30分钟足够了。nginx
也就是说,仅当nginx的keepalive_timeout值设置高于tcp_keepalive_time,而且距此tcp链接传输的最后一个http响应,通过了tcp_keepalive_time时间以后,操做系统才会发送侦测包来决定是否要丢弃这个TCP链接。通常不会出现这种状况,除非你须要这样作。浏览器
四、图解http的keep-alive服务器
参考连接地址:http://www.bubuko.com/infodetail-260176.html网络
http://www.nowamagic.net/academy/detail/23350305socket