APP下载

通过HTTP/2快速、安全地冲浪

2015-06-17

CHIP新电脑 2015年6期
关键词:报头数据流浏览器

HTTP是一个落后的网络协议,无法适应目前的网络应用环境,它既不安全,也无法充分利用带宽。通过新一代的HTTP/2标准就可以解决这些问题,目前所有主流的浏览器都已经支持这一新的标准。

每个人都曾经通过在浏览器地址栏中输入以“http://”开头的地址来访问过网站,被称为“万维网之父”的蒂姆·伯纳斯-李(Tim Berners-Lee)1991年第一次通过互联网实现网站通讯时也是如此。输入HTTP开头的地址访问网站,代表着浏览器将使用超文本传输协议和服务器连接,这是现在我们访问互联网站点的基础。目前该协议的最新版本为1.1版,而这个所谓的最新版本只是在1999年进行了一些零星优化的版本,该协议的主要缺点皆没有被修正,明显很难适应目前越来越复杂的网络应用环境。

15年前的网站结构通常都非常简单:HTML代码和一两个图像,仅此而已。而时至今日,构成网站的对象数量已经大幅增长。除了大量的图像文件和视频、音频文件之外,还有大量需要浏览器分析的JavaScript文件以及确定页面上HTML元素显示方式的层叠样式表(CSS)。而15年来从来就没有为此进行适当调整的HTTP 1.1协议完全无法有效地传输这种结构复杂的网页。其后果是,浏览器和网站之间的HTTP通信经常出现空转,浏览器打开网页的速度比实际可以实现的速度慢得多。无论网络的下行速度是5Mb/s还是20Mb/s,速度的提高对于浏览器打开网站的速度并没有产生影响。

新版本的HTTP/2协议可以解决这一问题,在支持HTTP/2的浏览器上将可以实现浏览器与网站服务器之间的实时交互,减少服务器的响应时间,明显可以加快打开网页的速度。

HTTP 1.1阻碍互联网发展

现在是时候推行新的HTTP协议了,1.1版本的问题根深蒂固,与传输控制协议的交互过程从一开始就已经存在着严重的问题。TCP负责数据包的传输工作,能够灵活地处理路由器超载拒绝数据包和数据包传输出现错误等问题。因而,当浏览器需要与网站建立连接并传输数据时,最佳的方式是建立一个TCP连接,并一直通过该连接不断地传输数据。

然而,HTTP 1.1协议的通信模式极其简单,该协议在网络通信的过程中建立了TCP许多不必要的连接:当浏览器请求访问一个网站并且得到网站服务器的响应时,浏览器将首先发出一个GET命令,请求目标地址的索引HTML文件,服务器将浏览器需要的HTML文件发送给浏览器,浏览器分析该文件,并根据HTML代码中的内容,请求所有其他的相关文件,例如网页的图像、图标、字体、音频、视频、样式表和脚本,为了加快速度,浏览器将打开8个并行的TCP连接,同时加载各种对象,为每个对象建立连接,然后发送GET命令。

这将导致严重的问题,因为每一个TCP连接都需要经过协商、握手等过程建立连接,然后服务器才能够将数据发送到通过HTTP协议访问的浏览器。在浏览器尝试获取的对象数目较多的情况下,大量的连接将导致服务器负载过大,连接的质量将受影响,出现响应时间延迟等问题。另外,在浏览器获取大量的数据后,未必能够马上进行处理,因为浏览器可能仍在处理前一批数据中需要大量计算的数据,例如运行脚本程序。任务将逐渐堆积起来,这就是所谓“线头堵塞(Head of Line)”。如果TCP数据包在传输过程中丢失,那么浏览器需要再次请求发送这些数据包,这个问题更是雪上加霜。

