Chrome 的秘密实验

什么?这几天 Chrome 打开网页的速度又上了一个层级,引来了其他浏览器羡慕又嫉妒的眼光,Chrome 究竟在进行什么秘密实验,互联网又将走向何方?

还能更快!

“咚咚咚” 浏览器老大的门被敲响了三次,“谁啊!”

“我!” TCP 喊道,“还有我!” HTTP 随后接道。

“进来吧,都有什么事啊?” 说着,浏览器老大放下了手头的工作。

“你来说吧!毕竟是你想到的。” TCPHTTP 说道。

“那我就不客气了!老大,还记得之前提的让请求变快的方式吗?”

“当然,首先是缓存,然后是长连接,接着你们自己还定了个 pipelining 对吧?怎么啦?难不成又有新发现!” 浏览器老大两眼开始放光。

emmm 那个 pipelining 不是很好用。不过确实,我们有新发现!这几天,我和 TCP 仔仔细细的研究了下发现还可以提升,这不是过来和你讨论讨论!” HTTP 显得有点兴奋。

回忆

故事开始在一周前。

TCP 你提的这个 pipelining 想法是美好的,但局限性太大了啊,就没有方法通用化一点吗?” HTTP 惋惜的说道。

“哎,还不是因为要把响应按你的请求顺序给你,导致服务器那边也得按顺序来返回给我结果!这就导致了前面卡住,后面的全卡住了!”

“我也没办法呀,请求是一个个过来的,我总得一个个的对应啊,就只能让他们排队啦!”

“哎,其实我也想到了,你也是没办法。” TCP 叹了口气,接着说道:“你说说,我一个数据交换中心,为什么要管顺序的问题呢?要是只管数据交换就好了,这个 pipelining 就是因为 顺序 才不好用,你想要是服务器不用管请求的顺序,直接把数据给我然后我在给你,不快的飞起吗?”

“但是,顺序很重要!” HTTP 一脸的无奈,突然间他灵光一下:“顺序!对!顺序!哈哈哈!你干嘛要管顺序呢!交给别人来管不就好了!来来来,TCP 你听我说!”

“嗯哼?我不管顺序?别人?你吗?你不是得按顺序给吗,但我不想要顺序!”

“你听我说嘛!” HTTP 兴奋的说道:“如果有人专门管理请求和响应的顺序不就好了!”

“你仔细说说。” TCP 来了兴趣。

“如果你想提升速度,顺序首先要抹杀掉对吧!”

“对,必须的!如果仅让我发送和接收数据是最好的!”

“好,假定你要怎么干,那你的上层应该是直接给你数据,然后你从服务器获取数据后,直接给你的上层对吧!”

“是啊,但我的上层不是你吗?你的 HTTP 报文是要顺序的发呀!” TCP 一脸的疑惑

“顺序只是一个概念啊!我问你,顺序是否也可以这么理解:乱序的数据排序后,就是有序的?”

“经你这么一说,确实啊!顺序是一个虚伪的概念,假定服务器把响应全给了到这边,有人帮你排好,在交给你!而我这边就只管数据的发送和接收,就能利用数据通道边发边接的能力!这样我就只管数据交互了!” TCP 开始兴奋起来,但突然间又想到了什么,说道:“不对!不对!那这样要等响应都结束了才能给到你,不更慢了吗?”

“你是不是傻?干嘛非要等响应都结束呢!既然知道排序规则,那第一个响应是那个总应该知道吧!第一个响应结束了直接给我不就好了!如果说第一个请求的响应没好,而其他请求的响应已接收完毕,那把那些资源缓存起来不就好了,反正等第一个响应给我后,我还是会用到那些资源!” HTTP 得意的说道。

“哦!对哦,这个想法实在是太妙了!那谁来处理这个排序呢?”

“这个啊,我不是很想做诶!” HTTP 看向了别处,明显不想干这个脏活。

“我也不想啊,这个实现好不容易让我只关注数据的交互,我也不来干!” TCP 反抗道:“在说了,要实现这个我还得去通知我服务器的哥们,让他也这么干才行。我可忙不过来!”

“要不,让老大新开个部门?专门处理,专人专事嘛!”

“嘿嘿,不错的想法!”

SPDY 的诞生

“老大!这就是我们想要的新部门!我们管它叫顺序层!” TCP 说道。

“呦吼!最新你们两表现的很耀眼啊!简直是浏览器界的两个新星!” 浏览器老大瞬间被他们的想法所折服:“说吧,你们想怎么干!我来协调。”

