最后更新:2022-07-30 01:36:49 手机定位技术交流文章
首次引入QuiC到MQTT的创新产品
不久前,开源的大规模分布式物联网 MQTT 消息服务器 EMQX 发布了 5.0版本 。EMQX 5.0不仅是世界上第一个分布式MQTT消息服务器,它实现了支持100万连接的单一组件,QUIC 的 支持 也 采用 了 创新 的 方式 。
QUIC是下层传输协议的下一代HTTP/3协议,它与TCP/TLS协议相比,为现代移动互联网提供了高效、灵活的传输层,同时降低了连接成本和消息延迟。
基于 QUIC 这些极适用于物联网消息传输场景的优势,EMQX 5.0 引入 QUIC 支持(MQTT over QUIC)并设计了独特的消息传输机制和管理方式。
本文将通过对 MQTT over QUIC 的详细解析,为了展示该领先技术对物体互联网的优点和价值,帮助人们更有效地使用EMQX5。 QUIC的支援能力,在各类 MQTT 应用场景中进行更加高效、低成本的物联网数据传输。
QUIC 是一种建立在 UDP 之上通用的传输层网络协议,最初由 Google 提出,作为 TCP+TLS 的替代方案,旨在改善用户体验。
与现有的TLS+TCP方案相比,QUIC有许多优点:
由于高性能的传输效率和多路径连贯性,QUIC已成为下一代HTTP/3网络协议的基础传输协议。
HTTP/3的简介
2018年10月,IETF HTTP和 QUIC工作组联合决定在 QUIC上调用HTTP映射 HTTP/3 ,提前制定一个全球标准。2022年6月6日,IETF将HTTP/3标准化为 RFC 9114 。
HTTP/3的目的是解决HTTP/2的传输问题,提供快速、可靠和安全的网络连接,适用于各种设备.HTTP/3使用类似HTTP/2的语义。包括相同的请求方法、状态代码和消息字段,两者根本区别在于,HTTP/2底层使用TCP/TLS协议,HTTP/3使用QuiC协议。
根据 W3Techs统计 ,至少40%的互联网流量是基于QuiC的,过去10百万网站中有25%已经支持HTTP/3,包括谷歌,Youtube,Facebook是一个最畅销的网站。
MQTT 是基于 TCP 的物联网通信协议,紧凑的报文结构能够在严重受限的硬件设备和低带宽、高延迟的网络上实现稳定传输;心跳机制、遗嘱消息、QoS 质量等级等诸多特性能够应对各种物联网场景。
然而,由于基本的TCP传输协议的局限性,MQTT协议在某些复杂网络环境中具有内在的缺点:
例如,网络用户经常面临类似的问题:车辆可能在山区、矿山、隧道等地区运行。当输入信号死角或被动切换基站时,会引起连接故障,频繁的连接中断和较慢的连接恢复速度可能导致用户体验的变化。在某些需要较高的实时和数据传输稳定性的操作中,例如,在L4级的无人驾驶车辆中,顾客需要花很多钱来缓解问题.
在上述这类场景中,QUIC的低连接成本和多路径支持特性显示其优点。经过更深入的探索,我们认为MQTT Over QUIC能够很好地解决这个问题,基于 QUIC 0 RTT/1 RTT的重新连接/更新能力,它能有效地提高弱网络和不安全的网络走廊的用户体验。
EMQX的当前实现将传输层转换为 QUIC Stream,客户端启动连接并创建一个Stream,EMQX和客户端在双向Stream上相互作用。
鉴于复杂的网络环境,如果客户由于某种原因无法与QuiC握手,则建议客户自动返回传统的TCP,从而阻止系统与服务器建立通信。

当前的EMQX5.在0中实现了下列特点:
同时, 仍 需要 探讨 下列 额外 的 能力 :
我们在一个实验室环境中,基于EMQX5.Version0模拟了不同场景的QuiC和TCP/TLS性能性能。
测试环境
测试在不同网络时延下握手、建立连接、完成订阅的时延。相较于 TLS,在网络时延较高时 QUIC 有一定的优势。


测试断开连接后,重新启动连接并恢复重新连接所需的延迟。
由于 QUIC 在 0 RTT 场景下可以在第一个包上带上应用层的数据包, 应用层相较于 TCP 一个来回握手响应更快。
QUIC协议支持0个RTT握手,当客户端和服务端完成初始握手时,服务端可以向客户端发送NTT包。当连接被切断后,客户端可以使用NTT快速重建连接,通过1RTT的几个步骤跳过。
0 RTT的优点是,它有效地降低了客户和服务端握手成本,并改善了性能(握手延迟),而EMQX默认向客户发送NTT包,有效期为2小时。
0 RTT也支持早期数据,与1RTT相比,应用层只能在手完成后传输。0 RTT 的 early data 可以在第一个包上带上应用层数据,用于快速恢复或重新启动应用程序层操作。但由于 0 RTT 的 early data 不能防范重放攻击,因此,QuiC建议不要携带0 RTT的数据,这将改变申请状态。
EMQX默认不支持早期数据,此测试仅用于比较验证。
测试结果表明,如果MQTT层协议设计正确,QIC在第一次握手后比纯TCP性能更好。

在重新连接新连接和故障线的各个过程中,测试处理器和服务器的内存的占用,以对比 TLS,当握手时,切开1RTT和0RTT的资源开支.测试结果表明, QUIC CPU和内存使用比TLS更好,但重新连接比TLS更昂贵。

注1:主要用于清算MQTT对话,取消旧连接的额外费用
注2:大量 QUIC初始化手提包主要来自传输路径的MTU认证

该测试模拟了大规模客户地址迁移时业务层消息传输的变化。
传统的TCP/TLS客户端必须在应用程序层重新连接,以检测故障线,此过程响应非常慢并伴有许多不必要的重传。QUIC处理更加顺利,传输层确保连接不会重新连接,并且应用程序层不受影响(如果应用程序层需要这样做,它也可以加入地址的更改)。
QUIC在客户源IP地址/港口更改时,发送的邮件没有效果。当更改后发送消息时,TLS连接被中断,即使客户可以通过重新连接机制重新连接到EMQX,但中间时间窗口无法执行任何操作。
这个结果表明, QUIC非常适合在经常需要网络交换的环境中使用。

测试在弱网条件下数据传输情况。我们分别做了 3 次测试:EMQX terminated TCP/TLS,QUIC 以及 nginx terminated TCP/TLS。
测试场景:EMQX在20K/s时发布 QoS 1 消息,在该过程中注入网络错误:20%的混乱(发送和接收数据包的顺序不一致),10% 丢包,QUIC测试也增加了额外的网络交换干扰每30秒。
在此情况下 QUIC 服务端接收的数据稍微有所抖动,但不丢失消息;而 TLS 出现因网络环境差而导致的拥塞、丢包。此项结果表明 QUIC 在弱网环境下可以提供可靠的传输。

在黄色的圆形标记中,我们消除了网络误差,我们可以看到TLS接收器返回正常接收器,数据包始终没有堆叠,而QuiC则从轻微的抖动中变得更加平滑。
NanoSDK 0.6.0 基于 MsQuic 项目率先实现了第一个 C 语言的 MQTT over QUIC SDK。
NanoSDK增加了 QUIC支持的NNG传输层,允许MQTT、nanomsg和其他协议从TCP转换为UDP,从而提供更好的事物网络连接体验。它将QUIC Stream和MQTT连接映射结合到内部,此外, 还实现了内置0RTT快速握手重新连接功能.
有关消息示例代码,请参阅纳米斯DK QUIC 示例。
我们近期也将基于 NanoSDK 进行封装并陆续推出 Python、Go 等语言的 SDK,方便更多用户尽快体验到 MQTT over QUIC 的优势能力。
同时,相关的 SDK 将支持 QUIC fallback,当 QUIC 不可用时,连接层将自动切换为 TCP/TLS 1.2,确保各类网络环境下业务都能正常运行。


结合 QUIC特性和事物网络场景,我们为QuiC的MQTT设计了许多功能,如果主题优先设置通过分离控制通道实现,实现不可靠的实时流量传输,以应对高频数据传输场景;并且灵活的主题和数据通道(流)映射减少主题之间的干涉。以后的版本会随之而来。
EMQ 也 积极 促进 了 MQTT 与 QUIC 之间 的 标准化 。继 2018 年成为 OASIS MQTT 技术委员会中目前为止唯一拥有投票权的中国公司并参与 5.0 协议标准制定后,EMQ 还 提交 了 QUIC 上 MQTT 的 草案 。相信在不久的将来,MQTT的基本协议同时支持TCP和QuiC,让整个物体互联网行业从中获利.
可以看到,QUIC非常适合传统的TCP/IP网络 UDP MTU大小可以保证弱的网络环境或频繁的网络交换环境。对于任何设备在任何时候运动的IoT场景(例如汽车网络、移动收购等),或者在频繁切断不适合长期连接的场景(例如设备需要定期休息期间),QUIC具有巨大的潜力,是一个更适合上下协议选项,这也是EMQX 5.0引入QuiC支持的原因。
MQTT over QUIC 在 EMQX 5.0 中的率先实现,让EMQ再次成为世界万物网新闻服务器的先锋。EMQ将始终坚持以持续技术创新为动力的不断升级产品,期望通过领先产品,为IoT领域带来基础设施安全和商业创新动力。
版权声明: 本条是原版EMQ, 请注意复制的来源.
原文链接: https://www.emqx.com/zh/blog/mqtt-over-quic
本文由 在线网速测试 整理编辑,转载请注明出处。