`
小青缨
  • 浏览: 9357 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

http线程

 
阅读更多

1、什么是http线程

 

一般情况下,http请求都是很有顺序的发出去的,只有当前这个请求的响应被完全接收到才会发生下一个请求。由于网络延迟和带宽的限制,下一个请求被服务器接收到之前会产生一个显著的延迟。

 

HTTP/1.1让多个http请求写在一个socket而不用去等待对应的响应,然后请求发送方等待响应按照发出去请求的顺序返回来。这样在发很多请求的时候在页面加载时间方面会有很显著的改善,尤其是有一些高延迟的连接。

 

线程同样可以减少tcp/ip数据包的数量,一个典型的在536至1460 bytes范围内的MSS(最大字段的大小),它可以装好几个http请求到一个tcp/ip数据包里。减少页面加载需要的数据包的数量对整个网络都是有利的,更少的数据包自然能减轻ip路由器和网络的负担。

 

符合HTTP/1.1的服务器需要支持线程,这并不意味着服务器一定要用pipeline的方式回应,但是他们必须保证当一个客户端选择用pipeline请求时,服务器不会出错。这显然会引入一个新的潜在的非致命性的bug,因为没有大众的浏览器支持线程。

 

2、什么时候应该用线程请求

 

只有idempotent可以用线程,例如get和head请求,put和post请求不能用线程,第一次连接也不能用线程,因为不能确定服务端或者代理是否支持HTTP/1.1。因此只有在重用一个已经存在的keep-alive连接时才可以用线程。

 

3、多少个请求的时候应该用线程

 

如果这个连接过早的被关闭,将很多请求放到线程里代价是昂贵的,因为我们会浪费这些写请求的时间,在新的请求中不得不重写一遍。此外,一个比较长的线程,如果早一点的请求要很长的时间去完成, 会产生用户可以感知到的延迟。HTTP/1.1并没有明确说明一个线程中理想的请求数,但是它给了个限制,每台服务器不要有超过两条keep-alive的连接。显然,它依赖于应用程序。鉴于以上两种原因,浏览器可能不会想要太长的线程,可能是合适的值,但是仍然有待检验。

 

4、如果一个请求取消会发生什么

 

如果一个请求被取消了,那就意味着整个线程被取消吗?或者意味着这个被取消的请求的响应简单的被丢弃,以免线程中的其他请求被迫重复请求一遍?答案取决于以下几个因素:被取消的请求的响应未被接受部分的大小。一个简单的方法就是取消这个线程然后重新发送所以的请求。这个是唯一的方法因为所以的请求都是idempotent。

 

5、如果一个连接失败会发生什么

 

如果一个连接失败了或者在服务器下载一个线程响应的中途被丢弃,浏览器会重新发送丢失的请求。这种情况可以简单的处理,用和上面那种取消的情况一样的方法

 

 

原文:http://www-archive.mozilla.org/projects/netlib/http/pipelining-faq.html

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics