物联网通信协议——TCP与MQTT的对比

在物联网通信中,MQTT和TCP的实现方式和原理完全不同,因为两者属于协议栈的不同层级,解决的问题也不同。以下从协议层级工作机制典型场景三个角度详细解释:


1. 协议层级与定位

特性TCPMQTT
协议层级传输层(第4层)应用层(第7层)
核心职责确保数据可靠、有序、无差错传输定义消息格式和通信模式
依赖关系独立运行,无需上层协议支持必须基于TCP(或类似可靠传输层)
数据内容传输原始字节流,不解析内容定义消息结构(主题、负载、QoS)

关键区别
TCP是底层传输的“管道”,只关心如何把数据从A送到B;而MQTT是上层“业务规则”,定义数据如何组织、谁来接收。


2. 工作机制对比

TCP的工作原理
  1. 连接建立:通过三次握手(SYN, SYN-ACK, ACK)建立可靠的双向连接。
  2. 数据传输
    • 分段与序列号:将数据拆分为多个报文段,每个段有唯一序列号。
    • 确认与重传:接收方需确认(ACK)收到的数据,未确认的段会被重传。
    • 流量控制:通过滑动窗口机制避免发送方压垮接收方。
    • 拥塞控制:动态调整发送速率,防止网络拥堵。
  3. 连接终止:通过四次挥手(FIN-ACK)优雅关闭连接。

特点
TCP是面向连接、可靠、流式传输的协议,但不关心数据内容(例如传输的是文本、图片还是传感器数据)。

MQTT的工作原理
  1. 通信模型:基于发布/订阅模式,包含三个角色:

    • 发布者(Publisher):发送消息到特定主题(Topic)。
    • 代理(Broker):负责接收消息并转发给订阅者。
    • 订阅者(Subscriber):订阅感兴趣的主题,接收相关消息。
  2. 消息流程

    • 客户端与代理通过TCP建立长连接。
    • 订阅者向代理注册订阅的主题(如 sensors/temperature)。
    • 发布者发送消息到主题,代理根据订阅关系将消息推送给订阅者。
  3. 核心特性

    • 主题分层:支持通配符(如 sensors/# 匹配所有子主题)。
    • 服务质量(QoS):提供三种消息可靠性级别:
      • QoS 0:最多一次(可能丢失)。
      • QoS 1:至少一次(可能重复)。
      • QoS 2:恰好一次(可靠但开销大)。
    • 遗嘱消息(Last Will):设备异常断开时,代理自动发布预设消息。

特点
MQTT是轻量级、异步、解耦的通信模式,设备无需知道彼此的存在,只需与代理交互。


3. 为什么MQTT依赖TCP?

MQTT选择基于TCP实现,是因为其需要依赖TCP的以下能力:

  1. 可靠性:TCP的重传和确认机制确保MQTT消息不丢失(尤其在QoS 1/2时)。
  2. 有序性:TCP保证数据按顺序到达,避免MQTT消息乱序。
  3. 长连接支持:MQTT的发布/订阅模型需要持久连接,TCP的长连接特性天然适合。

反例:CoAP协议基于UDP,但需自行实现可靠性(如通过重传和确认),适用于更轻量级的场景。


4. 直接使用TCP与使用MQTT的对比

场景直接使用TCP使用MQTT
开发复杂度需自行处理消息边界、重连逻辑协议已封装复杂性,提供标准API
设备资源消耗高(需实现完整TCP逻辑)低(客户端库轻量,如Eclipse Paho)
扩展性差(新增设备需修改协议)好(通过主题动态扩展订阅关系)
典型用例视频流传输、自定义二进制协议传感器数据上报、远程控制

5. 其他类似协议的设计思路

  • HTTP/2:基于TCP,但采用请求/响应模型,头部开销大,不适合高频小数据。
  • CoAP:基于UDP,模仿HTTP的RESTful风格,但支持多播和低功耗。
  • AMQP:类似MQTT,但更复杂,支持事务和高级路由(如银行交易)。

总结

  • TCP是“搬运工”:只负责可靠搬运数据块,不关心内容。
  • MQTT是“邮局”:在TCP搬运的基础上,定义如何分拣(主题)、投递规则(QoS)和异常处理(遗嘱消息)。
  • 两者协作:MQTT利用TCP的可靠性,专注于解决物联网场景中的高效消息分发问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【信息系统项目管理师】高分论文:论信息系统项目的成本管理(媒体融合采编平台)

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划项目成本管理2、估算成本3、制订项目预算4、控制成本论文 2017年7月,我作为项目经理参与了 XX省媒体融合采编平台的建设,该项目总共投资530万元,其中服务器、存储、网络等硬件设备投资200万元、软…

策略模式简单介绍

什么是策略模式?一般用于什么场景? 策略模式一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使得它们可以相互替换,这样,客户端可以根据需要在运行时选择合适的算法,…

基于PAI+专属网关+私网连接:构建全链路 Deepseek 云上私有化部署与模型调用架构

DeepSeek - R1 是由深度求索公司推出的首款推理模型,该模型在数学、代码和推理任务上的表现优异,市场反馈火爆。在大模型技术商业化进程中,企业级用户普遍面临四大核心挑战: 算力投入成本高昂:构建千亿参数级模型的训…

【APM】How to enable Trace to Logs on Grafana?

系列文章目录 【APM】Observability Solution 【APM】Build an environment for Traces, Metrics and Logs of App by OpenTelemetry 【APM】NET Traces, Metrics and Logs to OLTP 【APM】How to enable Trace to Logs on Grafana? 前言 本文将介绍如何在Grafana上启用 …

在 Excel 中使用通义灵码辅助开发 VBA 程序

VBA 简介 VBA 是一种用于微软办公套件(如 Word、Excel、PowerPoint 等)的编程语言,它本质上是一种内嵌的脚本,或者可以认为是一段命令,其标准叫法被称为宏。 VBA 只能依赖于对应的软件进行开发,例如本文就…

vscode终端运行windows服务器的conda出错

远程windows服务器可以运行,本地vscode不能。 打开vscode settings.json文件 添加conda所在路径

紫外相机的应用范围及介绍

(一)工业领域 半导体制造:在晶圆制造和检测过程中,紫外相机起着关键作用。它可用于裸晶圆检测,能准确识别出制造过程中偶然引入的微粒(如灰尘)或因处理不当造成的划痕等缺陷。对于图案晶圆检查…

08软件测试需求分析案例-删除用户

删除用户是后台管理菜单的一个功能模块,只有admin才有删除用户的权限。不可删除admin。 1.1 通读文档 通读需求规格说明书是提取信息,提出问题,输出具有逻辑、规则、流程的业务步骤。 信息:此功能应为用户提供确认删除的功能。…

Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比

Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比 一 基本概述对比 特性DBMS_JOB (旧版)DBMS_SCHEDULER (新版)引入版本Oracle 7 (1992年)Oracle 10g R1 (2003年)当前状态已过时但仍支持推荐使用的标准设计目的基础作业调度企业级作业调度系统 二 功能特性对比 2.1 作业定义能力 …

Linux网络编程实战:从字节序到UDP协议栈的深度解析与开发指南

网路通信的三大要素:协议,端口和IP 知识点1【字节序】 多字节在主机中的存放数据 把多字节看成一个整体存储的顺序。 为什么我们在文件中没有这个概念呢? 因为文件是字节流(流指针),流是以一个字节为操…

mvccc

. MVCC (多版本并发控制) 概念: MVCC 是一种并发控制技术,用于在数据库中实现并发事务的读写操作,同时保证事务的隔离性。MVCC 的核心思想是,在数据库中维护数据的多个版本,每个事务在读取数据时,读取的是…

Kotlin整数相除精度损失roundToInt

Kotlin整数相除精度损失roundToInt import kotlin.math.roundToIntfun main() {val a 0.0fval delta 0.1ffor (i in 0..10) {val r a i * deltaprintln("float${r} toInt${r.toInt()} (0.5 toInt)${(r 0.5).toInt()} round${Math.round(r)} roundToInt${r.roundToInt…

“星睿O6” AI PC开发套件评测 - Windows on Arm 安装指南和性能测评

引言 Radxa联合此芯科技和安谋科技推出全新的"星睿O6"迷你 ITX 主板。该系统搭载了 CIX P1(CD8180)12 核 Armv9 处理器,拥有高达30T算力的NPU和高性能的GPU,最高配备64GB LPDDR内存,并提供了如 5GbE、HDMI …

redis-事务(MULTI、EXEC、DISCARD、WATCH与lua脚本、包含lua脚本的简单介绍、乐观锁抢购案例的实现)

https://juejin.cn/post/6891158857708797959 首先Redis事务在实际的场景应用上也占着比较重要的地位,例如在秒杀场景中,我们就可以利用Redis事务中的watch命令监听key,实现乐观锁,保证不会出现冲突,也防止商品超卖。 另外就是Redis事务也是面试过程中面试官着重照顾的基础…

Redis-07-常见Redis使用场景

文章目录 01.缓存数据(Cache)02.布式锁(Distributed Lock)03.计数器(Counter)04.排行榜(Leaderboard)05.消息队列(Message Queue)06.限流(Rate Li…

长亭2月公开赛Web-ssrfme

环境部署 拉取环境报错&#xff1a; 可以尝试拉取一下ubuntu:16.04&#xff0c;看是否能拉取成功 将wersion&#xff1a;"3"删掉 我拉去成功之后&#xff0c;再去拉取环境&#xff0c;成功&#xff01; 访问环境 测试ssrf 源码 <?php highlight_file(__file__…

RK3506+net9+VS2022跨平台调试C#程序

下载GetVsDbg.sh &#xff0c;这脚本会下载一个压缩包&#xff0c;然后解压缩&#xff0c;设置x权限等等。但是目标板子连不上&#xff0c;就想办法获取到下载路径&#xff0c;修改这个脚本&#xff0c;显示这个下载链接后&#xff0c;复制一下&#xff0c;用电脑下下来 修改好…

MySQL GTID集合运算函数总结

MySQL GTID 有一些运算函数可以帮助我们在运维工作中提高运维效率。 1 GTID内置函数 MySQL 包含GTID_SUBSET、GTID_SUBTRACT、WAIT_FOR_EXECUTED_GTID_SET、WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS 4个内置函数&#xff0c;用于GTID集合的基本运算。 1.1 GTID_SUBSET(set1,set2) …

Java学习手册:Java内存模型

Java内存模型&#xff08;Java Memory Model&#xff0c;简称JMM&#xff09;是Java语言中用于定义线程之间如何共享和操作内存的规范。它描述了Java程序中变量的内存可见性行为&#xff0c;并定义了线程之间的通信规则。理解Java内存模型对于编写正确的并发程序至关重要。本文…

神经网络优化 - 高维变量的非凸优化

网络优化是指寻找一个神经网络模型来使得经验(或结构)风险最小化的过程&#xff0c;包括模型选择以及参数学习等。 关于经验风险最小化和结构风险最小化&#xff0c;请参考博文&#xff1a; 认识机器学习中的经验风险最小化准则_样本均值近似与经验风险最小化的关系-CSDN博客…