http1.x、http2与https的区别、以及http3

http1.x、http2与https的区别、以及http3
  ⾯试的时候被问到http与https的区别、以及http/1.x与http/2的区别,之前偶尔有了解,但是没有系统的学习,所以答的就⽐较模棱两可,结果不⼤如⼈意,于是狠下⼼来。。。学呗
⼀、⾸先说http与https的区别
  (⼀)、了解http与https之前先要知道⼀下⼏个概念:
    1、什么是http与https?
    2、什么是ssl与tls
      1、http(HyperText Transfer Protocol)超⽂本传输协议,https(Hypertext Transfer Protocol Secure)超⽂本传输安全协议,就是http的安全版本。http与https都属于应⽤层协议,下⼀层是TCP(传输层协议),https没有对http作任何修改,https是由http进⾏通信,但利⽤SSL/TLS来加密数据包,https是在http与tcp之间加了⼀个ssl/tls协议。http + 加密 + 认证 + 完整性保护 = https,可以说https是披着ssl/tls外⾐的http。那么什么是ssl/tls?
      2、ssl/tls:SSL/TLS是HTTP和TCP之间的中转协议,也是⼀个应⽤层协议。我们可以把ssl/tls理解
为⼀个⿊盒⼦,我们把数据丢给http,http把数据丢给ssl/tls,ssl/tls把数据加密后丢给tcp,这就是https。
  (⼆)、http与https的特点
    1、http是明⽂传输,所以如果报⽂被劫持,劫持者完全可以读懂报⽂或修改报⽂,易被监听、伪装、篡改,是⼀种不安全的协议。⽽https是密⽂传输,它是由http+SSL的结合体,由之前http到tcp,改为了http到SSL到tcp。报⽂是经过加密的,所以更加安全。耐高温无机颜料吧
    2、https使⽤需要CA证书,⼤部分都是付费使⽤的
    3、http默认使⽤80端⼝,https默认使⽤443端⼝
    4、https因为多了⼀层ssl/tls加密,以及数字证书的握⼿,数据的加密/解密,以及密钥的交换与确认,消耗更多的CPU和内存资源,加密范围也⽐较有限,⿊客攻击、拒绝服务攻击、服务器劫持⽅⾯⼏乎起不到什么作⽤。最关键的,SSL证书信⽤链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间攻击⼀样可⾏。
⼆、再说http/1.x与http/2的区别
Web 性能的终极⽬标是减少到⽤户端的延迟,让⽤户能够尽快的打开前端⽹页并进⾏相关交互。尽可能发送少的数据给服务器,从服务端下载尽可能少的数据,尽可能减少往返(Round Trips),客户端与服务器⽆论是哪⼀边,额外的数据流都会带来额外的延迟开销,与此同时也更容易出现拥塞和丢包问题,这⽆疑严重影响了性能。多余的 Round Trip 同样会增加延迟,尤其是在移动⽹络下(100ms 是让⽤户感觉到系统⽴即做出响应的时间上限)。
⽽HTTP/2试图解决HTTP/1.1的许多缺点和不灵活之处,对⽐demo在。
(⼀)、HTTP/1.x
  Http1.x
    缺陷:线程阻塞,在同⼀时间,同⼀域名的请求有⼀定数量限制,超过限制数⽬的请求会被阻塞。
  http1.0
毛毡包
    缺陷:浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建⽴⼀个 TCP 连接(TCP 连接的新建成本很⾼,因为需要客户端和服务器),服务器完成请求处理后⽴即断开 TCP 连接,服务器不跟踪每个客户也不记录过去的请求;
    解决⽅案:添加头信息——⾮标准的 Connection 字段 Connection: keep-alive
  http1.1
    改进点:
    1、持久连接
      引⼊了持久连接,即 TCP 连接默认不关闭,可以被多个请求复⽤,不⽤声明 Connection: keep-alive(对于同⼀个域名,⼤多数浏览器允许同时建⽴ 6 个持久连接)
    2、管道机制
      即在同⼀个 TCP 连接⾥⾯,客户端可以同时发送多个请求。
    3、分块传输编码
      即服务端没产⽣⼀块数据,就发送⼀块,采⽤”流模式”⽽取代”缓存模式”。
    4、新增请求⽅式
