| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> QUIC浅析,android开发者模式 -> 正文阅读 |
|
[移动开发]QUIC浅析,android开发者模式 |
下图是 这个过程由于太长,在复杂的网络情况下的连接建立容易产生较大时延,所以优化的方向比较统一:在保证安全的情况下,尽可能减少握手交换数据,加快连接的速度
这里讲一个TLS1.3和QUIC的事情,在2018年之前,因为TLS1.3还没有正式发布,所以QUIC使用的是自研的0RTT方式,叫做
感谢Google减少我们这些码农的学习成本~ 我们只需要弄清楚TLS1.3是如何实现0RTT的,就也能弄懂QUIC的了。 2.1.1 TLS1.3实现1RTT首先看下TLS1.2协议握手图: 整个过程是2RTT,因为比较熟悉,就不再讲中间过程了。 接下来看下TLS1.3如何做到1RTT,看下面握手图: 来看下握手全程:
除此之外,结合选定的DH参数计算出用于加密Http的共享密钥
相比于TLS1.2,TLS1.3最大改动其实就是去掉了 RSA的密钥交换,也就是TLS握手中的唯一一次非对称加密(不算签名验证)。 所以握手的时候,就不会再去发送那些和非对称加密相关的数据了,比如 TLS使用非对称加密的原因,是为了双方安全的算出 2.1.2 TLS1.3实现0RTT因为Http是无状态的,所以就有了Cookie、Session的概念, 在
虽然很快,但是不能保证前向安全,如果攻击者通过某种手段获取到 可以看到无论是第一次握手、还是恢复会话握手,TLS1.3都比TLS1.2少一个RTT,时间上是快了一倍,这也是为什么TLS1.3 daft草案被提出后,这么受欢迎的原因。 2.1.3 传输过程加密报文上述说到QUIC是使用 而TCP协议的头部是没有经过任何加密和认证,所以在传输过程中很容易被中间网络设备篡改、注入和窃听。而QUIC的加密可以说是武装到牙齿。 Http/2最强大的功能就是多路复用,QUIC的实现和Http/2类似,并且在其之上做了改进。我们先来看下Http2的不足之处。 2.2.1 Http2的多路复用和缺点Http2多路复用的实现方案是:同域名请求共用一条TCP通道,这样可以减少多次Tcp握手所带来的消耗。 Http/1.1的 但是即使如此,Http2的多路复用也有它的弱点:TCP的重传机制,这导致包的丢失会让整个通道停下来等待重传(停止等待协议的等待和滑动窗口的回退)。 例如下面是一个Http2的Tcp通道,客户端发送了4个数据流:stream1、2、3、4给服务端, 第一个流已经到达,但是第二个流的第三个Tcp segment丢失,那么Tcp为了保证了传输的可靠性,会重新发送 stream2、3、4,这导致了即使原来的Stream3、4已经到达了服务端,但是服务端并不会先处理,而是阻塞等待Stream2处理。 2.2.2 QUIC实现多路复用QUIC多路复用的实现方案是:同域名请求共用一条UDP通道,这样不仅省去了TCP连接,也没有Tcp的重传机制,在一条QUIC连接上,多个请求之间是没有依赖的,一个请求的丢失不会影响到其他的请求。 如下图所示: 那就会有同学问了:那这样的话不跟udp一样传输不可靠了么?QUIC是如何保证传输可靠的? 这和QUIC的流量控制有关,来看看它的流量控制的方法把。 2.3.1 单调递增的 Packet NumberQUIC使用了 但是单纯依靠递 如果Packet 里的装载的如果是 Stream(请求) 的话,就需要依靠 Stream 的 Offset 来保证应用数据的顺序。 如下图所示: 发送端先后发送了 Pakcet N 和 Pakcet N+1,Stream 的 Offset 分别是 x 和 x+y。 假设 Packet N 丢失了,发起重传,重传的 Packet Number 是 N+2,但是它的 Stream 的 Offset 依然是 x,这样就算 Packet N + 2 是后到的,依然可以将 Stream x 和 Stream x+y 按照顺序组织起来,交给应用程序处理。 2.3.2 基于 stream 和 connecton 级别的流量控制QUIC的流量控制类似Http2,提供了 下图是QUIC的流量控制策略,是针对一个Stream的: 对于单个Stream而言,起始的接收窗口就是其最大接收窗口(max receive window),随着接收者接收到一部分数据后,接收窗口变小。在接收到的数据中,有一部分是已经读取的(consumed部分),一部分是接收但并没来得及读取的(received部分)。当上图中的黄色部分达到一定的阈值后,就需要更新接收窗口并告知发送者。这个阈值定义为已读取的数据大于最大接收窗口的一半,达到后,发送 而对于connection级别的流量窗口,其接收窗口大小就是各个stream接收窗口大小之和。 QUIC相比于其他协议,队头阻塞问题解决的更加彻底:
QUIC默认采用
①:应用程序层面能实现不同的拥塞控制算法,不需要依赖操作系统和内核支持。 ②:即使是个单应用程序的不同连接也能支持配置不同的拥塞控制算法 ③:应用程序不需要停机和升级就能实现拥塞控制变更,只需要在服务端修改一下配置,就能实现拥塞算法的切换
为了尽可能的实现快重传而不是超时重传,QUIC采用了Tail Loss Probes (TLPs)实现某些情况下的快重传机制触发。 TLP算法如下图,服务器的segments 6-10丢失,客户端在等待s6时,由于没有收到后续的序列,因此无法触发快速重传机制,时间达到probe阈值(PTO)后,TLP算法对segments10进行重传,客户端收到这个重传序列,就能触发快速重传机制。而QUIC会在PTO之前就发送两个TLPs来尽可能避免等到超时再重传。 传统NAT遇到的问题,比如小区运营商切换端口,导致设备端判断不了新的连接标识,需要重新握手。而QUIC使用UDP,不面向连接,所以不用握手。其上层QUIC链路由于使用了64位的 QUIC采用向前纠错(FEC)方案,即每个数据包除了本身的数据以外,会带有其他数据包的部分数据,在少量丢包的情况下,可以使用其他数据包的冗余数据完成数据组装而无需重传,从而提高数据的传输速度。 但这个方案在网络好的时候会影响性能,增加带宽,所以后面被Google废弃了。 =================================================================================== 目前封装QUIC较好的库是Google的 之后有空再实现,这几天环境一直没有装好,各种踩坑= = ========================================================================= 下面的数据均来自于 腾讯、又拍云等大量使用QUIC的大厂的总结数据,不过数据比较老,来自18年,但具有一定的参考价值。 腾讯的黄钻业务、QQ会员接入了QUIC,在 腾讯浏览服务中公布了这些使用的数据 4.1.1 性能表现可以看到主要资源拉取耗时QUIC要比Http2快100ms,而首屏和Pagefinish耗时减少约20%。 4.1.2 监控数据QUIC对于其他协议有速度上的优势,而对业务来说稳定是首要的。腾讯浏览服务在QUIC场景搭建了完善的异常上报机制,对X5内核的QUIC业务进行监控。下面一起来看看QUIC的外网监控表现情况。 成功率监控: 这一维度主要监控QUIC的连接成功率以及竞速成功率,上图为黄钻业务06月15-17号三天成功率及竞速成功率数据,目前QUIC的连接成功率保持在98%以上,QUIC的竞速成功率在70%以上。 QUIC失败监控: 对于QUIC失败异常,X5内核提供了详细的QUIC细分错误码以分析错误原因,从上报的大盘数据来看:
cess=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3Jpa2thdGhld29ybGQ=,size_16,color_FFFFFF,t_70#pic_center) 对于QUIC失败异常,X5内核提供了详细的QUIC细分错误码以分析错误原因,从上报的大盘数据来看:
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 12:54:18- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |