HTTP网络协议中的HTTP Client Hints 技术

简介:

最近几年各种 Web 技术一直在爆炸式发展,每天都有大量新东西涌现出来。针对这个现象,业内两位大佬最近先后发文表达了自己的观点:Stop pushing the web forward、Is the web platform getting too big?。其实很早之前我就意识到以我目前的精力,吃透所有 Web 新技术几乎是不可能完成的任务,我关注新技术的侧重点放在了性能优化上。

今天我要向大家介绍的技术是:HTTP Client Hints,也与性能优化有关。利用这项技术,HTTP 客户端(通常可以认为是浏览器)能够主动将一些特性告诉服务端,以便服务端更有针对性地输出内容。这项技术由我们熟知的 Ilya Grigorik 提出,目前还处在较为早期的阶段,较为正式的描述文档可以在这里找到。目前 Chrome 46 (beta) 已支持它,IE 和 Firefox 则还在考虑中。

其实之前浏览器已经将很多自身特性放在 HTTP 请求中,例如下面这些头部字段:

User-Agent:提供浏览器类型及版本、操作系统及版本、浏览器内核等信息;

Accept:表明浏览器支持哪些 MIME type(例如 Chrome 通过 Accept 表明自己支持 image/webp 图片格式);

Accept-Encoding:表明本浏览器支持哪些内容编码方式(例如:gzip、deflate、sdch);

Accept-Language:表明本浏览器支持那些语言;

通过以上这些头部字段,我们已经可以针对不同客户端输出不同内容。例如本博客对支持 Webp 格式的浏览器会使用 Webp 来减少图片大小;本博客还会通过 User-Agent 针对 IE 老版本禁用 localStorage 缓存策略。

但是有一些浏览器特性,我们无法直接获取,如屏幕分辨率、设备像素比(devicePixelRatio)、用户带宽等。而在移动 Web 中,为了尽可能节省用户流量,需要输出尺寸最合适的图片资源。为了解决这个问题,常见的方案有:1)使用 JS 获取这些特性,动态拼接图片 URL;2)使用 HTML 中的 sizes 和 srcset 属性、picture 标签或 CSS 中的 image-set 属性来实现响应式图片。方案 1 很简单,这里略过;方案 2 网上有很多相关文章,不熟悉的同学可以自行搜索「响应式图片」了解下。

这里看一个使用方案 2 中提到的 picture、sizes 和 srcset 实现的响应式图片代码(via):

HTML
media="(min-width: 50em)"
sizes="50vw"
srcset="/image/thing-200.webp 200w, /image/thing-400.webp 400w,
/image/thing-800.webp 800w, /image/thing-1200.webp 1200w,
/image/thing-1600.webp 1600w, /image/thing-2000.webp 2000w"
type="image/webp">
sizes="(min-width: 30em) 100vw"
srcset="/image/thing-crop-200.webp 200w, /image/thing-crop-400.webp 400w,
/image/thing-crop-800.webp 800w, /image/thing-crop-1200.webp 1200w,
/image/thing-crop-1600.webp 1600w, /image/thing-crop-2000.webp 2000w"
type="image/webp">
media="(min-width: 50em)"
sizes="50vw"
srcset="/image/thing-200.jpgxr 200w, /image/thing-400.jpgxr 400w,
/image/thing-800.jpgxr 800w, /image/thing-1200.jpgxr 1200w,
/image/thing-1600.jpgxr 1600w, /image/thing-2000.jpgxr 2000w"
type="image/vnd.ms-photo">
sizes="(min-width: 30em) 100vw"
srcset="/image/thing-crop-200.jpgxr 200w, /image/thing-crop-400.jpgxr 400w,
/image/thing-crop-800.jpgxr 800w, /image/thing-crop-1200.jpgxr 1200w,
/image/thing-crop-1600.jpgxr 1600w, /image/thing-crop-2000.jpgxr 2000w"
type="image/vnd.ms-photo">
media="(min-width: 50em)"
sizes="50vw"
srcset="/image/thing-200.jpg 200w, /image/thing-400.jpg 400w,
/image/thing-800.jpg 800w, /image/thing-1200.jpg 1200w,
/image/thing-1600.jpg 1600w, /image/thing-2000.jpg 2000w">
sizes="(min-width: 30em) 100vw"
srcset="/image/thing-crop-200.jpg 200w, /image/thing-crop-400.jpg 400w,
/image/thing-crop-800.jpg 800w, /image/thing-crop-1200.jpg 1200w,
/image/thing-crop-1600.jpg 1600w, /image/thing-crop-2000.jpg 2000w">

