HTTP1.0,HTTP1.1,HTTP2.0之间有什么区别?
参考答案:
HTTP1.0 和 HTTP1.1 的一些区别
缓存处理
在 HTTP1.0 中主要使用 header 里的 If-Modified-Since(比较资源最后的更新时间是否一致),Expires(资源的过期时间(取决于客户端本地时间)) 来做为缓存判断的标准。
HTTP1.1 则引入了更多的缓存控制策略:
Entity tag:资源的匹配信息If-Unmodified-Since:比较资源最后的更新时间是否不一致If-Match:比较 ETag 是否一致If-None-Match:比较 ETag 是否不一致
等更多可供选择的缓存头来控制缓存策略。
带宽优化
HTTP1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能。
HTTP 1.1默认支持断点续传。
Host 头处理
在 HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机,并且它们共享一个 IP 地址。HTTP1.1 的请求消息和响应消息都应支持 Host 头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request)。
长连接
HTTP1.0 需要使用keep-alive参数来告知服务器端要建立一个长连接,而 HTTP1.1 默认支持长连接,一定程度上弥补了 HTTP1.0 每次请求都要创建连接的缺点。
HTTP 是基于 TCP/IP 协议的,创建一个 TCP 连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。
HTTP1.1 支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟。
错误通知的管理
在 HTTP1.1 中新增了 24 个错误状态响应码,如 409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
新增请求方式
- PUT:请求服务器存储一个资源
- DELETE:请求服务器删除标识的资源
- OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求
- CONNECT:保留请求以供将来使用
- TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
HTTP2.0 与 HTTP1.X 的区别
HTTP1.X 版本的缺陷概括来说是:线程阻塞,在同一时间,同一域名的请求有一定的数量限制,超过限制数目的请求会被阻塞。
二进制分帧
HTTP1.x 的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认 0 和 1 的组合。基于这种考虑 HTTP2.0 的协议解析决定采用二进制格式,实现方便且健壮。
HTTP2.0 在 应用层(HTTP2.0)和传输层(TCP/UDP)之间增加一个二进制分帧层。在不改动 HTTP1.X 的语义、方法、状态码、URI 以及首部字段的情况下, 解决了 HTTP1.1 的性能限制,改进传输性能,实现低延迟和高吞吐量。在二进制分帧层中,HTTP2.0 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码 ,其中 HTTP1.X 的首部信息会被封装到 HEADER frame,而相应的 Request Body 则封装到 DATA frame 里面。
帧:HTTP2.0 数据通信的最小单位消息:指 HTTP2.0 中逻辑上的 HTTP 消息。例如请求和响应等,消息由一个或多个帧组成。
流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数 ID。
多路复用(MultiPlexing)
多路复用允许同时通过单一的 HTTP2.0 连接发起多重的请求-响应消息。即是连接共享,提高了连接的利用率,降低延迟。即每一个 request 都是是用作连接共享机制的。一个 request 对应一个 id,这样一个连接上可以有多个 request,每个连接的 request 可以随机的混杂在一起,接收方可以根据 request 的 id 将 request 再归属到各自不同的服务端请求里面。
在 HTTP1.1 协议中浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞。这也是为何一些站点会有多个静态资源 CDN 域名的原因之一。
当然 HTTP1.1 也可以多建立几个 TCP 连接,来支持处理更多并发的请求,但是创建 TCP 连接本身也是有开销的。
TCP 连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求。
HTTP2.0 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,同个域名只需要占用一个 TCP 连接,消除了因多个 TCP 连接而带来的延时和内存消耗。HTTP2.0 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。
header 压缩
HTTP1.x 的 header 带有大量信息,而且每次都要重复发送,HTTP2.0 使用 HPACK 算法对 header 的数据进行压缩,减少需要传输的 header 大小,通讯双方各自 cache 一份 header fields 表,差量更新 HTTP 头部,既避免了重复 header 的传输,又减小了需要传输的大小。
header 采取的压缩策略:
- HTTP2.0 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;
- 首部表在 HTTP2.0 的连接存续期内始终存在,由客户端和服务器共同渐进地更新;
- 每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值。
服务端推送(server push)
服务端推送是一种在客户端请求之前发送数据的机制。
服务端可以在发送页面 HTML 时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 时再发送这些请求。
服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
题目要点:
HTTP1.0与HTTP1.1的区别
- 缓存处理:
- HTTP1.0:使用
If-Modified-Since和Expires作为缓存判断标准。 - HTTP1.1:引入了
Entity tag、If-Unmodified-Since、If-Match、If-None-Match等更多缓存控制策略。
- HTTP1.0:使用
- 带宽优化:
- HTTP1.0:存在浪费带宽的现象,不支持断点续传。
- HTTP1.1:默认支持断点续传,提高了带宽利用率。
- Host头处理:
- HTTP1.0:不传递主机名(hostname)。
- HTTP1.1:请求和响应消息都支持Host头域,没有Host头域会报告错误。
- 长连接:
- HTTP1.0:需要使用
keep-alive参数建立长连接。 - HTTP1.1:默认支持长连接,减少了建立和关闭连接的消耗和延迟。
- HTTP1.0:需要使用
- 错误通知的管理:
- HTTP1.1:新增了24个错误状态响应码,如409(Conflict)和410(Gone)。
- 新增请求方式:
- HTTP1.1:新增了PUT、DELETE、OPTIONS、CONNECT、TRACE等请求方式。
HTTP2.0与HTTP1.x的区别
- 二进制分帧:
- HTTP2.0:使用二进制格式代替文本格式,提高了协议的健壮性。
- 多路复用(MultiPlexing):
- HTTP2.0:允许在单一连接上并发处理多个请求和响应,提高了连接的利用率。
- HTTP1.x:同一时间对同一域名下的请求数量有限制,超过限制的请求会被阻塞。
- header压缩:
- HTTP2.0:使用HPACK算法对header数据进行压缩,减少了需要传输的header大小。
- 服务端推送:
- HTTP2.0:允许服务器在客户端请求之前主动推送数据,如JS和CSS文件。
总结
HTTP1.0是最初的HTTP协议版本,它在互联网的发展中发挥了重要作用,但随着时间的推移,它的性能限制变得越来越明显。
HTTP1.1对HTTP1.0进行了许多改进,提高了性能和安全性。然而,随着互联网的进一步发展,HTTP1.1也遇到了一些性能瓶颈,如线程阻塞、连接限制等。
HTTP2.0是在HTTP1.x基础上进行了重大改进的版本,它通过二进制分帧、多路复用、header压缩和服务端推送等机制,大幅提高了传输性能,减少了延迟和提高了吞吐量。这些改进使得HTTP2.0成为目前互联网上最常用的HTTP协议版本之一。