“首先,我要保证我的形式不变!” HTTP 抢先说道:“我还是把我的请求顺序的给我的下一层,也就是这个新层,其他的我就不管了!”

“老大,我也想提点要求!” TCP 在一旁举手示意。

“嗯,你说!”

“能不能直接给我二进制的数据流啊,既然要加,那就直接给我二进制流吧,我处理起来快!”

“那这层就相当于一个容器咯,HTTP 你往这个容器里直接扔数据,然后由容器将处理好的请求交给 TCPTCP 获取响应后直接丢给容器,容器内部自己组合成响应,然后在按顺序给 HTTP 是吧?” 浏览器老大想了想,接着说道:“顺序 层显得不那么专业,既然 TCP 想要通过二进制流与该容器进行沟通,这层那就叫 二进制分帧层 吧!那既然要成立这个新部门,不如现在我们仨继续畅想畅想,这个层还能干什么?”

三人陷入了沉思,不一会,HTTP 举手了。

“如果说,二进制分帧层建立了,那服务器那边应该需要实现一套与之相对应的操作,对吧?” HTTP 问道。

“当然!” TCP 说道:“因为和现有的形式完全不一样!”

“那既然双方都有对应的结构,并且 TCP 通道是长连接的话,那一些重复性的数据是不是就可以不传了?”

“恩,让我想想!” TCP 陷入了沉思。

“这样,你举个例子!” 浏览器老大在一旁说道。

“就比如说 user-agent cookie 这些请求头,因为如果是对同一域名进行请求的话,这些基本上是一样的!既然第一次给了,第二次最好不给,这些请求头有时候比请求体还要大,去掉的话,可以节省不少的网络流量!”

“对!这些请求附带的信息目前一直都会重复的被发送!” TCP 说道:“如果现在有了这层的话,这些状态完全可以保存在那里,然后两边同步状态!如果有变更,直接在通过我发一次专门修改请求头的数据就好了!但是如果要是实现同步的话,这个报文头得专门单独出来处理,通过一些算法让两边的状态保持同步。”

“那我总结总结,这个场景主要是处理报文头的对吧,解决的问题是报文头的重复发送,解决方式是双方维护相同的状态信息,如果不给则是使用之前的状态,如果给了就相当与更改某个状态!对吧!这个值得专门处理,这样吧,我们可以把报文头和报文提分开来发送,给 TCP 的数据可以分为头帧和数据帧。”

bingo ~ 老大总结的就是不一样。”

浏览器老大呵呵一笑,对 TCP 说道:“你看看他这样子,你呢,有什么想法?”

“老大,你说,有二进制分帧层的话,服务器推送是不是可以实现了啊!由于之前我给 HTTP 的数据要和他给我顺序必须要一致,因此也不能存储其他的数据资源,现在有这个二进制分帧层让他直接存下来就行啦!”

“我靠,我怎么没想到!” HTTP 明显是被这个想法给惊到了。

“服务器推送,你仔细说说!” 浏览器老大看向了 TCP

“在通道建立之后,服务器就可以推送给我数据啦,什么数据我不管啦,我都把数据给二进制分帧层就好啦!”

“别说的这么简单。举个例子!”

“就比如:用户打开了网页,这不是会产生一个 HTTP 请求嘛!我这边就会与服务器开启 TCP 数据通道,之后服务器开始返回对应的网页数据,这时,服务器其实知道后续还会有什么请求,比如说页面内的 javascript 资源,那这时候服务器直接把 javascript 资源发给我,毕竟通道还在嘛!然后存储在二进制分帧层,接下来 HTTP 会发起对该 javascript 资源的请求,二进制分帧层接到请求后,其实他早就已经开始接收 javascript 的数据,那么响应就会变快了不少,数据通道也能被充分的利用!”

“嗯,不错啊,你看看人家,这可是质的飞越啊,当然你的想法也很好!” 浏览器老大对 HTTP 说道。

SPDY

“那行,我来总结总结,你们想新开一个部门的主意,我同意了!但这个东西涉及的东西有点多,先在我们内部实现下,还有服务器那边,还需要你们去沟通一下!这部门主要实现以下几点:”

  1. 管理请求以及响应,HTTP 这边现有的方式不变,请求的顺序以及响应的封装由该部门内部实现。
  2. HTTP 请求分为头帧与数据帧,同时将对应的字节流给 TCP
  3. 保存同一域名下的报文头状态(包括请求头和响应头),同步服务器的状态信息。
  4. 保存由服务器主动推送过来的资源,当 HTTP 请求当命中该资源时,直接返回。

