摘要:如今每个浏览器发起的请求都需要携带请求元数据,其中有用户代理串,缓存指令,等等。如果头键值对在请求之间无修改,那么传递的开销为字节。这就是额外开销的不易被察觉的惊人之处。
如今每个浏览器发起的请求都需要携带请求元数据,其中有用户代理串,缓存指令,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
摘要:之压缩与解压解压压缩压缩与解压工具类在实际的应用场景中,特别是对外传输数据时,将原始数据压缩之后丢出去,可以说是非常常见的一个了,平常倒是没有直接使用原生的压缩工具类,使用和的机会较多正好在实际的工作场景中遇到了,现在简单的看下使用姿 title: 180918-JDK之Deflater压缩与Inflater解压tags: JDK categories: Java JDK dat...
摘要:客户端请求头声明浏览器支持的压缩方式,服务端配置启用压缩,压缩的文件类型,压缩方式。建议设置成大于的字节数,小于可能会越压越大。 背景 如果你是个前端开发人员,你肯定知道线上环境要把js,css,图片等压缩,尽量减少文件的大小,提升响应速度,特别是对移动端,这个非常重要。 压缩 压缩方式 前端压缩的方式很多,依赖java的有ant工具,前端自己打包压缩的有grunt,gulp,webp...
摘要:客户端请求头声明浏览器支持的压缩方式,服务端配置启用压缩,压缩的文件类型,压缩方式。建议设置成大于的字节数,小于可能会越压越大。 背景 如果你是个前端开发人员,你肯定知道线上环境要把js,css,图片等压缩,尽量减少文件的大小,提升响应速度,特别是对移动端,这个非常重要。 压缩 压缩方式 前端压缩的方式很多,依赖java的有ant工具,前端自己打包压缩的有grunt,gulp,webp...
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...
阅读 2874·2021-11-24 09:39
阅读 1139·2021-11-02 14:38
阅读 4088·2021-09-10 11:26
阅读 2725·2021-08-25 09:40
阅读 2281·2019-08-30 15:54
阅读 462·2019-08-30 10:56
阅读 2711·2019-08-26 12:14
阅读 3196·2019-08-26 12:13