资讯专栏INFORMATION COLUMN

http2-head compression

stormgens / 3049人阅读

摘要:如今每个浏览器发起的请求都需要携带请求元数据,其中有用户代理串,缓存指令,等等。如果头键值对在请求之间无修改,那么传递的开销为字节。这就是额外开销的不易被察觉的惊人之处。

如今每个浏览器发起的请求都需要携带请求元数据,其中有用户代理串,缓存指令,cookie等等。没有压缩的http head 经常需要几K字节来承载才可以。

为了降低这个开销,做了如下的改进

定义一个头表(head table),在客户端和服务器两端都有,并用于跟踪每次传递的键值对。

在整个连接期间,head table都持续存在,增量更新

每个键值对要么添加到存在的表内,要么修改之前的值

这样做了之后,发送方就可以把当前发送的Request head和head table(上次的request head)对比,获知两者的差异,并且发送差异;接收方获得差异,和自己方的head table比对,拼出完整的请求头。

来个例子。

假设上次传递的http head:

 method:get
 path:/1
 scheme:https
 user-agent: curl/7.28.1
 host: www.gravatar.com
 Accept: */*

本次传递的http head:

 method:get
 path:/2
 scheme:https
 user-agent: curl/7.28.1
 host: www.gravatar.com
 Accept: */*

那么,在服务器和客户端都在head table 中记录了第一个请求的情况下,第二次请求只要发送一个多带带的path,两端就可以解析出它本来的http head。

优化的效果下来,特别是对于公用的、在整个连接期间很少变化的键值对(user-agent,accept header..)只要传递一次。如果头键值对在请求之间无修改,那么传递的开销为0字节。

这就是http2引入head table的目的


对于某些应用来说,这些开销会成为瓶颈,比如api驱动的web应用:

visit:

http://ip.jsontest.com/?callback=showMyIP

Requst header

GET http://ip.jsontest.com/?callback=showMyIP HTTP/1.1
Host: ip.jsontest.com
Proxy-Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2
RA-Ver: 2.8.9
RA-Sid: DDED9CF3-20140806-053044-2b1b59-a2635f

query string:

callback=showMyIP

Response head:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Content-Type: application/javascript; charset=ISO-8859-1
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Mon, 23 Mar 2015 07:44:50 GMT
Server: Google Frontend
Cache-Control: private
Content-Length: 52
Alternate-Protocol: 80:quic,p=0.5,80:quic,p=0.5

Respone:

showMyIP({"ip": "45.56.92.8"});

作为Respone的json比起Header来说要小得多。

这就是额外开销的不易被察觉的惊人之处。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/49564.html

相关文章

  • 180918-JDK之Deflater压缩与Inflater解压

    摘要:之压缩与解压解压压缩压缩与解压工具类在实际的应用场景中,特别是对外传输数据时,将原始数据压缩之后丢出去,可以说是非常常见的一个了,平常倒是没有直接使用原生的压缩工具类,使用和的机会较多正好在实际的工作场景中遇到了,现在简单的看下使用姿 title: 180918-JDK之Deflater压缩与Inflater解压tags: JDK categories: Java JDK dat...

    chemzqm 评论0 收藏0
  • 前端性能优化之gzip

    摘要:客户端请求头声明浏览器支持的压缩方式,服务端配置启用压缩,压缩的文件类型,压缩方式。建议设置成大于的字节数,小于可能会越压越大。 背景 如果你是个前端开发人员,你肯定知道线上环境要把js,css,图片等压缩,尽量减少文件的大小,提升响应速度,特别是对移动端,这个非常重要。 压缩 压缩方式 前端压缩的方式很多,依赖java的有ant工具,前端自己打包压缩的有grunt,gulp,webp...

    张利勇 评论0 收藏0
  • 前端性能优化之gzip

    摘要:客户端请求头声明浏览器支持的压缩方式,服务端配置启用压缩,压缩的文件类型,压缩方式。建议设置成大于的字节数,小于可能会越压越大。 背景 如果你是个前端开发人员,你肯定知道线上环境要把js,css,图片等压缩,尽量减少文件的大小,提升响应速度,特别是对移动端,这个非常重要。 压缩 压缩方式 前端压缩的方式很多,依赖java的有ant工具,前端自己打包压缩的有grunt,gulp,webp...

    Nino 评论0 收藏0
  • [LintCode] String Compression

    String Compression Implement a method to perform basic string compression using the counts of repeated characters. For example, the string aabcccccaaa would become a2b1c5a3. If the compressed string w...

    Cruise_Chan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<