码迷,mamicode.com
首页 > Web开发 > 详细

http连接优化

时间:2015-07-08 13:00:03      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:http

http连接的性能优化
  1. 并行连接(可以同时和多台服务器建立HTTP连接)
  2. 持久连接
  3. 管道化连接
  4. 复用的连接

并行连接
优点:
并行连接可以在带宽资源充足的情况下同时建立多个HTTP连接,加快页面的加载速度。

缺点:
并行连接在带宽资源不足的情况下会是连接竞争资源,效率反而下降。同时建立多条连接会消耗大量内存,对服务器来说,大量的用户产生大量的连接可能会超过服务器的处理能力,所以服务器一般能够关闭来自特定客户端的超量连接!


持久连接(Keep-Alive/persistent)

优点:
重用已对目标服务器打开的空闲持久连接就可以避免缓慢的连接建立阶段。同时,已经打开的连接还可以避免慢启动的拥塞适应阶段,以便更快的进行数据传输。

现在的web应用程序都是并行连接+持久连接的形式。


管道化连接:
可以允许在持久连接上可选的使用请求管道。相当于流水线的功能。在相应到达之前,可以将多条请求放入队列。

管道化连接的几条限制:
  1. 如果连接不是持久的,就不应该使用管道
  2. 必须按照与请求相同的顺序回送http响应。http报文中没有序列号标签,因此如果收到的响应失序了,那么就没办法将其与请求匹配起来了。
  3. http客户端必须做好连接会在任意时刻关闭的准备,还要准备重发所有未完成的管道化请求。
  4. http客户端不应该用管道化的方式发送会产生副作用的请求(POST请求)。比如POST是要买一本书,再执行一次就又买了一本书,显然是不能执行的。

http连接的关闭
http的通信是建立在TCP连接之上的,所以http连接的关闭其实就是TCP连接的关闭。连接关闭分为完全关闭和半关闭,close会同时关闭输入和输出信道,shutdown只会单独关闭输入或者输出信道。

TCP关闭及重制错误
当一端关闭了输出信道,另一端的对等实体会在从其缓冲区中读出数据之后收到FIN(说明流结束了),同时该对等实体会向用用程序传送一个文件结束符,这样它就知道你将连接关闭了。此时对端实体的应用程序会发送一个FIN,最后就是TCP连接完全断开。
关闭输入信道比较危险,除非你知道另一端不打算再发送其他数据了。如果另一端向你已关闭的输入信道发送数据,操作系统就会向另一端的机器回送一条TCP“连接被对端重置”的报文。(重置报文会被当做很严重的错误来处理,直接删除对端还未读取的所有缓存数据,使应用程序产生错误)
技术分享
主动关闭的一方在为对方的FIN发送ACK之后进入TIME_WAIT状态。
TIME_WAIT也称为2MSL等待状态。每个具体的TCP实现必须选择一个报文段最大生成时间MSL,它是任何报文段被丢弃前在网络内的最长时间,我们知道这个时间时有限的,因为TCP报文是以IP数据包在网络内传输,而IP数据包则有限制其生存时间的TTL字段

为什么要设置为2MSL呢?因为这样可以再次发送最后的ACK避免ACK丢失。这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户端ip和端口,服务端ip和端口)不能被使用,这个连接只能在2MSL等待结束后才能再次使用。
在连接处于2MSL等待时,任何迟到的报文段将被丢弃。因为处于2MSL等待的、由该插 口对(socket pair) 定义的连接在这段时间内不能被再用。

FIN-WAIT_2状态:
FIN-WAIT_2状态表示本端已经发送FIN同时接收到对端的ACK,等待对端发送FIN。但是如果对端一直不发送FIN,那么状态是不是会一直持续下去呢?不会的,如果执行主动关闭的应用程序想执行全关闭,那么会设置一个定时器,如果时间超过10分75秒,TCP进去CLOSED状态。


正常关闭:
总之,实现正常关闭的应用程序首先应该关闭他们的输出信道,然后等待连接另一端的对等实体关闭它的输出信道,当两端都告诉对方他们不再发送任何数据之后,连接会被完全关闭,而不会有重置的危险。
但是无法确保对等实体实现半关闭。因此想要正常的关闭连接的应用程序应该先半关闭输出信道,然后周期性的检查其输入信道的状态(查找数据,或流的结尾),如收到数据结尾标记,可以结束该连接。如果在一定的时间区间内没有关闭输入信道,应用程序可以强制关闭连接,以节省资源(内存和socket)


长连接
长连接的数据传输完成识别
使用长连接之后,客户端、服务端怎么知道本次传输结束呢?分为两种:
判断传输数据是否达到了Content-Length只是的大小
动态生成的文件没有Content-Length,它是分块传输(chunked),分块传输的数据最后会有一个空的chunked块,表示本次传输的结束。更多请参考HTTP Keep-Alive模式
长连接的过期时间
客户端的长连接不可能无限期的拿着,由以下几种关闭长连接的方式:
  1. 服务器会告诉客户端超时时间,在响应头部中Keep-Alive中指明timeout时间或者max最大事务数
  2. 客户端或者服务端断开连接(关闭或者下线),主动发起四次握手


参考资料:
1.《http权威指南》
2.  http://www.cnblogs.com/cswuyg/p/3653263.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

http连接优化

标签:http

原文地址:http://blog.csdn.net/td901105td/article/details/46800907

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!