`

http keepalive 与 tcp keep alive

 
阅读更多

1、HTTP Keep-Alive
在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。
使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。
但是,keep-alive并不是免费的午餐,长时间的tcp连接容易导致系统资源无效占用。配置不当的keep-alive,有时比重复利用连接带来的损失还更大。所以,正确地设置keep-alive timeout时间非常重要。
keepalvie timeout
Httpd守护进程,一般都提供了keep-alive timeout时间设置参数。比如nginx的keepalive_timeout,和Apache的KeepAliveTimeout。这个keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要hold住keepalive_timeout秒后,才开始关闭这个连接。
当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置 keepalive_timeout后,httpd守护进程会想说:”再等等吧,看看浏览器还有没有请求过来”,这一等,便是keepalive_timeout时间。如果守护进程在这个等待的时间里,一直没有收到浏览发过来http请求,则关闭这个http连接。
2、TCP KEEPALIVE
链接建立之后,如果应用程序或者上层协议一直不发送数据,或者隔很长时间才发送一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线了还是确实没有数据传输,链接还需不需要保持,这种情况在TCP协议设计中是需要考虑到的。
TCP协议通过一种巧妙的方式去解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。
3、http keep-alive与tcp keep-alive
http keep-alive与tcp keep-alive,不是同一回事,意图不一样。http keep-alive是为了让tcp活得更久一点,以便在同一个连接上传送多个http,提高socket的效率。而tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。tcp keep-alive保鲜定时器,支持三个系统内核配置参数:
1 echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
2 echo 15 > /proc/sys/net/ipv4/tcp_keepalive_intvl
3 echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes
keepalive是TCP保鲜定时器,当网络两端建立了TCP连接之后,闲置idle(双方没有任何数据流发送往来)了tcp_keepalive_time后,服务器内核就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在 tcp_keepalive_intvl后再次尝试发送侦测包,直到收到对对方的ack,如果一直没有收到对方的ack,一共会尝试 tcp_keepalive_probes次,每次的间隔时间在这里分别是15s, 30s, 45s, 60s, 75s。如果尝试tcp_keepalive_probes,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。

也就是说,仅当nginx的keepalive_timeout值设置高于tcp_keepalive_time,并且距此tcp连接传输的最后一个http响应,经过了tcp_keepalive_time时间之后,操作系统才会发送侦测包来决定是否要丢弃这个TCP连接。一般不会出现这种情况,除非你需要这样做。

4、图解http的keep-alive

参考链接地址:http://www.bubuko.com/infodetail-260176.html

                           http://www.nowamagic.net/academy/detail/23350305

 

分享到:
评论

相关推荐

    利用Keep-Alive处理Socket网络异常断开的方法

    4. **超时与重试**:如果在一定时间内没有收到对端的响应,则会重新发送Keep-Alive报文,通常会进行多次尝试。 5. **连接断开**:如果经过多次重试仍然没有收到响应,TCP协议会认为连接已经失效,并主动发送一个RST...

    springboot-keepalive设置测试

    总结来说,"springboot-keepalive设置测试"涉及到的关键知识点包括:Spring Boot的HTTP连接池配置,特别是与keepalive相关的`keep-alive-timeout`属性;使用Jodd HttpClient进行HTTP客户端测试,以及理解HTTP长连接...

    TCP Keepalive和HTTP keepalive是一个东西吗 617 - 629

    TCP Keepalive 和 HTTP Keep-Alive 的区别和实现机制 TCP Keepalive 和 HTTP Keep-Alive 是两个不同的概念,虽然它们的名称相似,但它们的实现机制和作用域完全不同。下面我们将详细介绍 TCP Keepalive 和 HTTP ...

    W5500 Keepalive 应用笔记

    "W5500 Keepalive 应用笔记"是一个针对W5500网络接口芯片的专题,旨在探讨如何在TCP连接中有效地使用Keepalive机制。W5500是一款集成的以太网控制器,广泛应用于嵌入式系统,如物联网设备和工业自动化。 TCP ...

    socket的keepalive介绍

    Socket的Keepalive机制是TCP/IP通信中用于保持连接活跃性的一种技术。它的主要目标是确保在TCP连接上,即使在长时间无数据交换的情况下,也能检测到连接是否仍然有效。这在服务器与客户端通信中尤其重要,因为如果...

    HTTP协议Keep-Alive模式详解

    HTTP 协议 Keep-Alive 模式详解 Keep-Alive 模式是 HTTP 协议中的一种机制,它使客户端到服务器端的连接保持有效,从而避免了每个请求和应答都新建一个连接,并立即断开连接。下面是关于 Keep-Alive 模式的详细...

    tcp_keepalive:测试tcp保持活动模式

    TCP keepalive:TCP keepalive:参考于RFC1122 TCP内建的option,由c socket或kernel设置参数: TCP_KEEPCNT - tcp_keepalive_probes (重试几次决定断线) TCP_KEEPINTVL - tcp_keepalive_intvl(ACK传了多久没回应要重试)...

    详解Nginx中HTTP的keepalive相关配置

    对于后端服务器,Nginx使用keepalive_timeout来控制与后端服务器的TCP连接保持时间,这有助于减少因后端资源不可用而导致的超时。 例如,Nginx配置如下: ``` http { ... keepalive_timeout 65 65; ... } ``` ...

    tcpkatest:测试 TCP keep-alive 配置

    tcpkatest: 测试 TCP keep-alive 配置 这是一个用于测试 TCP keep-alive 配置参数的小工具。 有四个相关的套接字选项: SO_KEEPALIVE :启用 TCP 保持活动(请参阅和 )。 TCP_KEEPIDLE :设置在操作系统开始发送 ...

    HTTP完全分析-KeepAlive模式

    3、Keep-Alive的实现与限制 Keep-Alive并非无限期保持连接,而是有一定的存活时间(timeout)和最大请求数(max)。当达到预设的请求数或超时后,连接将被自动关闭。服务器可以通过设置这些参数来控制连接的持续时间...

    如何自动关闭空闲的sde连接

    - 运行命令`#ndd -set /dev/tcp/tcp_keepalive_interval 300000`,将TCP Keep-Alive间隔设置为300秒(即5分钟)。 3. **IBM AIX环境下设置TCP Keep-Alive:** - 在IBM AIX操作系统中,可以使用`no`命令来设置TCP ...

    Vue中keep-alive 实现后退不刷新并保持滚动位置

    首先,我们要明确我们谈的是TCP的 KeepAlive 还是HTTP的 Keep-Alive。TCP的KeepAlive和HTTP的Keep-Alive是完全不同的概念,不能混为一谈。实际上HTTP的KeepAlive写法是Keep-Alive,跟TCP的KeepAlive写法上也有不同。...

    mtb-example-anycloud-offload-tcp-keepalive:此代码示例演示了赛普拉斯Wi-Fi设备使用PSoC:registered:6 MCU提供的TCP Keepalive卸载功能。 它采用了AnyCloud低功耗助手(LPA)中间件库,该库有助于为赛普拉斯设备开发低功耗无线应用程序。

    AnyCloud示例:WLAN TCP Keepalive卸载 此代码示例演示了赛普拉斯Wi-Fi设备使用PSoC:registered:6 MCU提供的TCP Keepalive卸载功能。 它采用了(LPA)中间件库,可帮助开发赛普拉斯器件的低功耗应用。 TCP ...

    在Linux环境下使用TCP的keepalive机制

     tcp_keepalive_time:表示的是近一次数据包(简单的不含数据的ACKs包)发送与第一次keepalive探针发送之间的时间间隔;当连接被标记为keepalive之后,这个计数器不会再使用。  tcp_keepalive_intvl:表示的是...

    Keep-alive

    "Keep-alive" 是一种网络通信技术,主要应用于TCP协议中,用于保持连接状态,避免因长时间无数据传输导致的连接中断。Keepalive工具包,如提到的"Keepalive 1.3.5",是实现这一技术的软件实现,主要用于服务器端,以...

    WinSockTCPkeepalive的原理学习及使用方法借鉴.pdf

    这里的`tcp_keepalive`结构体定义了三个字段:`onoff`用于启用或禁用keepalive,`keepalivetime`指定了多久后发送第一个keep-alive包,而`keepaliveinterval`则是两次探测之间的时间间隔。 总的来说,WinSock TCP ...

    Lwip之TCP实现.pdf

    - `TCP_KEEPALIVE`: 定义了keep-alive选项,用于维持空闲连接。 - `TCP_KEEPDEFAULT`: 7200 秒 (2 小时),默认的keep-alive探测发送前的等待时间。 - `TCP_KEEPINTVL`: 75 秒,两次keep-alive探测之间的间隔。 -...

    keepalive+twemproxy+ redis主从安装配置的例子(linux)

    `Keepalive`是TCP协议的一个特性,用于在连接空闲时发送心跳包,以维持网络连接的活跃状态。在Redis中,启用Keepalive可以防止因长时间无数据传输而导致的网络连接中断。在Linux系统中,可以通过修改`/etc/sysctl....

    CUBE配置STM32H750+Lan8720+FreeRTOS+lwip+掉线重连+KeepAlive移植工程文件

    CUBE配置STM32H750+Lan8720+FreeRTOS+lwip+掉线重连+KeepAlive成功移植后的完整cube工程,对于没调通或者没做到掉线重连的会非常有用,打通了掉线重连方案和tcp保活,绝对值得下载

Global site tag (gtag.js) - Google Analytics