Http的KeepAlive最详细的说明文档

2012-01-29 19:01

Http的KeepAlive最详细的说明文档

Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。市场上 的大部分Web服务器,包括iPlanet、IIS和Apache,都支持HTTP Keep-Alive。对于提供静态内容的网站来说,这个功能通常很有用。但是,对于负担较重的网站来说,这里存在另外一个问题:虽然为客户保留打开的连 接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当Web服务器和应用服务器在同一台机器上运行时,Keep- Alive功能对资源利用的影响尤其突出。 此功能为HTTP 1.1预设的功能,HTTP 1.0加上Keep-Alive header也可以提供HTTP的持续作用功能。

Keep-Alive: timeout=5, max=100
timeout:过期时间5秒(对应httpd.conf里的参数是:KeepAliveTimeout),max是最多一百次请求,强制断掉连接
就是在timeout时间内又有新的连接过来,同时max会自动减1,直到为0,强制断掉。见下面的四个图,注意看Date的值(前后时间差都是在5秒之内)!

Tomcat中的相关设置,在server.xml 中的Connector 元素中。
keepAliveTimeout:
The number of milliseconds this Connector will wait for another HTTP request before closing the connection. The default value is to use the value that has been set for the connectionTimeout attribute.

maxKeepAliveRequests:
The maximum number of HTTP requests which can be pipelined until the connection is closed by the server. Setting this attribute to 1 will disable HTTP/1.0 keep-alive, as well as HTTP/1.1 keep-alive and pipelining. Setting this to -1 will allow an unlimited amount of pipelined or keep-alive HTTP requests. If not specified, this attribute is set to 100.

 

Keep-Alive通俗地讲,就是所谓的持久连接,对于http这种大量的短连接的服务来说,开启持久连接的好处可以节省大量的TCP连接过程的开销,据apache的官方文档称对包含大量图片的HTML文档造成的延时起到50%的加速作用。而同时现有操作系统越来越先进,建立连接的开销越来越小,像linux2.6的epoll,freebsd的kqueue,可以让程序不产生新进程或新线程的情况就能同时服务N多连接。与此同时,客户端比如IE,Firefox也可以同时开多个线程取内容,如果开了Keepalive,反而有可能使服务器端管理大量的等待超时的tcp连接,使服务器端资源耗尽,而导致响应速度变慢。那么http的Keep-Alive到底是启用还是关闭呢?
说到Keep-Alive这个参数不得不说说这个参数在HTTP/1.0跟HTTP/1.1的一些区别,HTTP/1.0的默认情况下,是不会使用Keep-Alive的,仅当客户端的头指定使用持久连接这个参数而且是要服务器预先知道传输内容的长度时才会与HTTP/1.0的客户端建立持久连接,这意味着那些长度不定的内容,诸如php等动态页面内容、SSI页面、以及服务器端生成的目录列表等内容一般来说将无法使用与HTTP/1.0客户端建立的持久连接。而对于HTTP/1.1的客户端来说,如果没有进行特殊指定,持久连接将是默认的连接方式。如果客户端请求的是未知长度的内容时将使用分块编码的方式进行传输,也就是大家在http头中看到的chunked。
由于http协议基于tcp协议,当然http协议也需要tcp的3次握手的过程,而对于一个完整的HTTP/1.0的请求和响应它有以下的一个请求过程
建立tcp连接 (syn; ack, syn2; ack2; 三个分组握手完成)
请求
响应
关闭连接 (fin; ack; fin2; ack2 四个分组关闭连接)
而对于一个完整的HTTP/1.1的请求和响应:
建立tcp连接 (syn; ack, syn2; ack2; 三个分组握手完成)
请求
响应


请求
响应
关闭连接 (fin; ack; fin2; ack2 四个分组关闭连接)
如果请求和响应都只有一个分组,那么HTTP/1.0至少要传输11个分组,才拿到一个分组的数据。而Keep-Alive可以更充分的利用这个已经建立的连接,避免的频繁的建立和关闭连接,减少网络拥塞。虽然Keep-Alive可以节约分组,提升响应速度,但是一旦超出某个平衡点,由于为了保持过多的连接,创建了太多的进程,导致系统不堪重负,系统响应变慢,而对于HTTP/1.0来说可以充分利用浏览器默认最大并发连接数比HTTP/1.1多的好处,实现不增加新域名的开销而更高的并行下载,减少域名解释的开销(注:IE6,7在HTTP/1.0中默认最大并发连接数为4,在HTTP/1.1中默认最大并发连接数为2,IE8都为6,Firefox2在HTTP/1.0中默认最大并发连接数为2 在HTTP/1.1中默认最大并发连接数为8,firefox3默认都是6),根据10年7月Google索引的42亿个网页的统计报告,每张网页里包含29.39个图片,7.09个外部脚本,3.22个外部CSS样式表,如果设置了Keep-Alive并且合理控制Keep-AliveTimeOut这个参数可以大量的节约连接的开销,提高相应速度。如果设置不好,在大并发的情况小,因维持大量连接而使服务器资源耗尽,而对于目前国内大部分的用户使用的还是IE6,7的情况下关闭Keep-Alive可以充分利用浏览器默认最大并发连接数的好处实现不增加额外的开销页面快速的展示。

 

RequestHeaders 

GET / HTTP/1.1

Host:www.taobao.com

User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.17) Gecko/20110420Firefox/3.6.17

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Encoding:gzip,deflate

Accept-Language:en-us,en;q=0.5

Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.

Keep-Alive:115
Connection: keep-alive

 

ResponseHeader
HTTP/1.1 200 OK

Server: nginx

