Daily-Interview-Question icon indicating copy to clipboard operation
Daily-Interview-Question copied to clipboard

第 117 题:介绍下 http1.0、1.1、2.0 协议的区别?

Open yygmind opened this issue 4 years ago • 18 comments

yygmind avatar Jul 31 '19 01:07 yygmind

http 1.0 构建可扩展 http 1.1 添加了持久链接 http 2.0 添加了加密 头部压缩 服务器推送 管线操作 以及多路复用等功能

小白只知道这些了

wilesen avatar Jul 31 '19 01:07 wilesen

http1.0 exprires last-modified 连接无法复用 http1.1 etag cache-control 支持长连接(connection) 支持文件断点续传 http2.0 多路复用 首部压缩 server push 传输速度更快了

maixiaojie avatar Jul 31 '19 02:07 maixiaojie

HTTP/0.9

已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。

HTTP/1.0

这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。

HTTP/1.1

持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。

HTTP/1.1相较于HTTP/1.0协议的区别主要体现在: 缓存处理 带宽优化及网络连接的使用 错误通知的管理 消息在网络中的发送 互联网地址的维护 安全性及完整性

HTTP/2

在 HTTP/2 的第一版草案(对 SPDY 协议的复刻)中,新增的性能改进不仅包括HTTP/1.1中已有的多路复用,修复队头阻塞问题,允许设置设定请求优先级,还包含了一个头部压缩算法(HPACK)[15][16]。此外, HTTP/2 采用了二进制而非明文来打包、传输客户端—服务器间的数据。[12]

帧、消息、流和TCP连接

有别于HTTP/1.1在连接中的明文请求,HTTP/2与SPDY一样,将一个TCP连接分为若干个流(Stream),每个流中可以传输若干消息(Message),每个消息由若干最小的二进制帧(Frame)组成。[12]这也是HTTP/1.1与HTTP/2最大的区别所在。 HTTP/2中,每个用户的操作行为被分配了一个流编号(stream ID),这意味着用户与服务端之间创建了一个TCP通道;协议将每个请求分割为二进制的控制帧与数据帧部分,以便解析。这个举措在SPDY中的实践表明,相比HTTP/1.1,新页面加载可以加快11.81% 到 47.7%[17]

HPACK 算法

HPACK算法是新引入HTTP/2的一个算法,用于对HTTP头部做压缩。其原理在于:

客户端与服务端根据 RFC 7541 的附录A,维护一份共同的静态字典(Static Table),其中包含了常见头部名及常见头部名称与值的组合的代码; 客户端和服务端根据先入先出的原则,维护一份可动态添加内容的共同动态字典(Dynamic Table); 客户端和服务端根据 RFC 7541 的附录B,支持基于该静态哈夫曼码表的哈夫曼编码(Huffman Coding)。

服务器推送

网站为了使请求数减少,通常采用对页面上的图片、脚本进行极简化处理。但是,这一举措十分不方便,也不高效,依然需要诸多HTTP链接来加载页面和页面资源。

HTTP/2引入了服务器推送,即服务端向客户端发送比客户端请求更多的数据。这允许服务器直接提供浏览器渲染页面所需资源,而无须浏览器在收到、解析页面后再提起一轮请求,节约了加载时间。

0w0k avatar Jul 31 '19 02:07 0w0k

http1.0 仅支持保持短暂的TCP链接 不追踪ip

http1.1 支持长连接 纯文本报头 增加了更多的请求头和响应头 连接数过多 容易队首阻塞 且串行传输

http2.0 多路复用,并行请求 二进制报头 数据帧 对报头压缩,降低开销 服务器主动推送,减少请求延迟 默认使用加密 增加伪头字段

就当每天做面试题了 每天巩固提升一下

如果有面试标准答案请告诉我 /笑哭

FontEndArt avatar Jul 31 '19 02:07 FontEndArt

http1.0
缓存:主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准 不支持断点续传 没有持久连接 http1.1 缓存: 引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。 支持长连接和管线化 可以进行断点续传 http2.0 在1.1的基础上添加了信道复用 header请求头压缩 服务端推送

了解有限 劳烦大神指点

xerxh avatar Jul 31 '19 02:07 xerxh

这道题,真是一点都不知道啊!学习了!

xiaokeqi avatar Jul 31 '19 02:07 xiaokeqi

HTTP/1.0 – 构建可扩展性

HTTP/1.1 – 标准化的协议

  • 连接可以复用,允许在第一个应答被完全发送之前就发送第二个请求,以降低通信延迟。
  • 增加流水线操作
  • 支持响应分块
  • 引入额外的缓存控制机制
  • 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换
  • 感谢Host头,能够使不同域名配置在同一个IP地址的服务器上

HTTP/2

  • 加密传输层
  • Server-sent events,服务器可以偶尔推送消息到浏览器
  • WebSocket,一个新协议,可以通过升级现有 HTTP 协议来建立

