HTTP是一个
请求<->响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个信息。在老的HTTP版本中,每一个请求都将被建立一个新的
客户端->服务器的链接,在这个链接上发送请求,而后接收请求。这样的模式有一个很大的优势就是,它很简单,很容易理解和编程实现;它也有一个很大的缺点就是,它效率很低,所以Keep-Alive被提出用来解决效率低的问题。
Keep-Alive功能使客户端到服务器端的链接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了创建或者从新创建链接。市场上 的大部分Web服务器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。对于提供静态内容的网站来讲,这个功能一般颇有用。可是,对于负担较重的网站来讲,这里存在另一个问题:虽然为客户保留打开的连 接有必定的好处,但它一样影响了性能,由于在处理暂停期间,原本能够释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep- Alive功能对资源利用的影响尤为突出。 此功能为HTTP 1.1预设的功能,HTTP 1.0加上Keep-Aliveheader也能够提供HTTP的持续做用功能。
Keep-Alive: timeout=5, max=100
timeout:过时时间5秒(对应httpd.conf里的参数是:KeepAliveTimeout),max是最多一百次请求,强制断掉链接
就是在timeout时间内又有新的链接过来,同时max会自动减1,直到为0,强制断掉。见下面的四个图,注意看Date的值(先后时间差都是在5秒以内)!
HTTP/1.0
在HTTP/1.0版本中,并无官方的标准来规定Keep-Alive如何工做,所以实际上它是被附加到HTTP/1.0协议上,若是客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段
Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个一样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP链接就会被保持,不会断开(超过Keep-Alive规定的时间,意外断电等状况除外),当客户端发送另一个请求时,就使用这条已经创建的链接
HTTP/1.1
在HTTP/1.1版本中,官方规定的Keep-Alive使用标准和在HTTP/1.0版本中有些不一样,默认状况下所在HTTP1.1中全部链接都被保持,除非在请求头或响应头中指明要关闭:Connection: Close ,这也就是为何Connection: Keep-Alive字段再没有意义的缘由。另外,还添加了一个新的字段Keep-Alive:,由于这个字段并无详细描述用来作什么,可忽略它
Not reliable(不可靠)java
HTTP是一个无状态协议,这意味着每一个请求都是独立的,Keep-Alive没能改变这个结果。另外,Keep-Alive也不能保证客户端和服务器之间的链接必定是活跃的,在HTTP1.1版本中也如此。惟一能保证的就是当链接被关闭时你能获得一个通知,因此不该该让程序依赖于Keep-Alive的保持链接特性,不然会有意想不到的后果程序员
Keep-Alive和POST编程
在HTTP1.1细则中规定了在一个POST消息体后面不能有任何字符,还指出了对于某一个特定的浏览器可能并不遵循这个标准(好比在POST消息体的后面放置一个CRLF符)。而据我所知,大部分浏览器在POST消息体后都会自动跟一个CRLF符再发送,如何解决这个问题呢?根据上面的说明在POST请求头中禁止使用Keep-Alive,或者由服务器自动忽略这个CRLF,大部分服务器都会自动忽略,可是在未经测试以前是不可能知道一个服务器是否会这样作。 浏览器
Keep-Alive 在 Java实现--客户端服务器
在客户端,Java抽象了Keep-Alive,和程序员分享离开来,HttpURLConnection类自动实现了Keep-Alive,若是程序员没有介入去操做Keep-Alive,Keep-Alive会经过客户端内部的一个HttpURLConnection类的实例对象来自动实现。也就是说,在java中keep-alive是由一个Java类库来实现的,但在其余类库中不必定可用。性能
Keep-Alive 在Java实现--服务器端
在服务器端,Java依然是将Keep-Alive抽象出来,HttpServlet、HttpServletRequest、和HttpServletResponse类自动实现 了Keep-Alive。这种状况下一些由第三方控制的操做是可能的,如在KeepAliveServlet中提到的JavaWebServer,Keep-Alive是否启用由两个因素决定,内容长度和输出大小,若是内容长度是响应的一部分(即这段内容长度输出后还有内容须要输出),则Keep-Alive被启用(固然须要客户端支持的状况下);若是内容长度未设定,则Servlet会试着计算响应缓冲区长度以肯定内容长度,在Javasoft实现中,使用一个4KB的缓冲区(至关于上面说的响应)。也就是说若是内容长度未设定,而且返回数据超过4KB,此时至关于内容长度大于响应长度,而不是响应长度一部分,Keep-Alive就不会被启用 。测试