有几个技巧可以降低HTTP 1.1这一缺陷的影响。首先网页制作人员可以尽量用一个大的图片代替多个小图像,其次可以将CSS代码和JavaScript脚本直接嵌入到网页中,尽可能地减少HTTP请求的数量。类似的措施可以减少连接的数量,但是在一些情况下却又可能增加线头堵塞的概率。例如,当人们浏览新闻网站并希望通过刷新来加载新的内容时,因为HTTP1.1只有在浏览器中可以触发重新加载而不允许服务器将数据主动推送到浏览器,所以在这种情况下HTTP1.1需要一个新的请求建立TCP连接,服务器再次执行完整的文件传输。而理想的情况应该是服务器只将已改变的代码发送到浏览器,而这只有在HTTP/2中才有可能实现。

HTTP/2协议的推送选项

新版本的HTTP协议旨在解决1.1版本存在的问题,对于上面我们提到的问题,在浏览器和服务器之间新协议采取了不同的通信方式:当浏览器与服务器的连接建立后,不再是只有浏览器可以请求数据,服务器也可以推送数据到浏览器上。这不仅能够更快地加载网站的刷新内容,而且在首次访问网站时的加载速度同样能够有所提高。

和HTTP1.1一样,HTTP/2开始时也建立一个TCP来连接传输数据,但此后则采用不同的方法。HTTP/2将从这个单一的连接中传输全部数据,由于服务器能够推送数据,所以浏览器不再需要根据网页的代码请求脚本文件和样式表,服务器将把它们发送到浏览器。这种机制减少了大量往返的请求和连接,消除了线头堵塞的隐患。由于新协议的定义围绕着数据包的结构,所以通过HTTP/2的复用功能,浏览器可以提供已经建立的连接发送新的请求,服务器将继续通过该连接发送数据包到浏览器。而HTTP 1.1无法做到这一点,每个分组具有文本格式的标题以及随后的主体与内容。

HTTP/2只建立一个连接,通过它的数据流可以不中断地传输数据,并且浏览器与服务器之间可以打开任意数量的数据流同时发送数据,经由这些数据流传输往返的数据。流传输的可以是任意文件类型的文件,每个数据流通过接收号码来识别,来自不同数据流的数据可以由服务器进行混合,传输到浏览器之后再进行编译。

首先传输重要数据

更重要的是HTTP/2为每一个数据流设置了优先级别,在HTTP 1.1,浏览器并不知道哪些数据是快速勾画一个网站最重要的数据,该协议不发送任何有关这方面的信息。它唯一进行分析的是HTML代码中需要哪些样式表和脚本文件,而HTTP/2的所有数据流都有优先级别,所以浏览器可以首先处理具有最高优先级的数据流。通过HTTP/2的这个“小把戏”,上面曾经提到的嵌入代码等网页制作技巧已经不再需要。

在数据流中,所有数据被打包成一个一个的消息来发送,每一个消息又被分成若干帧。每一个消息由头部帧以及随后的数据帧组成,消息可以传送文件、请求和信息,因此,一个消息可以包含多个帧,也可以只包含一个帧,并具有数据流的优先级别。HTTP/2还可以通过标准定义的数十种类型的控制帧交换信息,可以通过它们调节数据流,例如传递服务器的信息或者报告浏览器正忙而无法处理更多的数据流。

减少不必要的开销

HTTP 1.1的报头数据量较大,每次传输需要占用500至800个字节,如果再加入Cookie,报头尺寸将快速增长到几千个字节。这将是一个非常大的额外开销,尤其是在传输的对象比较小的情况下,例如本身只有几KB的图标。此外,HTTP报头频繁重复一些不必要的旧信息,例如地址、日期或连接信息等基本上都是多余的,因为浏览器和服务器在第一次建立连接时已经获得了这些信息。除此之外,目前HTTP的报头仍采用文本格式,并且没有经过压缩,这又造成了更多不必要的额外开销。而HTTP/2报头在压缩后通过二进制代码发送,在二进制代码中,规定哪些字节包含报头信息,软件可以更轻松地对其进行分析。HTTP/2同时还避免了频繁传输重复信息的问题:浏览器和服务器将维护一个已经收到的报头信息表,传输的只有新的信息。

HTTP/2标准正式成为全面应用的互联网规范可能还需要几年的时间,但是它的实施进展非常迅速。Google已经走在前列:该公司一直致力于HTTP协议的更新换代,5年前,Google已经推出了一款名为SPDY的Web协议,这也是目前HTTP/2的基础。在2013年,互联网工程任务组(IETF)已经采用SPDY 2.0作为新HTTP协议第一稿的模板。2014年11月15日IETF发布了HTTP/2草案,并在2015年年初提交最终版本。

目前,所有主流的浏览器已经开始支持新的标准。如果我们使用最新的Chrome或Firefox的版本,可以使用SPDY协议进行浏览,也可以手动激活HTTP/2。我们也可以在Windows 10预览版的Internet Explorer 11中使用HTTP/2,而其他Windows版本也将可以从微软已经筹备很长时间的Internet Explorer 12中使用HTTP/2。与此同时,苹果也终于在Safari 8中开始支持SPDY,因为很多流行的Web服务正计划切换到HTTP/2协议。

自动升级到HTTP/2

不过,切换到HTTP/2的服务器目前仍比较少,其结果是,浏览器即使激活HTTP/2,首次联系远程站点时也需要使用HTTP 1.1,在条件允许的情况下,再执行协议的升级。目前,浏览器使用一个加密的HTTPS连接用于请求升级,通过应用层协议谈判(ALPN)激活HTTP/2。如果成功升级到HTTP/2,那么将可以获得更快和更安全的浏览速度。新的协议接下来也将可以用于未加密的连接,越来越多的浏览器可以通过旧的HTTP 1.1协议提供一种升级机制。在这种机制下,浏览器将在首次联系服务器时发送一个请求改变HTTP版本的报头,如果服务器接受请求,那么接下来将自动从HTTP 1.1切换到HTTP/2。

切换到HTTP/2的小网站目前数量相对比较少,但是热门的Web服务对此都很重视。除了Google以外,Twitter和Facebook也已经切换到HTTP/2,或者至少开始支持SPDY 3.1。这是因为HTTP/2不仅有利于用户,由于服务器不必再应付大量额外的TCP连接请求的轰炸,所以服务器的负载也将大幅降低。目前,主要的服务器系统也都已经支持HTTP/2,其中包括Apache和Nginx等开源系统。除此之外,接下来的Java版本也将支持HTTP/2。

作为用户,我们可以在浏览网站的过程中,通过浏览器的开发工具查看和分析数据传输,了解当前的网站是否成功通过HTTP/2或SPDY连接。但是即使已经成功切换到HTTP/2,目前,大部分网站仍然无法为用户提供应有的快速体验。这是因为要发挥HTTP/2应有的性能,网站开发人员还需要调整自己的网站。现如今的商业网站大多通过很多外部来源加载代码,浏览器需要为每一个来源建立新的TCP连接,对于原本就需要为每一个对象建立连接的HTTP 1.1来说没有什么不同,不会因而出现延迟,但是对于已经优化了的HTTP/2,将无法充分发挥其通过一个连接接收一切数据的功能。因而,用真正切换到HTTP/2并充分体验新协议所带来的性能提升,还有许多事情需要做,需要很多的时间。不过,这并不奇怪,毕竟HTTP/2是一个全新的协议。

猜你喜欢

报头数据流浏览器
汽车维修数据流基础(下)
城市党报报头:政治与艺术的平衡
反浏览器指纹追踪
一种提高TCP与UDP数据流公平性的拥塞控制机制
环球浏览器
再见,那些年我们嘲笑过的IE浏览器
基于数据流聚类的多目标跟踪算法
淡妆浓抹总相宜
——对中国晚报报头变化的研究与欣赏
北医三院 数据流疏通就诊量
IP语音报头压缩设计与实现