在我们的互联网世界中,HTTP协议是使用最广泛的网络协议。最近,http2.0的诞生让它再次成为互联网技术圈的焦点。一切事物的消逝和重生都有其背后的驱动力。对于HTTP来说,这种力量的复杂性是各种技术细节的进化,简单来说就是用户体验和感知的进化。用户总是希望网络上的信息能尽快到达眼球,越快越好。正是这种对“快”的追求,催生了今天的http2.0。
1.http 2.0的前世
http2.0的前几代是http1.0和http1.1,虽然之前只有两个版本,但是这两个版本包含了庞大的协议规范,这足以让任何一个有经验的工程师头疼。Http1.0诞生于1996年,协议文档长达60页。之后的第三年,http1.1诞生,协议文档扩展到176页。但是,与我们的移动应用升级不同,新版本的网络协议不会立即取代旧版本。其实1.0和1.1已经共存很久了,这是网络基础设施更新缓慢决定的。今天的http2.0也是如此。新版本的协议再好,也需要经过行业产品的锤炼,基础设施需要年复一年的升级才能普及。
1.1 HTTP高于TCP
在了解http协议之前,必须对TCP有一定的基础了解。HTTP是基于TCP的,而TCP作为传输层协议,离应用层并不远。HTTP协议的瓶颈及其优化技巧是基于TCP协议本身的特点。例如,当TCP建立连接时,三次握手的延迟为1.5 RTT(往返时间)。为了避免每次请求时握手造成的延迟,应用层会选择不同策略的http长链接方案。例如,TCP在连接建立的初始阶段具有启动慢的特点,因此连接重用总是比新连接性能更好。
1.1 HTTP应用场景
http诞生之初,主要应用于web内容获取。当时的内容没有现在丰富,排版也没有现在这么漂亮,用户互动的场景也很少。对于这个获取网页内容的简单场景,http的表现相当不错。但是随着互联网的发展和web2.0的诞生,更多的内容开始显示(更多的图片文件),排版变得更加美观(更多的css),引入了更复杂的交互(更多的js)。打开网站主页时,用户加载的数据总量和请求数量也在增加。如今,大多数门户网站的主页规模将超过2M,请求数量可达100个。另一个广泛使用的应用是移动互联网客户端应用,不同类型的应用对http的使用是不同的。对于电子商务应用程序,加载主页的请求可能多达10个。对于微信等IM,http请求可能仅限于下载语音和图片文件,请求频率不高。
1.2因延迟而变慢
影响网络请求的主要因素有两个:带宽和延迟。如今的网络基础设施大大提高了带宽,很多时候,延迟会影响响应速度。Http1.0被投诉两个问题:连接不能重用,线头阻塞。要理解这两个问题,有一个非常重要的前提:客户端根据域名建立与服务器的连接。一般PC浏览器会同时与单个域名的服务器建立6 ~ 8个连接,而手机上的连接数一般控制在4 ~ 6个。显然,连接数并没有尽可能多,资源开销和整体延迟也会相应增加。
连接不能被重用,这将导致三次握手和每个请求的启动缓慢。三次握手在高延迟场景下影响明显,启动慢对大文件请求影响较大。
线头阻塞将导致带宽未被充分利用,并且随后的健康请求被阻塞。假设同时发出五个请求,如下图所示:
对于http1.0的实现,在第一个请求没有收到回复之前,从应用层发送的后续请求只能排队,请求2、3、4、5只能在请求1的响应回来之后,一个一个发送。网络畅通时,性能影响不大。一旦请求1的请求因故未能到达服务器,或者由于网络拥塞导致响应未能及时返回,后续的所有请求都会受到影响,问题会变得更加严重。
1.3解决连接不能重用的问题
您可以在http1.0协议头中设置Connection:Keep-Alive。在头部设置Keep-Alive可以在一定时间内复用连接,具体复用时间由服务器控制,一般在15s左右。在http1.1之后,连接的默认值是保持活动状态。如果要关闭连接重用,需要显式设置Connection:Close。一段时间内的连接复用对PC浏览器的体验很有帮助,因为大部分请求都集中在短时间内。但是对于移动应用来说,效果并不大,应用端的请求比较分散,时间跨度也比较大。因此,移动应用一般会从应用层寻求其他解决方案,如长连接解决方案或伪长连接解决方案:
方案一:基于tcp的长链路
现在越来越多的移动应用