极客时间架构 1 期:第 8 周 性能优化(二) - 学习总结
Http
Http 1.1
Http 1.1 通过 keepalive 机制解决 tcp 连接复用问题,多个请求可以使用同一个 tcp 连接进行通信。
队头堵塞问题
Http 1.1 虽然可以通过复用 tcp 连接来降低连接数量,但是发送的 http 报文的响应必须按照发送顺序进行响应。比如按照 1、2、3 这个顺序发送,服务端接必须按照 1、2、3 的顺序进行响应,否则无法知道具体的响应对应哪个请求。这就是 Http 的队头堵塞问题。
Http 2.0
2.0 在 1.1 基础上做了以下优化
将 1.1 每次都携带的大量的 key value 在两端建立一个索引表,对相同的头只发送索引表中的索引
将一个 TCP 的连接中,切分成多个流,每个流都有自己的 ID,而且具有优先级
将所有的传输信息分隔为更小的消息和帧,并对它们采用二进制格式编码
如何解决队头堵塞问题
Http 2.0 通过为每个 stream 打上 ID,来解决 Http 层的队头堵塞问题。由于 Http 2.0 基于的是 tcp,tcp 的队头堵塞问题无法解决。
Http 3.0
由于 Http 2.0 还是基于 tcp 的,tcp 是严格有序的,导致如果前面的包没有处理完成,后面的包会一直等待,因此,Http 3.0 采取基于 udp 的 quic 机制来解决这个问题。
队头堵塞
Http 3.0 通过无阻塞的多路复用技术,彻底解决了队头堵塞问题。quic 机制通过 stream 来发送 http 请求,由于 stream 之间不存在依赖,即使某一个 stream 发生了重传,后续的 stream 也可以发送给用户,不用等待重传的 stream 完成。
评论