参考连接
Http持久连接、非持久连接和pipeline连接
HTTP/2.0 相比1.0有哪些重大改进?
HTTP2.0性能增强的核心:二进制分帧
在网络信息传输过程中,都会套用经典的五层模型。
理论部分
http发展历史
http/0.9
http/0.9
是http
发展过程中第一个定稿的协议。
http
只有一个get
命令- 没有
header
去面熟数据信息 - 服务器发送完毕,就关闭
TCP
连接
http/1.0
- 增加了很多命令
- 增加
statys code
和header
- 多字符集支持,多部份发送、权限、缓存等。
http/1.1
- 持久连接
在http/1.0
中,客户端要想和服务器通信,发送一个http
请求,要创建一个http
连接,就必须要创建一个TCP
连接,在服务端返回内容之后TCP
连接就会被关闭(TCP
连接的建立需要经过三次握手,比较耗费性能。)。而在http1.1
中,实现了持久连接,可以在服务端返回内容之后,继续保持TCP
连接状态而不关闭。
持久连接情况下,服务器发出响应后让TCP
连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。
Http1.1
默认使用持久连接,如果客户端或者服务端任何一方不想使用持久连接,需要通过字段connection:close
来通知对方。`
- 支持
pipeline
HTTP/1.1
的新特性,允许在持久连接(也就意味着pipeline
是依赖于持久连接的,而不是独立的上可选地使用请求管道。在响应到达之前,可以将多条请求放入队列。当第一条请求通过网络流向服务器时,第二条和第三条请求也可以开始发送了。在髙时延网络条件下,这样做可以降低网络的环回时间,提高性能。
对于http/1.1
中的pipeline
,存在一个缺点:以上图为例,client
依次发送了三个请求,按先后顺序,我们将其依次标记为request1
,request2
,request3
。假设服务端对request1
请求内容的处理是比较耗时的,在request1
请求处理完成之前,request2
和request3
已经处理完成了,而此时,request2
和request3
对应的response2
和response3
还不能返回,必须等到response1
返回之后才能返回。
换句话说,对于pipeline
的请求顺序和响应顺序是相对应的。
- 增加
host
通过host
这个属性,我们可以在同一台物理服务器可以部署多个web
服务,提高服务器的利用率。
http2
http2
- 二进制数据帧
在不改动http/1.1
的语义、方法、状态码、URI
以及首部字段...的情况下,http2
是如何做到[突破http1.1
的性能限制、改进传输性能、实现低延迟和高吞吐量的?]
关键之一就在于应用层http2
和传输层之间TCP/UDP
之间增加一个二进制分帧层:
在二进制分帧层中,http/2
会将所有传输的信息分割为更小的信息和帧(frame
),并对他们采用二进制格式的编码,其中http1.1
的首部头信息被封装到header frame
而相应的request body
则被封装到data frame
中.
- 头信息压缩
HTTP 2.0
在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;通信期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型,等等)只 需发送一次。事实上,如果请求中不包含首部(例如对同一资源的轮询请求),那么 首部开销就是零字节。此时所有首部都自动使用之前请求发送的首部。
如果首部发生变化了,那么只需要发送变化了数据在Headers
帧里面,新增或修改的首部帧会被追加到“首部表”。首部表在 HTTP 2.0
的连接存续期内始终存在,由客户端和服务器共同渐进地更新 。
- 并行双向字节流的请求和响应
同一个连接里面发送多个请求不再需要按照顺序进行
在HTTP2.0
上,客户端和服务器可以把HTTP
消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。注意,同一链接上有多个不同方向的数据流在传输。客户端可以一边乱序发送stream
,也可以一边接收者服务器的响应,而服务器那端同理。
把 HTTP
消息分解为独立的帧,交错发送,然后在另一端重新组装是 HTTP 2.0
最 重要的一项增强。事实上,这个机制会在整个 Web
技术栈中引发一系列连锁反应, 从而带来巨大的性能提升,因为:
-
可以并行交错地发送请求,请求之间互不影响;
-
可以并行交错地发送响应,响应之间互不干扰;
-
只使用一个连接即可并行发送多个请求和响应;
-
消除不必要的延迟,从而减少页面加载的时间;
- 推送
HTTP 2.0
新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。换句话说,除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。
有了HTTP2.0
的服务器推送,HTTP1.x
时代的内嵌资源的优化手段也变得没有意义了。而且使用服务器推送的资源的方式更加高效,因为客户端还可以缓存起来,甚至可以由不同的页面共享(依旧遵循同源策略)。
举例来说,client
请求了一个html
,server
可以主动将该html
所需要引用的img
,css
,style
推送给client
,而不需要等到服务器解析html
时再来请求相应的文件。
URI
URL
URN
URI
uniform resource identifier 统一资源标识符,包含url
和urn
.
URL
uniform resource locator统一资源定位器.
user:pass
是url
中的定义,但由于其安全性和可操作性,现在已经不使用了
URN
uniform resource name 统一资源名称.
URN
统一资源定位符。URN
是作为特定内容的唯一名称使用的,与当前资源的所在地无关。使用URN
,在资源移动之后还能被找到,这样就可以将资源四处迁移,而不用担心迁移后无法访问。目前没有很好的实现方案,也没有具体的使用场景。