HTTP 1.0 2.0 3.0

HTTP 1.0 2.0 3.0

  • HTTP2.0解决队头阻塞了吗
  • http2相对于http1有哪些改进,http2和http1的差别
  • HTTP2新增 多路复用解决的问题 HTTP1一次最多能发多少请求
  • HTTP2的特点
  • http2相对于http1在报文中有哪些新增了?
  • 在一条tcp可以发送多个http嘛?

在这里插入图片描述
请求URL + Host = 请求URL
URL 代表着是统一资源定位符(Uniform Resource Locator)表示某个资源在 Web 上的地址。
URI 代表着统一资源标识符(Uniform Resource Identifier),用于标识某一互联网资源名称 如图中user.html

总结

版本改进存在的问题其他改进
HTTP1.0引入了请求头和响应头进行需求协商,为了减轻服务器,提供了Cache 机制每进行一次 HTTP 通信,都需要经历建立 TCP 连接、传输 HTTP 数据和断开 TCP 连接三个阶段,每次通信TCP连接和断开TCP连接的消耗很大
HTTP1.1增加持久连接的方法,特点是在一个 TCP 连接上可以传输多个 HTTP 请求。浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接队 头阻塞问题: 需要等待前面的请求返回之后,才能进行下一次请求。 如果 TCP 通道中的某个请求因为某些原因没有及时返回,那么就会阻塞后面的所有请求管道化技术:将多个HTTP请求整批提交给服务器,但是服务器依旧根据请求顺序来回复浏览器的请求,请求同时发送,返回仍然是有序的
HTTP2.0提升网络速度,采用二进制格式传输 + 多路复用,客户端只需要与服务端建立一个TCP连接即可完成通信需求解决了应用层面的队头阻塞问题,但是并没有解决TCP的队头阻塞。采用二进制分帧进行多路复用,通常只使用一个 TCP 连接进行传输。当TCP数据包在传输过程中丢失时,TCP的连接会处于暂停状态,将阻塞所有进行中的 HTTP 请求的流,直到重新发送丢失的数据。头部压缩实现方法:服务器和客户端之间建立哈希表
在服务器和客户端之间建立哈希表,将用到的字段存放在这张表中,那么在传输的时候对于之前出现过的值,只需要把索引(比如0,1,2,…)传给对方即可,对方拿到索引查表就行了。
HTTP3.0HTTP3主要解决问题:TCP丢包阻塞问题,基于 UDP 实现了快速UDP互联网连接协议。①TCP可靠传输等功能 ② 实现了在同一物理连接上可以有多个独立的逻辑数据流。实现了数据流的单独传输,就解决了 TCP 中队头阻塞的问题。

HTTP 1.0

HTTP1.0需要满足以下两个需求,引入了请求头和响应头

1.支持多种类型的文件下载,传输HTML、JavaScript、CSS、图片、音频、视频等不同类型的文件。
2.支持其他类型编码的文件,默认ASCII编码传输

HTTP 0.9 实现需求是通过ASCII字符流传递HTML超文本的内容。所以请求只有一个请求行就可以表达需求,服务器也不需要返回头信息,只通过ASCII字符流返回HTML格式的文件就行了

引入了请求头和响应头

HTTP1.0引入了请求头和响应头进行需求协商,以Key-Value形式保存,在HTTP发送请求时,会带上请求头信息,服务器返回数据时,会先返回响应头信息。

要支持多种类型的文件,浏览器请求时需要考虑的问题
1.告诉服务器我支持处理什么类型的文件,你最好传给我什么类型的文件 –accept: text/html
2.为了减轻传输性能,服务器会对数据进行压缩后再传输,所以浏览器需要告诉服务器我支持的压缩方法accept-encoding: gzip, deflate, br
3.告诉服务器,浏览器支持的字符集 –accept-charset:utf-8,iso-8859-1
4.告诉服务器,浏览器支持的语言 –accept-language: zh-CN,zh

//请求头的类容
accept: text/html
accept-encoding: gzip, deflate, br
accept-charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh

服务器接收到浏览器发送过来的请求头信息之后,会根据请求头的信息来准备响应数据。