这段冗长的代码只是为了实现一张响应式图片,尽管有一些夸张,实际使用时一般不会写这么全,但从中可以得到一个结论:在客户端实现的策略越多,HTML 体积就越大越冗余,可维护性和可读性就越差。

而使用了 HTTP Client Hints 之后,浏览器在页面发起子资源请求时,会通过新增的一系列头部字段带上分辨率、设备像素比、图片宽度等信息,使得各种复杂的策略可以挪到服务端去实现了。下面来看一看具体细节:

首先,有了支持 HTTP Client Hints 的浏览器之后,页面上还需要显式启用它。这是因为不是所有服务端都实现了响应式输出策略,每次都发送这些新增的头部可能会造成浪费。

与往常一样,这个功能也可以通过 HTTP 响应头和 meta 标签两种方式开启并配置:

Accept-CH: DPR, Width, Viewport-Width

或:

<meta http-equiv="Accept-CH" content="DPR, Width, Viewport-Width">

在启用了 HTTP Client Hints 的页面中,所有子资源请求(无论什么类型,无论什么方式创建),都会携带 Accept-CH 属性中所指明的头部,例如:

BASHAccept: image/webp,image/*,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,en-US;q=0.4,ja;q=0.2,de;q=0.2,zh-TW;q=0.2,cs;q=0.2,pt;q=0.2,ko;q=0.2
Connection: keep-alive
DPR: 2
Host: qgy18.imququ.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.13 Safari/537.36
Viewport-Width: 1280
Width: 128

有了这些头部,图片服务器可以知道客户端的 devicePixelRatio 是 2、图片宽度是 128px、支持 Webp 格式,所以输出 256px 的双倍 Webp 图最合适。但是浏览器怎么知道这个图片需要作为双倍图来使用呢(也就是说还是显示为 128px)?这就需要在响应头中增加下面这个字段作为 DPR 的回应:

Content-DPR: 2

需要注意的是,请求头中的 Width 字段,是根据 img 标签上的 sizes 属性算出来的。如果图片没有指定 sizes,或者图片请求是通过 JS 创建的,浏览器无法得知 Width,也就不会携带这个头部。

实际上,除了 DPR、Viewport-Width 和 Width 之外,文档还规定了两个字段,但是经过我的测试 Chrome 46 并没有支持它们,这里简单介绍下:

Downlink:用来指示当前网络的下行链路带宽,单位是 Mbps;

Save-Data:用来指示当前浏览器是否工作在省流模式之下,取值为 1 或 0;

可以看出这两个属性,也是为了尽可能给用户节省带宽而设计的。可以预见,后续还会有更多字段加到 HTTP Client Hints 协议中来。随着 HTTP/2 的普及,头部压缩使得增加几个头部字段带来的开销变得很小了。

值得注意的是,使用了 HTTP Client Hints 之后,服务端针对同一个 URL 可能会输出不同的内容,所以无论是中间节点,还是浏览器,在实现响应 Cache 时必须小心,需要针对不同的情况缓存多份内容。这需要用到 HTTP/1 中的 Vary 响应头,例如:

Vary: DPR, Width, Downlink

表明如果需要缓存这个响应,在生成缓存 Key 的时候需要将请求头中的 DPR、Width 和 Downlink 的值计算进去。

好了,HTTP Client Hints 技术就介绍到这里。很欣慰地看到,大部分 Web 新技术都是在给 HTML、CSS 和 JavaScript 增加功能和特性,而这项技术却是把之前复杂的代码和逻辑往后移,让我们的 HTML 代码能够轻装上阵。一些开源图片处理系统已经开始支持这个新特性了,国外的一些 CDN 托管服务肯定也在蠢蠢欲动,我十分期待它的未来。


作者:何妍 

来源:51CTO

相关文章
|
7天前
|
存储 安全 网络安全
云计算与网络安全的协同演进:挑战、技术与未来展望
本文深入探讨了云计算与网络安全之间的相互影响,并分析了它们在技术发展过程中所面临的挑战。通过对比分析云服务模型(如IaaS、PaaS和SaaS)与传统网络架构的安全需求,文章揭示了云计算环境中特有的安全威胁,例如数据泄露、身份盗用和服务中断。同时,文章还评估了当前信息安全技术在云环境中的应用效果,包括加密、访问控制和入侵检测系统等,并指出了这些技术在实施中的限制。最后,本文展望了云计算与网络安全的未来发展趋势,提出了加强合作、技术创新和政策制定等方面的建议,以应对不断变化的网络威胁,保障云计算环境的安全稳定运行。
|
7天前
|
SQL 监控 安全
网络安全中的安全漏洞管理与修复:技术深度剖析
【7月更文挑战第8天】安全漏洞的管理与修复是网络安全工作的重要组成部分。通过定期的安全审计、更新与补丁管理、漏洞扫描与评估、及时修复及持续监控与响应等措施,可以有效提升网络系统的安全性。然而,网络安全是一项长期而艰巨的任务,需要不断关注最新的安全动态和技术发展,持续优化安全策略和管理流程,以应对日益复杂的网络安全挑战。
|
5天前
|
云安全 安全 网络安全
云计算与网络安全:技术挑战与未来方向
【7月更文挑战第10天】 随着信息技术的飞速发展,云计算已成为企业和个人数据存储、处理的首选平台。然而,云服务的普及也带来了前所未有的网络安全挑战。本文将深入探讨云计算在提供灵活性和可扩展性的同时,如何应对日益复杂的网络安全威胁。我们将分析当前云服务中存在的安全漏洞,讨论最新的防御策略,并展望未来云计算安全技术的发展趋势。通过案例分析和专家访谈,本文旨在为读者提供一个全面的云计算安全现状和未来展望的视角。
|
5天前
|
SQL 存储 安全
网络安全与信息安全:防御前线的关键技术与策略
【5月更文挑战第70天】在数字化时代,网络安全和信息安全已成为维护网络空间主权和个人隐私的核心要素。本文将深入探讨网络安全漏洞的成因、加密技术的最新进展以及提升安全意识的有效方法。通过对这些关键点的分析,旨在为读者提供一套全面的网络防御策略,以应对不断演变的网络威胁。
|
1天前
|
存储 安全 网络安全
云计算与网络安全:技术进展与挑战
在当今数字化转型的浪潮中,云计算技术作为信息技术领域的重要创新,正日益成为各行各业信息化的关键基础设施。本文探讨了云计算在网络安全和信息安全方面的关键技术,分析了其应用中面临的挑战及未来发展趋势,旨在为读者提供对这一技术领域的深入理解。 【7月更文挑战第14天】
10 3
|
1天前
|
机器学习/深度学习 安全 网络安全
云计算与网络安全:技术融合的未来
【7月更文挑战第14天】在数字化浪潮的推动下,云计算已成为现代信息技术的核心。然而,伴随其快速发展的同时,网络安全问题也日益凸显。本文将深入探讨云计算服务中的网络安全挑战,并分析信息安全技术如何为云环境提供保护。通过案例分析和最新研究,我们将揭示云计算和网络安全之间的协同效应,以及它们如何共同塑造未来的技术景观。
|
2天前
|
存储 安全 网络安全
云计算与网络安全:云服务、网络安全、信息安全等技术领域的融合与挑战
【7月更文挑战第13天】在当今信息化社会,云计算作为一种新兴的技术,为我们的生活带来了诸多便利。然而,随之而来的网络安全问题也日益凸显。本文将从云服务、网络安全、信息安全等方面,探讨云计算在带来便利的同时,如何应对网络安全的挑战。
|
2天前
|
存储 安全 物联网
云计算与网络安全:技术进展与挑战
在当今数字化快速发展的时代,云计算作为重要的信息技术基础设施,已经深刻影响着各行各业的运作方式。本文探讨了云计算技术的最新进展,以及在这一背景下网络安全面临的挑战与应对策略。通过分析云服务的发展趋势、网络安全的关键问题以及信息安全的重要性,帮助读者更好地理解和应对当前技术环境下的挑战。 【7月更文挑战第13天】
|
4天前
|
JSON 网络协议 数据格式
网络协议基础:HTTP请求与响应详解
【7月更文挑战第11天】HTTP协议作为Web通信的核心,其请求与响应机制是理解网络通信的关键。本文详细介绍了HTTP请求与响应的格式、过程以及常用的请求方法,帮助读者更好地理解HTTP协议的工作原理和应用场景。在实际应用中,HTTP协议的可定制性和灵活性使其能够适应多种
|
3天前
|
存储 安全 网络安全
云计算与网络安全:技术融合与挑战
随着信息技术的飞速发展,云计算已成为企业和个人存储、处理数据的首选方式。然而,随之而来的网络安全问题也日益凸显。本文将深入探讨云计算环境下的网络安全挑战,分析云服务模型中的安全风险,并提出相应的信息安全策略。通过对比传统网络环境与云计算环境的安全差异,揭示云计算特有的安全威胁,并讨论如何通过技术和政策手段加强安全防护。文章旨在为读者提供云计算与网络安全交叉领域的全面视角,促进更安全的云计算应用环境的构建。