第 117 题:介绍下 http 1.0、1.1、2.0 协议的区别?
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
http1.0不支持持久连接
http1.1支持持久连接,但是串行发送请求,并行请求只能同时建立多个tcp连接,引入了管道化,但是存在队头阻塞的问题
http2.0二进制分帧、多路复用、头部压缩、服务端推送
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压缩、二进制传输
http1.0:无状态,无连接,默认不支持长连接(需要设置keep-alive参数指定),连接无法复用,不支持断点续传。
http1.1:默认支持长连接,连接可复用,支持断点续传、缓存处理。
http2.0:在http1.1的基础上增加了多路复用、并行请求,管道化,报头压缩,二进制格式编码传输,服务器推送。
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、头部压缩
那就把HTTP0.9一起写了吧:
HTTP-1.0
HTTP-1.1
HTTP-2.0
https://juejin.cn/post/6963931777962344455
https://segmentfault.com/a/1190000015316332
原文地址:http1.0 http1.1 http2.0特性及区别
http1.0 http1.1 http2.0特性及区别
http1.0特性
无状态
对于无状态的特性可以借助cookie/session机制来做身份认证和状态记录
无连接
无连接导致的性能缺陷有两种:
1. 无法复用连接
每次发送请求,都需要进行一次tcp连接(即3次握手4次挥手),使得网络的利用率非常低
2. 队头阻塞
http1.0规定在前一个请求响应到达之后下一个请求才能发送,如果前一个阻塞,后面的请求也给阻塞的
http1.1特性
为了解决http1.0的性能缺陷,http1.1出现了
http1.1特性:
长连接
http1.1默认保持长连接,数据传输完成保持tcp连接不断开,继续用这个通道传输数据
管道化
基于长连接的基础,我们先看没有管道化请求响应:
tcp没有断开,用的同一个通道
管道化的请求响应:
即使服务器先准备好响应2,也是按照请求顺序先返回响应1
虽然管道化,可以一次发送多个请求,但是响应仍是顺序返回,仍然无法解决队头阻塞的问题
缓存处理
当浏览器请求资源时,先看是否有缓存的资源,如果有缓存,直接取,不会再发请求,如果没有缓存,则发送请求
通过设置字段cache-control来控制
断点传输
在上传/下载资源时,如果资源过大,将其分割为多个部分,分别上传/下载,如果遇到网络故障,可以从已经上传/下载好的地方继续请求,不用从头开始,提高效率
在 Header 里两个参数实现的,客户端发请求时对应的是 Range 服务器端响应时对应的是 Content-Range
http2.0特性
二进制分帧
将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码
多路复用
基于二进制分帧,在同一域名下所有访问都是从同一个tcp连接中走,http消息被分解为独立的帧,乱序发送,服务端根据标识符和首部将消息重新组装起来
区别
HTTP1.0和HTTP1.1的一些区别:
1、缓存处理,在HTTP1.0中,使用
header
里的If-Modified-Since,Expires
来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag
,If-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功能。
http/1 :
http 1.1 :
http/2 :
HTTP/1.0 – 构建可扩展性
HTTP/1.1 – 标准化的协议
HTTP/2
HTTP/2在HTTP/1.1有几处基本的不同:
这道题,真是一点都不知道啊!学习了!
http1.0
缓存:主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准
不支持断点续传
没有持久连接
http1.1
缓存: 引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
支持长连接和管线化
可以进行断点续传
http2.0
在1.1的基础上添加了信道复用
header请求头压缩
服务端推送
了解有限 劳烦大神指点
http1.0
仅支持保持短暂的TCP链接
不追踪ip
http1.1
支持长连接
纯文本报头
增加了更多的请求头和响应头
连接数过多 容易队首阻塞 且串行传输
http2.0
多路复用,并行请求
二进制报头 数据帧
对报头压缩,降低开销
服务器主动推送,减少请求延迟
默认使用加密 增加伪头字段
就当每天做面试题了 每天巩固提升一下
如果有面试标准答案请告诉我 /笑哭
HTTP/0.9
已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息。
HTTP/1.0
这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。
HTTP/1.1
持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
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引入了服务器推送,即服务端向客户端发送比客户端请求更多的数据。这允许服务器直接提供浏览器渲染页面所需资源,而无须浏览器在收到、解析页面后再提起一轮请求,节约了加载时间。
http1.0 exprires last-modified 连接无法复用
http1.1 etag cache-control 支持长连接(connection) 支持文件断点续传
http2.0 多路复用 首部压缩 server push 传输速度更快了
http 1.0 构建可扩展
http 1.1 添加了持久链接
http 2.0 添加了加密 头部压缩 服务器推送 管线操作 以及多路复用等功能
小白只知道这些了