概念
http作为一个互联网人都不模式,全称是超⽂本传输协议,也就是HyperText Transfer Protocol。要理解这个概念还是有点东西的,我们把这个名词拆分开来就是以下三个部分:
- 超文本
- 传输
- 协议
超文本
简单的说是,超过普通文本。但具体一些,咋们说的普通文本一般是值文字组成的文章。但是在网页中,有这么一种文本,可以是文本、图片、音频、视频等组成。但是最关键的是里面还可以有超链接,从一个文本跳转到另外一个文本。
html (HyperText mark language)是超文本的一种格式,也可以说是一种规范吧。
传输
这个名称大家肯定不陌生,物品从一个地方到另一个地方就叫做传输。
但是我们的http可以是从客户端把报文传输给服务端,也可以从服务端把数据传给客户端,这就是一种双向的传输方式。
协议
协议的话就更好理解了,在同一环境下个体双方需要满足一定的规范,如:每个社会公民都需要遵纪守法,这个遵纪守法就是一种协议
http 是⼀个⽤在计算机世界⾥的协议。它使⽤计算机能够理解的语⾔确⽴了⼀种计算机之间交流通信的规范(两个以上的参与者),以及相关的各种控制和错误处理⽅式(⾏为约定和规范)。
那么合起来的概念就是: HTTP 是⼀个在计算机世界⾥专⻔在「两点」之间「传输」⽂字、图⽚、⾳频、视频等「超⽂本」数据的「约定和规范」
http 1.0特征
优点
http1.0 是非常多的优点,把我们带入了互联网的时代
1.http/1.0 相对来说是比较简单的, 基本的报文是 请求头加上请求体(header + body),头部信息也是 key-value的简单是形式;
2.http 1.0 是灵活并且易拓展的, 协议中的请求方法, url, port, 和头部信息等都可以由开发人员自行规定。
3.跨平台的,http 出现带来的最大的好处就是跨平台,只要你满足我的传输协议,就可以不限制平台,这也使得http的应用变的非常多,从以前的 C端, 到现在B端等
缺点
万物都是一把双刃剑,有好的一面,也会有坏的一面。那么在http1.0的时代有哪些问题呢?
1.http传输是无状态的,意味着如果不做状态处理,那么谁都可以访问服务器,毕竟服务又不认识人。解决这种办法有cookie, session, token, 到后来的jwt等
2.明文传输。这里纠正一个概念,不是说使用get传输方式就是明文传输。post在也是一样的,我们在调试的时候都可以通过抓包工具来获取到对应的数据包。明文传输无疑是在将自己的信息在互联网上裸奔。解决这个明文传输的方式那就是 https,https 就是基于http是可拓展的基础上,在tcp 和 http之间,增加了一个ssl/tls层。
3.http 1.0 还有一个最要命的缺点是他的网络响应方式,串行响应的模式,必须要等上一次请求回来才能对下一个请求进行响应。这里如果上一个请求卡死了,那么就会导致整个网站卡死,获取不到数据,这种行为也叫做 队头阻塞,还有就是每一次的网络请求都需要做三次握手和四次挥手,没有长连接是一个很大的问题。
看到http1.0 有那么多的问题,那么在http1.1 2.0 3.0 都是在对问题进行优化的
http 1.1
http 1.1 主要解决是
HTTP1.0 每一次连接都需要三次握手和四次挥手(每一次发送请求都要等前一次请求回来后),而且是串行的请求方式,增加额外的通信开销;
解决http1.0无法长连接的问题
1.长连接
在http 1.1 中可以通过在请求头中的 connection:keey-alive 来告诉服务器我当前需要使用长连接的方式(持久连接)。这样做的好处是于减少了TCP 连接的᯿复建⽴和断开所造成的额外开销,减轻了服务器端的负载。
持久连接的特点是,只要任意⼀端没有明确提出断开连接,则保持 TCP 连接状态。
2.管道⽹络传输
基于 http1.1 中有长连接的功能,成就了管道传输(pipeline)
管道传输的概念是,每一次请求我都可以不用等前面的请求响应结束后,我再来请求后面的请去。具体的图像图下:
这种管道的传输方式也是需要按照请求的顺序来返回的。「请求 - 应答」的模式加剧了 HTTP 的性能问题。 容易发生队头阻塞。
http/1.1 的瓶颈
1.服务器是按请求的顺序响应的,如果服务器响应慢,会招致客户端⼀直请求不到数据,也就是队头阻塞;
2.没有请求优先级控制;
3.请求只能从客户端开始,服务器只能被动响应;
4.请求 / 响应头部(Header)未经压缩就发送,⾸部信息越多延迟越⼤。只能压缩 Body 的部分;
5.每次互相发送相同的⾸部造成的额外的通信开销。
http/2
HTTP/2 协议是基于 HTTPS 的,所以 HTTP/2 的安全性也是有保障的。(防止篇幅过长,https 我想单独那一篇文章来讲清楚), http2 做了以下改变:
1.头部压缩
HTTP/2中如果你发送多个请求,并且请求头是相同的或者相似的,那么会压缩头部的请求头,协议帮你消除重复的部分。使用的是HPACK算法, 简单的理解HPACK算法就是可以说是用了两张表个来存储当前的请求头中的属性。 一个静态表格,一个动态表格来配合使用。在客户端和服务器同时维护⼀张头信息表,所有字段都会存⼊这个表,⽣成⼀个索引号,以后就不发送同样字段了,只发送索引号,这样就提⾼速度了。
2.⼆进制格式
在http1.1 中我们可以看到我们请求的报文数据,因为编码是utf-8的。但是在http/2中使用的是二进制的编码格式,对我们不友好,但是对计算机是友好的。因为计算机只懂⼆进制,那么收到报⽂后,⽆需再将明⽂的报⽂转成⼆进制,⽽是直接解析⼆进制报⽂,这增加了数据传输的效率。
HTTP/2 不再像 HTTP/1.1 ⾥的纯⽂本形式的报⽂,⽽是全⾯采⽤了⼆进制格式,头信息和数据体都是⼆进制,并 且统称为帧(frame):头信息帧和数据帧。
3.数据流
HTTP/2 的数据包不是按顺序发送的,同⼀个连接⾥⾯连续的数据包,可能属于不同的回应。因此,必须要对数据包做标记,指出它属于哪个回应。
每个请求或回应的所有数据包,称为⼀个数据流( Stream )。每个数据流都标记着⼀个独⼀⽆⼆的编号,其中规定客户端发出的数据流编号为奇数, 服务器发出的数据流编号为偶数
客户端还可以指定数据流的优先级。优先级⾼的请求,服务器就先响应该请求。
4.Serve Push (服务端推送)
上面说到http1.1 使用的是 「请求 - 应答」的方式,这样就会导致服务端一开始不能主动向客户端推送消息,那么在 HTTP/2中是打破改方式,服务器不再是完全被动地响应请求,也可以新建流 主动向客户端发送消息。比如,在浏览器刚请求HTML的时候就提前把可能会用到的JS、CSS文件发给客户端,减少等待的延迟,这被称为"服务器推送"( Server Push,也叫 Cache push)。
服务端可以主动推送,客户端也有权利选择是否接收。如果服务端推送的资源已经被浏览器缓存过,浏览器可以通过发送RST_STREAM帧来拒收。主动推送也遵守同源策略,换句话说,服务器不能随便将第三方资源推送给客户端,而必须是经过双方确认才行
5.多路复⽤
HTTP/2 是可以在⼀个连接中并发多个请求或回应,⽽不⽤按照顺序⼀⼀对应来返回。
来张图感受一下多路复用的快感
多路复用很好的解决了浏览器限制同一个域名下的请求数量的问题,同时也接更容易实现全速传输,毕竟新开一个 TCP 连接都需要慢慢提升传输速度。移除了 HTTP/1.1 中的串⾏请求,不需要排队等待,也就不会再出现「队头阻塞」问题,降低了延迟,⼤幅度提⾼了连接的利⽤率。
http/2 的缺陷
看似非常完成的协议,但是也会有一些问题。不然怎么会有 http/3呢?
HTTP/2 主要的问题在于,多个 HTTP 请求在复⽤⼀个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的。所以⼀旦发⽣了丢包现象,就会触发 TCP 的重新传机制,这样在⼀个 TCP 连接中的所有的 HTTP 请求都必须等待这个丢了的包被重传回来。
http/3
基于http/2在tcp中丢包触发TCP重传机制,并且TCP下层协议无法知道有多少个HTTP协议,在HTTP/3 把 HTTP 下层的 TCP 协议改成了 UDP!
网上有好多图来对比一下吧!
⼤家都知道 UDP 是不可靠传输的,但基于 UDP 的 QUIC(Quick UDP Internet Connections) 协议 可以实现类似 TCP 的可靠性传输。
HTTP3如何工作
QUIC 是⼀个在 UDP 之上的伪 TCP + TLS + HTTP/2 的多路复⽤的协议。
参考:
- www.sohu.com/a/347106117…
- 小林图解网络(这里不是宣传哈,确确实实学到了东西,从公众号搜索就行)
- blog.csdn.net/qq_38937634…
- blog.itpub.net/31483669/vi…
- blog.csdn.net/u011955252/…