好程序员分享http的keep-alive和tcp的keep-alive区别

  1. HTTP Keep-Alive

在http早期,每一个http请求都要求打开一个tpc socket链接,而且使用一次以后就断开这个tcp链接。nginx

使用keep-alive能够改善这种状态,即在一次TCP链接中能够持续发送多份数据而不会断开链接。经过使用keep-alive机制,它减小了tcp链接创建次数,也意味着能够减小Time_Wait状态链接,所以提升性能和提升httpd服务器的吞吐率。浏览器

可是,keep-alive它不是免费的午饭,长时间的tcp链接很容易致使系统资源无效的占用。配置不当的keep-alive,会比重复利用链接带来的损失更大。因此,正确地设置keep-alive timeout时间很是重要。服务器

二、tcp keepalive网络

  连接创建以后,若是应用程序与或者上层协议一直不发送数据,或者间隔很长时间才发一次数据,当连接好久没有数据报文传输时如何去肯定对方还在线,究竟是掉线仍是确实没有数据传输,连接还需不须要保持,这种状况下在TCP协议设计中是须要考虑到的。socket

TCP协议经过一种特别巧妙的方式来解决这个问题,当超过一段时间以后,TCP自动发送一个数据为空的报文给对方,若是对方回应了这个报文,说明对方还在线,连接能够继续保持,若是对方没有报文返回,而且重试了屡次以后则认为连接丢失,没有必要保持连接。tcp

三、keepalvie timeout性能

Httpd守护进程,通常都提供了keep-alive timeout时间设置参数。好比nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个keepalive_timout时间值意味着:一个http产生的tcp链接在传送完最后一个响应后,还须要hold住keepalive_timeout秒后,才开始关闭这个链接。spa

httpd守护进程发送完一个响应后,理应立刻主动关闭相应的tcp链接,设置 keepalive_timeout后,httpd守护进程会想说:”等一下浏览器吧,看看有没有请求过来”,这一等,即是keepalive_timeout时间。若是守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http链接。设计

  1. tcp keepalive保鲜定时器

HTTP的Keepalive,顾名思义,目的在于延长链接的时间,以便在同一条链接中传输多个HTTP请求。HTTP服务器通常会提供Keepalive Timeout参数,用来决定链接保持多久,何时关闭链接。当链接使用了Keepalive功能时,对于客户端发送过来的一个请求,服务器端会发送一个响应,而后开始计时,若是通过Timeout时间后,客户端没有再发送请求过来,服务器端就把链接关了,再也不保持链接了。进程

TCP的Keepalive,是挂羊头卖狗肉的,目的在于看看对方有没有发生异常,若是有异常就及时关闭链接。当传输双方不主动关闭链接时,就算双方没有交换任何数据,链接也是一直有效的。若是这个时候对端、中间网络出现异常而致使链接不可用,本端如何得知这一信息呢?答案就是保活定时器。它每隔一段时间会超时,超时后会检查链接是否空闲过久了,若是空闲的时间超过了设置时间,就会发送探测报文。而后经过对端是否响应、响应是否符合预期,来判断对端是否正常,若是不正常,就主动关闭链接,而不用等待HTTP层的关闭了。当服务器发送探测报文时,客户端可能处于4种不一样的状况:仍然正常运行、已经崩溃、已经崩溃并重启了、因为中间链路问题不可达。在不一样的状况下,服务器会获得不同的反馈。

五、http keep-alive与tcp keep-alive

http keep-alive与tcp keep-alive,不是同一回事,意图也同样。http keep-alive是为了让tcp活得更久一点,以便在同一个链接上传送多个http,提升socket的效率。而tcp keep-alive是TCP的一种检测TCP链接情况的保鲜机制。

相关文章
相关标签/搜索