Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
yygmind opened this issue Jul 31, 2019 · 18 comments
Open

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

yygmind opened this issue Jul 31, 2019 · 18 comments
Labels

Comments

@yygmind
Copy link
Contributor

yygmind commented Jul 31, 2019

No description provided.

@wilesen
Copy link

wilesen commented Jul 31, 2019

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

小白只知道这些了

@maixiaojie
Copy link

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

@0w0k
Copy link

0w0k commented Jul 31, 2019

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

@FontEndArt
Copy link

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

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

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

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

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

@xerxh
Copy link

xerxh commented Jul 31, 2019

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

了解有限 劳烦大神指点

@xiaokeqi
Copy link

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

@habc0807
Copy link

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在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
  • 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。

@taosin
Copy link

taosin commented Jul 31, 2019

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

@huanchong
Copy link

huanchong commented Jul 31, 2019

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. 服务端推送

@MagicalBridge
Copy link

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功能。

@MY729
Copy link

MY729 commented Jul 31, 2019

原文地址: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版本主要区别就是多路复用

@hulahulahhh
Copy link

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

@MissNanLan
Copy link

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压缩、二进制传输

@ZH-MIN
Copy link

ZH-MIN commented Aug 14, 2020

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

@mengshis
Copy link

mengshis commented Sep 16, 2020

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、头部压缩

@JaykeyGuo
Copy link

那就把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

@shifengdiy
Copy link

shifengdiy commented Aug 12, 2021

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. 服务器推送,服务器可以主动推送资源到客户端,以备后续使用

@lingok1
Copy link

lingok1 commented Apr 26, 2022

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests