【图解计算机网络】http1.1,http2.0,http3.0

http1.1

长连接

在http1.0的时候,一次http请求就要建立一次TCP连接,这一次的http请求完成以后,TCP连接就会断开,如果还要发起第二次的http请求,就要再建立一次TCP连接。

在这里插入图片描述

这样显然效率是很低的,于是http1.1提供了长连接的优化。http的长连接实际上是TCP连接的复用,在完成了一次http的请求与响应之后,该TCP连接不断开,继续供下一个http请求与响应使用。

在这里插入图片描述

通过对TCP连接的复用,减少了过多的TCP握手造成的性能开销,从而提升性能。

管道传输

管道(pipeline)传输是指当第一个http请求发送出去之后,不必等待该http请求的响应,就可以发送下一个http请求。服务端会按顺序处理http请求,客户端也会按顺序的接收到服务端发来的响应。

在这里插入图片描述

但是由于服务端是按顺序处理http请求的,如果前面有一个http请求处理时间较长,迟迟没有处理好,就会阻塞后面的http请求的处理。

在这里插入图片描述

缺点

http1.1虽然做了长连接和管道传输的优化,但是缺点还是很明显的。

  1. 头部没有压缩,存在头部冗余传输造成的带宽浪费,也就是相同的头部字段重复传输的问题
  2. 存在http队头阻塞的问题
  3. 只能由客户端发起请求,服务端只能被动响应

在这里插入图片描述

http2.0

头部压缩

http2.0使用HPACK算法,客户端和服务端双方各维护一张头部信息表,里面存放的头部字段对应的索引号,当有重复的头部字段需要发送时,就不发送该字段,而是发送该字段在头部信息表中对应的索引号。

在这里插入图片描述

二进制格式

http1.1以及之前的版本都是采用纯文本的形式传输的,而http2.0改成二进制格式进行传输。http2.0传输的二进制数据是帧(frame),http2.0就是一帧一帧的传输的。http2.0的二进制数据分为头部帧(Headers frame)和数据帧(Data frame)。

在这里插入图片描述

并发传输

http2.0引入了Stream,不同Stream复用同一条TCP连接,使得不同Stream之间的请求与响应可以并发传输。

在这里插入图片描述
一个TCP连接可以包含多个Stream,不同Stream之间互不影响并且可以并发传输。一个Stream里面包含一个或多个Message,一个Message代表一个http请求或一个http响应,一个Message包含一个过多个frame。

每个Stream都有一个唯一的Stream ID,不同Stream之间通过这个ID区分。

在这里插入图片描述

服务端推送

http2.0还有一个优化就是允许服务端主动推送,比如客户端请求一个html页面,服务端可以在给客户端返回html页面的之后,主动把html里面的css推送给客户端。

在这里插入图片描述

主动推送的css会在服务端建立的Stream中进行发送,也就是说客户端和服务端双方都可以建立Stream。但是客户端建立的Stream的Stream ID必须是奇数,而服务端建立的Stream的Stream ID必须是偶数。

在这里插入图片描述

缺点

http2.0相较于http1.1来说性能已经大大的提高了,而且占用的网络带宽也更小,还支持服务端主动推,可以说是做了非常大的优化。要说http2.0还有什么缺点的话,那就是TCP队头阻塞。

TCP是一个字节流协议,必须保证接收到的字节数据完整且连续,才能把缓冲区里的数据返回给应用层。如果前面有一个字节的数据没有接收到,即使后面的字节数据已经到达,也不能被应用层读取。只有等待该字节到达以后,应用层才能从内核缓冲区中读取到该数据。

在这里插入图片描述

http3.0

为了解决TCP队头阻塞的问题,从http3.0开始,底层就不再依赖TCP协议了,而是改用UDP协议。

由于UDP协议是一个不可靠的协议,所以http3.0不是直接依赖UDP协议的,而是依赖基于UDP协议的QUIC协议。http3.0通过基于UDP协议的QUIC协议可以实现与TCP协议一样的可靠传输。

QUIC有以下三个优点:

  • 无队头拥塞
  • 快速建立连接
  • 连接迁移

在这里插入图片描述

无队头阻塞

在这里插入图片描述
由于QUIC协议是基于UDP协议的,UDP协议不要求收到数据包按顺序,因此不会像TCP协议那样存在队头阻塞的问题。当一个stream中的某个quic包丢失,只会阻塞这个stream被应用层读取,而后面的stream还是可以被应用层读取。

快速建立连接

http2.0以前是基于TCP协议的,而TCP协议是与TLS处于不同层的协议,因此这两个协议的握手流程要分开。但是http3.0是基于QUIC协议的,而QUIC协议内部就包含了TLS协议。

在这里插入图片描述

因此TLS握手流程可以包含在QUIC协议握手流程里面。

在这里插入图片描述

不需要单独进行TLS握手,因此能更快的建立连接。

连接迁移

由于http2.0及以前是基于TCP协议的,TCP协议是通过TCP四元组唯一确定一条TCP连接的,TCP四元组:源IP、源端口号、目标IP、目标端口号。

在这里插入图片描述

当一个设备从一个网络迁移到另一个网络(比如手机从4G网络切换到WIFI),那么IP地址就会改变,而由于IP地址是组成TCP连接的四元组中的元素,IP地址改变意味着TCP四元组改变,这样就不是同一条TCP连接了,因此要重新经过TCP三次握手的流程建立新的TCP连接。

在这里插入图片描述

而QUIC协议则是通过一个连接ID确定一条唯一的QUIC连接,而这个连接ID在网络迁移的时候依然保持不变,这样就能够在网络迁移的时候也能做到连接复用。

在这里插入图片描述

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值