http的持久连接和非持久连接区别

HTTP 协议概要 非持久连接


“非持久连接”的概念
某网页由最基本的 HTML 和10个JPEG 图像构成,10个JPEG 图像文件存放在同一台服务器中。设这个网页的URL为www.server.com/somepath/index.html。如果用户请求该网页并采用“非持久连接”,那么在HTTP 客户(通常是用户浏览器)和服务器之间将发生以下操作:


1.  HTTP 客户端初始化一个与服务器主机www.server.com中的HTTP服务器的TCP 连接。服务器使用默认端口80监听来自HTTP客户的建立连接请求。

2.  HTTP客户端经由与TCP关联的本地Socket发出一个HTTP请求消息(Request)。这个消息中包含路径名/somepaht/index.html。

3.  HTTP服务器经由与TCP关联的本地Socket接收到这个请求消息,再从服务器主机的内存或者硬盘中取出文件/somepath/index.html,经由同一Socket向 HTTP客户端发送包含该文件的响应消息(Response Message)。

4.  HTTP服务器通知TCP服务层关闭这个TCP连接;TCP服务层并不立即关闭这个连接,而是在客户收到刚才那个响应消息后才会真正终止这个连接。

5.  HTTP客户端经由同一Socket接收这个响应消息(Response Message)。TCP连接随后终止。客户端所收到的消息中封装了客户端所请求的 HTML文件。客户端浏览器从中取出这个文件,加以分析后发现这个文件中还有有10个JPEG对象引用。

6.  对每个引用到的JPEG对象重复步骤1~4。



 

上述步骤之所以称为使用非持久连接,原因是每次服务器发送一个对象后相关的TCP连接就被关闭,也就是说每个连接没有持续到可以传输其他对象。每个TCP连接只能传送一个请求消息和响应消息。就上述例子,用户请求的那个Web页面就产生了11个TCP连接(1个网页请求连接和10个图象请求连接)。

 

在上述的例子中,并没有明确指出客户是依次打开10 逐一取得每个JPEG 对象,还是同时打开多个 TCP连接同时取得多个 JPEG对象。实际上,现今的浏览器允许用户通过配置来控制并行连接的程度。大多数浏览器默认可以打开5~10个并行TCP连接,每个连接处理一个请求/响应事务。如果把并行连接数设置为1,那样的话这个传送JPEG的10个连接是串行建立的。使用并行连接可以缩短响应时间。



从客户请求基本HTML文件到它收到这个文件所经历的时间为往返时间(Round Trip Time - RTT)。它是一个小分组从客户端游动到服务器在返回客户端所花费的时间。RTT包括分组传播延迟、在中间路由器和交换机上的分组排队延迟以及分组处理延迟。下面考虑用户点击某个超链接时会发生什么。用户的点击导致浏览器发起建立一个与Web服务器的TCP连接;这里涉及“三次握手”过程。首先是客户向服务器发送一个小的冗余消息,接着是服务器向客户确认并以一个小的TCP消息作为响应,最后是客户向服务器回送确认。“三次握手”过程的前两次握手结束时流逝的时间为1个RTT。此时客户把HTTP请求消息发送到TCP连接中,接着,客户将第三次握手过程最后一次的确认消息捎带在这个请求数据分组中发送出去。服务器收到来自TCP的请求消息后,把相应的HTML文件发送到TCP连接中,服务器接着把对早先收到的客户请求消息中的确认捎带数据包含在该HTML文件的数据分组中发送出去。这轮HTTP请求/响应也花费了1个RTT时间。因此,总的响应时间粗略的算是2个RTT加上服务器发送这个HTML文件的时间。




持久连接

非持久连接缺点。

缺点(一)客户得为每个待请求的对象建立并维护一个新得连接。对于每个这个的连接,TCP必须同时在客户端和服务器端分配TCP缓冲区,并维护TCP变量。对于有可能同时为来自数百个不同客户的请求提供服务的Web服务器来说,这会严重增加服务器的负担;
缺点(二)对每个对象请求都有2个RTT的响应延迟:一个RTT用于建立TCP连接,另一个RTT用于请求和接收对象;
缺点(三)每个对象都要经历 TCP 缓启动,因为每个TCP连接都要起始于slow start 阶段。并行TCP连接的使用能够部分减轻RTT延迟和缓启动的影响。

在持久连接情况下,服务器在发出响应后保持TCP连接继续打开着。同一客户/服务器之间的后续请求和响应可以通过这个连接传递。整个Web页面上,比如 1个基本HTML和10个JPEG对象的页面,可以通过单个的持久TCP连接发送。甚至存放在同一个服务器中的多个Web页面也可以通过单个持久TCP连接发送。通常,HTTP服务器在某个连接闲置了一段时间后就关闭它,而这段时间通常是可以配置的。持久连接分为不带流水线(without pipeline)和带流水线(with pipeline)两个版本。如果是步带流水线的版本,那么客户只能在接收到前一个请求的响应后才会发送新的请求。这种情况下,Web页面所引用的每个对象(上例中的10个JPEG图像)都经历1个RTT延迟用于请求和接收该对象。于非持久连接中每个对象需要2个RTT相比,不带流水线的持久连接已经有所改善。不过,带流水线的持久连接还能进一步降低响应延迟。不带流水线版本的另一个缺点是,服务器送出一个对象后开始等待下一个请求,而这个新的请求却不能马上到达。这段时间服务器资源便闲置了。

HTTP/1.1的默认模式是使用带流水线的持久连接。这种情况下,HTTP客户每遇到一个对象引用就立即发出一个请求,因而HTTP客户可以一个接一个连续发出各个引用对象的请求。服务器收到这些请求后,也可以一个接一个连续发送各个对象。如果所有的请求和响应都连续发送的,那么所有引用到的对象供给经历1个RTT延迟,而不是像不带流水线版本那样,每个引用都必须有1个RTT延迟。另外,带流水线的持久连接中服务器空等待时间比较少。与非持久连接相比,持久连接,无论是否带流水线降低了1个RTT延迟外,缓启动延迟也比较小。其原因在于既然各个对象都使用同一个TCP连接,服务器发送第一个对象后就不必再以一开始的缓慢速率发送后续对象了。相反,服务器可以按照第一个对象发送完毕后的速率发送下一个对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值