HTTP的特点
- 基于tcp/ip、一种网络应用层协议、超文本传输协议HyperText Transfer Protocol
- 工作方式:客户端请求服务端应答的模式
- 快速:无状态连接
- 灵活:可以传输任意对象,对象类型由Content-Type标记
- 客户端请求request消息包括以下格式:请求行(request line)、请求头部(header)、空行、请求数据
HTTP/0.9
- 仅仅有GET一种方式。当时的需求很简单,就是用来传输学术上体积很小的 HTML 文件。
- 只有请求行,没有后来熟悉的请求头,请求体
- 同理,服务端只是返回数据,没有响应头,响应体这些东西
HTTP/1.0
- 版本发布,内容大大增加。增加了POST和HEAD命令。可以发送任何形式的内容,也规定了请求和响应格式。
HTTP/1.1
- 长连接
- 默认使用长连接,长连接就是一次连接,连接期内多次发送请求。
- 相比于1.0 每一次请求都要进行tcp三次握手,节省了大量时间。
- 长连接的请求时长可以在请求头中的keep-alive中设置
- 管线化
- 在HTTP/1.0时,只有前一次的请求发出,并得到服务器端的响应。
- 第二次的请求才可以发出去。
- 而在HTTP/1.1管道机制规则下,可以一次同时向服务端发出去多个请求。
- 当然了,管线化,也有自己的缺陷。
- 虽然是一次性发出多个,但是服务端在响应的时候还是按照请求顺序响应。
- 这就有可能出现,前面的某个请求的响应时间很长,后面就会有很多的请求排队等候。
- 这个现象也称为队头阻塞。
- 虽然可以整批发送请求,不过服务器依然需要根据请求顺序来回复浏览器的请求。
- 支持断点续传,通过请求头中的 range 来实现
- 新增了缓存标识。E-tag,if-match,if-none-match
- 缺点
- 队头阻塞
- 请求头信息太多
- 多次请求,请求头重复信息太多
- 请求没有优先级
- 只有客户端请求- 服务端响应这个模式
HTTP/2.0
- HTTP/2.0标准在2015年发布,针对 HTTP/1.1 做出了如下的改变:
- 多路复用
- 大家都知道HTTP/1.1 为每个域名维护了多个TCP连接,那为什么还要搞多路复用?
- 想知道答案的可以看我上一篇文章一个域名究竟可以维护多少个TCP连接???,里面有详细的解答。
- 一个连接中并发多个请求或回应,而不用按照顺序一一对应。降低了延迟,大幅度提高了连接的利用率。
- 多路复用,每一个请求都对应一个ID。
- 这样,我们的请求就可以分开了,响应也可以打包混合运送,之所以敢这样,就是每一个响应包裹,都有对应ID,客户端收到之后,可以根据自己ID,将数据组合。
- 又因为有了多路复用,我们的请求优先级也可以用到了,遇到优先级高的,可以将当前的响应立马停止,转而去处理优先级高的请求。
- 头部压缩
- 同时发送多个请求,头部会帮我们消除重复的部分。这就是HPACK算法。
- 客户端,服务端同时维护一张头信息表,所有的字段都会存入这张表,生成索引号码,每一次仅仅发送索引号码就可以了。
- 这样在网络上传输就会更快。
- 二进制格式
- HTTP/2 不再像 HTTP/1.1 里的纯文本形式的报文,而是全面采用了二进制格式。
- 过这种形式对人不友好,对计算机友好。省去了计算机收到报文后,转换成二进制的过程。增加了数据传输的效率
- 数据流
- HTTP/2 的数据包不是按顺序发送的,同一个连接里面连续的数据包,可能属于不同的回应。
- 客户端发送的编号是奇数,服务端发出的偶数。客户端可以指定数据流的优先级,优先级高的请求,服务端就先响应其请求。
- 服务器推送
- 服务端可以主动向客户端发送消息。这样好处,就是那种我预判了你的预判的那种感觉。理解为性能优化中的预加载。
- 缺点
- 多个 HTTP 请求在复用一个 TCP 连接,下层的 TCP 协议是不知道有多少个 HTTP 请求的。
- 所以一旦发生丢包现象,就会触发TCP的重传机制,这样一个TCP连接中的所以请求都必须等待这个丢失的包重新传回来。
- 虽然 HTTP/2.0 解决了 HTTP/1.1 中的队头阻塞问题,但是 HTTP/2.0 依然是基于 TCP 协议的,所以上上面描述的情况已经存在。
- 因为HTTP/1.1 是多车道,一条对头阻塞了,还有其他的可以请求传输。
- 而我们的HTTP/2.0是单车道,如果因为丢包堵塞,那么就真的是堵塞了。
- 如果堵塞时间长(丢包多),当系统达到了 2% 的丢包率时,HTTP/1.1 的传输效率反而比 HTTP/2 表现得更好。
HTTP/3.0
- 多次提到了TCP丢包,TCP丢包。
- 从TCP的角度来看,HTTP/2.0 已经可以算是他的巅峰了,已经很难优化了。既然得不到,那就只有毁灭他了。
- 所以HTTP/3.0 有了一个新的协议 QUIC。
- 但是目前各种厂商的中间设备仅支持TCP和UDP协议,那么我们只能退而求其次,传输层选用UDP,顶层加入其他算法,使其既有TCP的稳定,还能保证UDP的传输。
- 思考一下,QUIC的内容,既要有HTTP/2.0的优点,又要去掉他的缺点,那么:
- QUIC 实现类似于 TCP 的保证传输的可靠性。也就是在UDP的基础上自己实现一套数据丢包重传机制,并且有多个通道传输内容,当一个通道堵塞,不影响其他通道
- TLS(https安全协议)升级到1.3
- 减少合并,连接开启前的握手
Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.A new tool that blends your everyday work apps into one. It's the all-in-one workspace for you and your team
https://serious-lose.notion.site/HTTP-ddfa06b0b489445db8ba2f78d68ee72c