https://coolshell.cn/articles/19840.html
概述
HTTP (Hypertext transfer protocol) 超文本传输协议
-
最初用于传递通过HTML封装过的数据
-
发展
1991 HTTP 0.9版
1996 HTTP 1.0版
1997 HTTP 1.1版 传输最广泛的版本
2015 HTTP 2.0版 优化了HTTP/1.1的性能和安全性
2018 HTTP 3.0版 激进地使用 UDP 取代 TCP协议
发展
最传统的 request – response的模式
HTTP/0.9
不支持请求头
只支持 GET 方法
HTTP/1.0
加入了HTTP版本号
GET /coolshell/index.html HTTP/1.0
request
还是response
都有header
增加了HTTP Status Code
标识相关的状态码
Content-Type
可以传输其它的文件
HTTP/1.1
设置keepalive
来让HTTP重用TCP链接
, 长链接
重用TCP链接可以省了每次请求都要在广域网上进行的TCP的三次握手的巨大开销。
支持pipeline
网络传输,可以发多个请求( 有顺序 )
(注:非幂等的POST 方法或是有依赖的请求是不能被pipeline化的)
支持 Chunked Responses
在Response的时候,不必说明 Content-Length,这样 客户端不能断连接,直到收到服务端的EOF标识
增加了 cache control
机制
协议头注
增加了 Language, Encoding, Type
等等头,让客户端可以跟服务器端进行更多的协商
加入了 HOST
区分用户是请求的域名
加入了 OPTIONS
方法
用于 CORS – Cross Origin Resource Sharing 应用
HTTP/2
http 1.0的缺点
- 串行请求
HTTP/1.1
可以重用TCP链接
,但是请求还是一个一个串行
发的,需要保证其顺序
- 数据传输的成本比较大
HTTP/1.1传输数据时
,是以文本的方式
,借助耗CPU
的zip压缩的方式
减少网络带宽,但是耗了前端和后端的CPU
http 2.0
-
二进制协议
,增加了数据传输的效率 -
在一个TCP链接中
并发请求多个HTTP请求
,移除了HTTP/1.1中的串行请求 -
HTTP/2会压缩头, 消除重复的部分
同时发出多个请求,他们的头是一样的或是相似的,协议会帮你消除重复的部分。 这就是所谓的HPACK算法
HTTP/3
http 2.0的缺点
HTTP/1.1中的pipeline中如果有一个请求block了,那么队列后请求也统统被block住了;
HTTP/2 多请求复用一个TCP连接,一旦发生丢包,就会block住所有的HTTP请求
若干个HTTP的请求在复用一个TCP的连接,底层的TCP协议是不知道上层有多少个HTTP的请求的,
所以,一旦发生丢包,造成的问题就是所有的HTTP请求都必需等待这个丢了的包被重传回来,哪怕丢的那个包不是我这个HTTP请求的
把HTTP底层的TCP协议改成了UDP
UDP不管顺序,不管丢包 , QUIC协议
有自己的丢包重传的机制
QUIC
(Quick UDP Internet Connections )
QUIC
是一个在UDP之上的伪TCP +TLS +HTTP/2
的多路复用的协议