最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • http/2 学习笔记

    正文概述 掘金(strongcode)   2021-02-28   784

    http/2 学习

    自己对于http/2 的理解还停留在面试死记硬背的水平,所以最近对自己心中一些疑问以及自己的理解做一个总结,这些总结可能会有错误。如果有大佬觉得哪里有什么问题,可以直接说出。

    http/2 的完整介绍很多。珠玉在前:http/2 简介 ,就不在赘述了。

    问题一: http/2 为什么要使用二进制分帧层

    二进制协议的理解:

    对于这个问题,我们首先就要搞清楚什么http1.1的文本协议和htt/p2的二进制协议的不同了。其实我作为一个基础并不牢固的搬砖工,当看到这个二进制的时候我就在想:在计算机世界当中所有的内容不都是二进制吗?为什么还要有二进制以及文本协议之分呢?

    带着这个问题,我在网上找到了一些回复,就直接搬下来吧

    四级低空略过水平的翻译:

    二进制协议和文本协议的区别并不是关于二进制blob是如何编码的。关键在于协议是以数据结构为导向还是以文本字符串为导向。

    文本协议请求:其中所有的内容都是文字

    http/2 学习笔记

    二进制请求:

    struct request {
      int requestType;
      int protocolVersion;
      char path[1024];
      char user_agent[1024];
      char host[1024];
      long int accept_bitmask;
      long int language_bitmask;
      long int charset_bitmask;
    };
    

    当我们看到http文本协议以及二进制请求的结构之后:

    • 二进制协议比文本协议更加紧凑。
    • 文本协议解析是需要特殊字符的,比如\r\n,一方面造成了文本协议更加冗长,另一方面使用这种特殊字符解析一段文字的方式,没有二进制解析方便快捷。
    • 二进制协议中的数字比文本中的数字占用空间更小:比如http中状态码200,在文本协议中是 "2" "0" "0",这三个数字要分别用编码表示的,但是在二进制协议中,不用将数字编码成文本格式,直接用二进制表示数字就可以了: 11001000 。

    http/2中的二进制分帧层

    参考文章

    _ 在许多文章中,都说http/2中的二进制分帧层,是http/2性能提升的关键,它给一个tcp链接同时发送多个请求提供了可能。

    http/2 学习笔记

    HTTP/1.1和HTTP/2都是基于TCP的协议,TCP模型是双向数据流,任何在一个TCP连接上处理超过一个请求的协议都需要解决这样两个问题:

    1. 分片——如何将流中的多个请求和响应拆分成独立的消息
    2. 对应——如何将请求和响应对应起来

    在这两个问题中,我觉得第二个往往会让人忽略,就是在http1.1 中,一个tcp请求只能同时完成一个请求响应过程,所以请求以及响应天生一一对应,不存在响应和请求无法匹配的问题。但是当我们打开抓包工具查看相应的相关http报文的时候,会发现其实响应是没有一个字段去和请求一一对应的。这就给http/2的多路复用带来了问题,一个tcp连接中多个请求,多个响应,那么如何将这些响应和请求一一对应呢?只能在二进制分帧层添加字段了,所以在http/2帧的报文格式中,有一个字段是Stream Identifier,这个流ID可以将响应和请求一一对应。这个根本解决了多路复用,请求以及响应匹配的问题。

    所以给这个问题来一个总结吧:

    • 二进制协议比文本协议更加紧凑,减少占用空间。
    • 分帧层相当于将http切分,更加灵活,比如可以对header帧做单独的特殊处理。
    • 分帧层有着属于自己的报文头,其中的Stream Identifier 使得操作系统具备将多个响应以及请求一一匹配的能力,这个是http/2 性能提升的关键,也就是多路复用。
    • 二进制分帧层存在的意义是将请求或响应切分,可以更加灵活处理。分帧层定义的报文格式,例如Stream Identifier等,直接关乎http/2 的各种优化方案的实现。

    问题二:tcp与http/2的帧的关系

    在http/2中帧是最小通信单位,我的问题是http/2 中的帧和最小的tcp数据包是什么关系,一一对应的吗?在http/2 的请求中,tcp是如何拆分以及组装消息的?

    很多面试题中多路复用的解释

    其中的解释如下:

    下面的解释当中,并行交错的请求和响应。其实这个并行请求应该具体为并行http请求,那么tcp可以将请求拆分并行请求吗?

    这个就要从tcp如何组装以分拆http报文说起了,

    我们假设有两个post请求并行进行请求:

    http/2 学习笔记

    如果TCP协议层面并行请求,并将顺序打乱,这样可以吗? http/2 学习笔记

    在我看来其实这是不可以的,因为tcp协议是完全按照顺序组装数据包的,如果并行请求并将数据包顺序打乱,那么计算机将不知道如何组装这些数据包。

    所以上面的并行请求是不准确的,在计算机内部一定是串行请求,发完一个请求的数据包,在发送下一个请求的数据包,这样才能保证数据包组合正确。

    所以http/2中的帧,是按照顺序串行请求的,如果不是这样,数据将无从组装,一一对应。 http/2 学习笔记

    总结一下吧:

    • http/2中的帧是最小通信单位,但这仅仅是在http/2这一协议层。一个http/2中的帧,如果信息过多,可能是由多个tcp拆分组成,所以http/2中的帧概念,并不是一一对应网络协议中的一个数据包。
    • 一个或多个tcp报文组成一个帧,一个或多个帧组成一个http/2的请求或者响应。
    • http/2 一个tcp链接不存在并行传输,是串行传输,发送完一个帧的数据包,再发送下一个帧的相关数据包。

    如果有哪些地方理解不到位,请不吝赐教


    起源地下载网 » http/2 学习笔记

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元