译者注:本文是《High Performance Browser Networking》的翻译版,采用google translator tookit工具翻译,原文很多格式丢失,后续还需要统一整理。
原文请参考:http://chimera.labs.oreilly.com/books/1230000000545/ch01.html
第一章 延迟和带宽的基本概念
速度是一个特性
过去几年内,Web性能优化(WPO)作为一个新的行业快速增长,成为用户追求更高的速度和更快的用户体验的一个明显标志。Web性能优化不单纯是一种快速连接世界的情感需要,也是很多关键业务需求驱动的结果:
- 更快的网站可以让更好的用户参与
- 更快的网站可以提升更好的用户回头率
- 更快的网站提升网站的转换率
简单地说,速度是一个重要特性。要实现这个特性,我们需要了解影响Web性能的诸多因素和基本限制。在本章中,我们将重点放在决定所有网络流量性能的两个关键部分:延迟和带宽(图1-1 )。
延迟
一个数据包从源到目的地的时间
带宽
逻辑的或物理的通道容量
图1-1 延时和带宽
为了更好的理解带宽和延迟是如何共同协作,我们将提供工具来更深入地研究TCP,UDP,以及上层应用协议的内部细节和性能特征。
低延迟的跨大西洋的高速光缆工程
在金融市场上,延迟是许多高频交易算法的重要影响因素,一个几毫秒的延时可能导致数以百万计的损失。
2011年初,华为和海伯尼亚大西洋网络( Hibernia Atlantic)开始铺设新的3000英里的光纤网络(“海伯尼亚快线”),这条高速光缆横跨大西洋连接伦敦到纽约,唯一的目标就是对比于所有其他现有的跨大西洋线路,能够节省5毫秒的延时。
一旦投入使用,这条电缆只被金融机构使用,这条光缆将耗资超过4亿美元,1毫秒的代价是8000万美元。由此可见,延迟的代价是昂贵的。
影响延迟的因素
延迟是一个消息或者一个数据包从它的起始点到达目的地所花的时间。这个定义很简单,但它往往隐藏了许多有效的信息 :每一个系统包含多个部件、多个影响因素,所有这些因素一起构成了消息传递的时间,了解系统由哪些部件组成,每一个部件的性能决定因素,对我们了解整个系统延迟至关重要。
让我们仔细的分析一下互联网的典型路由中常见的各种延迟因素,这些因素是如何影响一个消息从客户端传递到服务端。
传播延迟
一个报文在从发送方到接收方所需的时间,传播延迟是指电磁信号或者光信号在传输介质中传输的时延,在光纤或者铜线中,光信号和电磁信号的传播速度都在20万公里/秒以上,在传输介质中传输的是电磁信号或者光信号,而不是数据!
传输延迟
在数据链路中传输所有数据包所需的时间,传输延迟与数据包的长度和链路的传输速度有关。
处理延迟
处理数据头、校验数据、查找数据包的目标地址所需的时间。
排队延迟
数据包在队列中等待时间
客户端和服务器之间的延迟时间是所有上述的延迟的总和。传播时间决定于距离以及信号的传播媒介 -在光纤,双绞线,电缆等传输媒体中,传播速率是固定的,而与发送的数据大小无关!传输延迟取决于可用的传输链路的数据速率,与在客户端和服务器之间的距离无关。举一个例子,让我们假设我们两个不同链路传输一个10 Mb的文件:1 Mbps和100 Mbps的链路,在1 Mbps的链路上我们需要10s才能把所有的文件放在整个链路上,而在100 Mbps的链路上,我们只需要0.1s。
接下来,一旦数据包到达路由器时,路由器必须检查数据包标头以确定即将下一跳的路由,同时可能还会对数据做其他的检查和处理,这都需要时间。这些处理大部分在硬件中执行,延迟非常小,但它们确实存在。最后,如果数据包到达速度比路由器处理速度快,那么数据包还需要在路由器的数据包队列中等待,这个等待时间被称为排队时延。
在网络上传输的每个数据包,都会遇到这些延迟。当源地址与目标地址越远,传播延迟越大;当数据包通过的中间路由越多,每一个数据包所需要的处理时间越多;同时当经历的路由越繁忙,数据包在路由器的等待缓冲区中停留的时间也越长。
路由器的过度缓存问题(Bufferbloat)
Bufferbloat是一个由Jim Gettys在2010年创建和普及的术语,主要描述的就是路由器的排队时延影响整体网络性能的一个很好的例子。
这个问题产生的原因就是现在很多路由器创建了很大的接收缓冲区,用来避免丢失数据包,然而,这种行为破坏了TCP的拥塞避免机制(我们将在下一章介绍),并引入变化的高网络延迟。
好消息是CoDel主动队列管理算法已经被提出来解决这个问题,现在已经实现在Linux 3.5 +内核。要了解更多信息,请参阅“控制队列延迟 “ACM队列。
光速和传播延迟
正如爱因斯坦在他的狭义相对论中描述,光速是所有能量、物质和信息的可传播的最大理论速度。这个结论为任何网络的传播时间设定了无法超越的硬杠杠。
好消息是,光的速度很高:每秒299,792,458米,或者说每秒186282英里。但是,总有一个但是,这个是光在真空中的速度。实际应用中,我们的数据包总是通过某种介质来传输的,,比如铜线,或光纤电缆,这些介质都会减慢信号传输速度(表1-1 )。光速与光在介质中的传输速率比称为折射率,折射率越大,光在该介质中传输越慢。
典型的光纤的折射率值一般在1.4到1.6之间变化 ,当然,改善光纤材料质量,可以降低折射率。为了简化,经验法则是假设光纤中的光的速度是200,000,000米每秒,其对应的折射率为1.5左右。值得庆幸的是,我们已经实现了这样一个很高的速度了。这得感谢那些伟大的光通信工程师
表1-1.信号在真空和光纤的延迟
路由 |
距离 |
真空传播时间 |
光纤传播时间 |
光前传播往返时间(RTT) |
纽约---旧金山 |
4148km |
14ms |
21ms |
42ms |
纽约---伦敦 |
5,585 km |
19ms |
28ms |
56ms |
纽约---悉尼 |
15993km |
53ms |
80ms |
160ms |
赤道周长 |
40075km |
133.7ms |
200ms |
200ms |
光的速度已经很快快,但从纽约到悉尼的一个往返(RTT)仍然需要160ms。事实上,表1-1中的数字还是乐观情况,因为他们认为数据包通过光纤电缆沿大圆线(在地球上两点之间的最短距离,译者注:大圆线是球面上半径等于球体半径的圆弧。大圆线是连接球面上两点最短的路径所在的曲线。大圆线是球面上半径最大的圆弧,所有的經線都是大圆线,緯線則只有赤道而已)在城市间传输。在实际应用中,这样的电缆是不存在的,数据包在纽约和悉尼之间传输要经过更长的路由。沿着这条路由的每一跳将带来额外的路由,处理,排队和传输延迟。在我们现有实际的网络中,纽约和悉尼之间的实际RTT,基本在200-300ms之间。考虑所有的因素影响,似乎仍然相当快的,对不对?
我们不习惯于以毫秒为单位来衡量我们日常生活中的延迟,但研究表明,我们大多数人会去关注一个系统中超过100-200ms的延迟。一旦超过300毫秒的延迟阈值,交互往往定义为“疲软”,当超过了1000毫秒(1秒),很多用户在等待响应的过程中已经进行了心理上下文切换---也许开始白日梦,也许想到下一个紧急任务了。
结论很简单:为了提供最好的体验,让用户持续专注于当前的任务,我们需要我们的应用响应时间控制在几百毫秒内。这留给我们在网络上很少犯错的空间。为了达到这个目标,网络延迟需要重点被关注,并在应用开发的各个阶段有一个明确的设计标准。
内容交付网络(CDN)服务提供了许多便利,其最主要的一点就是通过简单的分析,将内容分布在全球各地,并通过从最近的位置为客户端提供内容,这将显著减少数据包的传播时间。
我们也许不能让数据包传播的更快,但我们可以通过策略性的方法将内容放在离用户更近的地方减少传播的距离!借助CDN,我们可以为数据传播带来显著的性能提升。
“最后一英里”的延迟
具有讽刺意味的是,实际情况往往不是穿越大洋或大陆,而是最后的几英里带来了更多的延迟:这就是臭名昭著的“最后一英里”的问题。为了将您的家里或办公室连接到互联网,你当地的ISP需要在临近的小区组建路由,合并信号,并将其转发到本地路由节点。在实际情况中,取决于连接的类型,路由方法,部署技术,也许需要消耗几十ms,而这只是为了接入到你的ISP的路由器!根据美国联邦通信委员会在2013年初进行的“宽带美国测量”的报告,在高峰时段:
|
光纤到户,平均延迟方面表现最好的,高峰时期平均为18毫秒,有线电缆延迟为26毫秒,而DSL则有44毫秒的延迟。 |
|
|
- FCC - 2013年2月 |
在数据包被发送到目的地前,我们仅发送到ISP的网络最近的节点已经就有18-44ms的延迟了。FCC的报告主要基于美国进行统计,但“最后一英里”的延迟问题是所有的互联网服务提供商的挑战,无论在哪个地域。如果你很好奇,一个简单traceroute经常可以告诉你你的互联网服务提供商的拓扑结构和性能情况。
$> traceroute google.com
traceroute to google.com (74.125.224.102), 64 hops max, 52 byte packets
1 10.1.10.1 (10.1.10.1) 7.120 ms 8.925 ms 1.199 ms
2 96.157.100.1 (96.157.100.1) 20.894 ms 32.138 ms 28.928 ms
3 x.santaclara.xxxx.com (68.85.191.29) 9.953 ms 11.359 ms 9.686 ms
4 x.oakland.xxx.com (68.86.143.98) 24.013 ms 21.423 ms 19.594 ms
5 68.86.91.205 (68.86.91.205) 16.578 ms 71.938 ms 36.496 ms
6 x.sanjose.ca.xxx.com (68.86.85.78) 17.135 ms 17.978 ms 22.870 ms
7 x.529bryant.xxx.com (68.86.87.142) 25.568 ms 22.865 ms 23.392 ms
8 66.208.228.226 (66.208.228.226) 40.582 ms 16.058 ms 15.629 ms
9 72.14.232.136 (72.14.232.136) 20.149 ms 20.210 ms 18.020 ms
10 64.233.174.109 (64.233.174.109) 63.946 ms 18.995 ms 18.150 ms
11 x.1e100.net (74.125.224.102) 18.467 ms 17.839 ms 17.958 ms
第一跳:本地无线路由 |
|
11跳:谷歌服务器 |
在上面的例子中的数据包开始在桑尼维尔市的圣克拉拉,然后奥克兰,回到圣何塞,路由到了“529 Bryant”的数据中心,在这里,它被路由到谷歌服务器,第11跳到达了目的地。这整个过程中,平均来说,耗时18 ms。所有的事情考虑起来,情况不坏,但同时数据包也基本穿越了整个美国大陆大部分地方。
最后一英里延迟受你的ISP情况,部署技术,网络的拓扑结构,甚至一天不同时刻变化的影响。作为最终用户,如果你想提高你的网页浏览速度,降低延迟,选择本地延迟最小的ISP是一个优化的重要方法。
网络延迟而非带宽,是大多数网站的性能瓶颈!要理解其中缘由,我们需要了解TCP和HTTP协议 - 随后的章节中我们将涵盖这个主题。然而,如果你觉得好奇,可以直接跳到:“更高的带宽不是关键” 。
采用Traceroute测量延迟
traceroute程序是一个简单的网络诊断工具,它用来记录数据包的路由路径以及路由中每一跳的延迟。为了标识出路由中的每一跳,它以递增的TTL发送一个数据包序列到目标地址。当TTL达到上限,中间路由将返回一个ICMP已超时“消息,Traceroute工具用这个来衡量每个网络跳的延迟。
在Unix平台上命令行名称为traceroute ,在Windows上,命令行名称为tracert 。
核心网带宽
光纤,作为一个简单的“光管”,略粗于人的头发,用来传输的电缆两端之间的光信号。金属线也可以用来传输,但金属线有更高的信号损耗,电磁干扰,以及更高的维护成本。数据包在传输过程中可能会同时经过这两种介质,但对于任何长距离传输,光纤是不可避免的。
光纤具有明显的带宽优势,因为每个光纤可以携带许多不同的光的波长(信道),这就是波分复用(WDM)技术。因此,光纤链路的总带宽,是每个通道的数据传输速率和复用信道数量的乘积。
截至2010年初,研究人员已经研究出超过400路波长复用的技术,每个通道带宽达到171 Gbit / s,每一个光纤链路的总带宽可以超过70 Tbit/秒!我们需要成千上万的铜线(电)才能达到这个吞吐量。这并不奇怪,长距离传输,如大洲之间的海底数据传输都是通过光纤链路进行。每根电缆包含多股光纤(4股是一种常见的数),它转换成每根电缆数百T bit/s的带宽容量。
接入网带宽
骨干网,或者说光纤链路,组成互联网的核心数据路由,能够传输数百Tbit/s的数据。然而,接入网的可用容量,要少得多,而且随着不同的接入技术变化很大:拨号,DSL,有线电缆,基于主机的无线技术,光纤到户,本地路由器的性能。用户的可用带宽是在客户端与目标服务器(图1-1 )之间传输链路中,属于最低的一环。
Akamai Technologies公司经营全球性的CDN,在全球各地部署服务器,并提供免费的季度报告,表1-2显示了2013年第一季度的带宽趋势。
表1-2 Akamai的服务器上显示的2013年第一季度的平均带宽
排名 |
国家/地区 |
平均Mbps的 |
同比变化 |
- |
全球平均 |
3.1 |
17% |
1 |
韩国 |
14.2 |
-10% |
2 |
日本 |
11.7 |
− 3.6% |
3 |
香港 |
10.9 |
16% |
4 |
瑞士 |
10.1 |
24% |
5 |
荷兰 |
9.9 |
12% |
... |
|||
9 |
美国 |
8.6 |
27% |
上述数据不包括来自移动运营商的流量,我们会在后续的章节中来讨论这个话题的细节。目前来看,移动带宽变化很大,而且总体是更慢一些。然而,即使不考虑移动带宽,在2013年初全球宽带平均带宽仅为3.1 Mbps!韩国的14.2 Mbps的带宽居世界领先地位,美国排在第九位为8.6 Mbps。
为了更清楚的了解这一点,我们考虑一下高清视频流,一般需要2-10 Mbps的带宽,这依赖于视频分辨率和编码格式。因此,目前平均带宽,普通用户可以用来播放低分辨率的视频流,这已经占用了用户的大部分带宽了,如果一个家庭中有多个用户想同时看视频,基本上就属于不靠谱的故事了。
搞清楚用户的带宽瓶颈在哪里是一件不简单但很重要的工作。有许多的在线服务,如由Ookla提供的speedtest.net(图1-2 ),它提供了一些本地服务器的上行和下行速率的测试服务-我们将在TCP章节来讨论为什么挑选一个好的本地ISP这么重要。在这些服务上运行一个测试,可以很好的检查您的连接速度是否符合您当地的ISP所宣传的速度。
图1-2 上行和下行速度测试(speedtest.net)
虽然选择一个高带宽链路的ISP是必须的,但也不能保证稳定的端到端的性能。网络可能在某一个时间点由于高负荷,硬件故障,集中的网络攻击,或其他主机原因在中间任何一个节点拥塞。高吞吐量和延迟性能的变化是我们的数据网络的固有属性 - 预测,管理和适应不断变化的“网络天气”是一项复杂的任务。
更高的带宽和更低的延迟
我们对更高带宽的需求正在快速增长,在很大程度上是由于日益普及的视频流需求,目前视频流基本占到了整个互联网一半的带宽。好消息是,虽然它可能不便宜,有多种技术为我们提供增长的可用容量:我们可以在我们的光纤链路中添加更多的光纤,我们可以在拥塞的路线部署更多的链路,我们也可以改善WDM技术,让其在现有的链接中传输更多的数据。
电信市场研究和咨询公司TeleGeography估计,截至2011年,我们仅使用了部署的海底光纤链路可用容量的20%。更重要的是,在2007年和2011年之间,一半以上所有新增跨太平洋电缆是由于WDM技术升级:在相同的光纤链路的两端,可以传输更多的数据。当然,我们不能指望这些提升无限制地进行下去,因为每一个介质都会达到其收益递减点。尽管如此,只要经济允许,我们没有理由不去增加带宽 - 即使新技术都失败了,我们还可以部署更多的光纤链路。
降低延迟是另外一个不同的的故事。我们可以通过开发更低折射率的材料和更快的路由器让我们一点点接近光的速度。然而,我们目前的光纤传播速度是折射率约为〜1.5,这意味着理论上我们最多提高30%。不幸的是,我们没有办法解决物理定律 - 光速的最低延迟的硬性限制。
因此,我们不能让光信号传输更快,但我们可以使短的距离 - 地球上任意两点之间最短的距离被定义为它们之间的大圆路径。然而,新电缆不可能完全按照大圆路径来铺设,这关系到地形,社会和政治等因素,同时也受到成本的限制。
因此,为了提高我们的应用性能,我们需要基于现有带宽和光传输速率的限制设计和优化好我们的协议:减少传输路由节点,在离客户端更近的地方部署数据,在应用中通过缓存、预取和其它技术来隐藏网络的延迟。