一则小故事带你了解HTTP/2的多路复用,加深记忆想忘都难(假的)

584 阅读4分钟

写在前面(可跳过)

只看多路复用的概念发现我这个脑子只是看看是不行的,需要用生动形象的例子加深记忆。
如果你也和我一样那么你可以抽出一点时间听我给你讲个小故事。
【通过我自己的理解编的,有不对的地方麻烦路过大佬指正】

来咯

想象你在某当劳里买汉堡,柜台有个点餐员

HTTP/1.0版本

点餐员只能记住你点一样东西。
你想吃汉堡、薯条、鸡米花,你需要和点餐员说我要吃汉堡(stop,再多说点餐员记不住了(;д;)),然后点餐员去给你拿汉堡,把汉堡交给你,点餐结束。
你说点餐员我还要薯条,点餐员重复上述步骤,点餐结束。
你说点餐员我还要鸡米花,依旧重复...
...
这实在是太麻烦了,如果我需要点个公司团餐,我需要不停地点餐。
! 这个时候,一个叫keep-alive的记事本出现了
点餐的时候带着keep-alive记事本,把你想点的东西全都写上去给点餐员看,点餐员就能一次记住多样东西了
但是你每次点餐都要带着keep-alive记事本,这还是有点麻烦

HTTP/1.1版本

这个版本的点餐员自备了keep-alive记事本,当你去点餐的时候你可以两手空空的就去了。设想两个场景

  1. 你想吃超豪华汉堡,哦还要一瓶水,于是点餐员在记事本上写着超豪华汉堡、一瓶矿泉水。
    超豪华汉堡工序复杂,可能需要一阵子才能做完。你都快渴死了,点餐员也不给你水而是和你面面相觑...
    ...(点餐员说我也没办法我这个记事本是无序的,我怕搞乱,还是等着吧(。•́︿•̀。))
    嗯,真的要渴死了!好气
    (如果你的同事们又给你打电话说你再来两单,其中一单是一份薯条,一份鸡米花,一个冰淇淋;另一单是...因为你的汉堡还是没有做完,这个时候又来两单,都得等着,这称为队头阻塞
  2. 假如设定顾客们最大的点餐数,比如60,我们点6单。因为点餐员一共可以处理60个,这样每单最多可以点10个吃的。
    当你的记事本上密密麻麻写了20个想要点的东西时,点餐员只能给你处理10个,剩下的只能将前面点的处理完才能处理。
    虽然你很崩溃但是点餐员也表示无能为力!

HTTP/2版本

鉴于前几个版本的用户体验一直不是很好,于是多路复用出现了。
多路复用是什么?
是为了解决前面那些麻烦情况

  1. 你想吃烤翅、超豪华汉堡、一瓶矿泉水。前两个制作过程缓慢,于是点餐员不在窗口等它们,而是去冷藏柜里给你拿了一瓶矿泉水,用帧(用来标记顺序的标识,二进制帧)给你的矿泉水瓶标记一个3,然后再回窗口等别的。之后烤翅烤好了,点餐员给了你烤翅顺便用帧给你的烤翅袋上标记了一个1,紧接着汉堡也做好了,点餐员给了你一个带着2的汉堡。
    ! 过程中你的同事们给你打电话叫你再下两单给他们带着,点餐员也会在过程中尽快给你拿到已经做好的吃的。因为帧标记了你的单号、点餐顺序,即使不是按顺序出餐你也不会搞乱,当然点餐员也不会搞乱(二进制帧组成了,以保证顺序不会乱)。
  2. 因为上面这种优化使得你点了20个想吃的东西,因为点餐员有帧进行顺序标识,根本不用等!因为假设限定了顾客最多点60个,现在点餐员可以单单处理60个,下6单就是处理360个!比原来的效率提升了六倍! <(▰˘◡˘▰)>
    这就是多路复用

解释

点餐:一个HTTP连接(三次握手四次挥手,嗯服务态度很好)
点餐员:服务器
我们:浏览器
其他概念文中已大写加粗(没注意?那就再看一遍!

最后

其实想要真正理解还是需要看概念,网上有很多可以自行百度。小故事只是带大家粗略了解或是加深记忆不那么容易忘记。希望我们每学一个知识点都能真正的理解,熟练掌握,把别人那里学来的变成自己的。

本文使用 mdnice 排版