博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
好程序员分享http的keep-alive和tcp的keep-alive区别
阅读量:6701 次
发布时间:2019-06-25

本文共 1703 字,大约阅读时间需要 5 分钟。

  hot3.png

  1. HTTP Keep-Alive

在http早期,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就断开这个tcp连接。

使用keep-alive可以改善这种状态,即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,它减少了tcp连接建立次数,也意味着可以减少Time_Wait状态连接,因此提高性能和提高httpd服务器的吞吐率。

但是,keep-alive它不是免费的午餐,长时间的tcp连接很容易导致系统资源无效的占用。配置不当的keep-alive,会比重复利用连接带来的损失更大。所以,正确地设置keep-alive timeout时间非常重要。

2、tcp keepalive

  链接建立之后,如果应用程序与或者上层协议一直不发送数据,或者间隔很长时间才发一次数据,当链接很久没有数据报文传输时如何去确定对方还在线,到底是掉线还是确实没有数据传输,链接还需不需要保持,这种情况下在TCP协议设计中是需要考虑到的。

TCP协议通过一种特别巧妙的方式来解决这个问题,当超过一段时间之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,链接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持链接。

3、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连接。

  1. tcp keepalive保鲜定时器

HTTP的Keepalive,顾名思义,目的在于延长连接的时间,以便在同一条连接中传输多个HTTP请求。HTTP服务器一般会提供Keepalive Timeout参数,用来决定连接保持多久,什么时候关闭连接。当连接使用了Keepalive功能时,对于客户端发送过来的一个请求,服务器端会发送一个响应,然后开始计时,如果经过Timeout时间后,客户端没有再发送请求过来,服务器端就把连接关了,不再保持连接了。

TCP的Keepalive,是挂羊头卖狗肉的,目的在于看看对方有没有发生异常,如果有异常就及时关闭连接。当传输双方不主动关闭连接时,就算双方没有交换任何数据,连接也是一直有效的。如果这个时候对端、中间网络出现异常而导致连接不可用,本端如何得知这一信息呢?答案就是保活定时器。它每隔一段时间会超时,超时后会检查连接是否空闲太久了,如果空闲的时间超过了设置时间,就会发送探测报文。然后通过对端是否响应、响应是否符合预期,来判断对端是否正常,如果不正常,就主动关闭连接,而不用等待HTTP层的关闭了。当服务器发送探测报文时,客户端可能处于4种不同的情况:仍然正常运行、已经崩溃、已经崩溃并重启了、由于中间链路问题不可达。在不同的情况下,服务器会得到不一样的反馈。

5、http keep-alive与tcp keep-alive

http keep-alive与tcp keep-alive,不是同一回事,意图也一样。http keep-alive是为了让tcp活得更久一点,以便在同一个连接上传送多个http,提高socket的效率。而tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。

转载于:https://my.oschina.net/530504/blog/3055697

你可能感兴趣的文章
解决github访问慢或pod install或pod update慢方案
查看>>
前端性能优化(JS/CSS优化,SEO优化)
查看>>
[译]GraphQL:你需要知道的一切
查看>>
数组与对象、字符串遍历方法大全
查看>>
ARP地址解析协议、DNS域名系统和交换机、路由器、网关的概念
查看>>
微信小程序自定义事件
查看>>
对Vue组件通信的理解
查看>>
JS 作用域 var与let 区别
查看>>
情人节撸一个表白页面
查看>>
Java ClassLoader分析
查看>>
小程序无限层级路由方案
查看>>
Android studio 安装Plugins
查看>>
安装FUNC遇到的一些问题
查看>>
【MySQL(2)| MySQL索引机制】
查看>>
Flutter 高效自学笔记(三)——网络请求
查看>>
从一道题解读JS原型链
查看>>
经典编程书籍大全
查看>>
DaoCloud 持续集成 Java 项目
查看>>
JS里的对象
查看>>
制作自己的CocoaPods(完善中)
查看>>