大家都知道在IIS中有个HTTP keep-alive设置,见下图:

很多人可能和我们一样,以为这样设置后,IIS会就在发送响应内容时加上这个http header——Connection: keep-alive,见下图:

今天在偶然的情况下突然发现——不是这样的,这是一个让人瞠目结舌的骗局——不知从哪个版本的IIS开始,只要用的是http 1.1协议,IIS坚决不发keep-alive响应头(http 1.0的情况未测试,现在主流浏览器用的都是http 1.1)。

即使你手动在IIS中添加这个响应头也无济于事,Connection: keep-alive根本就不会发给浏览器:

而只要稍改一下Connection的名称,比如把Connection改为Connection1就会在浏览器中出现:

而无论怎么改Connection的值 ,也不会在浏览器中出现。

由此可以推断,IIS在发出响应内容前强制地过滤掉了键名为Connectionhttp的http header。

所以,你没有任何办法可以让IIS输出Connection: keep-alive,除非你能修改IIS的源代码。你说霸不霸道!

微软为什么这么干呢?微软的理由真让人哭笑不得。。。

请看stackoverflow上的一个帖子IIS 7.5: Force Keep Alive header in Response

I opened a support ticket with Microsoft on this and had my worst suspicions confirmed. IIS 7.5 deliberately prevents the connection:keep-alive header from being returned in the response. Per the HTTP 1.1 RFC, all connections should assume keep alive (a departure from HTTP 1.0). Therefore, the omission of this header is the default and correct (?) behavior. When keep-alives are not desirable, IIS will send the connection:close header.

微软这么做竟然是为了遵守HTTP 1.1的标准,HTTP 1.1假设所有的连接都是keep alive的,所以不再需要keep-alive header。

看了一下HTTP 1.1的规范,也的确是这样:

HTTP/1.0, in its documented form, made no provision for persistent connections. Some HTTP/1.0 implementations, however, use a Keep-Alive header to request that a connection persist.

In recognition of their desirable properties, HTTP/1.1 makes persistent connections the default. HTTP/1.1 clients, servers, and proxies assume that a connection will be kept open after the transmission of a request and its response.

微软按标准办事,也许我们不应该有太多怨言。但是为什么不给用户提供一种选择呢——让用户可以通过设置开启keep-alive header。现在的做法给人的感觉就是两个字——霸道。

另外,我们的站点在不用负载均衡的情况下(阿里云SLB会主动加上keep-alive header),因为IIS不发keep-alive header,会造成大量的[RST,ACK]包。

这说明很多浏览器并没有严格遵守HTTP 1.1的标准(这地方有误,请看更新部分)。浏览器都不遵守,微软你这么积极干吗?该遵守标准时不遵守,不该遵守的时候却死守,而且做法还如此霸道。

Windows那么多问题都没怎么让人受伤,而IIS的一个问题就让人很受伤,还好ASP.NET vNext来了!

【更新】

大量的[RST,ACK]包与我们在IIS设置的keep-alive timeout有关(也就是Connection Time-out,在IIS中这一个设置两个地方用),我们设置的是30秒,而Chrome默认keep-alive的间隔是45秒(每隔45秒发送[TCP Keep-Alive ACK]包)。也是就说在Chrome发出keep-alive包之前,IIS由于发现该连接30秒无活动,所以就[RST, ACK]了。

而Firefox默认keep-alive的间隔是10秒。

Chrome与Firefox都不受是否有keep-alive header的影响,这次错怪IIS了。

