HTTP标准协议的发展

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传输数据时,是以文本的方式,借助耗CPUzip压缩的方式减少网络带宽,但是耗了前端和后端的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多路复用的协议

Buy me a 肥仔水!