MQTT 协议学习:Keep Alive 和连接保活

(2020-02-05 10:30)

我们提到过 Broker 需要知道 Client 是否非正常地断开了和它的连接,以发送遗愿消息。实际上 Client 也需要能够很快地检测到它失去了和 Broker 的连接,以便重新连接。

MQTT 协议是基于 TCP 的一个应用层协议,理论上 TCP 协议在丢失连接时会通知上层应用,但是 TCP 有一个半打开连接的问题(half-open connection)。这里我不打算深入分析 TCP 协议,需要记住的是,在这种状态下,一端的 TCP 连接已经失效,但是另外一端并不知情,它认为连接依然是打开的,它需要很长的时间才能感知到对端连接已经断开了,这种情况在使用移动或者卫星网络的时候尤为常见。

仅仅依赖 TCP 层的连接状态监测是不够的,于是 MQTT 协议设计了一套 Keep Alive 机制。回忆一下,在建立连接的时候,我们可以传递一个 Keep Alive 参数,它的单位为秒,MQTT 协议中约定:在 1.5*Keep Alive 的时间间隔内,如果 Broker 没有收到来自 Client 的任何数据包,那么 Broker 认为它和 Client 之间的连接已经断开;同样地, 如果 Client 没有收到来自 Broker 的任何数据包,那么 Client 认为它和 Broker 之间的连接已经断开。

MQTT 还有一对 PINGREQ/PINGRESP 数据包,当 Broker 和 Client 之间没有任何数据包传输的时候,可以通过 PINGREQ/PINGRESP 来满足 Keep Alive 的约定和侦测连接状态。

9.1.1 PINGREQ

PINGREQ 数据包没有可变头(Variable header)和消息体(Payload),当 Client 在一个 Keep Alive 时间间隔内没有向 Broker 发送任何数据包,比如 PUBLISH 和 SUBSCRIBE 的时候,它应该向 Broker 发送 PINGREQ 数据包。

9.1.2 PINGRESP

PINGRESP 数据包没有可变头(Variable header)和消息体(Payload),当 Broker 收到来自 Client 的 PINGREQ 数据包,它应该回复 Client 一个 PINGRESP 数据包。

对于 Keep Alive 机制,我们还需要记住以下几点:

  • 如果在一个 Keep Alive 时间间隔内,Client 和 Broker 有过数据包传输,比如 PUBLISH,Client 就没有必要再使用 PINGREQ 了,在网络资源比较紧张的情况下这点很重要;
  • Keep Alive 值是由 Client 指定的,不同的 Client 可以指定不同的值;
  • Keep Alive 的最大值为 18 小时 12 分 15 秒;
  • Keep Alive 值如果设为 0 的话,代表不使用 Keep Alive 机制。

原文地址:https://www.cnblogs.com/schips/p/12262723.html

时间: 2024-08-30 15:24:32

MQTT 协议学习:Keep Alive 和连接保活的相关文章

MQTT协议学习及实践(Linux服务端,Android客户端的例子)

前言 MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务.MQTT是专门针对物联网开发的轻量级传输协议.MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景.本文旨在研究其在消息发布/订阅/接收场景下的应用. MQTT协议中的几个重要概念 服务端 是发送消息的客户端和请求订阅的客户端之间的中介,又称

MQTT 协议学习:001-有关概念入门

背景 MQTT 协议是物联网中常见的协议之一,"轻量级物联网消息推送协议" 概念 MQTT是机器对机器(M2M)/物联网(IoT)连接协议.它被设计为一个极其轻量级的发布/订阅消息传输协议.对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽.高延迟或不可靠的网络而设计.这些原则也使该协议成为新兴的"机器到机器"(M2M)或物联网(IoT)世界的连接设备,以及带宽和电池功率非常高的移动应用的理想选择.例如,它已被用于通过卫星链路与

MQTT 协议学习:Retained(保留消息) 和LWT(最后遗嘱)

背景导入 让我们来看一下这个场景: 你有一个温度传感器,它每三个小时向一个 Topic 发布当前的温度.那么问题来了,有一个新的订阅者在它刚刚发布了当前温度之后订阅了这个主题,那么这个订阅端什么时候能才能收到温度消息? 对的,它必须等到三个小时以后,温度传感器再次发布消息的时候才能收到.在这之前,这个新的订阅者对传感器的温度数据一无所知. 怎么来解决这个问题呢? 这个时候就轮到 Retained 消息出场解决这个问题了.Retained 消息是指在 PUBLISH 数据包中 Retain 标识设

MQTT 协议学习:006-订阅主题

背景 之前我们提到了怎么发布消息对应的报文:现在我们来看,订阅一个主题的报文是怎么样的. SUBSCRIBE - 订阅主题 客户端向服务端发送SUBSCRIBE报文用于创建一个或多个订阅.每个订阅注册客户端关心的一个或多个主题.为了将应用消息转发给与那些订阅匹配的主题,服务端发送PUBLISH报文给客户端.SUBSCRIBE报文也(为每个订阅)指定了最大的QoS等级,服务端根据这个发送应用消息给客户端. SUBSCRIBE 的 固定报头 Bit 7 6 5 4 3 2 1 0 byte 1 MQ

HTTP协议学习笔记---HTTP持久连接和如何正确地关闭HTTP连接

一,持久连接 什么是持久连接?对于HTTP协议而言,它是基于请求响应模型,Client向Server发请求时,先建立一条HTTP连接,Server给Client响应数据后,连接关闭. 当Client发送下一个请求时,需要重新再建立HTTP连接,这种方式就是:一个请求响应需要占用一条HTTP连接.而持久连接就是:只需要建立一条连接,然后在这条连接上 传输多个请求和响应. 与持久连接相关的字段 HTTP1.0中有一个Connection首部字段,它是一个逐跳首部字段.Connection:Keep-

MQTT 协议学习:002-使用MQTT示例源码构建最简单的demo在STM32上移植MQTT协议

前言 通过上一章:<>,我们明确了MQTT的有关概念. 本文参考:STM32+W5500+MQTT+Android实现远程数据采集及控制 现在我们就来进行移植. MQTT代码源码下载地址: http://www.eclipse.org/paho/ 在STM32这边我们使用的是C/C++ MQTT Embedded clients代码. 原文地址:https://www.cnblogs.com/schips/p/12255092.html

转战物联网&#183;基础篇06-深入理解MQTT协议之基本术语

??通过上一节我们对MQTT协议已经有了初步的印象,这一节我们开始深入的理解一下MQTT协议,介绍常用的MQTT 3.1.1版本,5.0版本后面指介绍新增部分即可.这一节我们先介绍MQTT里常用的术语(非官方文档直接复制). ??网络连接(Network Connection): ??MQTT 是一种连接协议,底层使用 TCP/IP (传输层协议)提供网络连接,提供有序.可靠的.双向字节流传输.这个连接需要互联网通信的基础设施支撑,客户端使用它连接到服务端(MQTT代理服务的服务器或服务器集群)

MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制.Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用. 若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]--相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]--在RESTful架构的物联网

MQTT协议实现Eclipse Paho学习总结二

一.概述 前一篇博客(MQTT协议实现Eclipse Paho学习总结一) 写了一些MQTT协议相关的一些概述和其实现Eclipse Paho的报文类别,同时对心跳包进行了分析.这篇文章,在不涉及MQTT逻辑实现的基础之上分析一下Eclipse Paho中Socket通信的实现,这里我们主要阐述其采用Java同步技术将同步的Socket通信异步化的过程. 二.上菜 先看一下在org.eclipse.paho.client.mqttv3.internal有两个类,CommsSender,Comms