HTTP连接管理

Http事务的时延:
(1)TCP建立连接握手
(2)TCP慢启动拥塞控制
(3)数据聚集的Nagle算法
(4)用于捎带确认的TCP延迟确认算法
(5)TIME_WAIT时延和端口耗尽
TCP握手时延:三次握手+四次挥手带来时延;
TCP慢启动时延:一开始会限制发送的分组的速度,避免拥塞控制;新建立的连接的传输速度会小于交换过一定量数据的连接,这个会带来时延;
Nagle算法:TCP发送大量包含少量数据的分组,网络的性能就会下降;Nagle算法试图在发送分组之前,会将大量的TCP分组捆绑在一起,以提高网络的效率;这样就会导致小的HTTP分组无法填满一个分组,可能会一直等待其它数据的到来,导致时延;
延迟确认:确认之后才能继续发送报文;由于确认报文非常的小,所以TCP允许把这个确认捎带在数据分组之中,而不是直接的发送这个确认;延迟确认算法会在一个时间之内,将确认放在缓冲区之中,以寻找能够捎带它的分组,如果在那段时间内没有输出分组,就将确认以单独的分组发送;
TIME_WAIT时延:2MSL

串行处理事务时延:
一个页面嵌入了三张图片,需要发起四个Http请求;

HTTP连接管理_第1张图片
串行处理事务

并行连接:通过多条TCP连接发起并发的HTTP请求;

HTTP连接管理_第2张图片
并行连接

并行连接可能会提高页面的加速度:时延重叠;如果单条连接没有充分利用带宽,就可以将其未用的带宽分配来装载其它对象;
并行连接不一定快:带宽不足,导致每条连接都会以较慢的速度去加载;大量连接还会消耗很多内存,会导致服务器的性能下降;

并行连接的缺点:
每个事务都会打开/关闭一条连接,耗费时间和带宽;
由于TCP的慢启动特性的存在,每条新连接性能的都会下降;
并行连接数是有限的;

持久连接:允许HTTP设备在事务处理结束之后将TCP连接保持在打开状态,以便未来的HTTP请求重用现在的连接;在事务处理结束之后仍然保持在打开状态的TCP连接叫做持久连接;非持久连接会在事件处理结束之后关闭,持久连接会在不同的事务之间保持打开状态;
持久连接的优点:
降低时延和连接建立的开销;
将连接保持在已经调谐的状态;
减少了打开连接的潜在数量;

持久连接+并行连接:
少量并行连接+持久连接;

HTTP/1.0+keep-alive连接:
(1)客户端通过Connection:keep-alive首部发送给服务端;
(2)服务器响应首部包含相同的Connection:keep-alive首部;
(3)如果服务器响应没有Connection:keep-alive首部,客户端就认为服务器不支持keep-alive,会在处理完事务后关闭连接;
持久连接的方式:HTTP/1.0+keep-alive连接;

HTTP连接管理_第3张图片
Keep-alive

keep-alive选项:
keep-alive选项只是请求将连接保持在活跃状态,发送端和接收端并不一定同意进行keep-alive会话;可以在任意时刻关闭keep-alive连接;

keep-alive首部是可选的,但是只有在提供Connection:keep-alive首部才能使用它;下面的实例 max,timeout都是服务器返回的;表明服务器最多还会为5个事务保持连接状态,并且打开状态在连接空闲之后,最多保持120s

keep-alive示例

HTTP/1.1持久连接:
(1)默认持久连接
(2)要在事务处理完之后关闭连接,必须显示的在报文中添加一个Connection:close首部
持久连接的限制和规则:
发送了Connection:close首部后,客户端就无法在那条连接上发送更多的请求了;
如果客户端不想在某条连接上发送请求了,就应该发送Connection:close首部;
只有连接上所有报文都是正确的(实体部分长度==Content-length),连接才能持久;
HTTP/1.1可以在任意时刻关闭连接;
管道化连接:
HTTP/1.1可以在持久连接上选择使用请求管道;在响应到达之前,可以将多条请求放入队列;当第一条请求到达时u,可以发送第二条连接;
管道化连接限制:
客户端无法确认是持久连接,就不应该使用管道;
必须按照和请求相同的顺序来回送HTTP响应;
HTTP客户端必须做好连接随时关闭的准备,还要准备好重新发送未完成的请求;

HTTP连接管理_第4张图片
串行连接
HTTP连接管理_第5张图片
持久连接

HTTP连接管理_第6张图片
管道化连接

TCP关闭:
半关闭:shutdown()
全关闭 : close()

你可能感兴趣的:(HTTP连接管理)