请教大神:Connection:close和Connection:keeo 金牌月嫂avavalivee有什么区别

IT-网络安全(10)
看到有人问Connection: close和Connection: keep-alive有什么区别?想起以前学习到的一篇文章,今天转载来,大家看看,我也再温故知新下。如果有问题补充的在下面可以扩充下。等忙完了,我也再补充些。
一、问题现象: 一个JSP页面,居然要耗时40多秒。网页中有大量的图片的CSS
问题解决: 原因也找了半天,原来Apache配置里面,把Keep-Alive的开关关闭了。这个是个大问题,工程师为什么要关闭它,原来他考虑的太简单了,我们知道Apache适合处于短连接的请求,处理时间越短,并发数才能上去,原来他是这么考虑,但是没有办法,只能这样了,还是打开Keep-Alive开关吧。
当然,不是所有的情况都设置KeepAlive为On,下面的文字总结比较好:
【在使用apache的过程中,KeepAlive属性我一直保持为默认值On,其实,该属性设置为On还是Off还是要具体问题具体分析的,在生产环境中的影响还是蛮大的。
KeepAlive选项到底有什么用处?如果你用过Mysql ,应该知道Mysql的连接属性中有一个与KeepAlive 类似的Persistent Connection,即:长连接(PConnect)。该属性打开的话,可以使一次TCP连接为同一用户的多次请求服务,提高了响应速度。
比如很多网页中图片、CSS、JS、Html都在一台Server上,当用户访问其中的Html网页时,网页中的图片、Css、Js都构成了访问请求,打开KeepAlive 属性可以有效地降低TCP握手的次数(当然浏览器对同一域下同时请求的图片数有限制,一般是2 见下文章节 减少域名解释的开销),减少httpd进程数,从而降低内存的使用(假定prefork模式)。MaxKeepAliveRequests
和KeepAliveTimeOut 两个属性在KeepAlive =On时起作用,可以控制持久连接的生存时间和最大服务请求数。
不过,上面说的只是一种情形,那就是静态网页居多的情况下,并且网页中的其他请求与网页在同一台Server上。当你的应用动态程序(比如:php )居多,用户访问时由动态程序即时生成html内容,html内容中图片素材和Css、Js等比较少或者散列在其他Server上时,KeepAlive =On反而会降低Apache 的性能。为什么呢?
前面提到过,KeepAlive =On时,每次用户访问,打开一个TCP连接,Apache 都会保持该连接一段时间,以便该连接能连续为同一client服务,在KeepAliveTimeOut还没到期并且MaxKeepAliveRequests还没到阈值之前,Apache 必然要有一个httpd进程来维持该连接,httpd进程不是廉价的,他要消耗内存和CPU时间片的。假如当前Apache 每秒响应100个用户访问,KeepAliveTimeOut=5,此时httpd进程数就是100*5=500个(prefork
模式),一个httpd进程消耗5M内存的话,就是500*5M=G,夸张吧?当然,Apache 与Client只进行了100次TCP连接。如果你的内存够大,系统负载不会太高,如果你的内存小于2.5G,就会用到Swap,频繁的Swap切换会加重CPU的Load。
现在我们关掉KeepAlive ,Apache 仍然每秒响应100个用户访问,因为我们将图片、js、css等分离出去了,每次访问只有1个request,此时httpd的进程数是100*1=100个,使用内存100*5M=500M,此时Apache 与Client也是进行了100次TCP连接。性能却提升了太多。
<span style="color:#、当你的Server内存充足时,KeepAlive =On还是Off对系统性能影响不大。
<span style="color:#、当你的Server上静态网页(Html、图片、Css、Js)居多时,建议打开KeepAlive 。
<span style="color:#、当你的Server多为动态请求(因为连接数据库,对文件系统访问较多),KeepAlive 关掉,会节省一定的内存,节省的内存正好可以作为文件系统的Cache(vmstat命令中cache一列),降低I/O压力。
PS:当KeepAlive =On时,KeepAliveTimeOut的设置其实也是一个问题,设置的过短,会导致Apache 频繁建立连接,给Cpu造成压力,设置的过长,系统中就会堆积无用的Http连接,消耗掉大量内存,具体设置多少,可以进行不断的调节,因你的网站浏览和服务器配置 而异。
三、减少域名解释的开销
对于HTTP/1.0来说可以充分利用浏览器默认最大并发连接数比HTTP/1.1多的好 处,实现不增加新域名的开销而更高的并行下载,减少域名解释的开销(注:IE 6,7在HTTP/1.0中默认最大并发连接数为4,在HTTP/1.1中默认最大并发连接数为2,IE8都为6,Firefox2在HTTP/1.0中 默认最大并发连接数为2 在HTTP/1.1中默认最大并发连接数为8,firefox 3默认都是6),根据10年7月Google索引的42亿个网页的统计报告,每张网页里包含29.39个图片,7.09个外部脚本,3.22个外部CSS
样式表,如果设置了Keep-Alive并且合理控制Keep-Alive TimeOut这个参数可以大量的节约连接的开销,提高相应速度。如果设置不好,在大并发的情况小,因维持大量连接而使服务器资源耗尽,而对于目前国内大 部分的用户使用的还是IE6,7的情况下关闭Keep-Alive可以充分利用浏览器默认最大并发连接数的好处实现不增加额外的开销页面快速的展示。
&&&&&& 有的网站会在服务器运行一段时间后down掉,有很多原因可能造成这种现象:比如tomcat堆和非堆内存设置不足,程序没能释放内存空间造成内存溢出,或者某些进程一直运行没能释放,造成cup资源大量消耗。
&&&&& 但除了程序本身的原因,还有可能是客服端访问造成(当然这个客户端也包含如蜘蛛软件等搜索引擎),如果服务器和客户端建立的是长链接(可以用&netstat -a&命令查看网络访问信息),这就需要对http响应头的connection做一定的设置。
&&&&& 介绍如下:
1. 解释一下:
&&& 在http1.1中request和reponse header中都有可能出现一个connection头字段,此header的含义是当client和server通信时对于长链接如何进行处理。
&&& 在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的&#20540;为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的&#20540;为close.
&&& 不论request还是response的header中包含了&#20540;为close的connection,都表明当前正在使用的tcp链接在请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。 HTTP Connection的 close设置允许客户端或服务器中任何一方关闭底层的连接双方都会要求在处理请求后关闭它们的TCP连接。
2.如何在程序中设置:
&&& 可以在过滤器中加入:response.setHeader(&connection&, &close&);
与之相关:解决服务器产生大量close_wait问题
要解决这个问题的可以修改系统的参数(/etc/sysctl.conf文件),系统默认超时时间的是7200秒,也就是2小时。
默认如下:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效
sysctl -w net.ipv4.tcp_keepalive_time=30
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2
经过这个修改后,服务器会在短时间里回收没有关闭的tcp连接。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:304312次
积分:3691
积分:3691
排名:第8709名
原创:22篇
转载:426篇
评论:30条
(6)(31)(27)(19)(39)(17)(29)(16)(12)(40)(16)(5)(23)(10)(4)(32)(8)(1)(7)(9)(24)(2)(13)(9)(13)(37)扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
vHTTP/1.1 200 OK Connection: close Date: Mon这是啥意思了, 我得链接上有 ,这 玩意,
扫二维码下载作业帮
2亿+学生的选择
你的什么连接上有?这是一个http的头信息,你的浏览器在请求网页的时候都会发这么一个http头给服务器告诉服务器用的是什么协议,要请求什么文件,用的浏览器是什么,服务器响应完毕后是否关闭连接,表单提交的数据,还有cookie等信息
为您推荐:
其他类似问题
扫描下载二维码HTTP实现长连接
HTTP是无状态的&也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话
HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。
如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽。
实现长连接要客户端和服务端都支持长连接。
如果web服务器端看到这里的值为&Keep-Alive&,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。要实现这一点,&web服务器需要在返回给客户端HTTP头信息中发送一个Content-Length(返回信息正文的长度)头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然&后在正式写出内容之前计算它的大小
无论客户端浏览器 (Internet Explorer) 还是 Web 服务器具有较低的 KeepAlive 值,它都将是限制因素。例如,如果客户端的超时值是两分钟,而 Web 服务器的超时值是一分钟,则最大超时值是一分钟。客户端或服务器都可以是限制因素
在header中加入 --Connection:keep-alive&在HTTp协议请求和响应中加入这条就能维持长连接。&再封装HTTP消息数据体的消息应用就显的非常简单易用
Http Keep-Alive&seems to be massively misunderstood. Here's a short description of how it works, under both&1.0&and 1.1
Under&HTTP 1.0, there is no official specification for how keepalive operates. It was, in essence, tacked on to an existing protocol. If the browser supports&keep-alive, it adds an additional header to the request:
Connection:&Keep-Alive
Then, when the server receives this request and generates a response, it also adds a header to the response:
Connection:&Keep-Alive
Following this, the&connection&is NOT dropped, but is instead kept open. When the client sends another request, it uses the same&connection. This will continue until either the client or the server decides that the conversation is over, and one of them drops the&connection.
Under&HTTP&1.1, the official keepalive method is different.&All&connections are kept alive, unless stated otherwise with the following header:
Connection: close
The&Connection:&Keep-Alive&header no longer has any meaning because of this.
Additionally, an optional&Keep-Alive: header is described, but is so underspecified as to be meaningless. Avoid it.
Not reliable
HTTP&is a stateless protocol - this means that every request is independent of every other.&Keep alive&doesn&t change that. Additionally, there is no guarantee that the client or the server will keep the&connection&open. Even in 1.1, all that is promised is that you will probably get a notice that theconnection&is being closed. So keepalive is something you should not write your application to rely upon.
KeepAlive and POST
The&HTTP&1.1 spec states that following the body of a POST, there are to be no additional characters. It also states that "certain" browsers may not follow this spec, putting a CRLF after the body of the POST. Mmm-hmm. As near as I can tell, most browsers follow a POSTed body with a CRLF. There are two ways of dealing with this: Disallow keepalive in the context of a POST request, or ignore CRLF on a line by itself. Most servers deal with this in the latter way, but there's no way to know how a server will handle it without testing.
client用apache的commons-httpclient来执行method 。&用 method.setRequestHeader("Connection" , "Keep-Alive" or "close") 来控制是否保持连接。
常用的apache、resin、tomcat等都有相关的配置是否支持keep-alive。
tomcat中可以设置: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 asHTTP/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.
所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,&&&所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接,一般银行都使用短连接
长连接就是指在基于tcp的通讯中,一直保持连接,不管当前是否发送或者接收数据。&&&而短连接就是只有在有数据传输的时候才进行连接,客户-服务器通信/传输数据完毕就关闭连接。
长连接和短连接这个概念好像只有移动的CMPP协议中提到了,其他的地方没有看到过。&&&通信方式&&&各网元之间共有两种连接方式:长连接和短连接。所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接。短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,即每次TCP连接只完成一对 CMPP消息的发送。&&&现阶段,要求ISMG之间必须采用长连接的通信方式,建议SP与ISMG之间采用长连接的通信方式。
短连接:比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。&&&长连接:有些服务需要长时间连接到服务器,比如CMPP,一般需要自己做在线维持。
最近在看&&,在B/S结构中,通过某种magic使得客户端不需要通过轮询即可以得到服务端的最新信息(比如股票价格),这样可以节省大量的带宽。
&&&& 传统的轮询技术对服务器的压力很大,并且造成带宽的极大浪费。如果改用ajax轮询,可以降低带宽的负荷(因为服务器返回的不是完整页面),但是对服务器的压力并不会有明显的减少。
&&& 而推技术(push)可以改善这种情况。但因为HTTP连接的特性(短暂,必须由客户端发起),使得推技术的实现比较困难,常见的做法是通过延长http连接的寿命,来实现push。
&&& 接下来自然该讨论如何延长http连接的寿命,最简单的自然是死循环法:
&&& 【servlet代码片段】
&&&& public void doGet(Request req, Response res) {
&&&&&&&&& PrintWriter out = res.getWriter();
&&&&&&&&& &&
&&&&&&&&& 正常输出页面
&&&&&&&&& &&
&&&&&&&&& out.flush();
&&&&&&&&& while (true) {
&&&&&&&&&&&&&&& out.print("输出更新的内容");
&&&&&&&&&&&&&&& out.flush();
&&&&&&&&&&&&&&& Thread.sleep(3000);
&&&&&&&&& }
&&&& 如果使用观察者模式则可以进一步提高性能。
&&&& 但是这种做法的缺点在于客户端请求了这个servlet后,web服务器会开启一个线程执行servlet的代码,而servlet由迟迟不肯结束,造成该线程也无法被释放。于是乎,一个客户端一个线程,当客户端数量增加时,服务器依然会承受很大的负担。
&&&& 要从根本上改变这个现象比较复杂,目前的趋势是从web服务器内部入手,用(JDK 1.4提出的java.nio包)改写request/response的实现,再利用线程池增强服务器的资源利用率,从而解决这个问题,目前支持这一非J2EE官方技术的服务器有和(后者只是听说,没有用过)。
&&&& 目前也有一些框架/工具可以帮助你实现推功能,比如pushlets。不过没有深入研究。
&&&& 这两天准备学习一下Glassfish中对Comet(彗星:某人给服务器推送技术起的名字)的支持,呵呵。
/lidabo/p/4585900.html
Views(...) Comments()新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
白手起家, 积分 18, 距离下一级还需 182 积分
论坛徽章:0
各位大侠,小弟遇到一个棘手的问题需要解决,希望各位不惜笔墨指点一下吧。
问题如下,我使用urllib2写了一个提取服务器网页的程序,发现即使在http header里加上connection: keep-alive,发出去的request(抓包看到的),connection被改为了close. 所以现在的程序无法抓到原来的网页了。请问这是什么问题,如何解决。我们的应用基于session的,如果connect close后面的事情无法进行了 :(
大侠们,帮帮我吧。
& && &&&self.url = url
& && &&&req = urllib2.Request(self.url)
& && &&&req.add_header(&Accept-Encoding&, &gzip, deflate&)
& && &&&req.add_header(&User-Agent&, &Mozilla/4.0 ( MSIE 5.01; Windows NT 5.0)&)
& && &&&req.add_header(&Connection&, &Keep-Alive&)
& && &&&req.add_header(&Accept&, ('image/gif, '
& && && && && && && && && && && & 'image/x-xbitmap, '
& && && && && && && && && && && & 'image/jpeg, '
& && && && && && && && && && && & 'image/pjpeg, '
& && && && && && && && && && && & 'application/x-shockwave-flash, '
& && && && && && && && && && && & 'application/vnd.ms-excel, '
& && && && && && && && && && && & 'application/vnd.ms-powerpoint,application/msword, '
& && && && && && && && && && && & '*/*'))
& && &&&req.add_header(&Accept-Language&, &en-us&)
& && &&&try:
& && && && &#handle = urllib2.urlopen(req)
& && && && &opener = urllib2.build_opener()
& && && && &myheader = opener.open(req)
抓包看到的:
GET /report/login.asp HTTP/1.1
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint,application/msword, */*
User-Agent: Mozilla/4.0 ( MSIE 5.01; Windows NT 5.0)
Connection: close
Cookie: ASPSESSIONIDQCSDDTDC=AGKBKKGCNPGHLNGGLGLPCFAB;
(Cookie:是程序后加上去的)
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
稍有积蓄, 积分 464, 距离下一级还需 36 积分
论坛徽章:0
白手起家, 积分 18, 距离下一级还需 182 积分
论坛徽章:0
翻了urllib2的代码,知道是什么原因了。Python urllib2还不支持persistence connection。
多谢指点,之前已经找到httplib2了。多谢}

我要回帖

更多关于 keep alive 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信