zoukankan      html  css  js  c++  java
  • Http2.0和Http3.0

    1. http2.0,或许是一个过渡协议

    a. 它兼容1.1版本,2015年左右发布,目前部分知名网站已经开始使用,它依然基于TCP协议,主要focus on performance。

    b.  很多请求都是头部很多内容,实际传输的内容很少,所以http2.0做了头部压缩。不过 HTTP/2 并没有使用传统的压缩算法,而是开发了专门的“HPACK”算法,“HPACK”算法是专门为压缩 HTTP 头部定制的算法,与 gzip、zlib 等压缩算法不同,它是一个“有状态”的算法,需要客户端和服务器各自维护一份“索引表”,也可以说是字典,压缩和解压缩就是查表和更新表的操作

    • 这里注意http2中没有请求/响应行的概念了,都抽象为虚拟头,与其他头部一起放到索引表中管理。常见的头放到静态表中,新增的头,放到动态表中。
    • 大致原理是,第一次发送请求时的“user-agent”字段长是一百多个字节,用哈夫曼(第一次这个内容还是全量的,所以需要哈夫曼编码压缩)压缩编码发送之后,客户端和服务器都更新自己的动态表,添加一个新的索引号“65”。那么下一次发送的时候就不用再重复发那么多字节了,只要用一个字节发送编号就好。

    c. 二进制方式传输,(注意这里并没有加密),它把 TCP 协议的部分特性挪到了应用层,把原来的“Header+Body”的消息“打散”为数个小片的二进制“帧”(Frame),用“HEADERS”帧存放头数据、“DATA”帧存放实体数据。

    d. 虚拟流的概念

    • HTTP/2 为此定义了一个“流”(Stream)的概念,它是二进制帧乱序的双向传输序列,同一个消息往返的帧会分配一个唯一的流 ID。多个请求对应多个流ID,从而实现多路复用的目的,所以server不需要保持多个TCP链接,server端响应能力更好,以前需要为每一个客户端维持6个TCP的状态信息,现在只需要一个即可。
    • 流还可以设置优先级,比如有些关键资源(js,css)可以优先发送
    • HTTP/2 还在一定程度上改变了传统的“请求 - 应答”工作模式,服务器不再是完全被动地响应请求,也可以新建“流”主动向客户端发送消息,一定程度的双工。
    • 多个请求对应多个流ID,不在是以前的串行发送了,可以一起发送,某个流的数据包全部收到了之后,就可以组装给上层应用使用了。某个流的数据被卡住或者丢包重串,不影响其他流,这就在应用层解决了对头阻塞的问题(注意这里TCP的阻塞依然存在)

    e. 2015年发布http2的时候,TLS1.3还没有发布,所以只要求使用使用TLS1.2以上的协议,默认比1.1要求的更高,默认需要使用https加密传输。

    注意:

    http1.1里面的一些优化手段,对于2.0来说,可能起到反作用。比如合并js,css,雪碧图等。因为过大的文件,容易导致缓存失效,其中一个单元修改了,整个缓存就得重新获取。

    更多的TCP连接,也对server端不友好,更小的资料,往往会很快会被使用,更快地给UI呈现。

    2. Http3.0,真正的下一代可靠的高速应用层通信技术

    a. http2中始终在使用TCP协议,所以无论如何都还是会有tcp传输层的对头阻塞问题,而http3彻底解决对头阻塞的问题,正式版本还没有发布。

    • 让我们从协议栈的角度来仔细看一下。在 HTTP/2 把多个“请求 - 响应”分解成流,交给 TCP 后,TCP 会再拆成更小的包依次发送(其实在 TCP 里应该叫 segment,也就是“段”)。在网络良好的情况下,包可以很快送达目的地。但如果网络质量比较差,像手机上网的时候,就有可能会丢包。而 TCP 为了保证可靠传输,有个特别的“丢包重传”机制,丢失的包必须要等待重新传输确认,其他的包即使已经收到了,也只能放在缓冲区里,上层的应用拿不出来,只能“干着急”。比如这个流有3个包,现在收到了2个包,还有一个包没有收到,就会一直等,超时后还会要求重传。
    • 在比如,这里有2个请求,就会有2个stream,我们假定他们编号是stream1,stream2,然后stream1被TCP拆分为p1-1,p1-2,p1-3,共3个包,stream2被TCP拆分出p2-1,p2-2 两个包。流拆包时可能时乱顺(可能会有优先级)给TCP传输的,比如p1-1,p1-2,p2-1,p1-3,p2-2的顺序。这样假如网络不好在传p1-3时候,一直没有收到确认收到的ACK消息,就会一直等,可能等到超时重传p1-3,这样p2-2就一直不能传输,而p2-1就只能呆在缓存区静静的等待,就导致了阻塞。

    b.  所以google又(google在web协议发展中,总是领先推出一些协议,成为既定事实后,再由标准化组织给他正名,写入RFC)重新推了QUIC协议,彻底放弃使用TCP协议,而使用基于UDP的QUIC协议。

    c. UDP协议不需要3次握手和4次挥手,所以天然比TCP协议快。

    d. 同时2018年TLS1.3版本发布,可以获取更好的加密性能。QUIC 内含了 TLS1.3,只能加密通信,支持 0-RTT 快速建连;

    e. QUIC协议自定义了连接机制,在IP地址发送变化,只要双方的通信Id没变,就会保持连接,特别适合移动互联网容易断网切网的应用场景, 不会像tcp那样不能变ip和port,如果变了就要重新建立耗时的TCP连接。

    f. QUIC自定义重传机制,由于TCP重传机制算法不够优秀,往往不准确超时时间,所以QUIC使用自增ID计算,更好的计算出了重传时间。

    g. 离开了TCP的底层重传,流之间没有依赖,包之间没有依赖,真正实现了多路复用,告诉传输数据。

    h. 自定义流量控制,采用滑动窗口协议与http2相同。

  • 相关阅读:
    PAT顶级 1024 Currency Exchange Centers (35分)(最小生成树)
    Codeforces 1282B2 K for the Price of One (Hard Version)
    1023 Have Fun with Numbers (20)
    1005 Spell It Right (20)
    1092 To Buy or Not to Buy (20)
    1118 Birds in Forest (25)
    1130 Infix Expression (25)
    1085 Perfect Sequence (25)
    1109 Group Photo (25)
    1073 Scientific Notation (20)
  • 原文地址:https://www.cnblogs.com/roy1/p/13721842.html
Copyright © 2011-2022 走看看