Http的1.0\2.0\3.0区别

Posted on 2022-03-04 23:32  AcTourist  阅读(1378)  评论(0编辑  收藏  举报

本章将把1.0、2.0、3.0进行理解

一、Http1.0

  1.1.0的http版本,是一种无状态,无连接的应用层协议。http1.0规定浏览器和服务器保持短暂的链接

  2.浏览器每次请求都需要与服务器建立一个TCP(传输控制协议:是一种面向链接的,可靠的、基于节流的传输层通信协议。Ps:Http是建立在TCP之上的,当你建立起TCP链接之后,在上面传输的数据用的是HTTP协议)链接,服务器处理完成以后立即断开TCP链接(无连接),服务器不跟踪每个客户单,也不记录过去的请求

  3.理解就是:HTTP1.0很笨,只会与浏览器保持短暂链接,在连接的时候得需要用到TCP,链接一次用一次TCP,而且不会记录用户得cookie和以前得请求

  4.弊端:无法复用链接,因为每次请求都需要进行一次TCP链接,而TCP链接释放过程又是比较费事得,这种无链接得特性会使得网络得利用率变低;第二点:队头阻塞,由于http1.0规定下一个请求必须在前一个请求响应到达之前才发送,假设前一个请求响应一直不到达,那么下一个请求就不发送,后面得请求就阻塞

二、Http1.1

  1.http继承了HTTP1.0的简单,克服了HTTP1.0性能上的问题

  2.长连接:HTTP1.1增加COnnection字段,通过设置Keep-Alive保持HTTP链接不断卡,避免每次客户端与服务器请求都要重复建立释放建立TCP链接,提高了网络的利用率

三、HTTP2.0

  1.二进制分帧:HTTP2.0通过在应用层和传输层之间增加一个二进制分层帧,突破了HTTP1.1得性能限制,改进传输性能

  2多路复用(链接共享):

  • 流(stream):已建立连接上的双向字节流。
  • 消息:与逻辑消息对应的完整的一系列数据帧。
  • 帧(frame):HTTP2.0通信的最小单位,每个帧包含头部,至少也会标识出当前所属的流(stream_id)

  所有HTTP2.0通信都在一个TCP链接上完成,这个链接可以承载任意流量的双向数据流

  每个数据流以消息的形式发送,而消息由一或多个帧组成。这些帧可以乱序发送,然后再根据每个帧头部的流标识符(Stream_id)重新封装

  多路复用(连接共享)可能会导致关键字被阻塞,HTTP2.0里每个数据流都可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回客户端,数据流还可以依赖其他的子数据流

  HTTP2.0实现了真正的并行传输,它能够在一个TCP上进行任意数量的HTTP请求。而这个强大的功能基于“二级制分帧”的特性

  3.头部压缩:

  在HTTP1.X中,头部元数据都是以纯文本的形式发送的,通常会给每个请求增加500-8000字节的负荷

  比如cookie,默认情况下,浏览器会在每次请求的时候,把cookie附在header上面发给服务器

  HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header_files表,既避免重复header的传输,又减少了需要传输的大小

  高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟

  4.服务器推送:服务器除了最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确的需求

四、HTTP3.0

  1.Google搞了一个基于UDP协议的QUIC协议,并且使用在了HTTP/3上, HTTP/3之前的名称为HTTP-over-QUIC;早期Quic协议,存在IETF和Google两个版本,直到它被证实命名为HTTP3.0

  2.多路复用

  QUIC基于UDP,一个连接上的多个stream之间没有依赖,即使丢包,只需要重发丢失的包即可,不需要重传整个连接

  3.更好得移动端表现

  QUIC在移动端的表现比TCP好,因为TCP是基于IP识别连接,而QUIC是通过ID识别链接。 无论网络环境如何变化,只要ID不便,就能迅速重新连上

  4.加密认证得根文

  TCP协议头没有经过任何加密和认证,在传输过程中很容易被中间网络设备篡改、注入和窃听

  QUIC的packet可以说武装到了牙齿,除了个别报文,比如PUBLIC_RESET和CHLO,所有报文头部都是经过认证的,报文Body都是经过加密的

  所以只要对 QUIC 做任何更改,接收端都能及时发现,有效地降低了安全风险

  5.向前纠错机制

  QUIC协议有一个非常独特的特性,称为向前纠错(Foward Error Connec,FEC),每个数据包除了它本身的内容之外还包括了其他数据包的数据,因此少量的丢包可以通过其他包的冗余数据直接组装而无需重传。

  向前纠错牺牲了每个数据包可以发送数据的上限,但是带来的提升大于丢包导致的数据重传,因为数据重传将会消耗更多的时间(包括确认数据包丢失,请求重传,等待新数据包等步骤的时间消耗)。

总结

HTTP 1.0

  • 无状态,无连接
  • 短连接:每次发送请求都要重新建立tcp请求,即三次握手,非常浪费性能
  • 无host头域,也就是http请求头里的host,
  • 不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象

 

HTTP 1.1

  • 长连接,流水线,使用connection:keep-alive使用长连接
  • 请求管道化
  • 增加缓存处理(新的字段如cache-control)
  • 增加Host字段,支持断点传输等
  • 由于长连接会给服务器造成压力

 

HTTP 2.0

  • 二进制分帧
  • 头部压缩,双方各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小
  • 多路复用(或连接共享),使用多个stream,每个stream又分帧传输,使得一个tcp连接能够处理多个http请求
  • 服务器推送(Sever push)

 

HTTP 3.0

  • 基于google的QUIC协议,而quic协议是使用udp实现的
  • 减少了tcp三次握手时间,以及tls握手时间
  • 解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题
  • 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗
  • 连接迁移,不再用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接
  • 更合适的流量控制