TCP keepalive 和 HTTP keepalive

HTTP keepalive

在http早期,每个http请求都要求打开一个tcp连接,并且使用一次之后就断开这个tcp连接。这样无疑是很浪费资源的,因为tcp每次建立连接都需要三次握手。于是在http1.1中,我们有了keep-alive这个解决方案, keepalive可以复用同一个tcp连接以承载多个http请求。有效地降低了网络开销,也减轻了服务器压力。

但是keepalive也带来另一个问题,,长时间的tcp连接容易导致系统资源无效占用,为了解决这个问题我们需要设置keepalvie timeout这个参数。这个参数意味着,一个http产生的tcp连接在传送完最后一个响应后,还需要保持keepalvie timeout秒后,才开始关闭这个连接。正确的设置这个参数,可以在性能和开销方面获得一个最优的均衡。这个参数在web服务器中一般都有提供,比如nginx的keepalive_timeout

TCP keepalive

tcp的keepalive是一种检测tcp连接状况的机制,用于回收空闲的tcp连接,以释放服务器的资源,提升服务器的性能。当网络两端建立了tcp连接之后,闲置(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务端就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,如果一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次。如果尝试tcp_keepalive_probes次,依然没有收到对方的ack包,则会断开tcp连接。

通过上面介绍我们可以知道,只有当nginx的keepalive_timeout的值大于tcp_keepalive_time,并且距离tcp连接传输的最后一个http响应tcp_keepalive_time时间之后,操作系统才会发送侦测包来决定是否要丢弃这个tcp连接。

tcp_keepalive_time默认值是7200秒。

//以下命令可以查看tcp_keepalive_time的值
cat /proc/sys/net/ipv4/tcp_keepalive_time

tcp_keepalive_intvl默认值是75秒。

//以下命令可以查看tcp_keepalive_intvl的值
cat /proc/sys/net/ipv4/tcp_keepalive_intvl

tcp_keepalive_probes默认值是9次。

//以下命令可以查看tcp_keepalive_probes的值
cat /proc/sys/net/ipv4/tcp_keepalive_probes

总结

tcp keepalive用于回收空闲的tcp连接,以释放服务器的资源,提升服务器的性能。

http keepalive用于复用同一个tcp连接以承载多个http请求,这样减少了连接建立的三次握手和关闭的四次握手,这样降低了网络开销,也减轻了服务器压力。

你可能感兴趣的:(TCP keepalive 和 HTTP keepalive)