HTTP1.1 和 1.0的区别、HTTP1.1 和2.0的区别
1、HTTP1.1 和 1.0的区别
1.1、长连接(Persistent Connection)
-
HTTP1.0
规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接
,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。
-
HTTP 1.1
则支持持久连接Persistent Connection
, 并且默认使用persistent connection
. 在同一个tcp的连接中可以传送多个HTTP请求和响应
. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头- HTTP 1.1的持续连接,也需要
增加新的请求头
来帮助实现, - 例如,Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;
- Connection请求头的值为close时,客户端通知服务器返回本次请求结果后关闭连接。
- HTTP1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。
- HTTP 1.1的持续连接,也需要
扩展
Connection头域可以携带三种不同类型的符号:
- 1、一个包含若干个头域名的列表,声明仅限于一次hop连接的头域信息;
- 2、任意值,本次连接的非标准选项,如Keep-Alive等;
- 3、close值,表示消息传送完成之后关闭长连接;
1.2、管线化(Pipelining)
HTTP 1.1
支持请求的流水线(Pipelining)
处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。
- 例如:一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。
- HTTP1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容。
1.3、host字段
Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。如Host:image.baidu.com\r\n
HTTP1.0
中认为每台服务器都绑定一个唯一的IP地址
,因此,请求消息中的URL并没有传递主机名(hostname)
。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers)
,并且它们共享一个IP地址。HTTP1.1
的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域,会报告一个错误(400 Bad Request)。此外,服务器应该接受以绝对路径标记的资源请求。
1.4、带宽优化
HTTP/1.0中
,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了。- 例如,客户端只需要显示一个文档的部分内容,又比如下载大文件时需要支持断点续传功能,而不是在发生断连后不得不重新下载完整的包。
HTTP/1.1中
,在请求消息中引入了range
头域,它允许只请求资源的某个部分。在响应消息中Content-Range头域
声明了返回的这部分对象的偏移值和长度。- 如果服务器相应地返回了对象所请求范围的内容,则响应码为206(Partial Content),它可以防止Cache将响应误以为是完整的一个对象。
另外一种情况是请求消息中如果包含比较大的实体内容
,但不确定服务器是否能够接收该请求(如是否有权限),此时若贸然发出带实体的请求,如果被拒绝也会浪费带宽。
HTTP/1.1
加入了一个新的状态码100(Continue)
。- 客户端事先发送一个只带头域的请求,如果服务器因为权限拒绝了请求,就回送响应码401(Unauthorized);
- 如果服务器接收此请求就回送响应码100,客户端就可以继续发送带实体的完整请求了。
- 注意,HTTP/1.0的客户端不支持100响应码。但可以让客户端在请求消息中加入Expect头域,并将它的值设置为100-continue。
2、HTTP1.1 和 2.0的区别
2.1、新的二进制格式(Binary Format)
HTTP1.x
的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多。- 二进制则不同,只认
0和1
的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
在不改动HTTP/1x的语义、方法、状态码、UR以及首部字段……的情况下,HTTP2
是如何做到破HTTP1.1
的性能限制,改进传输性能,实现低延迟和高吞吐量的?
关键之一就是在应用层(HTTP/2)
和传输层(TCPorUDP)
之间增加一个二进制分帧层,具体如下:
看上去协议的格式和HTTP1.x完全不同了,实际上HTTP2并没有改变HTTP1.x的语义,只是把原来HTTP1.x的header和body部分用frame重新封装了一层而已
- 在二进制分顿层中,
HTTP/2
会将所有传输的信息分割为更小的消息
和帧(frame)
,并对它们来用二进制格式的编码
- 其中
HTTP1.X的首部信息
会被封装到HEADERframe
,而相应的Request Body
则封装到DATA frame
里面。
- 其中
HTTP/2
通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。
在过去,HTTP性能优化的关键并不在于高带宽,而是低延迟。TCP连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为TCP侷启动。由于这种原因,让原本就具有突发性和短时性的HTTP连接变的十分低
HTTP/2
通过让所有数据流共用同一个连接
,可以更有效地使用TCP连接,让高芾宽也能真正的服务于HTTP的性能提升。
总结:
- 单连接多资源的方式,减少服务端的链接压力,内存占用更少连接吞吐呈更大
- 由于TCP连接的减少而使网络拥塞状况得以改善,同时慢启动时间的减少使拥塞和丢包恢复速
2.2、多路复用(MultiPlexing)
多路复用(MultiPlexing),即连接共享,即每一个request
都是是用作连接共享机制的。一个request
对应一个id
,这样一个连接上可以有多个request
,每个连接的request
可以随机的混杂在一起,接收方可以根据request的 id
将request
再归属到各自不同的服务端请求里面。
HTTP2与HTTP1.1最重要的区别就是解决了线头阻塞
的问题!其中最重要的改动是:多路复用 (Multiplexing)。
- 多路复用意味着线头阻塞将不在是一个问题,允许同时通过
单一的 HTTP/2
连接发起多重的请求-响应消息,合并多个请求为一个的优化将不再适用。
2.3、header压缩
HTTP1.x的header
带有大量信息,而且每次都要重复发送
,HTTP2.0
使用encoder
来减少需要传输的header
大小,通讯双方各自cache一份header fields表
,既避免了重复header
的传输,又减小了需要传输的大小。- HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
为什么需要头部压缩?
假定一个页面有100个资源需要加载(这个数量对于今天的Web而言还是挺保守的), 而每一次请求都有1kb的消息头(这同样也并不少见,因为Cookie和引用等东西的存在), 则至少需要多消耗100kb来获取这些消息头。HTTP2.0可以维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。
2.4、服务端推送(server push)
HTTP2.0的web server
请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。- Serverpush让HTTP1x时代使用内嵌资源的优化手段变得没有意义;
- 如果一请求是由你的主页发起的,服务器很可能会
响应主页内容、logo以及样式表
,因为它知道客户会用到这些东西。这相当于在一个HTML文档内集合了所有的资源。 - 不过与之相比,服务器推送还有一个很大的优势:可以缓存!也让在遵循同源的情况下,不同页面之间可以共享缓存资源成为可能。
服务器推送到底是什么?
服务端推送能把客户端所需要的资源伴随着index.html
一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。具体如下:
1、普通的客户端请求过程:
2、服务端推送的过程:
参考
1、https://www.cnblogs.com/shijingxiang/articles/4434643.html
2、https://www.zhihu.com/search?type=content&q=HTTP1.1%20%E5%92%8C%201.0
3、https://www.jianshu.com/p/be29d679cbff
4、https://www.zhihu.com/question/34074946