Date: Thu, 12May 2011 11:02:36 GMT

Content-Type:text/html; charset=GB2312

Transfer-Encoding:chunked

Connection:keep-alive

Vary:Accept-Encoding

Expires: Thu,12 May 2011 12:02:36 GMT

Cache-Control:max-age=3600

Content-Encoding:gzip

 

在HTTP1.0官方协议中并没有对keepalive的明确支持,所有的HTTP请求是如下流程:
1.client 发起一个请求;
2.server收到请求后,回复一个响应;
3.连接关闭。

如果要在HTTP1.0中支持keep alive,你必须明确的在header中加入Connection:keep-alive。
1.client 发起一个包含Connection:keep-alive的请求
2.server收到请求后,如果server支持keepalive,回复一个包含Connection:keep-alive的响应,不关闭连接,否则回复一个包含Connection:close的响应,关闭连接。
3.如果client收到包含Connection:keep-alive的响应,向同一个连接发送下一个请求,直到一方主动关闭连接。

因为keepalive在很多情况下能够重用连接,减少资源消耗,缩短响应时间。所以在HTTP1.1中缺省就是支持keepalive的,如果响应方不 支持keepalive,需要明确的标识Connection:close,Connection:keep-alive就没什么意义了。

我们再说一下Keep-Alive:115,这个在mozilla的浏览器的请求头中经常出现,是指timeout时间,浏览器将在这个时间后关闭连接。其意义在于服务端可以选择不主动关闭连接而是等待客户端来关闭。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: POSIX Socket 官方文档是一份详细说明 POSIX 标准中 socket 编程接口的官方文档。POSIX(可移植操作系统接口)是一组操作系统 API 的标准化接口,它定义了在不同操作系统上编写可移植软件所需的最小接口集。 该文档涵盖了 socket 编程的各个方面,包括如何创建、绑定、监听和连接 socket,以及如何发送和接收数据。它还包括对 socket 参数和返回值的详细解释,以及与 socket 相关的错误处理。 POSIX Socket 官方文档提供了清晰的函数和结构定义,以及示例代码,有助于开发人员理解和使用这些接口。它还描述了不同类型的 socket,如 TCP、UDP 和 UNIX domain socket,以及与它们关联的属性和操作。 文档还介绍了 socket 通信中的一些高级概念,如多路复用(multiplexing),包括使用 select()、poll() 或 epoll() 函数来处理多个 socket 的 I/O 事件。此外,它还引入了一些可选的扩展功能,如SO_REUSEADDR 和 SO_KEEPALIVE。 通过遵循 POSIX Socket 官方文档提供的规范和示例,开发人员能够实现跨平台的网络应用程序,并在不同的操作系统上实现相同的功能。文档的透明度和准确性使得开发人员能够更有效地使用这些接口,并识别和解决可能出现的问题。 总之,POSIX Socket 官方文档是一个必备的参考资源,帮助开发人员使用标准化的接口进行 socket 编程,从而实现高效、稳定和可移植的网络应用程序。 ### 回答2: POSIX Socket 官方文档是用于了解和使用 POSIX Socket 编程接口的权威参考资料。它提供了有关如何在网络应用程序中使用 Socket 进行通信的详细说明和指导。 这个官方文档涵盖了各种网络协议(如 TCP、UDP 等)和 Socket 类型(如流式套接字、数据报套接字等)的使用方法。它详细介绍了套接字的创建、绑定、监听、连接、接收和发送等基本操作。 文档还提供了许多示例代码和代码片段,以帮助读者更好地理解和使用 Socket 接口。这些示例涵盖了各种常见的网络通信场景,如客户端-服务器通信、多客户端服务、并发通信等。 官方文档还包含了一些高级主题,如网络编程中的错误处理、超时设置、地址重用等。这些主题对于开发高效可靠的网络应用程序非常重要。 使用这个官方文档,开发者可以系统地学习和掌握 Socket 编程接口,从而能够开发出稳定、高效和可扩展的网络应用程序。同时,这个文档也作为开发者的参考手册,供他们在实际开发过程中解决问题和查询接口的使用方式。 总之,POSIX Socket 官方文档对于理解和掌握 Socket 编程接口是非常有价值的。它提供了详细说明、示例代码和高级主题,帮助开发者学习和使用 Socket 接口,开发出高效稳定的网络应用程序。 ### 回答3: POSIX Socket官方文档是一个关于POSIX标准网络编程接口的官方文档资源。它提供了关于如何使用POSIX Socket API在网络通信中进行数据传输的详细说明和指导。在这个文档中,用户可以找到关于套接字的创建、绑定、监听、连接、数据传输等方面的详细解释和代码示例。 在POSIX Socket官方文档中,用户可以了解到套接字类型的区别和如何选择适当的套接字类型,例如流式套接字、数据报套接字和原始套接字等。文档还介绍了如何通过套接字设置和获取选项,如超时、缓冲区大小和多播等。此外,还提供了一些有关异常处理和错误处理的建议,以及如何处理多个并发连接的技巧。 在这个文档中,用户还会发现一些高级主题,比如多线程、非阻塞I/O和事件驱动编程等。这些主题可以帮助用户更好地理解和应用POSIX Socket API在实际的网络编程场景中。文档还包含了一些关于安全性和性能优化的指导,以及一些关于多平台兼容性和可移植性的建议。 总之,POSIX Socket官方文档是一个宝贵的资源,任何对于网络编程有兴趣的开发者都可以通过阅读该文档来学习和掌握POSIX标准网络编程接口的使用方法和技巧,从而能够更好地开发可靠和高效的网络应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值