http连接管理(http权威指南第四章)

来源:互联网 发布:配电柜报价软件 编辑:程序博客网 时间:2024/05/16 03:17

连接管理

本章将介绍:
- http时如何使用TCP连接的
- TCP连接的时延,瓶颈以及存在的障碍
- http的优化,包括并行连接,keep-alive(持久连接)和管道化连接
- 管理连接时应该以及不应该做的事情
1. TCP连接
TCP为http提供了一条可靠的比特传输管道,从TCP连接的一端填入的字节会从另一端以原有的顺序,正确的传送出来
http要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP受到数据流之后,会讲数据流砍成被称作为段的小数据块,并将段封装在IP分组中,通过因特网进行传输,所有这些工作都由TCP/IP软件来处理,http程序员什么都看不到
每个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址。每个IP分组包括:
- 一个IP分组首部(通常20个字节)
- 一个TCP段首部(通常20个字节)
- 一个TCP数据块(0个或多个字节)
IP首部:源和目的IP地址,长度和其它一些标记
TCP段首部:TCP端口号,TCP控制标记,数据排序和完整性检查的一些数字值
在任意时刻计算机都可以有几条TCP连接处于打开状态,TCP是通过端口号来保持所有这些连接的正确运行。IP地址可以将我们连接到正确的计算机,端口号可以将我们连接到正确的应用程序上。TCP连接通过4个值来识别:

<源IP地址,源端口号,目的IP地址,目的端口号>

这四个值唯一的定义一条连接
操作系统提供了一些操纵其TCP连接的工具,套接字API向http程序员隐藏了TCP和IP的所有细节。套接字API允许用户创建TCP的端点数据结构,将这些端点与远程服务器的TCP端点进行连接,并对数据流进行读写
2. 对TCP性能的考虑
http紧挨TCP,位于其上层,所以http事务的性能在很大程度上取决于底层TCP通道的性能。
http事务的时延由以下原因:
- 客户端首先根据URI确定web服务器的IP地址和端口号,如果最近没有对URI中的主机进行访问,通过DNS解析系统将URI中的主机名转换
- 客户端向服务器发送一条TCP连接请求,并等待服务器回送一个请求接受应答
- 一旦连接建立起来,客户端就会通过新建立的TCP管道发送http请求,web服务器会从TCP连接中读取请求报文,并对请求进行处理
- web服务器回送http响应,这也需要时间
常见TCP相关时延为:
- TCP连接建立握手
TCP连接握手需要经过以下几个步骤:
1. 请求新的TCP连接时,客户端要向服务器发送一个小的TCP分组,这个分组中设置一个特殊的SYN标记,说明这是一个连接请求
2. 如果服务器接收了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组,这个分组中的SYN和ACK标记都被置位,说明连接请求已被接受
3. 最后客户端向服务器回送一条确认信息,通知它连接已建立。现在的TCP都允许客户端在这个确认分组中发送数据
- TCP慢启动拥塞控制
TCP数据传输的性能还取决于TCP连接的使用期。TCP连接会随着时间进行自我“调谐”,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度,这种调谐别称为TCP慢启动,用于防止因特网的突然过载荷拥塞。所以新连接的传输速度会比已经交换过一定数据的“已调谐”连接慢一些
- 数据聚集的Nagle算法
Nagle算法试图在发送一个分组之前,将大量TCP数据绑定在一起,以提高网络效率。Nagle算法鼓励发送全尺寸的段,只有当所有其它分组都被确认之后,Nagle算法才允许发送非全尺寸分组,如果其它分组还在传输过程中,就将那部分数据缓存起来。只有当挂起分组被确认,或者缓存中积累了足够发送一个全尺寸分组的数据时,才会将缓存的数据发送出去。
http应用程序常常在自己的栈中设置参数TCP_NODELAY,禁用Nagle算法,提高性能。
- 用于捎带确认的TCP延迟确认算法
小的http事务可能会在TCP建立上花费很多时间。TCP将返回的确认信息与输出的数据分组结合在一起,可以更有效的利用网络。为了增加确认报文找到通向传输数据分组的可能性,很多TCP栈都实现了一种“延迟确认”算法。延迟确认算法会在一个特定的窗口时间(通常100-200毫秒)内将输出确认存放在缓冲区中,以寻找能够捎带它的输出数据分组,如果在那段时间内没有输出数据分组,就将确认信息放在单独的分组中传送
- TIME_WAIT时延和端口耗尽
TIME_WAIT端口耗尽时很严重的性能问题,会影响到性能基准,现实中相对较少出现
当某个TCP端点关闭TCP连接时,会在内存中维护一个小的控制块,用来记录最近所关闭连接的IP地址和端口号,这类信息只会维持一小段时间,以确保在这段时间内不会创建具有相同地址和端口号的新连接。
3. http连接的处理
- 常被误解的Connection首部
http允许在客户端和最终的源端服务器之间存在一串中间实体(代理,高速缓存等)。可以从客户端开始,逐条的讲http报文经过这些中间设备,转发到源端服务器上去
Connection首部可以承载3中不同类型的标签:
- http首部字段名,列出了只与此连接有关的首部
- 任意标签值,用于描述此连接的非标准选项
- 值close,说明操作完成后需要关闭这条持久连接
在将报文转发出去之前,必须删除Connection首部列出的所有首部字段,因此将逐跳首部名放入Connection首部被称为“对首部的保护“
- 串行事务处理时延
串行事务的时延可能会叠加起来,几种现存和新兴的方法可以提高http的连接性能:
1. 并行连接
- 并行连接可能会提高页面的加载速度
因为时延会重叠
- 并行连接不一定更快
因为带宽有限,而且大量连接消耗内存资源,引发性能下降
- 并行连接可能让人“感觉”更快一些
因为多个组件对象同时出现在屏幕上,用户能够看到加载的进展
2. 持久连接
初始化了对某服务器http请求的应用程序很可能会在不久的将来对那台服务器发起更多的请求,这种性质被称为站点本地性。因此http/1.1允许http设备在事务处理结束之后将TCP连接保持在打开状态,以便为未来的http请求重用现存的连接,这称为持久连接。非持久连接会在每个事务结束之后关闭。
并行连接的一些缺点:
- 每个事务都会打开/关闭一条新的连接,会耗费时间和带宽
- 由于TCP慢启动特性的存在,每条新连接的性能都会有所下降
- 可打开的并行连接数量是有限的
持久连接和并行连接配合使用时最高效的方式,现在很多web应用程序都会打开少量的并行连接,其中每一个都是持久连接。持久连接有两种类型:
- 比较老的http/1.0+ keep-alive连接
- 现代的http/1.1 persistent连接
3. 管道化连接
http/1.1允许在持久连接上可选地使用请求管道。在响应到达之前,可以将多条请求放入队列,当第一条请求通过网络流向服务器时,第二条河第三条请求也可以开始发送了,这样做可以降低网络的环回时间,提高性能
4. 复用的连接
交替传送请求和响应报文(实验阶段)

原创粉丝点击