keep-alive详解

我们都知道,HTTP协议采用“请求-应答”模式,当使用普通模式,即非Keep-alive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-alive模式时(又称持久连接,连接重用)时,Keep-alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,Keep-alive避免了重新建立连接。

在老的HTTP版本中,每个请求都将被创建一个新的客户端到服务器端的连接,在这个连接上发送请求,然后接受请求。这样的模式有一个很大的优点,它很简单,很容易理解和编程实现;它也有一个很大的缺点,它的效率很低,Keep-alive就是用来解决这个问题的。

Keep-alive使客户端到服务器端的连接持续有效,当出现对服务器的后续请求时,Keep-alive功能避免了建立或者重新建立连接。现在的大多数Web服务器都支持Keep-alive。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另一个问题:虽然为客户保留打开的连接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源让旧被占用。此功能为HTTP1.1预设的功能,但在HTTP1.0上我们加上Keep-Aliveheader同样可以使用这个功能。

我们来举个例子说一下:

Keep-alive:timeout=5,max=100

意思是说:过期时间5秒,max是最多100次请求,强制断掉连接,也就是在timeout时间内每来一个新的请求,max会自动减1,直到为0,强制断掉连接。

在HTTP1.0版本中并没有官方的标准来规定Keep-alive如何工作,因此实际上他是被附加到HTTP1.0协议上的,如果客户端浏览器支持Keep-alive,那么就在HTTP请求中加一个字段:Connection:Keep-alive,当服务器收到附带有Connection:Keep-alive的请求时,它也会在响应头中加一个同样的字段来使用Keep-alive。这样一来客户端和服务器之间的HTTP连接就会保持,不会断开(除非超过timeout规定的时间),当客户端发送另外一个请求时,就使用这条已经建立的连接。

在HTTP1.1版本中,官方规定的Keep-alive使用标准和HTTP/1.0版本中有些不同,默认情况下HTTP/1.1中所有连接都被保持,除非在请求头或响应头中指明要关闭,:Connection:Close。

HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-alive没能改变这个结果。另外,Keep-alive也不能保证客户端和服务器端之间的连接一定是活跃的,在HTTP/1.1中也是如此。唯一能保证的就是当连接被关闭时你能得到一个通知,所以我们不应该让程序依赖Keep-alive的保持连接性,否则会与一些意想不到的后果。

通过使用Keep-alive机制,可以减少tcp连接建立的次数,也以为这可以减少TIME_WAIT状态连接,以此提高性能和提高HTTP服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用,socket的accept()和close()调用)。但是长时间的tcp连接容易导致系统资源无效占用,配置不当的Keep-alive有事比重复利用连接带来的损失还更大。所以正确地设置Keep-alive timeout时间非常重要。

下面我们来说说这个Keep-alive timeout参数:

Httpd守护进程,一般都提供了Keep-alivetimeout时间设置参数。这个时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要还需要保持keep-alive timeout秒后,才开始关闭这个连接。

当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置keepalive_timeout后,httpd守护进程会说:再等等吧,看浏览器还有没有请求过来,这个等待的时间就是keepalive_timeout时间,如果守护进程在这个等待的时间里,一直没有收到浏览器发过来的http请求,则关闭这个http连接。

总之,我们应更好的使用这个机制给我们带来一些好处。

时间: 2024-10-26 05:12:50

keep-alive详解的相关文章

ThreadPoolExecutor详解

ThreadPoolExecutor详解 ThreadPoolExecutor的完整构造方法的签名是:ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) . coreP

Android NuPlayer要点详解

本文将基于Android N源码对NuPlayer做一个详解.NuPlayer是Android中本地和流媒体播放所用的播放器. 1.AHandler机制 首先介绍NuPlayer中无处不在的AHandler机制 frameworks/av/include/media/stagefright/foundation/ frameworks/av/media/libstagefright/foundation/ AHandler是Android native层实现的一个异步消息机制,在这个机制中所有的

FastDFS配置参数详解

tracker.conf配置详解 # is this config file disabled # false for enabled # true for disabled disabled=false # 这个配置文件是否不生效,呵呵(改成是否生效是不是会让人感觉好点呢?) false 为生效(否则不生效) true反之 # bind an address of this host # empty for bind all addresses of this host bind_addr=

FastDFS Tracker端配置文件详解及启动注意事项

http://www.fanli7.net/a/bianchengyuyan/C__/20130611/325825.html # is this config file disabled # false for enabled # true for disabled disabled=false #当前配置是否不可用false可用,true不可用 # bind an address of this host # empty for bind all addresses of this host

Spark schedule资源调度分配详解

一:任务调度与资源调度的区别 1. 任务调度:是通过DAGScheduler,TaskScheduler,SchedulerBackend等进行的作业调度: 2. 资源调度:是指应用程序如何获得资源: 3. 任务调度时在资源调度的基础上进行的,没有资源调度那么任务调度就成为了无源之水,无本之木. 二:资源调度内幕天机揭秘 1. 因为Master负责资源管理和调度,所以资源调度的方法schedule位于Master.scala这个类中,当注册程序或者资源发生改变的时候都会导致schedule的调用

Memcached集群/分布式/高可用 及 Magent缓存代理搭建过程 详解

当网站访问量达到一定时,如何做Memcached集群,又如何高可用,是接下来要讨论的问题. 有这么一段文字来描述“Memcached集群” Memcached如何处理容错的? 不处理!:) 在memcached节点失效的情况下,集群没有必要做任何容错处理.如果发生了节点失效,应对的措施完全取决于用户.节点失效时,下面列出几种方案供您选择: * 忽略它! 在失效节点被恢复或替换之前,还有很多其他节点可以应对节点失效带来的影响. * 把失效的节点从节点列表中移除.做这个操作千万要小心!在默认情况下(

【转】Hadoop安全模式详解及配置

原文链接 http://www.iteblog.com/archives/977 在<Hadoop 1.x中fsimage和edits合并实现>文章中提到,Hadoop的NameNode在重启的时候,将会进入到安全模式.而在安全模式,HDFS只支持访问元数据的操作才会返回成功,其他的操作诸如创建.删除文件等操作都会导致失败. NameNode在重启的时候,DataNode需要向NameNode发送块的信息,NameNode只有获取到整个文件系统中有99.9%(可以配置的)的块满足最小副本才会自

设计模式 - 模板方法模式(template method pattern) Applet 详解

模板方法模式(template method pattern) Applet 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), applet就是一个能够在网页上面执行的小程序, applet有很多钩子(

Java自带线程池和队列详解

Java线程池使用说明 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的问题提供了非常大的帮助. 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪

监控服务器Nagios之二 配置参数详解

    本篇主要介绍下安装完Nagios服务端后的配置目录及文件参数的解释,可供大家备忘! 首先解释下安装Nagios的时候make的含义如下: make all  //安装所有主程序 make install //来安装主程序,CGI和HTML文件 make install-init //在/etc/rc.d/init.d安装启动脚本 make install-config //来安装示例配置文件,安装的路径是/usr/local/nagios/etc make install-command