当前位置 博文首页 > 土著部落:HTTP的KeepAlive和TCP的KeepAlive区别

    土著部落:HTTP的KeepAlive和TCP的KeepAlive区别

    作者:[db:作者] 时间:2021-08-06 18:52

    1??Http的KeepAlive

    1.1???应用场景

    http 1.0中默认是关闭KeepAlive,需要在http头加入"Connection:Keep-Alive",才能启用KeepAlive。

    http 1.1中默认启用KeepAlive,如果加入"Connection:close ",才关闭。

    1.2???语义解析

    若Http关闭KeepAlive,每个http请求都要求打开一个tcp socket连接,并且使用一次之后就断开这个tcp连接。

    使用KeepAlive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用KeepAlive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd 服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。

    但是,KeepAlive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的KeepAlive,有时比重复利用连接带来的损失还更大。所以,正确地设置KeepAlive?timeout时间非常重要。

    ?

    1.3???keepalvie?timeout

    Httpd守护进程,一般都提供了keep-alivetimeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个 keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住 keepalive_timeout秒后,才开始关闭这个连接。当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是 keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。

    ?

    2??TCP的KeepAlive

    2.1???应用场景

    链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。

    2.2???语义解析

    TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。


    tcp_keepalive_time:一个连接需要TCP开始发送keepalive探测数据包之前的空闲时间。以秒为单位

    tcp_keepalive_probes:发送TCPkeepalive探测数据包的最大数量,默认是9.如果发送9个keepalive探测包后对端仍然没有响应,就关掉这个连接

    tcp_keepalive_intvl:发送两个TCPkeepalive探测数据包的间隔时间,默认是75秒

    默认配置

    $ cat /proc/sys/net/ipv4/tcp_keepalive_time

    7200?

    $ cat /proc/sys/net/ipv4/tcp_keepalive_probes?

    9?

    $ cat /proc/sys/net/ipv4/tcp_keepalive_intvl??

    75

    cs