//响应头数据
content-encoding: br  //服务器最终使用的压缩方法
content-type: text/html; charset=UTF-8 //服务器返回的是 html 文件,并且该文件的编码类型是 UTF-8。

有了响应头的信息,浏览器就会使用 br 方法来解压文件,再按照 UTF-8 的编码格式来处理原始文件,最后按照 HTML 的方式来解析该文件。

HTTP 1.1

HTTP/1.0 每进行一次 HTTP 通信,都需要经历建立 TCP 连接、传输 HTTP 数据和断开 TCP 连接三个阶段。

  • HTTP/1.1 中增加了持久连接的方法
    它的特点是在一个 TCP 连接上可以传输多个 HTTP 请求,只要浏览器或者服务器没有明确断开连接,那么该 TCP 连接会一直保持。
    目的是为了减少每次通信TCP连接和断开TCP连接的消耗。
    默认使用持久连接,如果不想采用持久连接,可以在HTTP请求头中加上Connection:close
  • 浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接。
  • 提供虚拟主机的支持,HTTP/1.1 的请求头中增加了Host 字段,用来表示当前的域名地址
    在 HTTP/1.0 中,每个域名绑定了一个唯一的 IP 地址,因此一个服务器只能支持一个域名。但是随着虚拟主机技术的发展,需要实现在一台物理主机上绑定多个虚拟主机,每个虚拟主机都有自己的单独的域名,这些单独的域名都公用同一个 IP 地址。
    因此,HTTP/1.1 的请求头中增加了Host 字段,用来表示当前的域名地址,这样服务器就可以根据不同的 Host 值做不同的处理。
队头阻塞问题

持久连接需要等待前面的请求返回之后,才能进行下一次请求。 持久连接相当于一个队列,前一个请求出队了,后一个请求才开始处理。

如果 TCP 通道中的某个请求因为某些原因没有及时返回,那么就会阻塞后面的所有请求,这就是队头阻塞的问题。

HTTP/1.1 中试图通过管线化的技术来解决队头阻塞的问题。
HTTP/1.1 中的管线化是指将多个 HTTP 请求整批提交给服务器的技术,虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求。(按顺序请求才知道是返回给他的响应)
请求同时发送,返回仍然是有序的

如何解决队头阻塞问题
  1. 并发连接,对于一个域名允许分配多个长连接,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其它所有任务。目前浏览器中对于同一个域名,默认允许同时建立 6 个 TCP 持久连接。
  2. 域名分片,一个域名可以并发6个长连接,可以通过多分几个域名,来增加并发的长连接数。
    比如将xx.com域名分出二级域名,content1.xxx.comcontent2.xxx.com。而它们都指向同样的一台服务器,能够并发的长连接数更多了
  3. 使用HTTP2.0

HTTP2.0 提升网络速度

HTTP2采用二进制格式传输数据

  • HTTP/1.1版本的头部信息是文本,数据部分可以是文本也可以是二进制。HTTP/2版本的头部和数据部分都是二进制,且统称为‘帧’
  • 多路复用:同一个TCP连接里面,客户端和服务器可以同时发送多个请求和多个响应,并且不用按照顺序来。由于服务器不用按顺序来处理响应,所以避免了“对头堵塞”的问题。
  • 头部压缩:使用专用算法压缩头部,减少数据传输量,主要是通过服务端和客户端同时维护一张头部信息索引表,所有的头部信息在表里面都会有对应的记录,并且会有一个索引号,这样后面只需要发送索引号即可
  • 服务器端推送:允许服务器主动向客户推送数据
  • 客户端能指定请求的优先级,优先级越高,服务器会越快做出响应

多路复用

对于同一个域,客户端只需要与服务端建立一个TCP连接即可完成通信需求,这种利用一个连接来发送多个请求的方式称为多路复用。每一条路都被称为一个 stream(流)

http1 里面使用多个TCP连接,但是 TCP 的慢启动特性,会很消耗时间。

HTTP2使用二进制数据传输来提升传输效率,引入了二进制分帧层。

客户端在发送请求时会数据经过二进制分帧层处理后,被转换为一个个带有请求 ID 编号的帧,然后将这些帧同时发送给服务端。服务端接收到数据之后,会将相同编号的帧合并为完整的请求信息。同样,服务端返回结果、客户端接收结果也遵循这个帧的拆分与组合的过程。

