HTTP 1.0, 1.1, 2.0, 3.0 概念

127 阅读6分钟

HTTP(即超文本传输协议)

http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定。也就是说,http协议规定了超文本传输所要遵守的规则。

HTTP 1.0 无状态无连接应用层协议

  • 无状态就是服务器不跟踪不记录请求过的状态
  • 无连接就是浏览器每次请求都需要建立tcp连接

HTTP/1.0规定浏览器和服务器保持短暂的连接。浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态

缺陷

  1. 无法复用连接。每次发送请求的时候,都需要进行一次TCP连接,而TCP的连接释放过程又是比较费事的。这种无连接的特性会导致网络的利用率非常低。

  2. 队头堵塞(head of line blocking)。由于HTTP/1.0规定下一个请求必须在前一个请求响应到达之前才能发送。假设一个请求响应一直不到达,那么下一个请求就不发送,就导致阻塞后面的请求。

HTTP 1.1

长连接: HTTP/1.1增加了一个Connection字段,通过设置Keep-alive(默认已设置)可以保持连接不断开,避免了每次客户端与服务器请求都要重复建立释放TCP连接,提高了网络的利用率。如果客户端想关闭HTTP连接,可以在请求头中携带Connection:false来告知服务器关闭请求

支持请求管道化: 基于HTTP/1.1的长连接,使得请求管线化成为可能。管线化使得请求能够“并行”传输。(但是有个缺陷就是虽然能同时发送多个请求, 但是还是要按照请求的顺序来响应, 如果上一个请求未响应的话下一个请求是不会响应的)

支持断点传输: 指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载。可以节省时间,提高速度。

加入了缓存处理 : 强缓存和协商缓存, 减小服务器的压力, 提高性能, 减少网络传输

HTTP 2.0

1. 头部压缩

http2.0头部压缩又称为HAPCK,设计简单而灵活,是因为HPACK格式有意地简单且不灵活能降低由于实现错误而导致的互操作性或安全问题的风险

http1.1没有头部压缩,随着请求增加,冗余头部字段会不必要地占用带宽,从而显着增加延迟,而头部压缩可消除冗余报头字段,限制已知安全攻击的漏洞,并且在受限环境中使用有限的内存要求

HTTP2.0大幅度的提高了web性能,在HTTP1.1完全语义兼容的基础上,进一步减少了网络的延迟。实现低延迟高吞吐量。对于前端开发者而言,减少了优化工作。

2. 二进制分帧

HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式,二进制协议解析起来更高效。 HTTP / 1 的请求和响应报文,都是由起始行,首部和实体正文(可选)组成,各部分之间以文本换行符分隔。HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。

3. 多路复用

  • 流(stream) :已建立连接上的双向字节流。
  • 消息:与逻辑消息对应的完整的一系列数据帧。
  • 帧(frame) :HTTP2.0通信的最小单位,每个帧包含头部,至少也会标识出当前所属的流(stream_id)

所有HTTP2.0通信都在一个TCP链接上完成,这个链接可以承载任意流量的双向数据流。

每个数据流以消息的形式发送,而消息由一或多个帧组成。这些帧可以乱序发送,然后再根据每个帧头部的流标识符(Stream_id)重新封装。

多路复用(连接共享)可能会导致关键字被阻塞,HTTP2.0里每个数据流都可以设置优先级和依赖,优先级高的数据流会被服务器优先处理和返回客户端,数据流还可以依赖其他的子数据流。

可见,HTTP2.0实现了真正的并行传输,它能够在一个TCP上进行任意数量的HTTP请求。而这个强大的功能基于“二级制分帧”的特性。

HTTP 3.0

HTTP/1.x 有连接无法复用、队头阻塞、协议开销大和安全因素等多个缺陷

HTTP/2 通过多路复用、二进制流、Header 压缩等等技术,极大地提高了性能,但是还是存在着问题的

那么http3就是为了解决http3.0以前相关问题而诞生,它基于一个新的传输层协议QUIC,而http3就是建立一个在QUIC上运行的HTTP新规范,而http3之前的版本都是基于TCP,QUIC就是为了替代TCP,解决TCP的一些缺陷

tcp

  1. 不支持流级复用,TCP会将所有对象序列化在同一个流中,因此,它不知道TCP段的对象级分区,无法在同一个流中复用数据包

  2. 会产生冗余通信,tco三次连接握手会有冗余的消息交换序列(所谓三次握手(Three-Way Handshake)即建立TCP连接。就是指建立一个TCP连接时,需要客户端服务端总共发送三个包以确认连接的建立)

  3. 可能会间歇性地挂起数据传输,tcp中有个因为序列顺序处理丢失的问题的缺陷称为行头阻塞

QUIC

  1. 同样拥有头部压缩,并优化了对乱序发送的支持,也优化了压缩率
  2. 放弃tcp,通过udp建立,提高了连接建立的速度,降低了延迟
  3. tcp本身是无法解决队头拥塞,quic则解决了这个问题
  4. Connection ID使得http3支持连接迁移以及NAT的重绑定

最后讲一下关于HTTPS与HTTP的一些区别

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
  • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。