傻大方


首页 > 潮·科技 > >

一文读懂 HTTP/1、HTTP/2、HTTP/3( 二 )



按关键词阅读:


RTO:英文全称是 Retransmission TimeOut , 即重传超时时间;RTO 是一个动态值 , 会根据网络的改变而改变 。 RTO 是根据给定连接的往返时间 RTT 计算出来的 。 接收方返回的 ack 是希望收到的下一组包的序列号 。
多路复用导致服务器压力上升
多路复用没有限制同时请求数 。 请求的平均数量与往常相同 , 但实际会有许多请求的短暂爆发 , 导致瞬时 QPS 暴增 。
多路复用容易 Timeout
大批量的请求同时发送 , 由于 HTTP2 连接内存在多个并行的流 , 而网络带宽和服务器资源有限 , 每个流的资源会被稀释 , 虽然它们开始时间相差更短 , 但却都可能超时 。
即使是使用 Nginx 这样的负载均衡器 , 想正确进行节流也可能很棘手 。 其次 , 就算你向应用程序引入或调整排队机制 , 但一次能处理的连接也是有限的 。 如果对请求进行排队 , 还要注意在响应超时后丢弃请求 , 以避免浪费不必要的资源 。 (引用:)
QUIC简介
Google在推 SPDY 的时候就已经意识到了这些问题 , 于是就另起炉灶搞了一个基于 UDP 协议的 QUIC 协议 。 而这个就是 HTTP3 。 它真正“完美”地解决了“队头阻塞”问题 。
一文读懂 HTTP/1、HTTP/2、HTTP/3文章插图
主要特点

  1. 改进的拥塞控制、可靠传输
  2. 快速握手
  3. 集成了 TLS 1.3 加密
  4. 多路复用
  5. 连接迁移
改进的拥塞控制、可靠传输
从拥塞算法和可靠传输本身来看 , QUIC 只是按照 TCP 协议重新实现了一遍 , 那么 QUIC 协议到底改进在哪些方面呢?主要有如下几点:
1. 可插拔 — 应用程序层面就能实现不同的拥塞控制算法 。
一个应用程序的不同连接也能支持配置不同的拥塞控制 。 应用程序不需要停机和升级就能实现拥塞控制的变更 , 可以针对不同业务 , 不同网络制式 , 甚至不同的 RTT , 使用不同的拥塞控制算法 。
关于应用层的可插拔拥塞控制模拟 , 可以对 socket 上的流为对象进行实验 。
2. 单调递增的 Packet Number — 使用 Packet Number 代替了 TCP 的 seq 。
每个 Packet Number 都严格递增 , 也就是说就算 Packet N 丢失了 , 重传的 Packet N 的 Packet Number 已经不是 N , 而是一个比 N 大的值 。 而 TCP 重传策略存在二义性 , 比如客户端发送了一个请求 , 一个 RTO 后发起重传 , 而实际上服务器收到了第一次请求 , 并且响应已经在路上了 , 当客户端收到响应后 , 得出的 RTT 将会比真实 RTT 要小 。 当 Packet N 唯一之后 , 就可以计算出正确的 RTT 。
3. 不允许 Reneging — 一个 Packet 只要被 Ack , 就认为它一定被正确接收 。
Reneging 的意思是 , 接收方有权把已经报给发送端 SACK(Selective Acknowledgment) 里的数据给丢了(如接收窗口不够而丢弃乱序的包) 。
QUIC 中的 ACK 包含了与 TCP 中 SACK 等价的信息 , 但 QUIC 不允许任何(包括被确认接受的)数据包被丢弃 。 这样不仅可以简化发送端与接收端的实现难度 , 还可以减少发送端的内存压力 。
4. 前向纠错(FEC)
早期的 QUIC 版本存在一个丢包恢复机制 , 但后来由于增加带宽消耗和效果一般而废弃 。 FEC 中 , QUIC 数据帧的数据混合原始数据和冗余数据 , 来确保无论到达接收端的 n 次传输内容是什么 , 接收端都能够恢复所有 n 个原始数据包 。 FEC 的实质就是异或 。 示意图:
一文读懂 HTTP/1、HTTP/2、HTTP/3文章插图
5. 更多的 Ack 块和增加 Ack Delay 时间 。
QUIC 可以同时提供 256 个 Ack Block , 因此在重排序时 , QUIC 相对于 TCP(使用 SACK)更有弹性 , 这也使得在重排序或丢失出现时 , QUIC 可以在网络上保留更多的在途字节() 。 在丢包率比较高的网络下 , 可以提升网络的恢复速度 , 减少重传量 。
TCP 的 Timestamp 选项存在一个问题:发送方在发送报文时设置发送时间戳 , 接收方在确认该报文段时把时间戳字段值复制到确认报文时间戳 , 但是没有计算接收端接收到包到发送 Ack 的时间 。 这个时间可以简称为 Ack Delay , 会导致 RTT 计算误差 。 现在就是把这个东西加进去计算 RTT 了 。
6. 基于 stream 和 connection 级别的流量控制 。
为什么需要两类流量控制呢?主要是因为 QUIC 支持多路复用 。 Stream 可以认为就是一条 HTTP 请求 。 Connection 可以类比一条 TCP 连接 。 多路复用意味着在一条 Connetion 上会同时存在多条 Stream 。
QUIC 接收者会通告每个流中最多想要接收到的数据的绝对字节偏移 。 随着数据在特定流中的发送 , 接收和传送 , 接收者发送 WINDOW_UPDATE 帧 , 该帧增加该流的通告偏移量限制 , 允许对端在该流上发送更多的数据 。


稿源:(未知)

【傻大方】网址:http://www.shadafang.com/c/111J2F212020.html

标题:一文读懂 HTTP/1、HTTP/2、HTTP/3( 二 )


上一篇:天价国产手机卖不动了?万元价格降至千元以下,买家依旧寥寥无几

下一篇:微软Edge浏览器市场份额首次破10%,在谷歌面前仍不值一提