TCP的keepalive和HTTP的keepalive之间的关系?两者都有timeout,HTTP的timeout是什么含义呢?如果两者设置的值不同会造成什么后果?

TCP的keepalive和HTTP的keepalive之间的关系
协同工作:HTTP keepalive利用了TCP连接的持续性,而TCP keepalive则为HTTP keepalive提供了底层连接的活性检测。当HTTP协议使用keepalive机制保持TCP连接打开时,TCP keepalive可以在底层检测这个TCP连接是否由于网络故障等原因而中断。如果TCP keepalive检测到连接已经失效,那么HTTP keepalive就无法继续使用这个连接,需要重新建立连接。
功能目的差异:TCP keepalive主要关注的是TCP连接层面的对端存活情况,是一种通用的TCP连接维护机制,不管上层应用是HTTP还是其他基于TCP的协议,都可以发挥作用。而HTTP keepalive重点在于提高HTTP协议的性能,通过复用TCP连接来减少连接建立和关闭的开销,优化HTTP请求的传输效率。
配置和控制的独立性:TCP keepalive是由TCP层(内核态)实现的,其相关参数通常可以在操作系统层面进行配置。而HTTP keepalive是由应用层(用户态)实现的,其超时时间等参数一般由Web服务器或应用程序进行设置。
HTTP的timeout的含义
HTTP的timeout,如Nginx中的keepalive_timeout,是指服务器在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。当HTTP守护进程发送完一个响应后,理应马上主动关闭相应的TCP连接,但设置了keepalive_timeout后,守护进程会等待一段时间,看看浏览器还有没有请求过来,这一等便是keepalive_timeout时间。如果在这个等待时间里,一直没有收到浏览器发过来的HTTP请求,则关闭这个HTTP连接。
两者设置的值不同会造成什么后果
资源占用问题:如果HTTP keepalive的timeout值设置得比TCP keepalive的timeout值大很多,可能会导致在TCP层面已经认为连接不可用并准备关闭时,HTTP层面仍然认为连接是可用的并继续占用资源。这可能会造成服务器资源的浪费,因为一些已经“死亡”的连接仍然被保留,占用了宝贵的系统资源。
连接中断问题:如果TCP keepalive的timeout值设置得比HTTP keepalive的timeout值小,那么在HTTP连接仍然处于活跃状态时,TCP连接可能已经被认为是无效的并被关闭。这将导致HTTP连接在传输过程中突然中断,影响正常的通信。例如,客户端可能在发送请求或接收响应的过程中,突然发现连接已断开,需要重新建立连接,从而影响用户体验和系统性能。
配置不一致导致的复杂性:当两者设置的值不一致时,会增加系统配置和维护的复杂性。管理员需要同时考虑两个层面的超时设置,以确保它们之间的协调和兼容。如果配置不当,可能会引发难以诊断的网络问题和应用故障。
TCP keepalive和HTTP keepalive的推荐值
TCP keepalive的推荐值
tcp_keepalive_time:默认值为7200秒(2小时),表示TCP连接空闲时开始发送保活探测包的时间间隔。如果希望连接保持更长时间不关闭,可以将该值设置得更大,例如10800秒(3小时)。
tcp_keepalive_intvl:默认值为75秒,表示每次发送保活探测包的时间间隔。在高负载的应用程序中,可以适当增加该值,例如120秒,以减少网络流量和系统负担。
tcp_keepalive_probes:默认值为9次,表示未收到响应的保活探测包重试次数。如果希望更可靠地检测连接状态,可以将该值设置为10次。
HTTP keepalive的推荐值
keepalive_timeout:默认值为75秒。根据实际情况,可以将其设置为60秒或120秒。如果将超时时间设置得太短,可能会导致频繁地建立和断开连接,增加TCP连接的开销;如果设置得太长,可能会导致资源占用过多,影响其他请求的处理。
keepalive_requests:默认值为100,表示一个keep-alive连接上可以服务的请求的最大数量。在QPS较高的场景下,可以适当增加该值,例如1000或10000,以提高连接的利用率。
综合推荐
TCP keepalive:
tcp_keepalive_time:10800秒(3小时)
tcp_keepalive_intvl:120秒
tcp_keepalive_probes:10次
HTTP keepalive:
keepalive_timeout:120秒
keepalive_requests:1000
这些推荐值在大多数场景下都能提供较好的性能和资源利用平衡。具体设置时,建议根据实际应用的负载和需求进行调整。

posted @   yongliu  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示