HTTP的KeepAlive和TCP的KeepAlive区别

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 

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

75

可以通过echo临时修改

echo "300" > /proc/sys/net/ipv4/tcp_keepalive_time

也可以通过修改/etc/sysctl.conf永久生效

$ grep net.ipv4.tcp_keepalive_time /etc/sysctl.conf 

net.ipv4.tcp_keepalive_time = 300 

$ sysctl -p|grep net.ipv4.tcp_keepalive_time

net.ipv4.tcp_keepalive_time = 300

2.3   实例

假想主机A和主机B之前一个简单的TCP连接:在A与B之间有一个简单的三次握手,A发送SYN到B,然后B发送SYN+ACK到A,最后A发送ACK到B。现在就建立起了一个稳定的TCP连接,等待某方通过这个通道传输数据。现在问题就来了:拔掉主机B的电源,主机B在没有任何通知主机A当前连接即将关闭的情况会立即关机。对于主机A,正准备接收数据,但是不知道主机B已经关机。现在主机B开机,主机A和主机B又处于正常状态,主机A知道还有一个与主机B的活动连接,但是主机B不知道。当主机A尝试通过这个死掉的连接向主机B发送数据时,主机B会返回RST,主机A就会主动关掉这个连接。

作者:Younger Liu

本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。


猜你喜欢

转载自blog.csdn.net/iamonlyme/article/details/79449857
今日推荐