HTTP/2版本中,每个请求或者响应的所有数据包,称为一个数据流(stream),并且每一个数据流都有一个唯一的编号ID,请求数据流的编号ID为奇数,响应数据流的编号ID为偶数。每个数据包在发送的时候带上对应数据流的编号ID,这样服务器和客户端就能分区是属于哪一个数据流。

客户端能指定请求的优先级,优先级越高,服务器会越快做出响应。

头部压缩

HTTP/2 针对头部字段,对请求头进行压缩。
实现方法:服务器和客户端之间建立哈希表

在服务器和客户端之间建立哈希表,将用到的字段存放在这张表中,那么在传输的时候对于之前出现过的值,只需要把索引(比如0,1,2,…)传给对方即可,对方拿到索引查表就行了。
在这里插入图片描述

HTTP2 没有请求行的概念,请求方法、url、http协议都变成请求头里的属性,这些属性都有:前缀,与其他的请求头属性区分

在这里插入图片描述

HTTP2.0和HTTP 1.0的区别


HTTP1.0HTTP2.0
连接方式HTTP1.0 每进行一次 HTTP 通信,都需要经历建立 TCP 连接、传输 HTTP 数据和断开 TCP 连接三个阶段
HTTP1.1持久一个 TCP 连接上可以传输多个 HTTP 请求
建立一个TCP连接进行通信
HTTP队头阻塞并发连接:同一个域名,默认允许同时建立 6 个 TCP 持久连接

域名分片:一个域名可以并发6个长连接,可以通过多分几个域名,来增加并发的长连接数

增加TCP连接,并没有从HTTP层面解决问题
采用多路复用+二进制帧,可以同时发送请求,服务器不用按顺序来处理响应,避免了应用层队头堵塞的问题
头部信息头部信息是文本,数据部分可以是文本也可以是二进制头部和数据部分都是二进制,统称为‘帧’
头部信息压缩×
服务端推送×
核心解决的问题不同类型文件传输-设置头部字段

创建/断开TCP连接开销大-建立长连接进行复用
并发数有限-二进制分帧、多路复用

缺点 TCP的队头阻塞

HTTP2解决了应用层面的队头阻塞,但是并没有解决TCP的队头阻塞

HTTP/2 由于采用二进制分帧进行多路复用,通常只使用一个 TCP 连接进行传输。当TCP数据包在传输过程中丢失时,TCP的连接会处于暂停状态,将阻塞所有进行中的 HTTP 请求的流,直到重新发送丢失的数据。

TCP的数据传输
从一端发送给另外一端的数据会被拆分为一个个按照顺序排列的数据包,这些数据包通过网络传输到了接收端,接收端再按照顺序将这些数据包组合成原始数据,这样就完成了数据传输。
如果在数据传输的过程中,有一个数据因为网络故障或者其他原因而丢包了,那么整个 TCP 的连接就会处于暂停状态,需要等待丢失的数据包被重新传输过来

TCP的队头阻塞
TCP 传输过程中,由于单个数据包的丢失而造成的阻塞称为 TCP 上的队头阻塞

HTTP3

HTTP3主要解决问题:TCP丢包阻塞问题

HTTP2的问题是在TCP,TCP是在传输层,因此协议的新迭代必须更新传输层,但是这个代价是非常高的。

HTTP3的思想是放弃TCP,使用了QUIC快速UDP网络连接协议。QUIC 是一个 UDP 版的 TCP + TLS + HTTP/2 替代实现

HTTP/3 中的 QUIC 协议

  • 实现了类似 TCP 的流量控制、传输可靠性的功能。虽然 UDP 不提供可靠性的传输,但 QUIC 在 UDP 的基础之上增加了一层来保证数据可靠性传输。它提供了数据包重传、拥塞控制以及其他一些 TCP 中存在的特性。
  • 集成了 TLS 加密功能。
  • 实现了 HTTP/2 中的多路复用功能。和 TCP 不同,HTTP/2 之所以存在 TCP 层的队头阻塞,是因为所有请求流都共享一个滑动窗口,而QUIC中给每个请求流都分配一个独立的滑动窗口。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值