一直不是非常理解.NET中HttpWebRequest的KeepAlive属性有何用处,看了这篇文章就清楚了!

http://www.cnblogs.com/lwzz/archive/2011/08/15/2139937.html

摘录如下:

有人也许会问,Http不是基于TCP/IP的吗?而这个是可以保持状态的。怎么Http就是无状态了的呢?搞清楚这个问题,对以后我们WCF中选择协议也有帮助。

Http是属于最高层的应用协议,基于TCP/IP,也就是说它在TCP/IP的基础上引入了新的概念和规定。因此,无状态是Http规定的,是为了适应Web的要求而规定的。Web应用经常面对大量的访问,如果都保持TCP的连接状态那么将会消耗大量的资源。就会演变成了类似“客户端/服务端”一对一模型。因此,Http规定了它是无状态的,也就是说,处理完一个请求并返回以后,服务器端就要直接关闭掉TCP连接,不管相同的客户端是否再次发送请求。以这样的形式来实现单向的Request/response模式的。

上面我说的是Http 1.0 的规定。用图来表示就是:

注意,服务端关闭连接这个动作不可少。这样才是无状态。也就是说HTTP 1.0的协议的无状态是由这4个步骤组成,缺一不可。一个连接请求就在一次处理后关闭。

看到这里如果对浏览器有些了解的人就会知道,其实这个模型并不高效。在当初网页主要是HTML文本的时候还可以,但是现在一个的网页里都包含了非常多的诸如img,javascript,css等元素,这使得浏览器在解析由服务器发回的HTML网页以后,如果解析HTML时发现了上面这些元素的标签,那么还要多次的发起连接请求。而每次建立连接请求都需要三次握手,比较耗资源。因此,HTTP 1.0对于现在的网页来说并不很适合。
浏览器生成一个完整的页面,一共发送了N+1条请求。1就是指返回的HTML网页字符串,N是其中包含的资源,由浏览器解析HTML标签后发出。

如图:

这个问题应该怎么解决呢?要是能够在一条已建立的连接上,多处理几次资源请求就好了。也就是连接能够复用,更直接了当的说就是当服务器处理完一条资源请求时,不要像1.0那样马上关闭连接,而是等一段时间。

持久连接

在1.0+(1.0的各种修正版本)以及1.1中,允许HTTP设备在事务处理结束以后仍然将TCP保持在打开的状态,以便为未来的HTTP请求重用现存的连接。在事务处理结束以后仍然保持打开的连接我们就叫做“持久连接”,持久连接在1.0+和1.1中是通过不同方式确定的:

  • HTTP 1.0中通过首部插入keep-alive信息表明是持久连接
  • HTTP 1.1中默认是持久连接

下面来介绍一下这两种方式

1.keep-alive

客户端 :实现HTTP/1.0 keep-alive连接的客户端可以通过包含connection:Keep-Alive首部请求将一条连接保持在打开状态。

服务器端:如果服务器端愿意将一条连接保持在打开状态,那么就在响应头部中同样插入connection:Keep-Alive ,否则表达的意思就是我响应你这条信息后我就要把TCP连接给关闭掉。

HTTP 1.0 中keep-alive不是默认采用的,也就是说如果你不主动的往头部加入这个信息,那么就意味着是一次HTTP请求就会打开关闭一次TCP连接。客户端通过检查服务器端的响应有没有connection:Keep-Alive,就可以知道服务器发出响应以后是否会关闭连接了。

2.和keep-alive正好相反,在HTTP1.1中持久连接默认是激活的,除非你发送了Connection:close表明可以关闭连接。HTTP1.1客户端假定在收到响应之后,除非响应中包含了Conncetion:close,否则HTTP/1.1的连接就仍然维持在打开的状态。
因此,这时服务器对于关闭TCP连接就会采用两种方式,一种是当收到浏览器发送的关闭连接请求后关闭该TCP请求(意味着浏览器已经把该网页所需的请求资源已经拿完了,无需再从这条连接里获取其他资源),另一种就是当经过一段时间后,就算浏览器没有发送关闭连接的请求,服务端也会因为超时而自动关闭该条TCP连接。

因此我们知道为什么我们的HTTP请求中还包含了HTTP的版本信息,因为这会影响到双发对于关闭请求的理解。

当然HTTP 1.1除了这条改进之外,还增加了诸如PUT,DELETE等动作。在接下来讲REST的文章的时候会讲到。

HttpWebRequest中的KeepAlive的更多相关文章

  1. 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    通用辅助类  下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需 要获取认证信息(如Cookie),所以返回的是HttpWeb ...

  2. SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成,浏览器中的Keep-Alive

    http://www.cnblogs.com/OpenCoder/p/5089258.html     IE中Keep-Alive机制引起的错误 我们知道Http协议是基于TCP/IP连接的,也就是说 ...

  3. TCP连接探测中的Keepalive和心跳包

    TCP连接探测中的Keepalive和心跳包 tcp keepalive 心跳 保活 Linuxtcp心跳keepalive保活1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 ...

  4. (转) 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    转自:http://blog.csdn.net/zhoufoxcn/article/details/6404236 通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中 ...

  5. 【转】在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求

    http://zhoufoxcn.blog.51cto.com/792419/561934 这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全 ...

  6. TCP连接探测中的Keepalive 和心跳包

    采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是 ...

  7. 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求【转载】

    标签:C# HTTPS HttpWebRequest HTTP HttpWebResponse 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...

  8. http中的KeepAlive

    为什么要使用KeepAlive? 终极的原因就是需要加快客户端和服务端的访问请求速度.KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的.当客户端发送一次请求,收到相应以后,第二 ...

  9. C#中用HttpWebRequest中发送GET/HTTP/HTTPS请求 (转载)

    这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全部采用手工操作工作量大而且繁琐,因此周公决定利用C#来实现.在很多地方都需要验证用户身份才可 ...

随机推荐

  1. [React Native] Build a Separator UI component

    In this lesson we'll create a reusable React Native separator component which manages it's own style ...

  2. [008]new、delete及动态内存分配

    1.new和delete都会用,这里只声明一点: C++ 没有明确定义如何释放指向不是用 new 分配的内存地址的指针. 比如下面的代码: #include<iostream> using ...

  3. Java自学成长路线(转载)

    JAVA自学之路 一:学会选择  决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等.  JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅 ...

  4. C#_delegate - 用委托实现事件,Display和Log类都使用Clock对象

    //public event SecondChangeHandler OnSecondChange; 若将委托加上event,则视作是事件,不是委托,外围就不能直接对OnSecondChange传值 ...

  5. Making Use of Forms and Fieldsets

    Making Use of Forms and Fieldsets So far all we have done is read data from the database. In a real- ...

  6. Android(java)学习笔记122:TabActivity使用

    1.首先我们要知道TabActivity是结合TabHost使用的,于是我们自然而然要说明一下TabHost 所谓的TabHost是提供选项卡(Tab页)的窗口视图容器. 此对象包含两个子对象: 一个 ...

  7. 关于SWT中的GridLayout布局方式

    GridLayout 布局的功能非常强大,也是笔者常用的一种布局方式.GridLayout是网格式布局,它把父组件分成一个表格,默认情况下每个子组件占据一个单元格的空间,每个子组件按添加到父组件的顺序 ...

  8. 210 - Concurrency Simulator(WF1991, deque, 模拟)

    题目有点长,理解题花了不少时间 粘下别人的翻译~ 你的任务是模拟n个程序(按输入顺序编号为1~n)的并行执行.每个程序包含不超过25条语句,格式一共有5种: var=constant(赋值): pri ...

  9. android的平台架构及特性

    Android平台采用了整合的策略思想,包括底层Linux操作系统.中间层的中间件和上层的Java应用程序.下面我把Android的特性及其架构体系结构总结一下. 一.Android的平台特性 And ...

  10. 在orangepi-PC下使用pyopengl

    在OrangePi-PC下安装显卡驱动以及opengl: http://www.orangepi.org/orangepibbsen/forum.php?mod=viewthread&tid= ...