从 URI 区分到 HTTP1.0/1.1/2/3 发展详解【个人八股】
URI是统一资源标识符,用于标识Web资源类型;URL是URI子集,提供资源路径和访问方式。HTTP协议演进:1.0默认短连接,1.1引入长连接和流水线处理,2.0采用二进制协议、多路复用和服务器推送。HTTP/3基于QUIC协议解决TCP队头阻塞问题。目前HTTP/2最流行,占比46.9%。长连接通过Connection:keep-alive实现,1.1默认开启,超时可通过HTTP守护进程或TC

你有了解过URL和URI的区别吗?
我们平时好像了解的最多的就是URL,好像对于URI的了解并不是很多,那在这里就给大家来介绍一下。
-
URI,统一资源标识符(Uniform Resource Identifier, URI),标识的是 Web 上每一种可用的资源,如 HTML 文档、图像、视频片段、程序等都是由一个 URI 进行标识的。
-
URL,统一资源定位符(Uniform Resource Location),它是 URI 的一种子集,主要作用是提供资源的路径。
一个是identifier,一个是location,从两个词相比大家也就知道两者之间的不同之处了!
identifier目的是要确定当前的web资源究竟是一个什么样的东西,是一个文档,一个视频,还是其他格式的资源文件
location相当于是告诉我们这个东西放在哪个位置,我们直接去请求获取它即可!
它们的主要区别在于,URL 除了提供了资源的标识,还提供了资源访问的方式。这么比喻,URI 像是身份证,可以唯一标识一个人,而 URL 更像一个住址,可以通过 URL 找到这个人——人类住址协议://地球/中国/北京市/海淀区/xx 职业技术学院/14 号宿舍楼/525 号寝/张三.男。
可以,你既然知道了什么是HTTP,HTTP是如何配合其他协议来发挥作用的,以及HTTP本身的工作方式和HTTP内部的报文结构,你了解过每个版本的HTTP之间的区别吗?
说下 HTTP1.0,1.1,2.0 的区别?
HTTP1.0 默认是短连接,HTTP 1.1 默认是长连接,HTTP 2.0 采用的多路复用。

详细说一下HTTP1.0
-
无状态协议:HTTP 1.0 是无状态的,每个请求之间相互独立,服务器不保存任何请求的状态信息。
-
非持久连接:默认情况下,每个 HTTP 请求/响应对之后,连接会被关闭,属于短连接。这意味着对于同一个网站的每个资源请求,如 HTML 页面上的图片和脚本,都需要建立一个新的 TCP 连接。可以设置
Connection: keep-alive强制开启长连接。
多个HTTP之间是无状态的,相互之间是独立存在的!
HTTP在响应完成之后都会关闭,每次请求都需要重新建立一次连接操作!
说一下HTTP1.1
-
持久连接:HTTP 1.1 引入了持久连接(也称为 HTTP keep-alive),默认情况下不会立即关闭连接,可以在一个连接上发送多个请求和响应。极大减轻了 TCP 连接的开销。
-
流水线处理:HTTP 1.1 支持客户端在前一个请求的响应到达之前发送下一个请求,以提高传输效率。
简单来说
首先就是HTTP1.1支持了 持久连接,就是HTTP发送请求并得到响应之后,TCP之间是不会立即断开的,可以处理多个请求和响应的过程。这是HTTP1.1区别于HTTP1.0一个非常重要的地方
流水线处理,不再像HTTP1.0那样 客户端需要等待服务器响应 才能接着发送下一个请求,而是即使响应还没到服务器,我照样可以直接发送请求到服务器!
说一下HTTP2.0
-
二进制协议:HTTP 2.0 使用二进制而不是文本格式来传输数据,解析更加高效。
-
多路复用:一个 TCP 连接上可以同时进行多个 HTTP 请求/响应,解决了 HTTP 1.x 的队头阻塞问题。
-
头部压缩:HTTP 协议不带状态,所以每次请求都必须附上所有信息。HTTP 2.0 引入了头部压缩机制,可以使用 gzip 或 compress 压缩后再发送,减少了冗余头部信息的带宽消耗。
-
服务端推送:服务器可以主动向客户端推送资源,而不需要客户端明确请求。
二进制协议,底层采用二进制的方式来进行数据的传输,加上计算机本身底层就是二进制的数据,那么相对应的解析肯定会更加的高效。
多路复用:之前HTTP1.x解决了 一次TCP连接只能处理一次HTTP请求的问题,但是容易出现因为HTTP请求队头阻塞,然后整个的请求都需要等待的问题,效率是非常低下的,因此HTTP2.0是可以同时进行多个HTTP的请求/响应
头部压缩:减少带宽
服务端推送:之前的HTTP1.X版本都是 客户端向服务端发起一次请求,服务端响应一次!但是这种方式存在一个问题就是,如果客户端需要监听服务器的状态,就需要不停的不间断的发送请求,会带来非常大的额外开销,因此在HTTP2.0当中就引入服务端推送机制,不需要请求,直接像客户端发送消息的机制!

emmmm,可以可以,那你有了解过HTTP/3.0吗
HTTP/3 了解吗?
HTTP/2.0 基于 TCP 协议,而 HTTP/3.0 则基于 QUIC 协议,Quick UDP Connections,直译为快速 UDP 网络连接。

基于 TCP 的 HTTP/2.0,尽管从逻辑上来说,不同的流之间相互独立,不会相互影响,但在实际传输的过程中,数据还是要一帧一帧的发送和接收,一旦某一个流的数据有丢包,仍然会阻塞在它之后传输的流数据。
而基于 UDP 的 QUIC 协议可以更彻底地解决这样的问题,让不同的流之间真正的实现相互独立传输,互不干扰。
同时,QUIC 协议在传输的过程中就完成了 TLS 加密握手,更直接了
QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议。QUIC已开始它的标准化过程,成为新一代传输层协议。
既然有这么多的版本,那现在比较流行的是哪一个版本的HTTP协议呢?
应该是 HTTP/2,在 2022 年 1 月达到峰值,占所有网站的 46.9%。
统计网站:w3techs
你之前在介绍版本的时候,提到了长连接,那么你对于长连接有了解吗?
在 HTTP 中,长连接是指客户端和服务器之间在一次 HTTP 通信完成后,不会立即断开,而是保留连接以供后续请求复用。
这种机制可以减少了频繁建立和关闭连接的开销
那你知道怎么去设置长连接吗?
可以通过 Connection: keep-alive 实现。在 HTTP/1.1 中,长连接是默认开启的。
在什么时候会连接超时呢?
-
HTTP 一般会有 httpd 守护进程,里面可以设置
keep-alive timeout,当 tcp 连接闲置超过这个时间就会关闭,也可以在 HTTP 的 header 里面设置超时时间 -
TCP 的 keep-alive 包含三个参数,支持在系统内核的 net.ipv4 里面设置;当 TCP 连接之后,闲置了 tcp_keepalive_time,则会发生侦测包,如果没有收到对方的 ACK,那么会每隔 tcp_keepalive_intvl 再发一次,直到发送了 tcp_keepalive_probes,就会丢弃该连接。
可以同时通过HTTP和TCP来进行判断!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)