相册内页
      PUT:请求服务器存储⼀个资源;
      DELETE:请求服务器删除标识的资源;
      OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求;
      TRACE:请求服务器回送收到的请求信息,主要⽤于测试或诊断;
      CONNECT:保留将来使⽤
    缺点:
      虽然允许复⽤ TCP 连接,但是同⼀个 TCP 连接⾥⾯,所有的数据通信是按次序进⾏的。服务器只有处理完⼀个请求,才会接着处理下⼀个请求。如果前⾯的处理特别慢,后⾯就会有许多请求排队等着。这将导致“队头堵塞”
    避免⽅式:⼀是减少请求数(代码合并、图⽚精灵),⼆是同时多开持久连接(静态资源分布到不同的域下)。
(⼆)、HTTP/2.0
  特点
    采⽤⼆进制格式⽽⾮⽂本格式;完全多路复⽤,⽽⾮有序并阻塞的、只需⼀个连接即可实现并⾏;使⽤报头压缩,降低开销服务器推送
  1. ⼆进制协议
    HTTP/1.1 版的头信息肯定是⽂本(ASCII 编码),数据体可以是⽂本,也可以是⼆进制。HTTP/2 则是⼀个彻底的⼆进制协议,头信息和数据体都是⼆进制,并且统称为”帧”:头信息帧和数据帧。⼆进制协议解析起来更⾼效、“线上”更紧凑,更重要的是错误更少。
  2. 完全多路复⽤(多路复⽤的单⼀长连接)动力钳
    (1)、单⼀长链接
      在HTTP/2中,客户端向某个域名的服务器请求页⾯的过程中,只会创建⼀条TCP连接,即使这页⾯可能包含上百个资源。⽽之前的HTTP/1.x⼀般会创建6-8条TCP连接来请求这100多个资源。单⼀的连接应该是HTTP2的主要优势,单⼀的连接能减少带来的时延(如果是建⽴在SSL/TLS上⾯,HTTP2能减少很多不必要的,⼤家都知道SSL握⼿很慢吧)。
      另外我们知道,TCP协议有个滑动窗⼝,有慢启动这回事,就是说每次建⽴新连接后,数据先是慢慢地传,然后滑动窗⼝慢慢变⼤,才能较⾼速度地传,这下倒好,这条连接的滑动窗⼝刚刚变⼤,http1.x就创个新连接传数据(这就好⽐⼈家HTTP2⼀直在⾼速上⼀直开着,你HTTP1.x是⼀辆公交车⾛⾛停停)。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的⼗分低效。
      所以咯,HTTP2中⽤⼀条单⼀的长连接,避免了创建多个TCP连接带来的⽹络开销,提⾼了吞吐量。
    (2)、多路复⽤
      HTTP2把要传输的信息分割成⼀个个⼆进制帧,⾸部信息会被封装到HEADER Frame,相应的request body就放到DATA Frame,⼀个帧你可以看成路上的⼀辆车,只要给这些车编号,让1号车都⾛1号门出,2号车都⾛2号门出,就把不同的http请求或者响应区分开来了。但是,这⾥要求同⼀个请求或者响应的帧必须是有有序的,要保证FIFO的,但是不同的请求或者响应帧可以互相穿插。这就是HTTP2的多路复⽤,是不是充分利⽤了⽹络带宽,是不是提⾼了并发度?
      更进⼀步,http2还能对这些流(车道)指定优先级,优先级能动态的被改变,例如把CSS和JavaScript⽂件设置得⽐图⽚的优先级要⾼,这样代码⽂件能更快的下载下来并得到执⾏。
  3. 报头压缩
    HTTP 协议是没有状态,导致每次请求都必须附上所有信息。所以,请求的很多头字段都是重复的,⽐如 Cookie,⼀样的内容每次请求都必须附带,这会浪费很多带宽,也影响速度。对于相同的头部,不必再通过请求发送,只需发送⼀次;HTTP/2 对这⼀点做了优化,引⼊了头信息压缩机制;⼀
