傻大方


首页 > 潮·科技 > >

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



按关键词阅读:


除了每个流的流控制外 , QUIC 还实现连接级的流控制 , 以限制 QUIC 接收者愿意为连接分配的总缓冲区 。 连接的流控制工作方式与流的流控制一样 , 但传送的字节和最大的接收偏移是所有流的总和 。
最重要的是 , 我们可以在内存不足或者上游处理性能出现问题时 , 通过流量控制来限制传输速率 , 保障服务可用性 。
一文读懂 HTTP/1、HTTP/2、HTTP/3文章插图
快速握手
由于 QUIC 是基于 UDP 的 , 所以 QUIC 可以实现 0-RTT 或者 1-RTT 来建立连接 , 可以大大提升首次打开页面的速度 。
集成了 TLS 1.3 加密
TLS 1.3 支持 3 种基本密钥交换模式:
(EC)DHE (基于有限域或椭圆曲线的 Diffie-Hellman)PSK - onlyPSK with (EC)DHE在完全握手情况下 , 需要 1-RTT 建立连接 。 TLS1.3 恢复会话可以直接发送加密后的应用数据 , 不需要额外的 TLS 握手 , 也就是 0-RTT 。
TLS 1.3 0-RTT 简单原理示意(基于 DHE):
一文读懂 HTTP/1、HTTP/2、HTTP/3文章插图
但是 TLS1.3 也并不完美 。 TLS 1.3 的 0-RTT 无法保证前向安全性(Forward secrecy) 。 简单讲就是 , 如果当攻击者通过某种手段获取到了 Session Ticket Key , 那么该攻击者可以解密以前的加密数据 。
要缓解该问题可以通过设置使得与 Session Ticket Key 相关的 DH 静态参数在短时间内过期(一般几个小时) 。
多路复用
QUIC 是为多路复用从头设计的 , 携带个别流的的数据的包丢失时 , 通常只影响该流 。 QUIC 连接上的多个 stream 之间并没有依赖 , 也不会有底层协议限制 。 假如 stream2 丢了一个包 , 也只会影响 stream2 的处理 。
连接迁移
TCP 是按照 4 要素(客户端 IP、端口, 服务器 IP、端口)确定一个连接的 。 而 QUIC 则是让客户端生成一个 Connection ID (64 位)来区别不同连接 。 只要 Connection ID 不变 , 连接就不需要重新建立 , 即便是客户端的网络发生变化 。 由于迁移客户端继续使用相同的会话密钥来加密和解密数据包 , QUIC 还提供了迁移客户端的自动加密验证 。
挑战NAT 问题
NAT 概念
为了解决 IP 地址不足的问题 , NAT 给一个局域网络只分配一个 IP 地址 , 这个网络内的主机 , 则分配私有地址 , 这些私有地址对外是不可见的 , 他们对外的通信都要借助那个唯一分配的 IP 地址 。 所有离开本地网络去往 Internet 的数据报的源 IP 地址需替换为相同的 NAT , 区别仅在于端口号不同 。
一文读懂 HTTP/1、HTTP/2、HTTP/3文章插图
原因
TCP 和 UDP 的报文头部不同导致 NAT 问题的出现 。
NAT 设备的端口记忆问题
对于基于 TCP 的 HTTP、HTTPS 传输 , NAT 设备可以根据 TCP 报文头的 SYN/FIN 状态位 , 知道通信什么时候开始 , 什么时候结束 , 对应记忆 NAT 映射的开始和结束 。
但是基于 UDP 传输的 HTTP3, 不存在 SYN/FIN 状态位 。 NAT 设备的记忆如果短于用户会话时间 , 则用户会话会中断 。 NAT 设备的记忆时间如果长于用户会话时间 , 则意味着 NAT 设备的端口资源会被白白占用 。
最直接的解决方案是 , 在 QUIC 的头部模仿 TCP 的 SYN/FIN 状态 , 让沿途的 NAT 设备知道会话什么时候开始、什么时候结束 。 但这需要升级全球所有的 NAT 设备的软件 。
另外一个可行的方案是 , 让 QUIC 周期性地发送 Keepalive 消息 , 刷新 NAT 设备的记忆 , 避免 NAT 设备自动释放 。
NAT 设备禁用 UDP
在一些 NAT 网络环境下(如某些校园网) , UDP 协议会被路由器等中间网络设备禁止 , 这时客户端会直接降级 , 选择 HTTPS 等备选通道 , 保证正常业务请求 。
NGINX 负载均衡问题概念
QUIC 客户端存在网络制式切换 , 就算是同一个移动机房 , 可能第一次业务请求时会落到 A 这台服务器 , 后续再次连接 , 就会落到 B 实例上 , 重复走 1-RTT 的完整握手流程 。
全局握手缓存
为所有 QUIC 服务器实例建立一个全局握手缓存 。 当用户网络发生切换时 , 下一次的业务请求无论是落到哪一个机房或哪一台实例上 , 握手建连都会是 0-RTT 。
历代 HTTP 速度测试一文读懂 HTTP/1、HTTP/2、HTTP/3文章插图
结尾从古至今实时数据传输(音频、视频、游戏等)都面临卡顿、延迟等问题 , 而 QUIC 基于 UDP 的架构和改进的重传等特性 , 能够有效的提升用户体验 。 目前B 站 也已经接入 QUIC 。
如果想要自己体验 QUIC , 可以使用 Libquic、Caddy 等 。 另外 github 上面也有 C++版本的 QUIC 实现 , 利用 Nodejs 的 C++ 模块 , 前端工程师也可以快速实现一个 node-quic 。


稿源:(未知)

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

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


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

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