写在前面(可跳过)
只看多路复用的概念发现我这个脑子只是看看是不行的,须要用生动形象的例子加深记忆。
若是你也和我同样那么你能够抽出一点时间听我给你讲个小故事。
【经过我本身的理解编的,有不对的地方麻烦路过大佬指正】web
来咯
想象你在某当劳里买汉堡,柜台有个点餐员浏览器
HTTP/1.0版本
点餐员只能记住你点同样东西。
你想吃汉堡、薯条、鸡米花,你须要和点餐员说我要吃汉堡(stop,再多说点餐员记不住了(;д;)),而后点餐员去给你拿汉堡,把汉堡交给你,点餐结束。
你说点餐员我还要薯条,点餐员重复上述步骤,点餐结束。
你说点餐员我还要鸡米花,依旧重复...
...
这实在是太麻烦了,若是我须要点个公司团餐,我须要不停地点餐。
! 这个时候,一个叫keep-alive的记事本出现了
点餐的时候带着keep-alive记事本,把你想点的东西全都写上去给点餐员看,点餐员就能一次记住多样东西了
可是你每次点餐都要带着keep-alive记事本,这仍是有点麻烦服务器
HTTP/1.1版本
这个版本的点餐员自备了keep-alive记事本,当你去点餐的时候你能够两手空空的就去了。设想两个场景编辑器
-
你想吃超豪华汉堡,哦还要一瓶水,因而点餐员在记事本上写着超豪华汉堡、一瓶矿泉水。
超豪华汉堡工序复杂,可能须要一阵子才能作完。你都快渴死了,点餐员也不给你水而是和你面面相觑...
...(点餐员说我也没办法我这个记事本是无序的,我怕搞乱,仍是等着吧(。•́︿•̀。))
嗯,真的要渴死了!好气
(若是你的同事们又给你打电话说你再来两单,其中一单是一份薯条,一份鸡米花,一个冰淇淋;另外一单是...由于你的汉堡仍是没有作完,这个时候又来两单,都得等着,这称为
「队头阻塞」)
-
假如设定顾客们最大的点餐数,好比60,咱们点6单。由于点餐员一共能够处理60个,这样每单最多能够点10个吃的。
当你的记事本上密密麻麻写了20个想要点的东西时,点餐员只能给你处理10个,剩下的只能将前面点的处理完才能处理。
虽然你很崩溃可是点餐员也表示无能为力!
HTTP/2版本
鉴于前几个版本的用户体验一直不是很好,因而「多路复用」出现了。
多路复用是什么?
是为了解决前面那些麻烦状况优化
-
你想吃烤翅、超豪华汉堡、一瓶矿泉水。前两个制做过程缓慢,因而点餐员不在窗口等它们,而是去冷藏柜里给你拿了一瓶矿泉水,用帧(用来标记顺序的标识,
「二进制帧」)给你的矿泉水瓶标记一个3,而后再回窗口等别的。以后烤翅烤好了,点餐员给了你烤翅顺便用帧给你的烤翅袋上标记了一个1,紧接着汉堡也作好了,点餐员给了你一个带着2的汉堡。
! 过程当中你的同事们给你打电话叫你再下两单给他们带着,点餐员也会在过程当中尽快给你拿到已经作好的吃的。由于帧标记了你的单号、点餐顺序,即便不是按顺序出餐你也不会搞乱,固然点餐员也不会搞乱(二进制帧组成了
「流」,以保证顺序不会乱)。
-
由于上面这种优化使得你点了20个想吃的东西,由于点餐员有帧进行顺序标识,根本不用等!由于假设限定了顾客最多点60个,如今点餐员能够单单处理60个,下6单就是处理360个!比原来的效率提高了六倍! <(▰˘◡˘▰)>
这就是多路复用
解释
点餐:一个HTTP链接(三次握手四次挥手,嗯服务态度很好)
点餐员:服务器
咱们:浏览器
其余概念文中已「大写加粗」(没注意?那就再看一遍!)spa
最后
其实想要真正理解仍是须要看概念,网上有不少能够自行百度。小故事只是带你们粗略了解或是加深记忆不那么容易忘记。但愿咱们每学一个知识点都能真正的理解,熟练掌握,把别人那里学来的变成本身的。orm
本文使用 mdnice 排版ci