HTTP 事务的时延
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 网络时延的大小取决于硬件速度、网络和服务器的负载,请求和响应报文的尺寸,以及客户端和服务器之间的距离。TCP 协议的技术复杂性也会对时延产生巨大的影响。
建立一条新的 TCP 连接时,甚至是在发送任意数据之前,TCP 软件之间会交换一系列的 IP 分组,对连接的有关参数进行沟通。如果连接只用来传送少量数据,这些交换过程就会严重降低 HTTP 的性能。
TCP 连接握手需要经过以下几个步骤。
1、请求新的 TCP 连接时,客户端要向服务器发送一个小的 TCP 分组(通常是 40~60 个字节)。这个分组中设置了一个特殊的 SYN 标记,说明这是一个连接请求。
2、如果服务器接受了连接,就会对一些连接参数进行计算,并向客户端回送一个 TCP 分组,这个分组中的 SYN 和 ACK 标记都被置位,说明连接请求已被接受。
3、最后,客户端向服务器回送一条确认信息,通知它连接已成功建立。现代的 TCP 栈都允许客户端在这个确认分组中发送数据。
HTTP 程序员永远不会看到这些分组——这些分组都由 TCP/IP 软件管理,对其是不可见的。HTTP 程序员看到的只是创建 TCP 连接时存在的时延。
通常 HTTP 事务都不会交换太多数据,此时,SYN/SYN+ACK 握手会产生一个可测量的时延。TCP 连接的 ACK 分组通常都足够大,可以承载整个 HTTP 请求报文,而且很多 HTTP 服务器响应报文都可以放入一个 IP 分组中去(比如,响应是包含了装饰性图片的小型 HTML 文件,或者是对浏览器高速缓存请求产生的 304 Not Modified 响应)。
最后的结果是,小的 HTTP 事务可能会在 TCP 建立上花费 50%,或更多的时间。后面的小节会讨论 HTTP 是如何通过重用现存连接,来减小这种 TCP 建立时延所造成的影响的。
版权声明: 本文为 InfoQ 作者【阿泽🧸】的原创文章。
原文链接:【http://xie.infoq.cn/article/8cf140d588b8cc20915081eed】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论