4.5长连接

HTTP1.1和HTTP1.0的高版本,允许使用已有的连接发送不同的请求,这种在连接成功后一直保持开启的连接可称为持久连接(长连接)。长连接一直保持开启状态,直到客户端发起关闭连接的请求。

4.5.1 长连接和并发连接

长连接有时比并发连接更具备优势:

降低建立http连接的资源开销和延迟,原因是不必新增连接;

保持连接状态可调整;

降低潜在的连接数;

劣势:

长连接需要精心维护,否则有可能使应有产生巨大的连接数;

开销大量本地资源;

开销大量远端客户端和服务器端资源;

长连接和并发连接同时使用才能得到更好性能,现在有不少浏览器都使用多个长连接的方式工作。

目前有两种模式:HTTP/1.0+"Keep-alive",HTTP/1.1"persistent' 两种方式。

4.5.2 HTTP/1.0+"Keep-alive"连接

许多HTTP1.0浏览器和服务器都被升级来支持一种早期实验性长连接Keep-alive模式长连接.这种早期的长连接诟病于一些互通性的设计问题,尽管此问题已经在HTTP1.1做了修正,但仍然有很多客户端使用这种长连接。

一个长连接内的四次请求-响应交互,相比于建立四次连接的时间优势,我想再次不用多少,大家都应该知道。原因是,长连接内的四次交互回避了建立连接的开销。

4.5.3长连接操作

不赞成使用keep-alive属性,并且HTTP1.1说明文档 中已经不再描述此属性。然而,keep-alive握手在浏览器和服务端的应用中还经常被使用,因此HTTP协议的实现者必须做好准备用此属性做互动操作。

客户端要实现HTTP1.0长连接,可以通过报文头中添加Keep-Alive的属性的方式获得。

如果服务器端愿意保持这个连接的长开启状态,它将在响应报文的报文头中添加相同的属性。如果响应报文中没有此属性,那么客户端假设服务器不支持长连接,并且认为服务器在返回消息后就关闭了这个连接。

4.5.4Keep-Alive选项

要注意,keep-alive报文头支持作为保持长连接的请求,但并不意味着肯定可以获取长连接。客户端、服务器端并不需要都同意去建立一个长连接会话。他们可以在任何时间关闭空闲的长连接,并且可以无限制的控制长连接内的交互处理量。

在http报文头中,可以通过多个属性(以逗号分割)控制长连接的行为。

-timeout参数,在服务器端的响应报文中,用以预估此长连接的大概最长会话时间;

-max参数,在服务器端的响应报文中,用以预估长连接存活期大概能处理多少次交互;

-keep-alive头也可以支持一些自定义的http不会做处理的属性,用户系统检查或debug等,语法为name=[value];

keep-alive头也是完全可以选的,只有当keep-alive参数出现在Connection属性中,才会允许长连接。

例如:

Connection:Keep-Alive

Keep-Alive:max=5,timeout=120

4.5.5Keep-Alive连接的限制和规则

Keep-Alive连接连接中有一些限制和需要明确注意的东西:

-keep-alive不是HTTP1.0默认开启的。客户端必须发送Connection:Keep-Alive请求报文头以激活长连接;

-Connection:Keep-Alive头必须和所有需要持久化交互的信息一起发出;

-在服务器端的响应报文头中如果不再有Connection:Keep-Alive,客户端必须能够识别出来;

-只有当报文体长度可以在不关闭连接的情况下就可以断定,才能保持连接长开启状态,这意味着报文体必须有一个正确的Content-length,多种载体类别,或者被分段编码。发送错误包体长度信息是非常不好的,因为这样交易的结束点就不可能探测的不准确了;

-代理和网关必须加强连接头的规则,在转发或缓存之前,代理和网关必须移除所有Connection header中的域,以及Connection header自身;

-正规的来说,keep-alive连接 不应该在不支持这种Connection header的代理服务器之间建立,以避免和dumb代理之间的交互问题,接下来会进行讲解,实际上keep-alive在实际中并不总是可用的;

-技术角度来讲,任何Connection header域(包括Connection:Keep-Alive)在被HTTP1.0设备接收后,都应该被忽略,因为,他们可能是被其他过时的代理服务器转发过来的。实际情况中,一些客户端和服务器端转变了此规则,当然这要承担来自过时代理服务器转发的风险;

-如果客户端在收到响应报文前,连接就被关闭了,那么他必须做好重复请求的准备,除非重复请求会给客户端带来不良的其他影响。

to be continue ...

猜你喜欢

转载自sooerr.iteye.com/blog/1884670