“以上四点,你俩看看,是不是你们需要的?”

“嗯!” TCPHTTP 同时说道。

“这一整套实现,总归得有个名字,部门叫二进制分帧层,这一整套实现我们叫他 SPDY 吧,由于涉及的比较多,我们自己内部先试用试用!”

“嗯嗯,好的!”

“还呆着干嘛呢?去看看新部门?”

“这么快你就建好了?”

“当然,谁让我是这儿的老大呢?心之所想,事之所至!但服务端的 TCPHTTP 那儿,需要你们赶紧去沟通沟通哦!还有 TCP ,这项算是实验功能,你要确保你能继续使用之前的形式处理请求哦 ~”

“那当然,必须的!” TCP 自信满满的说道。

实验

“怎么样啦,我这边已经安排好啦!” 浏览器老大晃悠到 HTTP 的手术室说道。

“都没问题啦!” TCP 回答道:“刚刚我们一起已经把计划通知到服务器那边了,现在在等他们回电话!”

“哦哦,那我也来一起等吧,二进制分帧层里我已经派了几个人过去了。” 浏览器老大晃悠到 TCPHTTP 身边。

“苍茫的天涯的是我的爱!” 电话铃声突然想起,HTTP 尴尬的接起了电话。

“老大,HTTP 这品味有点高啊,这彩铃!牛皮!哈哈哈!” TCP 大笑道。

“喂,HTTP 吗?我们这边已经弄好了,赶紧发个请求试试!” 电话里传来了兴奋的女声。

“呦呵!HTTP 你这小子!High 啊!” TCP 小声道:“快说!什么时候勾搭上的?”

“嘘,被她听到你可要挨揍了!她是个技术狂,ps:爱好跆拳道!在 HTTP 学院可是出了名的!” HTTP 小声对 TCP 说道。

“赶紧的,磨磨蹭蹭干嘛!HTTP 赶紧的!” 电话里声音变的急躁起来。

“好的好的,那我就请求下这个网页(https://blog.acohome.cn)吧。说着就把一个 HTTP 报文给丢进了一旁的通道中。”

“我已经帮你的通道接到二进制分帧层了,过去看看?” 浏览器老大说道:“看看是不是符合你们的预期!”

说话间,三人来到新建的部门,门上写着 BFBinary Framing) 两个大字,只见房间很大,隔了很多个小间,突然间其中一个小间突然蹦出了刚刚 HTTP 丢到通道中的报文。

只见其中一人略带生疏的操作了起来:拿起请求头,放进了一旁的机器,不一会出来了一段二进制流。

“你们看,这里他把请求头单独处理,那台机器就实现同步服务器报文头算法的关键,我已经和服务器那边商量过了,那边有相同的实现,出来的就是二进制流,会直接丢给 TCP,当然这台机器还对数据进行了一定的压缩。”

浏览器老大说着,里面的操作员把二进制流丢进了另一个通道中,浏览器老大接着解释道:“这个是 GET 请求,所以没有请求体,如果有请求体的话,他还会把数据处理成二进制流接着给 TCP。我们接着去看看 TCP 那边吧!”

“这里就由我来说吧!” TCP 抢过了话题,说道:“我们这里呢就比较简单了,不管他给什么,我直接发给服务器。你看那个实习生,开始工作了,三次握手,发送数据,做的不错!”

“嗯,但关键不是这个哦,等一等!” TCP 神秘的一笑。

“你们看,数据来了,按照之前说的,我这边只要把响应给二进制分帧层就 OK 了!”

“我靠,一下子来这么多响应啊!” HTTP 张大了嘴巴:“一个网页应该不需要这么多数据啊!”

“嘿嘿!你忘了我之前提的服务器推送!这些都是服务器推送过来的。” TCP 兴奋的说道:“接下来我们去看二进制分帧层吧!”

说话间,三人再次来到了二进制分帧层外。

“你看,他在组合响应,就是有点生疏。” 浏览器老大解释道,不一会 https://blog.acohome.cn 的响应被拼了出来,往一侧的通道内一扔。

“去 HTTP 哪儿吧!” 浏览器老大兴奋的说道。

“等等呀,你们看他,还在拼数据?” HTTP 有点困惑。

“等下你就知道了!先去你那儿吧!” TCP 一脸的得意。

