1. 引言
HTTP连接是HTTP报文传输的关键通道,几乎所有的HTTP通信都是由TCP/IP承载。
HTTP连接实际上就是TCP连接和一些使用连接的规则。TCP连接是因特网上的可靠连接。
TCP为HTTP提供了一条可靠的比特传输管道。从TCP连接一端填入的字节会从另一端以原有的顺序、正确地传送出来。
(1)浏览器解析出主机名
(2)浏览器查询这个主机名的IP地址(DNS)
(3)浏览器获得端口号
(4)浏览器发送到ip:port的连接
(5)乱了去年向服务器发送一个HTTP GET报文
(6)浏览器从服务器读取HTTP响应报文
(7)浏览器关闭连接
TCP流是分段的,由IP分组传送
TCP的数据是通过名为IP分组(或IP数据报)的小数据块来发送的。HTTP就是“HTTP over TCP over IP”这个协议栈中的最顶层。
其安全版本HTTPS就是在HTTP和TCP之间插入一个(称为TLS或SSL的)密码加密层。
如图:
HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP收到数据流之后,会将数据流砍成被称作段的小数据块,并将段封装在IP分组中,通过因特网进行传输,。所有这些工作都是由TCP/IP软件来处理的,HTTP程序员什么都看不到。
每个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址的,每个IP分组中都包括:
(1)一个IP分组首部(通常为20字节)
(2)一个TCP段首部(通常为20字节)
(3)一个TCP数据块(0个或多个字节)
在任意时刻计算机都可以有几条TCP连接诶处于打开状态。TCP是通过端口号来保持所有这些连接的正确运行的。
2. 对TCP性能的考虑
HTTP紧挨着TCP,位于其上层,所以HTTP事务的性能在很大程度上取决于底层TCP通道的性能。
HTTP事务主要的连接、传输以及处理时延。如图:
与建立TCP连接,以及传输请求和响应报文的时间相比,事务处理时间可能是很短的。除非客户端或服务器超载,或正在处理复杂的动态资源,否则HTTP时延就是由TCP网络时延构成的。
HTTP事务的时延有以下几种主要原因:
(1)客户端手续需要根据URI确定Web服务器的IP地址和端口号。如果最近没有对URI中的主机名进行访问,通过DNS解析系统将URI中的主机名转换成一个IP地址可能要花费数十秒的时间。
(2)客户端会向服务器发送一条TCP连接请求,并等待服务器会送一个请求接受应答。每条新的TCP连接都会有连接建立时延。这个值通常最多只有一两秒钟,但如果有百个HTTP事务的话,这个值会快速地叠加上去。
(3)一旦连接建立起来了,客户端就会通过新建立的TCP管道来发送HTTP请求。数据到达时,Web服务器会从TCP连接中读取请求报文,并对请求进行处理。因特网传输请求报文,以及服务器处理请求报文都需要时间。
(4)Web服务器会回送HTTP响应,这也需要花费时间。
这些TCP网络时延的大小取决于硬件速度、网络和服务器的负载,请求和响应报文的尺寸,以及客户端和服务器之间的距离。
性能聚焦区域
列出了一些会对HTTP程序员产生影响的、最常见的TCP相关时延。其中包括:
(1)TCP连接建立握手:建立一条新的TCP连接时,甚至在发送任意数据之前,TCP软件之间会交换一系列的IP分组。如果连接只是用来传送少量数据,这些交换过程就会严重降低HTTP的性能。HTTP程序员永远不会看到这些分组--这些分组都是由TCP/IP软件管理,对其是不可见的。HTTP程序员看到的只是创建TCP连接时存在的时延。
(2)TCP慢启动拥塞控制:TCP慢启动限制了一个TCP端点在任意时刻可以传输的分组数。每成功接收一个分组,发送端就有了发送另外两个分组的权限。如果某个HTTP事务有大量数据要发送,是不能一次将所有分组都发送出去的。由于存在这种拥塞控制特性,所以新连接的传输速度会比已经交换过一定量数据的连接慢一些。
(3)数据聚集Nagle算法:Nagle算法会引发集中HTTP性能问题。(a)小的HTTP报文可能无法填满一个分组,可能会因为等待哪些永远不会到来的额外数据而产生时延(b)Nagle算法与延迟确认之间的交互存在问题--Nagle算法会阻止数据的发送,直到有确认分组,但确认分组自身会被延迟确认算法延迟100~200ms。TCP_NODELAY禁用Nagle算法。
(4)用于捎带确认的TCP延迟确认算法:由于确认报文很小,所以TCP允许在发往相同方向的输出数据分组中对其进行“捎带”。TCP将返回的确认信息与输出的数据分组结合在一起,可以更有效地利用网络,为了增加确认报文找到同向传输数据分组的可能性,很多TCP栈都实现了一种“延迟确认”算法。延迟确认算法会在一个特定的窗口时间(100~200ms)内将输出确认存放在缓冲区中,以寻找能够捎带它的输出数据分组。
(5)TIME_WAIT时延和端口耗尽
3. HTTP连接的管理
有几种方法可以提高HTTP的连接性能:
(1)并行连接:通过多条TCP连接发起并发的HTTP请求;
(2)持久连接:重用TCP连接,以消除连接及关闭时延;在事务处理结束之后仍然保持在打开状态的TCP连接被称为持久连接。重用已对目标服务器打开的空闲持久连接,就可以避开缓慢的连接建立阶段。而且,已经打开的连接还可以避免慢启动的拥塞适应阶段,以便更快的进行数据传输。
(3)管道化连接:通过共享的TCP连接发起并发的HTTP请求;
(4)复用的连接:交替传送请求和响应报文。