HTTP/2在HTTP/1.1有几处基本的不同:

  • HTTP/2是二进制协议而不是文本协议。不再可读,也不可无障碍的手动创建,改善的优化技术现在可被实施。
  • 这是一个复用协议。并行的请求能在同一个链接中处理,移除了HTTP/1.x中顺序和阻塞的约束。
  • 压缩了headers。因为headers在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
  • 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。

habc0807 avatar Jul 31 '19 03:07 habc0807

1.0 1.1 2.0
长连接 需要使用keep-alive 参数来告知服务端建立一个长连接 默认支持 默认支持
HOST域 ✔️ ✔️
多路复用 - ✔️
数据压缩 使用HAPCK算法对header数据进行压缩,使数据体积变小,传输更快
服务器推送 ✔️

taosin avatar Jul 31 '19 03:07 taosin

http/1 :

  1. 默认不支持长连接,需要设置keep-alive参数指定
  2. 强缓存expired、协商缓存last-modified\if-modified-since 有一定的缺陷

http 1.1 :

  1. 默认长连接(keep-alive),http请求可以复用Tcp连接,但是同一时间只能对应一个http请求(http请求在一个Tcp中是串行的)
  2. 增加了强缓存cache-control、协商缓存etag\if-none-match 是对http/1 缓存的优化

http/2 :

  1. 多路复用,一个Tcp中多个http请求是并行的 (雪碧图、多域名散列等优化手段http/2中将变得多余)
  2. 二进制格式编码传输
  3. header压缩
  4. 服务端推送

huanchong avatar Jul 31 '19 03:07 huanchong

HTTP1.0和HTTP1.1的一些区别:

1、缓存处理,在HTTP1.0中,使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tagIf-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。 2、带宽优化以及网络连接的使用,HTTP1.0中,存在一些浪费的现象,例如客户端只是需要某个对象一部分,而服务器却将整个对象送过来了,并且不支持断点续传的功能,HTTP1.1则在请求头中引入了range头域,它允许只请求资源的某一个部分,即返回206 这样开发者方便了开发者自由选择以便充分利用带宽和链接。 3、错误通知的管理,在HTTP1.1中新增了24个错误状态码,例如409表示请求的资源和当前状态发生冲突;410表示服务器上的某一个资源被永久的删除。 4、HOST头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。 5、长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

HTTP2.0 和HTTP1.X的区别:

1、新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

2、多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

3、header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

4、服务端推送(server push),同SPDY一样,HTTP2.0也具有server push功能。

MagicalBridge avatar Jul 31 '19 04:07 MagicalBridge

原文地址:http1.0 http1.1 http2.0特性及区别

http1.0 http1.1 http2.0特性及区别

http1.0特性

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

无状态

对于无状态的特性可以借助cookie/session机制来做身份认证和状态记录

无连接

无连接导致的性能缺陷有两种:

1. 无法复用连接
每次发送请求,都需要进行一次tcp连接(即3次握手4次挥手),使得网络的利用率非常低

2. 队头阻塞
http1.0规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也给阻塞的

http1.1特性

为了解决http1.0的性能缺陷,http1.1出现了

http1.1特性:

  • 长连接:新增Connection字段,可以设置keep-alive值保持连接不断开
  • 管道化:基于上面长连接的基础,管道化可以不等第一个请求响应继续发送后面的请求,但响应的顺序还是按照请求的顺序返回
  • 缓存处理:新增字段cache-control
  • 断点传输

长连接

http1.1默认保持长连接,数据传输完成保持tcp连接不断开,继续用这个通道传输数据

管道化

基于长连接的基础,我们先看没有管道化请求响应:

tcp没有断开,用的同一个通道

请求1 > 响应1 --> 请求2 > 响应2 --> 请求3 > 响应3

管道化的请求响应:

请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3

即使服务器先准备好响应2,也是按照请求顺序先返回响应1

虽然管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题

缓存处理

当浏览器请求资源时,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存,则发送请求

通过设置字段cache-control来控制

断点传输

在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率

在 Header 里两个参数实现的,客户端发请求时对应的是 Range 服务器端响应时对应的是 Content-Range

http2.0特性

  • 二进制分帧
  • 多路复用: 在共享TCP链接的基础上同时发送请求和响应
  • 头部压缩
  • 服务器推送:服务器可以额外的向客户端推送资源,而无需客户端明确的请求

二进制分帧

将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码

多路复用

基于二进制分帧,在同一域名下所有访问都是从同一个tcp连接中走,http消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来

区别

  1. http1.0 到http1.1的主要区别,就是从无连接到长连接
  2. http2.0对比1.X版本主要区别就是多路复用

MY729 avatar Jul 31 '19 13:07 MY729

http1.0不支持持久连接 http1.1支持持久连接,但是串行发送请求,并行请求只能同时建立多个tcp连接,引入了管道化,但是存在队头阻塞的问题 http2.0二进制分帧、多路复用、头部压缩、服务端推送

hulahulahhh avatar Aug 01 '19 01:08 hulahulahhh

HTTP1.0与HTTP1.1 缓存处理 HTTP1.0 中主要是用header里的If-Modified-Since、Expires HTTP1.1中则引入Entity tag、If-Unmodified-Since,If-Match,If-None-Match

长连接 HTTP1.0 不支持,需要用一个keep-alive来设置 HTTP1.1 默认就是

host域 HTTP1.0 不支持,因为之前觉得一台服务器只有一个地址 HTTP2.0 支持,请求消息和响应消息都支持

HTTP1.x与HTTP2.0 HTTP2.0 支持服务端推送、多路复用、headers压缩、二进制传输

MissNanLan avatar Aug 14 '19 07:08 MissNanLan

http1.0:无状态,无连接,默认不支持长连接(需要设置keep-alive参数指定),连接无法复用,不支持断点续传。 http1.1:默认支持长连接,连接可复用,支持断点续传、缓存处理。 http2.0:在http1.1的基础上增加了多路复用、并行请求,管道化,报头压缩,二进制格式编码传输,服务器推送。

ZH-MIN avatar Aug 14 '20 04:08 ZH-MIN

http1.0 1、引入了请求头、响应头、状态码

http1.1: 1、持久连接(一个tcp连接可以传输多个请求) 2、不成熟的http管线化(将多个请求整批发送给服务器,服务器根据请求顺序来响应请求) 3、提供虚拟主机的支持(增加HOST字段,表示当前域名) 4、对动态生成的内容提供完美的支持 很多页面的内容都是动态生成的,因此在传输数据之前并不知道最终的数据大小,这就导致了浏览器不知道何时会接收完所有的文件数据。引入chunk transfer机制,服务器将数据分割成若干任意大小数据块。 5、客户端cookie、安全机制 缺点: 1、tcp慢启动 2、同时开启多条tcp连接,那么这些连接会竞争固定带宽 3、对头阻塞问题

http2: 1、多路复用(通过二进制分帧层实现,数据经过二进制分帧层处理以后,会被转换为一个个带有请求ID的帧,服务器接收到所有帧后,将相同ID编号的帧合并为完整的请求信息)解决一个域名可以使用一个tcp长连接和对头阻塞问题。 2、可以设置请求优先级 3、服务器推送 4、头部压缩

mengshis avatar Sep 16 '20 01:09 mengshis

那就把HTTP0.9一起写了吧:

  1. HTTP/0.9
  • 只有GET方法
  • 使用ASCII字符流传输
  1. HTTP/1.0
  • 添加请求头和响应头,Accept-* <=> Content-*字段
  • 添加HTTP版本号
  1. HTTP/1.1
  • 默认开启长链接(keep-alive)
  • 管线化(req1 -> req2 -> req3 === res1 -> res2 -> res3)
  • Host头字段,对虚拟主机的支持
  • 对动态文件的支持,chunk transfer机制
  • cookie机制
  • 安全机制
  1. HTTP/2.0
  • 二进制分帧
  • 头部压缩算法 HPACK
  • 多路复用,通过流的方式传输
  • 服务器推送 Push Cache

JaykeyGuo avatar Oct 30 '20 01:10 JaykeyGuo

HTTP-1.0

  1. 协商缓存使用expires、last-modified来判断
  2. 不支持长链接

HTTP-1.1

  1. 现阶段使用范围最广的http协议
  2. 协商缓存控制使用date和last-modified判断
  3. 默认开启长链接(keep-alive),一个tcp可以复用发送多个http请求
  4. 支持管线化(pipelining),不再等上一个请求完成之后才开始发送下一个请求,可以连续发送多个http请求头,然后按照顺序响应

HTTP-2.0

  1. 多路复用特性
  • http2.0复用一个tcp连接完成所有请求
  • 每个http请求报文会被切片成帧(iframe),用来传输http2.0的tcp通道称为流(stream); 不同的帧在流(stream)里面传播,每个帧会被压缩为二进制,所以http2.0是二进制格式
  • 不同流的帧可以单独无序的传输,不用按照顺序产生阻塞问题,当所有帧发送完毕,按照顺序重新组合成完整报文
  • 同时帧上面可以携带priority参数规定优先级,可以规定那些帧先被发送和组装
  1. 使用头部压缩算法,传输效率更高
  2. 服务器推送,服务器可以主动推送资源到客户端,以备后续使用

shifengdiy avatar Aug 12 '21 16:08 shifengdiy

https://juejin.cn/post/6963931777962344455#heading-22 https://segmentfault.com/a/1190000015316332

lingok1 avatar Apr 26 '22 12:04 lingok1