⽅⾯,头信息使⽤ gzip 或 compress 压缩后再发送;另⼀⽅⾯,客户端和服务器同时维护⼀张头信息表(分
静态部分和动态部分),所有字段都会存⼊这个表,产⽣⼀个索引号,之后就不发送同样字段了,只需发送索引号。
  4. 服务器推送
    HTTP/2 允许服务器未经请求,主动向客户端发送资源;通过推送那些服务器任务客户端将会需要的内容到客户端的缓存中,避免往返的延迟
    服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送
RST_STREAM帧来拒收。主动推送也遵守同源策略,换句话说,服务器不能随便将第三⽅资源推送给客户端,⽽必须是经过双⽅确认才⾏。
三、http3的特性
⾸先说说http2的缺点:
上⽂提到 HTTP/2 使⽤了多路复⽤,⼀般来说同⼀域名下只需要使⽤⼀个 TCP 连接。但当这个连接中出现了丢包的情况,那就会导致HTTP/2 的表现情况反倒不如 HTTP/1 了。
因为在出现丢包的情况下,整个 TCP 都要开始等待重传,也就导致了后⾯的所有数据都被阻塞了。但是对于 HTTP/1.1 来说,可以开启多个 TCP 连接,出现这种情况反到只会影响其中⼀个连接,剩余的 TCP 连接还可以正常传输数据。
1、0RTT自制室内单杠
传输层0RTT建⽴连接
加密层0RTT建⽴连接
2、真正的多路复⽤
虽然 HTTP/2 ⽀持了多路复⽤,但是 TCP 协议终究是没有这个功能的。QUIC 原⽣就实现了这个功能,并且传输的单个数据流可以保证有序交付且不会影响其他的数据流,这样的技术就解决了之前 TCP 存在的问题。
同HTTP2.0⼀样,同⼀条 QUIC连接上可以创建多个stream,来发送多个HTTP请求,但是,QUIC是
基于UDP的,⼀个连接上的多个stream 之间没有依赖。⽐如下图中stream2丢了⼀个UDP包,不会影响后⾯跟着 Stream3 和 Stream4,不存在 TCP 队头阻塞。虽然stream2的那个包需要重新传,但是stream3、stream4的包⽆需等待,就可以发给⽤户。
另外QUIC 在移动端的表现也会⽐ TCP 好。因为 TCP 是基于 IP 和端⼝去识别连接的,这种⽅式在多变的移动端⽹络环境下是很脆弱的。但是 QUIC 是通过 ID 的⽅式去识别⼀个连接,不管你⽹络环境如何变化,只要 ID 不变,就能迅速重连上。
3、加密认证的报⽂
TCP 协议头部没有经过任何加密和认证,所以在传输过程中很容易被中间⽹络设备篡改,注⼊和窃听。⽐如修改序列号、滑动窗⼝。这些⾏为有可能是出于性能优化,也有可能是主动攻击。
但是 QUIC 的 packet 可以说是武装到了⽛齿。除了个别报⽂⽐如 PUBLIC_RESET 和 CHLO,所有报⽂头部都是经过认证的,报⽂ Body 都是经过加密的。
这样只要对 QUIC 报⽂任何修改,接收端都能够及时发现,有效地降低了安全风险。
如上图所⽰,红⾊部分是 Stream Frame 的报⽂头部,有认证。绿⾊部分是报⽂内容,全部经过加密。
缘1144、向前纠错机制
QUIC协议有⼀个⾮常独特的特性,称为向前纠错 (Forward Error Correction,FEC),每个数据包除了它本⾝的内容之外,还包括了部分其他数据包的数据,因此少量的丢包可以通过其他包的冗余数据直接组装⽽⽆需重传。向前纠错牺牲了每个数据包可以发送数据的上限,但是减少了因为丢包导致的数据重传,因为数据重传将会消耗更多的时间(包括确认数据包丢失、请求重传、等待新数据包等步骤的时间消耗)。
假如说这次我要发送三个包,那么协议会算出这三个包的异或值并单独发出⼀个校验包,也就是总共发出了四个包。当出现其中的⾮校验包丢包的情况时,可以通过另外三个包计算出丢失的数据包的内容。当然这种技术只能使⽤在丢失⼀个包的情况下,如果出现丢失多个包就不能使⽤纠错机制了,只能使⽤重传的⽅式了。
参考⽂献:

本文发布于:2024-09-22 07:04:37,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/196678.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   服务器   连接   协议   数据
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议