HTTP事务的延迟—TCP的影响

导读:最近看完了大部头著做《HTTP权威指南》,对于此类指南类、手册类图书,每每让咱们联想到的就是枯燥无味的使用讲解、技术指标讲解......令人头大。可是这本书却让我以为读起来很“清新”,一方面做者用了浅显易懂的语言和大量的图示让咱们很容易知因此然,另外一方面应该是我一直以来对网络编程的兴趣和此书的内容有很大的契合点,今天要讲的内容也是与本身的兴趣有关的HTTP协议中有关TCP的部分,是从书中第四章——”链接管理“的部份内容总结而来。
web


HTTP请求过程当中会有哪些网络时延?

wKiom1UhMG2hoBaIAACFJLHKC_U641.jpg

  1. 域名解析:域名解析是进行网络访问的第一步,把域名识别为TCP认识的IP地址。这步每每会由于域名解析服务的质量形成诸多问题,我在实际的工程实践中遇到的最多见的问题就是选择的域名服务商质量很差或者客户端自己设置的域名解析服务地址错误致使域名解析慢或者失败。不过如今对于大多数的HTTP客户端都有一个小的DNS缓存,用来保存近期所访问站点的IP地址,能够有效的缓解此问题。算法

  2. 接下来,客户端会向服务器发送一条TCP链接请求,并等待服务器回送一条响应。每条新的TCP链接都有链接创建时延(一般最多只有一两秒钟),对于单线程浏览器而言,若是有数百个并发的HTTP事务的话,可想而知时间叠加值也会很大。编程

  3. 一旦链接创建起来,客户端和服务器端就会经过这个创建的TCP管道来进行请求的收发了,这些TCP的网络时延的大小取决于硬件速度、网络和服务器的负载,请求和响应报文的尺寸,以及客户端和服务器之间的距离。请参见个人文章《构建高性能服务的考量》浏览器

TCP相关时延
  • TCP链接创建握手缓存

    wKioL1UhMc3RLTTHAACWKdyGkGs865.jpg
    创建一条新的TCP链接时,TCP两端之间会交换一系列的IP分组,若是链接只是用来传送少许的数据,相比而这种创建链接的过程会大大影响HTTP的性能。
    服务器

    一般HTTP的事务都不会交换太多数据,SYN/SYN+ACK两次握手会产生一个可测量的时延,但第三次握手——TCP链接ACK分组一般都足够大,能够承载整个HTTP的请求报文(现代的TCP协议栈都容许客户端在这个确认分组中发送数据),并且不少HTTP服务器响应报文均可以放到一个IP分组中去。网络

    能够看出,小的HTTP事务可能会在TCP创建链接上花费50%的时间之多。因此咱们现实中经常会有重用HTTP链接的需求。并发

  • TCP的延迟确认机制
    咱们都知道因特网自身是没法保证可靠的分组传输的,因此TCP实现了本身的确认机制来确保数据的传输成功。在这种确认机制中使用的就是确认报文,因为确认报文很小,因而TCP将要返回的确认信息与输出的数据分组结合在一块儿发送能够更有效的利用网络。为了增长确认报文找到同向传输数据分组的可能性,不少TCP协议栈都实现了一种“延迟确认”算法——在一个特定的窗口时间(一般是100-200毫秒)内将输出确认放在缓冲区中,以寻找可以捎带它的输出数据分组,不然超出这个时段就将确认数据单独发送。
    tcp

    可是HTTP具备双峰特征的请求——应答行为下降了捎带信息的可能。当但愿有相反方向回传分组的时候,恰恰没有那么多。一般,延迟确认算法会引入至关大的时延,因此咱们应该依据相应的操做系统的不一样调整或者禁用延迟确认算法。ide

注:在对TCP协议栈的任何参数进行修改以前,必定要对本身作什么有清醒的认识。TCP中引入这些算法的目的是防止设计欠佳的应用程序对网络形成破坏。因此修改这些配置后都应该保证应用程序不会引起这些算法所要避免的问题。

  • TCP慢启动(拥塞控制)
    为了更好的保护网络,TCP慢启动限制了一个TCP端点在任意时刻能够传输的分组数。TCP数据传输起初会限制传输速度(传输分组数),若是数据成功传输,会随着时间的推移提升传输速度(传输分组数)。若是某个HTTP事务有大量数据要发送,是不能一次将全部分组都发送出去的。必须依赖慢启动逐渐的打开拥塞窗口。

    因为存在这种拥塞控制特性,因此新链接的传输速度会比已经交换过必定量数据的链接慢一些。这样又须要咱们从重用HTTP链接(持久链接)的角度去考虑提升传输性能。

  • Nagle算法与TCP_NODELAY
    若是TCP链接老是发送大量包含少许数据的分组,网络的性能就会严重降低。Nagle算法就是试图在发送一个分组以前,将大量TCP数据绑定在一块儿发送(鼓励发送全尺寸的段,好比以太网上的段大小是1500字节,不然就进行缓存,要么当全部其余分组都被确认以后,Nagle算法才容许发送非全尺寸的分组),以提升网络效率。

    Nagle算法会引起几种HTTP的性能问题。好比小的HTTP报文可能没法填满一个分组,因此要缓存等待起来,要么就等待确认分组的抵达(确认分组的时延大概在100-200毫秒)。

    因此HTTP应用程序经常会在本身的协议栈中设置参数TCP_NODELAY,禁用Nagle算法来提升性能。

  • TIME_WAIT累积与端口耗尽
    关于TIME_WAIT状态的解释请看个人这篇博文
    《网络编程释疑之:TCP的TIME_WAIT状态在服务器开发中的影响?》,以前TIME_WAIT时间的设置为2分种之可能是由于早期路由器的处理速度还比较慢,可是如今高速路由器的使用已经大大弱化了这个问题,因此对于web服务器来讲能够经过操做系统设置来减少TIME_WAIT状态的持续时间,不然若是服务器存在大量的TIME_WAIT状态会大大影响服务器的性能。至于端口耗尽的状况则是针对少许客户端主机对web服务器进行基准测试时可能出现的问题,与TCP链接四元组有关。

参考书籍:

《HTTP权威指南》

相关文章
相关标签/搜索