Web架构“圣经”-------HTTP权威指南--2

来源:互联网 发布:网络直播培训机构 编辑:程序博客网 时间:2024/05/29 16:30

四,连接管理

1TCP/IP是全球计算机网络计算机网络都在使用的一种分组交换网络分层协议集,一旦连接建立起来,在客户端和服务器之间交换的报文就永远不会丢失、受损或失序。TCPHTTP提供了一条可靠的比特传输管道,从TCP连接的一端填入的字节会从另一端以原有的顺序、正确的传送出来。

2,几种HTTP连接

(1)串行连接

     也就是一个事务处理完后,才处理下一个事务,每一个事务使用一个连接,这样,连接时延和慢启动时延就会叠加起来。

     连接时延:建立一条TCP连接时,TCP软件之间会交换一系列的IP分组,对连接的参数进行沟通;

     慢启动:TCP连接会随着时间的推移进行自我“调谐”,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度,这种调谐被称为TCP慢启动,用于防止因特网的突然过载和拥塞;

(2)并行连接

    即通过多条的TCP连接发起并发的HTTP请求;在包含嵌入对象的组合页面,并行连接可以克服单条连接的空载时间和宽带限制,加载速度也会提高,时延可以叠加起来,而且如果单条连接没有充分的利用客户端的因特网带宽,可以将未使用的带宽分配装载其他对象;

但是,注意并行连接不一定总是更快,当浏览器的带宽不足,而服务器的处理速度较快时,每一个对象都去竞争有限的带宽,从而每个对象都会一较慢的速度同比例加载,这样带来的性能提升就很小了,甚至没什么提升;而且打开大量的连接会消耗很多内存资源,会造成服务器的性能严重下降;

但是,并行连接可以让人感觉更快一些,因为每个组件同时出现在页面上,用户能看到加载的进展;

(3)持久连接

     也就是在处理为一个事务后不立即关闭TCP连接,而是可以持续发送多个连接;这样可以避免缓慢 的链接建立阶段和慢启动的拥塞阶段,一边更快的进行数据传输;但是连接管理一定要特别小心,不然就会出现积累出大量的空闲连接,耗费本地以及远程客户端和服务器上的资源;

     持久连接有两种:HTTP/1.0的“keep-alive”连接和HTTP/1.1的“persistent”连接

     HTTP/1.0的“keep-alive”连接:要建立这种连接,客户端的请求头中必须显示的包含Connection: Keep-Alive首部,表示请求将一条连接保持在打开状态,如果服务器同意,就在相应中包含相同的Connection: Keep-Alive首部,否则表示不同意;

     HTTP/1.1的“persistent”连接:HTTP/1.1中,持久连接时默认激活的,除非特别指明,要在事务结束后关闭TCP连接,即在请求头中包含首部:Connection: close

(4)管道化连接

     HTTP/1.1允许管道化连接是HTTP/1.0的“keep-alive”连接的优化,在相应到达之前,将多条请求放到队列,当一条请求发送到服务器端时,后面的连接请求也就可以发送了,在高时延的网络条件下,这样可以降低网络的回环时间,以提供性能;

     管道化连接的缺点是:

     必须确定连接时持久的,否则就不能使用管道连接;

     响应的顺序必须和请求的顺序相同,因为HTTP报文没有序列号标签;

     不应该使用管道化连接发送会产生副作用(非幂等)的请求,如:post

3,连接的关闭

   所有的HTTP客户端、服务器或代理都可以在任意时刻关闭一条TCP连接,通常是在一条报文结束的时候关闭,但在出错的情况下,也可能在首部行的中间,或是其他奇怪的地方关闭连接;

TCP连接时双向的,所以关闭连接有两种情况:完全关闭(套接字调用close()方法),即输入和输出信道都关闭和半关闭(套接字调用shutdown()方法),即单独关闭输入或是输出;

关闭连接的输出信道总是安全的;因为另一端会在其缓冲区中读出所有数据后收到一个通知,说明数据流结束了;

关闭连接的输入信道是很危险的,除非你知道另一端不会再发送数据了;如果你像已经关闭输入信道的一端发送数据的时候,那一端会回送一条TCP“连接被对端重置”的报文,大部分的操作系统都会将这种情况作为很严重的错误来处理,删除对端还未读取的所有缓存数据;

4,正常关闭连接

   先半关闭输出信道,然后周期性的检查其输入信道的状态(查找数据或流的末端),如果在一定的时间区间内对端没有关闭输入信道,可以强制关闭连接,一节省资源;