http/0.9 http/1.0 http/1.1(标准) http/2.0 http/3.0

442 阅读6分钟

http/0.9

协议定义了客户端发起请求、服务端响应请求的通信模式;请求报文内容只有 1 行 GET + 请求的文件路径,传输纯文本;没有 HTTP 标头,没有状态/错误代码,没有 cookie,也没有其他现代功能;http/0.9 建立在 TCP(传输控制协议)之上,响应后立即终止连接。

http0.9.PNG

http/1.0

随着互联网的发展以及浏览器的出现,单纯的文本内容已经无法满足用户需求了,浏览器希望通过 HTTP 来传输脚本、样式、图片、音频和视频等不同类型的文件,就是现在的 web2.0 ,所以在 1996 年 HTTP 更新的 1.0 版本中引入了如下特性:

1. 支持三种请求方法:GET,Head,和POST

2. 增加了响应状态码,标记可能的错误原因

3. 引入了协议版本号概念

4. 引入了 HTTP Header(头部)的概念,让 HTTP 处理请求和响应更加灵活

5. 内容类型能够传输 HTML 文件以外的文档

http1.0.PNG

http/1.1(标准)

随着互联网的迅速发展,摩尔定律得出信息指数级增长,网络负载和带宽增大导致信息传播时延增大,http/1.0不满足现在的生产力,出现现在的http/1.1;具体来说就是 HTTP/1.0 每进行一次通信,都需要经历 建立连接传输数据断开连接 三个阶段。当一个页面引用了较多的外部文件时,这个建立连接和断开连接的过程就会增加大量网络开销;期间出现了https(安全超文本传输协议),使用 SSL/TLS 进行安全加密通信。http/1.1引入以下特性:

1. 长连接(Connection:keep-alive):引入了 TCP 连接复用,即一个 TCP 默认不关闭,可以被多个请求复用

2. 并发连接:对一个域名的请求允许分配多个长连接(缓解了长连接中的队头阻塞问题)

3. 引入管道机制,一个 TCP 连接,可以同时发送多个请求。

4. 支持请求方法:OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE

5. 新增缓存字段(cache-control E-tag)

6. 请求头中引入了 range 字段,支持断点续传

7. 允许响应数据分块(chunked),利于传输大文件

8. 强制要求 Host 头,让互联网主机托管成为可能

48ba61ef2ac1638d9fb7819da1d21c7.png

http报文.PNG

http报文

HTTP Request Header

  • Accept:浏览器能够处理的内容类型
  • Accept-Charset:浏览器能够显示的字符集
  • Accept-Encoding:浏览器能够处理的压缩编码
  • Accept-Language:浏览器当前设置的语言
  • Connection:浏览器与服务器之间连接的类型
  • Cookie:当前页面设置的任何Cookie
  • Host:发出请求的页面所在的域
  • Referer:发出请求的页面的URL
  • User-Agent:浏览器的用户代理字符串

HTTP Responses Header

  • Date:表示消息发送的时间
  • server:服务器名称
  • Connection:浏览器与服务器之间连接的类型
  • Cache-Control:控制HTTP缓存
  • content-type:表示后面的文档属于什么MIME类型(application/x-www-form-urlencoded:浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以这种方式提交数据。multipart/form-data:该种方式也是一个常见的 POST 提交方式,通常表单上传文件时使用该种方式。application/json:服务器消息主体是序列化后的 JSON 字符串。text/xml:该种方式主要用来提交 XML 格式的数据)

http/2.0

HTTP/1.1 通过长连接减少了大量创建/断开连接造成的性能消耗,但是它的并发能力受到限制,表现在两个方面:HTTP/1.1 中使用持久连接时,一个连接中同一时刻只能处理一个请求。当前的请求没有结束之前,其他的请求只能处于阻塞状态,这种情况被称为 队头阻塞 浏览器为了减轻服务器的压力,限制了同一个域名下的 HTTP 连接数,即 6 ~ 8 个,2015 年正式发布的 HTTP/2 默认不再使用 ASCII 编码传输,而是改为二进制数据,来提升传输效率。

客户端在发送请求时会将每个请求的内容封装成不同的带有编号的二进制帧(Frame),然后将这些帧同时发送给服务端。服务端接收到数据之后,会将相同编号的帧合并为完整的请求信息。同样,服务端返回结果、客户端接收结果也遵循这个帧的拆分与组合的过程。

有了二进制分帧后,对于同一个域,客户端只需要与服务端建立一个连接即可完成通信需求,这种利用一个连接来发送多个请求的方式称为 多路复用 。每一条路都被称为一个 stream(流)。

http/2.0 的主要修改包括:

1. 数据通过二进制协议传输

2. 多路复用,废弃了 1.1 中的管道

3. 使用专用算法压缩头部,减少数据传输量

4. 通过设置数据帧的优先级,让服务器优先处理某些请求

5. 允许服务器主动向客户推送数据(websokect)

6. 头部字段全部改为小写;引入了伪头部的概念,出现在头部字段之前,以冒号开头

7. http/2.0隐藏了协议版本号

1665996001146.png

http/3.0

http/2 由于采用二进制分帧进行多路复用,通常只使用一个 TCP 连接进行传输,在丢包或网络中断的情况下后面的所有数据都被阻塞;但对于 http/1.1 来说,可以开启多个 TCP 连接,任何一个 TCP 出现问题都不会影响其他 TCP 连接,剩余的 TCP 连接还可以正常传输数据,这种情况下 http/2 的表现就不如 http/1 了。

2018 年 http/3 将底层依赖的 TCP 改成 UDP,从而彻底解决了这个问题。UDP 相对于 TCP 而言最大的特点是传输数据时不需要建立连接,可以同时发送多个数据包,所以传输效率很高,缺点就是没有确认机制来保证对方一定能收到数据。

总结

1. http/0.9: GET + 请求的文件路径,服务端收到请求后返回一个以 ASCII 字符流编码的 HTML 文档,确立了客户端请求、服务端响应的通信流程。

2. http 1.0:支持最基本的 GET、POST 方法、引入 header、传输的数据不局限于纯文本

3. http/1.1:增减缓存策略、支持长连接、支持断点续传,新增方法 PUT,DELETE 等,可用于 Restful API

4. http/2.0:数据通过二进制协议传输、支持压缩 header,减少体积、多路复用,一次 TCP 连接中可以多个 HTTP 并行请求、服务端推送

5. http/3.0:将底层依赖的 TCP 改成 UDP