HTTP keep-alive和TCP keepalive

HTTP keep-alive

传统的HTTP/1.0应用里都是一次TCP连接一次request,这样子效率低并且造成服务器负载增加。协议规定HTTP/1.0如果想要保持长连接,需要在请求头中加上Connection: keep-alive,而HTTP/1.1默认是支持长连接的。如果HTTP/1.1版本的http请求报文不希望使用长连接,则要在请求头中加上Connection: close,接收到这个请求头的对端服务就会主动关闭连接。

但是http长连接会一直保持吗?肯定是不会的,不然会造成服务端端口被长期占用释放不了。一般服务端都会设置keep-alive超时时间。超过指定的时间间隔,服务端就会主动关闭连接。同时服务端还会设置一个参数叫最大请求数,只要超过了最大请求次数,即使还没到超时时间,服务端也会主动关闭连接。

当然了,协议是这样规定的,至于支不支持还得看服务器(比如tomcat)和客户端(比如浏览器)的具体实现。在实践过程中发现谷歌浏览器使用HTTP/1.1协议时请求头中总会带上Connection: keep-alive,另外通过httpclient使用HTTP/1.0协议去请求tomcat时,即使带上Connection: keep-alive请求头也保持不了长连接。

HTTP keep-alive和TCP keepalive的区别

TCP keepalive指的是TCP保活计时器(keepalive timer)。设想有这样的情况:客户已主动与服务器建立了TCP连接。但后来**客户端的主机突然出故障。**显然,服务器以后就不能再收到客户发来的数据。因此,应当有措施使服务器不要再白白等待下去。这就是使用保活计时器。服务器每收到一次客户的数据,就重新设置保活计时器,时间的设置通常是两小时。若两小时没有收到客户的数据,服务器就发送一个探测报文段,以后则每隔75秒发送一次。若一连发送10个探测报文段后仍无客户的响应,服务器就认为客户端出了故障,接着就关闭这个连接。

针对linux系统,TCP保活超时时间、探测报文段发送间隔、探测报文段最大发送次数都是可以设置的,如下

# cat /proc/sys/net/ipv4/tcp_keepalive_time  7200 当keepalive启用的时候,TCP发送keepalive消息的频度。缺省是2小时
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl  75  当探测没有确认时,重新发送探测的频度。缺省是75# cat /proc/sys/net/ipv4/tcp_keepalive_probes  9  探测尝试的次数。如果第1次探测包就收到响应了,则后8次的不再发
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nginx确实支持HTTP Keep-alive功能,这使得浏览器可以利用同一个连接发送多个请求并接收响应,提高了网络通信效率,减少了建立TCP连接的成本。 ### HTTP Keep-alive详解 HTTP Keep-alive,也称为持久连接,允许客户端(通常是Web浏览器)在完成了一个HTTP请求之后,继续保持与服务器的连接状态一段时间。这样做的目的是为了减少建立新连接所需的时间,同时也可以让服务器在同一连接上处理后续的请求,从而提高性能和减少资源消耗。 ### Nginx如何实现Keep-alive 在Nginx配置文件中,默认情况下已经启用了Keep-alive功能。你可以通过`proxy_http_version 1.1;`和`http { keepalive_timeout 50s;}`这样的指令来调整HTTP版本以及Keep-alive超时时间等设置。 - `proxy_http_version 1.1;`用于启用HTTP/1.1协议,这是启用Keep-alive的关键之一。 - `keepalive_timeout 50s;`表示当无据传输超过50秒后关闭连接。 ### 开启和调整Keep-alive 如果你需要调整默认设置,例如增加Keep-alive的超时时间或者优化资源管理,可以在`server`块或者全局`http`块中添加上述指令: ```nginx http { # 其他配置... proxy_http_version 1.1; keepalive_timeout 60s; # 设置为60秒作为示例 } server { # 其他服务器特定配置... } ``` ### 相关问题: 1. **HTTP Keep-alive对服务器资源的影响是什么?** - 使用HTTP Keep-alive可以帮助服务器更高效地管理连接,减少连接建立和断开带来的系统开销,尤其是在高并发访问的情况下更为明显。 2. **如何在Nginx配置文件中禁用HTTP Keep-alive?** - 可以将`keepalive_timeout`值设为0秒,并关闭`proxy_http_version`为1.1的功能。但这可能会导致浏览器尝试使用HTTP/1.0连接,这通常不会保持连接,除非有额外的脚本或配置来实现这一目标。 3. **为何在某些场景下需要禁用HTTP Keep-alive?** - 禁用HTTP Keep-alive可能出于安全、性能或其他特定需求考虑,比如: - 需要防止长时间占用连接影响其他流量,特别是在有流量控制限制的网络环境。 - 某些服务可能需要明确地清理每个会话的资源,禁止共享连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值