微软IIS对http keep-alive的“霸道”处理的更多相关文章

  1. 微软IIS服务器的最佳优化工具- IIS Tuner

      dudu的 <让Windows Server 2008 + IIS 7+ ASP.NET 支持10万个同时请求>,里面涉及到需要手工调整参数的地方.在这篇文章中,我们给你介绍一个IIS ...

  2. IIS 7.5 Application Warm-Up Module

    http://www.cnblogs.com/shanyou/archive/2010/12/21/1913199.html 有些web应用在可以处理用户访问之前,需要装载很多的数据,或做一些花费很大 ...

  3. [翻译]为什么IIS应用程序池回收时间默认被设置为1740分钟?

    作者:斯科特 福赛斯/Scott Forsyth日期:2013/04/06地址:http://weblogs.asp.net/owscott/why-is-the-iis-default-app-po ...

  4. iis 重新注册 .net 方法

    dhl:IIS注册ASP.NET 1.1.2.0.4.0_在win7下如果先安装vs2010 后安装iis7的话,必须注册iis才可以用.~~~!!鄙视微软   IIS中ASP.NET的版本号此时可选 ...

  5. IIS的Unicode漏洞攻击

    IIS有十多种常见漏洞,但利用得最多的莫过于Unicode解析错误漏洞.微软IIS 4.0/5.0在Unicode字符解码的实现中存在一个安全漏洞,用户可以远程通过IIS执行任意命令.当IIS打开文件 ...

  6. IIS 内部运行机制及Asp.Net执行过程详解

    一直以来对一个Asp.net页面穿过IIS后就返回给浏览器一个HTML页面感觉很是神奇.虽然做技术这么长时间了,也曾经大致了解过一点来龙去脉,但是如果你真的问起我比较详细的过程,我还真的回答不上来,好 ...

  7. asp.net设置默认打开页面,Web.config,defaultDocument

    The web.config file can be used to set a default document, or list of default documents for your web ...

  8. 强制浏览器使用兼容模式,Web.config,httpProtocol

    对于一些政府类的网站,很多支持IE6~8,而不支持使用更高版本浏览器浏览.虽然有些浏览器会自动使用兼容模式,或有些人会手动调整浏览器的兼容模式,但不是每一个人.每一款浏览器都可以做到用兼容模式.所以, ...

  9. 常见的web容器与应用程序服务器区别及对比

    tomcat 类型:servlet容器和HTTP web服务器 功能:实现了一些J2EE特性包括Java Servlet.JSP页面.Java EL和websocket,还有纯java的http we ...

随机推荐

  1. ZipArchive之C++编译和调用

    由于要用到zip的解压,就上网下载了CZipArchive类的源码(还是2000年的),里面有个示例,稍微修改下,就能正常运行. 就高兴地把lib拿出来,放到项目中了.捣鼓了快一个下午了,死活编译不通 ...

  2. MySQL(五) MySQL中的索引详讲

    序言 之前写到MySQL对表的增删改查(查询最为重要)后,就感觉MySQL就差不多学完了,没有想继续学下去的心态了,原因可能是由于别人的影响,觉得对于MySQL来说,知道了一些复杂的查询,就够了,但是 ...

  3. 修复 XE8 FMX TGridLayout 容器自动计算宽度及高度的问题

    说明:TGridLayout 提供计算容器内控件等分的功能: 横式(Orientation=Horizontal)可将 ItemWidth = -1(小于0则自动等分) 直式(Orientation= ...

  4. igraph安装(R/Python)

    python-igraph:啥都不说了,用Ubuntu吧,虽然按照官方的流程还是会出错,但是排错会比较少,一般找不了多久就能找到解决方案 R-igraph:一般需要升级R版本,用3.3吧.升级R的方法 ...

  5. Java应用程序项目的打包与发行(run.bat形式)

    参考: http://www.iteye.com/topic/57312 背景: 以前一直都是在eclipse上面创建应用程序,每次要要运行的时候都要打开eclipse, 直到有个同事叫我帮忙写一个应 ...

  6. JqueryUI学习笔记-自动完成autocomplete

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...

  7. cocos2d-x在Android平台下的音频导致的卡死

      先挖个坑,慢慢再来填.出错信息: frameworks/wilhelm/src/android/AudioPlayer_to_android.cpp:779: pthread 0x75f14a00 ...

  8. CSS3/jQuery自己定义弹出窗体

    简单演示一下,精简了演示效果和css样式文件,更利于在项目中的实际应用 引入style.css   index.js <!DOCTYPE HTML PUBLIC "-//W3C//DT ...

  9. Struts2的零配置和rest插件

    1. 零配置使用struts2-convention-plugin-2.3.16.jar,rest使用struts2-rest-plugin-2.3.16.jar 1.1 Struts2的conven ...

  10. 十一、mysql输入安全

    .尽量使用“绑定参数”功能,php中可用pdo进行一系列操作 .php可使用mysql_real_escape_string()函数进行输入过滤: