HttpWebRequest中的KeepAlive
一直不是非常理解.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的更多相关文章
- 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中发送GET/HTTP/HTTPS请求,因为有的时候需 要获取认证信息(如Cookie),所以返回的是HttpWeb ...
- SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成,浏览器中的Keep-Alive
http://www.cnblogs.com/OpenCoder/p/5089258.html IE中Keep-Alive机制引起的错误 我们知道Http协议是基于TCP/IP连接的,也就是说 ...
- TCP连接探测中的Keepalive和心跳包
TCP连接探测中的Keepalive和心跳包 tcp keepalive 心跳 保活 Linuxtcp心跳keepalive保活1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 ...
- (转) 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
转自:http://blog.csdn.net/zhoufoxcn/article/details/6404236 通用辅助类 下面是我编写的一个辅助类,在这个类中采用了HttpWebRequest中 ...
- 【转】在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求
http://zhoufoxcn.blog.51cto.com/792419/561934 这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全 ...
- TCP连接探测中的Keepalive 和心跳包
采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是 ...
- 在C#用HttpWebRequest中发送GET/HTTP/HTTPS请求【转载】
标签:C# HTTPS HttpWebRequest HTTP HttpWebResponse 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. ...
- http中的KeepAlive
为什么要使用KeepAlive? 终极的原因就是需要加快客户端和服务端的访问请求速度.KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的.当客户端发送一次请求,收到相应以后,第二 ...
- C#中用HttpWebRequest中发送GET/HTTP/HTTPS请求 (转载)
这个需求来自于我最近练手的一个项目,在项目中我需要将一些自己发表的和收藏整理的网文集中到一个地方存放,如果全部采用手工操作工作量大而且繁琐,因此周公决定利用C#来实现.在很多地方都需要验证用户身份才可 ...
随机推荐
- WCF之初体验
什么是WCF? WCF的全称是:Windows通信基础(WindowsCommunication Foundation).本质来讲,他是一套软件开发包. WCF和WebService的差别 Webse ...
- POJ 3104 Drying 二分
http://poj.org/problem?id=3104 题目大意: 有n件衣服,每件有ai的水,自然风干每分钟少1,而烘干每分钟少k.求所有弄干的最短时间. 思路: 注意烘干时候没有自然风干. ...
- 微信公众平台java开发详解(工程代码+解析)
原文:http://blog.csdn.net/pamchen/article/details/38718947 说明:本次的教程主要是对微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初 ...
- Android界面刷新
Android的invalidate与postInvalidate都是用来刷新界面的,用法区别在于: 1)invalidate():实例化一个Handler对象,并重写handleMessage方法调 ...
- 西门子PLC两线制,四线制
1 一.对于控制系统模块:两线制,四线制信号都只有两根线接入模件,区别在于: 两线制信号的这两根线一正一负,不带提供信号电流,而且提供供电电压:一般流量,压力,液位等等的信号常用两线制信号,但也要根据 ...
- OC中-数组是如何遍历的?
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool ...
- android 下载instagram动态中图片的demo
最近迷上了刷instagram,里面的很多照片都特别喜欢,于是就想分享到朋友圈或者微博,奈何墙外不知墙内苦啊.于是只能想办法将它们保存到本地,既可以做壁纸也能分享给别人. 我发现每条ins的动态在ap ...
- Disruptor框架
http://developer.51cto.com/art/201306/399370.htm
- GitHub帮助文档翻译1——helloWorld
工欲善其事必先利其器 ,都不知道 GitHub到底是什么,还怎么玩?因为总是会读了第一句就忘了下一句,形成不了感觉,所以希望把读GitHub的帮助文档都翻译出来,总是看大段大段的东西,谁都会懵圈的.希 ...
- Python 基础【第八篇】变量
1.变量定义: 给数据进行命名,数据的名字就叫做变量 2.变量格式: [变量名] = [值] 注:变量名命名需要满足下面两条准则 准则一:标示符开头不能为数字.不能包含空格.特殊字符准则二:标示符不能 ...