keep-alive和http2的多路复用
# http/1.0 和 http/1.1
# 1. 区别
- http1.0 不能创建长连接, http1.1 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销。
- http1.1增加了更多的缓存策略,比E-Tag、If-None-Match,http1.0使用的是last-modified、If-Modified-Since
# 2. 存在的问题
- 每一次传输数据都需要重新建立连接,延迟较多
- 传输均为明文,客户端和服务端均无法验证双方身份,存在一定的数据安全
- 请求的header部分内容较大,增加传输成本,且很多时候header部分是不变的
- 虽然http1.1有长连接的功能,但长连接使用过多也给服务端带来了更大的性能压力,特别是对于一些图片类视频类等资源型的服务器,如果长期保持长连接他是没必要的,但给服务器是大的性能浪费
- 请求只能从客户端开始,服务器只能被动响应。
# http/2
# 1. 特点
- 采用二进制格式而非文本格式, http/1采用文本格式
- HTP/2使用一个连接可实现多路复用,http/1.1 使用keepalive请求头保持连接
- http2使用报头压缩,HTTP/2降低了开销
- HTP/2让服务器可以将响应主动“推送”到客户端
# 2. 与http1.1的区别
相对于htto/1.1 有高健壮性、高性能、网络开销低的特点。
- 二进制分帧传输数据。
- 优先级排序:http/2 每个数据流都关联了数据权重和依赖关系,以标明资源优先级的关系,并且允许客户端修改
- 首部压缩:http1.1使用文本形式传输消息头,http/2 使用HPACK算法压缩头部字段,减小头部大小。
- 多路复用:http2创建的连接可以实现真正的复用;
- 服务器推送:HTP/2让服务器可以将响应主动“推送”到客户端
# http/1.1 keep-alive 与 http/2 多路复用
# 1. http/1.1 keep-alive 请求头
从http/1.1开始,引入了keep-live长连接,改善了 HTTP/1.0 短连接造成的性能开销。http1.0每发送一次消息都要创建一个新的tcp连接(http1.0短连接),tcp 创建连接(三次握手四次挥手 成本很高)。
- http1.1默认keep-alive开启;http1.0默认关闭;
- keep-alive 关闭时,每发送一次消息都要创建一个新的tcp连接(http1.0短连接);keep-alive 开启时可以使tcp连接在一定时间内不断开,继续保持一段时间(timeout);在这段时间内,同一个客户端发送消息还会复用该tcp连接,并重置timeout计时器。直到一方主动发起关闭或者timeout时间结束;
- timeout时间到了也不会立即结束,服务器会发送一个探测报文,以后每隔75s发送一次,连续发送10个探测报文得不到回复认为客户端故障,关闭连接。
- keep-alive 使用管道机制,上一次请求过程中,下一个请求排队,服务端也是按照请求的顺序返回响应。
# 2. http/2 多路复用
http/2 引入数据帧和流
- http2是基于二进制流的,可以把http消息分为独立的帧,交错发送,然后在另外一端通过数据帧中的标识重新组装数据,从而实现多路复用。
- 多个请求可以同时发送,某一个请求阻塞时不会互相影响;
- http2在同域名下的所有通信都是在同一个连接上完成;
# 3. 区别
- http/1.1 keep-alive基于文本数据传输,只能整体一次性传输; http2 是基于二进制流的,可以把http消息分为独立的帧,交错发送,然后在另外一端通过数据帧中的标识重新组装数据;
- keep-alive 使用管道机制,消息排队顺序发送,一个tcp连接同一时间只能处理一个请求,互相之间影响较大; http/2 多路复用多个请求可以同时发送,某一个请求阻塞时不会互相影响;
- keep-alive为了解决队头阻塞,将同一页面的资源分散到不同域名下,开启多个tcp连接; http2在同域名下的所有通信都是在同一个连接上完成。
上次更新: 2023/04/16, 18:35:33