- 短连接:(
short-lived connections
)
- 每一个
http
请求都有它独立完成, 这个就意味着每一个http
请求之前都会有一个tcp
连接和握手
- 在 http 1.0 的时候,
Connection
设置为close
才会使用这个模型
- 每一个
- 持久连接(
persistent - connections
):
-
keep-alive
连接
-
-
http 2.0
:
-
长连接
,数据帧
,数据流
,
-
http2
是基于帧的协议, 采用分帧是为了将重要的信息进行封装, 数据帧是http 2.0
中最小的数据传输单位,
- 这个是数据帧的数据结构:
文章图片
image
【HTTP|HTTP 协议简史】http2
规范了对数据流的定义,HTTP/2
连接上独立的、双向的帧序列交换。你可以将流看作在连接上的一系列帧,它们构成了单独的HTTP
请求和响应。
如果客户端想要发出请求,它会开启一个新的流。然后,服务器将在这个流上回复。这与http 1 的请求 / 响应
流程类似,
重要的区别在于,因为有分帧,所以多个请求和响应可以交错,而不会互相阻塞。流 ID(帧首部的第 6~9 字节)
用来标识帧所属的流。
- 多路复用:
就是说在一个TCP
连接上,我们可以向对方不断发送一个个的消息,这里每一个消息看成是一帧,而每一帧有个stream identifier
的字段标明这一帧属于哪个 流,然后在对方接收时,根据stream identifier
拼接每个 流 的所有帧组成一整块数据。我们把HTTP/1.x
每个请求都当作一个 流,那么请求化成多个流,请求响应数据切成多个帧,不同流中的帧交错地发送给对方,这就是HTTP/2
中的 多路复用
文章图片
image
- 不同的流在交错发送;
- HEADERS 帧在 DATA 帧前面;
- 流的ID都是奇数,说明是由客户端发起的,这是标准规定的,那么服务端发起的就是偶数了。
HTTP/2
还是提供了SETTINGS_MAX_CONCURRENT_STREAMS
字段在SETTINGS
帧 上设置,可以限制并发流
数目,标准上建议不要低于 100
以保证性能。
文章图片
image
HTTP/1.x
一次请求-响应,建立一个连接,用完关闭;每一个小组任务都需要建立一个班级,多个小组任务多个班级,1:1比例
HTTP/1.1 Pipeling
解决方式为,若干个小组任务排队串行化单线程处理,后面小组任务等待前面小组任务完成才能获得执行机会,一旦有任务处理超时等,后续任务只能被阻塞,毫无办法,也就是人们常说的线头阻塞
HTTP/2
多个小组任务可同时并行(严格意义上是并发)在班级内执行。一旦某个小组任务耗时严重,但不会影响到其它小组任务正常执行
- 针对一个班级资源维护要比多个班级资源维护经济多了,这也是
多路复用
出现的原因。
文章图片
http2_stream_thumb.png