4.3 传输链路

经过客户端缓存的节流、DNS服务的解析指引,程序发出的请求流量便正式离开客户端,踏上以服务器为目的地的旅途了,这个过程就是本节的主角:传输链路。

可能不少人的第一直觉会认为传输链路是开发者完全不可控的因素,网络路由跳点的数量、运营商铺设线路的质量决定了线路带宽的大小、速率的高低。然而事实并非如此,程序发出的请求能否与应用层、传输层协议提倡的方式相匹配,也会对传输的效率有极大影响。最容易体现这点的是那些前端网页的优化技巧,只要简单搜索一下,就能找到很多以优化链路传输为目的的前端设计原则,譬如经典的雅虎YSlow-23条规则[1]中与传输相关的内容如下。

1)减少请求数量(Minimize HTTP Requests):请求每次都需要建立通信链路进行数据传输,这些开销很昂贵,减少请求的数量可有效提高访问性能,对于前端开发者,可用于减少请求数量的手段包括:

·雪碧图(CSS Sprite)

·CSS、JS文件合并/内联(Concatenation/Inline)

·分段文档(Multipart Document)

·媒体(图片、音频)内联(Data Base64 URI)

·合并Ajax请求(Batch Ajax Request)

2)扩大并发请求数(Split Components Across Domain):对于每个域名,现代浏览器(Chrome、Firefox)一般支持6个(IE为8~13个)并发请求。如果希望更快地加载大量图片或其他资源,需要进行域名分片(Domain Sharding),将图片同步到不同主机或者同一个主机的不同域名上。

3)启用压缩传输(GZip Component):启用压缩能够大幅度减少需要在网络上传输的内容的大小,节省网络流量。

4)避免页面重定向(Avoid Redirect):当页面发生了重定向,就会造成整个文档的传输延迟。在HTML文档到达之前,页面中不会呈现任何东西,降低了用户体验。

5)按重要性调节资源优先级(Put Stylesheet at the Top,Put Script at the Bottom):将重要的、马上就要使用的、对客户端展示影响大的资源,放在HTML的头部,以便优先下载。

……

这些原则在今天仍有一定价值,但若干年后再回头看它们,其中多数原则大概率会变成Tricks,甚至成了反模式。导致这种变化的原因是HTTP协议还在持续发展,从20世纪90年代的HTTP/1.0和HTTP/1.1,到2015年发布的HTTP/2,再到2019年的HTTP/3,HTTP协议本身的变化使得“适合HTTP传输的请求”的特征也在不断变化。

[1] YSlow-23(其实已经积累到35条了,但名字仍然叫YSlow-23):https://developer.yahoo.com/performance/rules.html。