“我那有什么好看的,无非就把响应给老大你啊!” HTTP 还是想看看屋内的人在干嘛。

“行啦,测试要紧,等下你就知道啦!” 浏览器老大说道,拎着 HTTP 走向了他的手术室。

“呐,这个就是响应的网页,老大你来解析下吧!”

“请求 jquery.jsmain.css 吧,网页解析器要用!” 浏览器老大叫来了网页解析器一顿解析。

“好嘞,发起请求!” HTTP 说着,就把请求发了出去:“我们去看看那屋,我想看看他到底在拼什么!”

“嘿嘿!” TCP 神秘的一笑,却不为所动。

“走啊,你们怎么不走!”

“你看,你的响应已经到了!”

“不可能,我才刚发出去!”

“不信你看。” TCP 往通道努了努嘴。

HTTP 扭头往通道看去,果然,两个大大的包裹已经出现。HTTP 惊的张大了嘴巴:“怎么可能!什么情况?”

“就知道刚刚在说服务器推送的时候你没仔细听!刚刚服务器一直在发送这些数据给我们,因为他们知道我们迟早会有这些请求,他就提前推了过来!”

“哦哦!服务器推送,好东西啊!我就说呢,明明网页都给我了,他怎么还在拼数据,原来是在拼之后的请求啊!厉害了! TCP 牛皮!”

“低调低调!”

“好了,完整性测试通过!SPDY 实现成功!” 浏览器老大兴奋的挥了挥手。

羡慕

午夜降临,各个浏览器开始闲了下来,这不一天一次的浏览器总结大会展开了。

Chrome 这就是你的不好了啊!” FireFox 在一旁冷冷的说道:“好东西怎么能私藏呢?”

“什么嘛!我私藏什么了?” Chrome 说道。

“我们那的 HTTP 听他服务器的哥们说了,你们那有个叫 SPDY 的东西,请求快的飞起啊!”

“哦,那个啊,这是文档,给你吧,我也没想私藏,只是试验一下可行性!这不是带来推广了嘛?”

“真的?”

“真的!但这东西需要和服务器端配合,如果说服务端没实现 SPDY 的话,那我们实现了也白搭。”

“那我们至少可以支持嘛!”

“是的,这也是我把协议具体实现带过来的原因,大家有个统一的标准服务器实现起来也简单,就能更快的推广了!”

“嗯,不错不错!” FireFox 开心的竖起来大拇指。

HTTP 2.0

“老大!老大!” HTTP 跑到了浏览器老大的办公室。

“怎么了,慌慌张张的?”

“我想把 SPDY 这一整套体系提到 HTTP 2.0 标准里!这样就算是一个公认的标准了!推广那简直是轻而易举。”

“我是没有意见,你问问 TCP 毕竟这也有他的功劳!”

“我已经问啦,他没意见呢!如果这东西能成为标准,让大家都实现的话,他也是很期待的呢!”

“行,那你提吧!”

不久后 HTTP 2.0 大会正式展开,SPDY 得到大家的充分认可,HTTP 2.0 版本充分沿用了 SPDY 的设计,世界正在向 HTTP 2.0 过渡。互联网 2.0 时代即将来临。

相关阅读

Read more

Gitlab 搭建

Gitlab 搭建

为什么? 想要自己搭建一个代码仓库无非是以下几点原因: 1. 公司内部项目 2. 自己的项目,但不适合在公网 3. 大部分的 git 仓库虽然有私有服务,但价格都不便宜,甚至不如一台云服务器来的便宜 配置及安装文档 Gitlab * 由于 gitlab 会用到 22 端口端口转发的化就走不了 git clone 的默认配置,且占用内存较高,不推荐使用 docker 进行部署; * 由于 gitlab 自带 nginx 默认情况下会与属主机的 nginx 冲突,因此推荐只使用 gitlab 自带的 nginx 进行端口转发; 最小化配置 # path /etc/gitlab/gitlab.rb external_url 'http://git.

By breeze
NPM 私服

NPM 私服

verdaccio 私服搭建,搭建过程中的一些问题以及解决: * docker compose 启动后,可能会报错:配置找不到,添加 config.yaml 文件到映射的 ./conf 目录即可,config.yaml 具体内容可在官网找到,下方也有最小化配置。 services: verdaccio: image: verdaccio/verdaccio container_name: 'verdaccio' networks: - node-network environment: - VERDACCIO_PORT=4873 - VERDACCIO_PUBLIC_URL=http://npm.demo.com ports: - '10001:4873'

By breeze