网络协议通俗易懂详解指南
目录
1. 什么是网络协议?
1.1 协议的本质
1.2 为什么需要协议?
1.3 协议分层的概念
2. TCP协议详解 - 可靠的信使 📦
2.1 TCP是什么?
2.2 TCP的核心特性
🔗 面向连接
🛡️ 可靠传输
📊 流量控制
2.3 TCP三次握手 - 建立连接
2.4 TCP四次挥手 - 断开连接
2.5 TCP数据格式
2.6 TCP实际应用
3. UDP协议详解 - 快速的信使 ⚡
3.1 UDP是什么?
3.2 UDP vs TCP对比
3.3 UDP数据格式
3.4 UDP实际应用
🎮 在线游戏
📹 视频直播
🎵 语音通话
📺 IPTV网络电视
4. HTTP/HTTPS协议 - 网页浏览的语言 🌐
4.1 HTTP是什么?
4.2 HTTP请求响应过程
📤 HTTP请求(客户端→服务器)
📥 HTTP响应(服务器→客户端)
4.3 HTTP状态码
2xx 成功状态 ✅
3xx 重定向状态 🔄
4xx 客户端错误 ❌
5xx 服务器错误 💥
4.4 HTTPS - 加密的HTTP 🔐
🔒 HTTPS工作过程
4.5 HTTP实际应用示例
🔍 搜索百度
📝 提交登录表单
5. Modbus TCP协议 - 工业设备的对话 🏭
5.1 Modbus是什么?
5.2 Modbus TCP特点
5.3 Modbus数据模型
5.4 Modbus TCP帧格式
5.5 Modbus功能码
📖 读取指令
✏️ 写入指令
5.6 Modbus TCP实际应用
🏭 工厂自动化场景
🏠 楼宇自动化应用
5.7 Modbus TCP编程示例
🐍 Python读取数据例子
6. MQTT协议 - 物联网的邮局 📮
6.1 MQTT是什么?
6.2 MQTT核心概念
🏢 代理服务器(Broker)
📚 主题(Topic)
📊 QoS服务质量
6.3 MQTT消息格式
6.4 MQTT工作流程
🔌 连接过程
📝 订阅主题
📤 发布消息
📥 接收消息
6.5 MQTT实际应用
🏠 智能家居系统
🚗 车联网应用
🏭 工业物联网
6.6 MQTT编程示例
🐍 Python订阅温度数据
📤 Arduino发布传感器数据
7. FTP协议 - 文件传输专家 📁
7.1 FTP是什么?
7.2 FTP工作模式
🎯 主动模式(Active Mode)
🚶♂️ 被动模式(Passive Mode)
7.3 FTP双连接机制
7.4 FTP命令详解
👤 身份验证命令
📂 目录操作命令
📁 文件操作命令
⚙️ 传输模式命令
7.5 FTP响应码
1xx 初步响应 🔄
2xx 成功响应 ✅
3xx 需要进一步信息 📝
4xx 暂时失败 ⚠️
5xx 永久失败 ❌
7.6 FTP实际应用
🌐 网站文件管理
📊 企业文件服务器
🔄 数据备份同步
7.7 FTP客户端工具
💻 图形界面工具
💻 命令行工具
7.8 FTP安全改进
🔐 FTPS(FTP over SSL/TLS)
🛡️ SFTP(SSH File Transfer Protocol)
8. DNS协议 - 网络世界的电话簿 📞
8.1 DNS是什么?
8.2 域名结构
8.3 域名分类
🌐 顶级域(TLD)分类
🏠 常见主机名
8.4 DNS服务器层次
🏠 本地DNS服务器
🌍 根域名服务器
🏢 顶级域名服务器
🏪 权威域名服务器
8.5 DNS查询过程
🔍 递归查询 vs 迭代查询
🔄 完整查询过程
8.6 DNS记录类型
📍 A记录(Address)
📍 AAAA记录(IPv6)
🏷️ CNAME记录(别名)
📮 MX记录(邮件交换)
📋 NS记录(名称服务器)
📝 TXT记录(文本信息)
🔄 PTR记录(反向解析)
8.7 DNS缓存机制
⏰ TTL(生存时间)
🗂️ 缓存层次
8.8 DNS实际应用
🏠 家庭网络DNS设置
🏢 企业DNS管理
🌐 CDN加速原理
8.9 DNS安全
🛡️ DNS劫持防护
🔐 DNSSEC协议
9. DHCP协议 - 自动地址分配员 🎫
9.1 DHCP是什么?
9.2 DHCP解决什么问题?
❌ 没有DHCP的痛苦
✅ 有了DHCP的便利
9.3 DHCP工作过程
🤝 四步握手过程
1️⃣ DHCP Discover(发现)
2️⃣ DHCP Offer(提供)
3️⃣ DHCP Request(请求)
4️⃣ DHCP ACK(确认)
9.4 DHCP地址池管理
🏊♂️ 地址池概念
📋 地址分配策略
9.5 DHCP租约管理
⏰ 租约生命周期
🔄 续约过程
9.6 DHCP配置选项
⚙️ 常用DHCP选项
9.7 DHCP实际应用
🏠 家庭路由器DHCP设置
🏢 企业DHCP部署
9.8 DHCP故障排除
🔍 常见DHCP问题
🛠️ DHCP诊断命令
10. 实际应用场景 🏗️
10.1 家庭网络场景
🏠 智能家居网络
🎮 游戏网络优化
10.2 企业网络场景
🏢 办公网络架构
🏭 工业自动化场景
10.3 物联网场景
🌾 智慧农业
🏥 医疗物联网
10.4 云计算场景
☁️ 微服务架构
🎮 在线游戏后端
10.5 安全场景应用
🛡️ 零信任网络架构
总结与学习建议 🎓
🎯 核心要点回顾
📚 深入学习路径
🔰 初学者阶段
🎯 进阶阶段
🚀 专家阶段
🛠️ 实践建议
🏠 家庭实验环境
📊 监控和分析工具
💻 编程实践
📖 推荐学习资源
📚 经典书籍
🎥 在线课程
🌐 技术网站
🎯 职业发展方向
🔧 网络工程师
💻 软件开发工程师
🔬 研究方向
1. 什么是网络协议?
1.1 协议的本质
网络协议就像人类的语言规则:
🗣️ 人类对话:
- 中文对话:你好 → 你好
- 英文对话:Hello → Hello
- 日文对话:こんにちは → こんにちは
💻 计算机对话:
- HTTP协议:GET /index.html → 200 OK + 网页内容
- TCP协议:SYN → SYN+ACK → ACK
- SMTP协议:MAIL FROM → 250 OK
1.2 为什么需要协议?
生活中的例子:
🏪 去超市买东西:
1. 你:我要买苹果
2. 店员:苹果5元一斤,要几斤?
3. 你:要2斤
4. 店员:总共10元,谢谢!
这就是一套"购物协议"
💻 计算机访问网站:
1. 浏览器:我要访问www.baidu.com
2. DNS服务器:百度的地址是220.181.38.148
3. 浏览器:向220.181.38.148请求首页
4. 百度服务器:这是首页内容
这就是HTTP协议
1.3 协议分层的概念
就像写信寄快递:
📝 应用层:写信内容(HTTP、FTP、Email)
📮 传输层:装信封、写地址(TCP、UDP)
🗺️ 网络层:选择邮递路线(IP)
🚚 链路层:具体运输方式(以太网、WiFi)
🛤️ 物理层:道路基础设施(网线、光纤)
每一层都有自己的"语言规则"(协议)
2. TCP协议详解 - 可靠的信使 📦
2.1 TCP是什么?
TCP = Transmission Control Protocol(传输控制协议)
生活比喻:TCP就像顺丰快递
- ✅ 保证送达:收不到会重发
- ✅ 完整无损:检查包裹是否损坏
- ✅ 按序到达:即使分多个包裹,也会按顺序送达
- ✅ 签收确认:收到后要签字确认
2.2 TCP的核心特性
🔗 面向连接
就像打电话:
📞 拨号(建立连接)
🗣️ 通话(数据传输)
📞 挂机(断开连接)
TCP连接过程:
客户端 服务器| ||--"我想连接你"--> | SYN| ||<--"好的,我也想连接"-- | SYN+ACK| ||--"连接建立!"--> | ACK| |开始传输数据...
🛡️ 可靠传输
确认机制:
发送方:我发了数据包1
接收方:收到数据包1,请发数据包2
发送方:我发了数据包2
接收方:收到数据包2,请发数据包3
重传机制:
发送方:我发了数据包3
(等待确认...超时)
发送方:没收到确认,重新发送数据包3
接收方:收到数据包3,确认!
📊 流量控制
就像水龙头控制水流:
接收方:我的缓冲区还能接收1000字节
发送方:好的,我只发1000字节
接收方:我处理完了,现在能接收2000字节
发送方:好的,我发2000字节
2.3 TCP三次握手 - 建立连接
生活比喻:两个人约会
小明 小红| ||--"你在吗?能聊天吗?"--> | (SYN)| ||<--"在啊,我也想聊!"-- | (SYN+ACK)| ||--"好的,开始聊吧!"--> | (ACK)| |开始愉快聊天...
技术过程:
第一次握手:客户端 → 服务器
发送:SYN=1, seq=x
含义:"我想建立连接,我的初始序号是x"第二次握手:服务器 → 客户端
发送:SYN=1, ACK=1, seq=y, ack=x+1
含义:"我也想连接,我的序号是y,确认你的x"第三次握手:客户端 → 服务器
发送:ACK=1, seq=x+1, ack=y+1
含义:"确认建立连接,确认你的y"
为什么需要三次握手?
- 🔄 确认双方都能收发消息
- 🛡️ 防止过期的连接请求
- 🔢 同步双方的序列号
2.4 TCP四次挥手 - 断开连接
生活比喻:电话通话结束
小明 小红| ||--"我说完了,挂机吧"--> | (FIN)| ||<--"好的,我知道了"-- | (ACK)| ||<--"我也说完了"-- | (FIN)| ||--"好的,再见!"--> | (ACK)| |通话结束
技术过程:
第一次挥手:客户端 → 服务器
FIN=1:我没有数据要发送了第二次挥手:服务器 → 客户端
ACK=1:我知道你要关闭了第三次挥手:服务器 → 客户端
FIN=1:我也没有数据发送了第四次挥手:客户端 → 服务器
ACK=1:好的,连接关闭
2.5 TCP数据格式
TCP数据包就像快递包裹:
📦 TCP数据包结构:
┌─────────────┬─────────────┐
│ 源端口 │ 目的端口 │ ← 寄件人和收件人
├─────────────┴─────────────┤
│ 序列号 │ ← 包裹编号
├───────────────────────────┤
│ 确认号 │ ← 确认收到的编号
├─────────────┬─────────────┤
│ 控制位 │ 窗口大小 │ ← 包裹类型和容量
├─────────────┼─────────────┤
│ 校验和 │ 紧急指针 │ ← 安全检查
├─────────────┴─────────────┤
│ 数据 │ ← 实际内容
└───────────────────────────┘
重要字段解释:
- 🏠 端口号:就像门牌号,区分不同的服务
- 🔢 序列号:包裹的编号,保证顺序
- ✅ 确认号:确认收到哪个编号的包裹
- 🚩 控制位:包裹类型(SYN=建立连接,FIN=关闭连接)
2.6 TCP实际应用
TCP适用场景:
- 🌐 网页浏览:必须完整接收HTML内容
- 📧 邮件发送:邮件内容不能丢失
- 📁 文件下载:文件必须完整无误
- 💬 即时聊天:消息要准确传达
TCP端口示例:
80端口:HTTP网页服务
443端口:HTTPS加密网页
25端口:SMTP邮件发送
110端口:POP3邮件接收
21端口:FTP文件传输
22端口:SSH远程登录
3. UDP协议详解 - 快速的信使 ⚡
3.1 UDP是什么?
UDP = User Datagram Protocol(用户数据报协议)
生活比喻:UDP就像广播电台
- ⚡ 速度快:说了就播,不等反馈
- 🚫 不保证送达:听不到就算了
- 📻 一对多:一个电台,很多收音机
- 🎵 实时性好:适合音乐、新闻直播
3.2 UDP vs TCP对比
快递服务对比:
特性 | TCP(顺丰快递) | UDP(广播电台) |
---|---|---|
🚚 可靠性 | ✅ 保证送达 | ❌ 不保证接收 |
⚡ 速度 | 🐌 相对较慢 | ⚡ 非常快 |
📋 确认机制 | ✅ 需要签收 | ❌ 无需确认 |
🔗 连接 | ✅ 需要建立连接 | ❌ 无连接 |
💰 开销 | 📈 较大 | 📉 很小 |
3.3 UDP数据格式
UDP数据包像明信片:
📮 UDP数据包结构:
┌─────────────┬─────────────┐
│ 源端口 │ 目的端口 │ ← 寄件人和收件人
├─────────────┼─────────────┤
│ 长度 │ 校验和 │ ← 明信片大小和防伪
├─────────────┴─────────────┤
│ 数据 │ ← 明信片内容
└───────────────────────────┘
对比TCP:
- 📏 更简单:只有8字节头部(TCP有20字节)
- ⚡ 更快速:没有复杂的控制机制
- 💧 更轻量:适合小数据传输
3.4 UDP实际应用
UDP适用场景:
🎮 在线游戏
游戏客户端 → 游戏服务器
"我的角色移动到坐标(100,200)"如果这个包丢了:
✅ UDP:继续发送下一个位置更新
❌ TCP:等待确认,可能造成游戏卡顿
📹 视频直播
直播服务器 → 观众
发送视频帧:帧1、帧2、帧3...如果帧2丢失:
✅ UDP:继续播放帧3(画面可能卡一下)
❌ TCP:等待重传帧2(整个直播卡住)
🎵 语音通话
VoIP电话、微信语音
实时性要求高,偶尔丢一点声音可以接受
但是不能有延迟,否则对话就乱了
📺 IPTV网络电视
电视信号广播:
一个服务器 → 成千上万个用户
如果每个用户都要确认接收,服务器会崩溃
常用UDP端口:
53端口:DNS域名解析
67/68端口:DHCP自动分配IP
123端口:NTP时间同步
161端口:SNMP网络管理
514端口:Syslog日志
4. HTTP/HTTPS协议 - 网页浏览的语言 🌐
4.1 HTTP是什么?
HTTP = HyperText Transfer Protocol(超文本传输协议)
生活比喻:HTTP就像餐厅点菜
🍽️ 在餐厅点菜:
1. 顾客:"服务员,我要一份宫保鸡丁"
2. 服务员:"好的,马上给您准备"
3. 厨师:制作宫保鸡丁
4. 服务员:"您的宫保鸡丁来了"🌐 HTTP请求网页:
1. 浏览器:"服务器,我要baidu.com的首页"
2. 服务器:"好的,正在准备"
3. 服务器:查找并准备网页内容
4. 服务器:"这是百度首页的HTML内容"
4.2 HTTP请求响应过程
📤 HTTP请求(客户端→服务器)
请求格式就像订餐单:
GET /index.html HTTP/1.1 ← 请求行:要什么菜
Host: www.example.com ← 请求头:哪家餐厅
User-Agent: Chrome/91.0 ← 客户信息
Accept: text/html ← 接受什么格式← 空行← 请求体(GET通常为空)
请求方法解释:
- 🔍 GET:我要看菜单(获取网页)
- 📝 POST:我要下订单(提交表单)
- 📤 PUT:我要上传新菜谱(上传文件)
- 🗑️ DELETE:删除这道菜(删除资源)
📥 HTTP响应(服务器→客户端)
响应格式就像上菜:
HTTP/1.1 200 OK ← 状态行:菜品状态
Date: Mon, 27 Jul 2024 12:28:53 ← 响应头:上菜时间
Server: Apache/2.4.29 ← 厨房信息
Content-Type: text/html ← 菜品类型
Content-Length: 1234 ← 菜品分量← 空行
<html> ← 响应体:实际菜品
<head><title>网页标题</title></head>
<body><h1>欢迎光临!</h1></body>
</html>
4.3 HTTP状态码
状态码就像餐厅的服务状态:
2xx 成功状态 ✅
- 200 OK:菜上齐了,请慢用
- 201 Created:您的订单已成功创建
- 204 No Content:订单处理完成,但没有菜品返回
3xx 重定向状态 🔄
- 301 Moved Permanently:这道菜搬到新菜单了
- 302 Found:这道菜临时换地方了
- 304 Not Modified:菜品没变化,用之前的就行
4xx 客户端错误 ❌
- 400 Bad Request:您的订单有误,请重新填写
- 401 Unauthorized:请先登录会员
- 403 Forbidden:抱歉,这道菜您不能点
- 404 Not Found:抱歉,没有这道菜
- 408 Request Timeout:您点菜太慢了,请重新点
5xx 服务器错误 💥
- 500 Internal Server Error:厨房出故障了
- 502 Bad Gateway:传菜员出问题了
- 503 Service Unavailable:餐厅太忙,暂停服务
- 504 Gateway Timeout:厨房响应太慢
4.4 HTTPS - 加密的HTTP 🔐
HTTPS = HTTP + SSL/TLS(安全套接字层)
生活比喻:HTTPS就像保密餐厅
🔓 HTTP(普通餐厅):
- 点菜声音很大,隔壁桌都能听到
- 菜单是明文的,任何人都能看
- 服务员可能是冒充的🔐 HTTPS(保密餐厅):
- 点菜用暗号,只有你和服务员懂
- 菜单是加密的,外人看不懂
- 服务员有身份证明,防止冒充
🔒 HTTPS工作过程
1. 客户端:"我要用加密方式点菜"
2. 服务器:"这是我的身份证(数字证书)"
3. 客户端:验证身份证真假
4. 双方:协商加密方式,生成密钥
5. 开始加密通信...
如何识别HTTPS:
- 🔒 地址栏有小锁图标
- ✅ 网址以https://开头
- 🛡️ 浏览器显示"连接是安全的"
4.5 HTTP实际应用示例
🔍 搜索百度
完整过程:
1. 你在地址栏输入:www.baidu.com
2. 浏览器发送请求:GET / HTTP/1.1Host: www.baidu.com3. 百度服务器响应:HTTP/1.1 200 OKContent-Type: text/html<html>百度首页内容...</html>4. 浏览器解析HTML并显示页面
📝 提交登录表单
登录过程:
1. 你在登录框输入用户名和密码
2. 浏览器发送POST请求:POST /login HTTP/1.1Host: www.example.comContent-Type: application/x-www-form-urlencodedusername=zhangsan&password=1234563. 服务器验证账号密码:HTTP/1.1 302 FoundLocation: /dashboardSet-Cookie: sessionid=abc1234. 浏览器跳转到用户中心页面
5. Modbus TCP协议 - 工业设备的对话 🏭
5.1 Modbus是什么?
Modbus = 工业设备通信的标准语言
生活比喻:Modbus就像工厂车间的对讲机
🏭 工厂场景:
车间主管:"1号机器,报告你的温度"
1号机器:"主管,我的温度是45度"
车间主管:"2号机器,把速度调到80%"
2号机器:"收到,速度已调整到80%"🔌 Modbus场景:
PLC:"温度传感器01,读取当前温度"
温度传感器:"PLC,当前温度是45.5°C"
PLC:"变频器02,设置频率为50Hz"
变频器:"收到,频率已设置为50Hz"
5.2 Modbus TCP特点
为什么叫Modbus TCP?
- 🏭 Modbus:工业通信协议的名字
- 🌐 TCP:运行在TCP/IP网络上
- 📡 结合:工业协议 + 以太网 = 现代工业通信
主要特点:
- 🤖 主从结构:一个主站,多个从站
- 📊 数据透明:直接读写设备数据
- 🔧 简单易用:指令简单,容易实现
- 🌐 基于TCP:可靠传输,适合以太网
5.3 Modbus数据模型
Modbus就像设备的"档案柜":
📂 Modbus数据区域:
├── 📋 线圈(Coils)01-99999
│ ├── 开关状态:开/关
│ └── 例子:电机启停、阀门开关
│
├── 📝 离散输入(Discrete Inputs)10001-19999
│ ├── 只读开关状态
│ └── 例子:按钮状态、限位开关
│
├── 📊 保持寄存器(Holding Registers)40001-49999
│ ├── 可读写数值
│ └── 例子:设定值、参数配置
│
└── 📈 输入寄存器(Input Registers)30001-39999├── 只读数值└── 例子:温度、压力、流量
生活比喻:
🏠 智能家居控制面板:
📱 线圈区:控制开关(灯光、空调)
👁️ 离散输入:状态指示(门窗开关)
⚙️ 保持寄存器:设置参数(空调温度)
📊 输入寄存器:传感器数据(室内温度)
5.4 Modbus TCP帧格式
Modbus TCP数据包结构:
📦 Modbus TCP数据包:
┌─────────────┬─────────────┬─────────────┐
│ MBAP头 │ 功能码 │ 数据 │
│ (7字节) │ (1字节) │ (变长) │
└─────────────┴─────────────┴─────────────┘📋 MBAP头详细:
┌──────┬──────┬──────┬───────┬──────┬──────┐
│事务ID│协议ID│长度 │单元ID │功能码│数据 │
│2字节 │2字节 │2字节 │1字节 │1字节 │变长 │
└──────┴──────┴──────┴───────┴──────┴──────┘
字段解释:
- 🎫 事务ID:请求编号,用于匹配请求和响应
- 🏷️ 协议ID:固定为0,表示Modbus协议
- 📏 长度:后续字节数
- 🏠 单元ID:设备地址(1-247)
- 🔧 功能码:要执行的操作类型
- 📊 数据:具体的操作数据
5.5 Modbus功能码
功能码就像不同的"指令类型":
📖 读取指令
01 读线圈状态
"读取1号设备的开关状态"
请求:01 01 00 00 00 10
响应:01 01 02 FF 0002 读离散输入
"读取传感器的触发状态"
请求:01 02 00 00 00 08
响应:01 02 01 5503 读保持寄存器
"读取设备的设定值"
请求:01 03 00 00 00 02
响应:01 03 04 00 64 00 3204 读输入寄存器
"读取传感器测量值"
请求:01 04 00 00 00 02
响应:01 04 04 01 2C 00 FA
✏️ 写入指令
05 写单个线圈
"控制1号开关打开"
请求:01 05 00 00 FF 00
响应:01 05 00 00 FF 0006 写单个寄存器
"设置温度为25度"
请求:01 06 00 01 00 19
响应:01 06 00 01 00 1915 写多个线圈
"批量控制多个开关"
请求:01 0F 00 00 00 08 01 55
响应:01 0F 00 00 00 0816 写多个寄存器
"批量设置多个参数"
请求:01 10 00 01 00 02 04 00 0A 00 14
响应:01 10 00 01 00 02
5.6 Modbus TCP实际应用
🏭 工厂自动化场景
系统架构:
💻 上位机(SCADA)↕ Modbus TCP
🔄 PLC控制器↕ Modbus RTU
📊 现场设备群
├── 温度传感器
├── 压力传感器
├── 变频器
└── 阀门控制器
实际通信例子:
🌡️ 读取温度传感器数据:
SCADA → PLC: 读取30001寄存器
PLC → 温度传感器: 获取温度值
温度传感器 → PLC: 当前温度25.5°C
PLC → SCADA: 返回温度值255(25.5°C×10)🎛️ 控制变频器频率:
SCADA → PLC: 设置40001寄存器为500(50.0Hz)
PLC → 变频器: 设置频率50Hz
变频器 → PLC: 确认设置完成
PLC → SCADA: 设置成功确认
🏠 楼宇自动化应用
智能建筑系统:
🖥️ 楼宇管理系统↕ Ethernet/TCP
🏢 各楼层控制器
├── 空调控制器
├── 照明控制器
├── 电梯控制器
└── 消防控制器控制例子:
- 读取各房间温度
- 控制空调开关和温度
- 调节照明亮度
- 监控电梯状态
5.7 Modbus TCP编程示例
🐍 Python读取数据例子
from pymodbus.client.sync import ModbusTcpClient# 连接Modbus TCP设备
client = ModbusTcpClient('192.168.1.100', port=502)# 读取保持寄存器(温度数据)
result = client.read_holding_registers(0, 1, unit=1)
if result.isError():print("读取失败")
else:temperature = result.registers[0] / 10.0print(f"当前温度: {temperature}°C")# 控制线圈(开关设备)
result = client.write_coil(0, True, unit=1)
if result.isError():print("控制失败")
else:print("设备已启动")client.close()
代码解释:
- 🔌 连接设备:指定IP地址和端口502
- 📊 读取数据:从地址0读取1个寄存器
- 🎛️ 控制设备:向地址0的线圈写入True(开启)
- ✅ 错误处理:检查操作是否成功
6. MQTT协议 - 物联网的邮局 📮
6.1 MQTT是什么?
MQTT = Message Queuing Telemetry Transport(消息队列遥测传输)
生活比喻:MQTT就像微信群聊
💬 微信群聊模式:
1. 张三在"同学群"发消息:"今天天气真好"
2. 群里所有人都能收到这条消息
3. 后加入群的李四也能看到历史消息(可选)📡 MQTT发布订阅模式:
1. 温度传感器向"room/temperature"主题发布:"25.5"
2. 订阅这个主题的所有设备都收到温度数据
3. 新加入的设备也能收到最新的温度值
6.2 MQTT核心概念
🏢 代理服务器(Broker)
就像微信服务器:
📱 设备A ←→ 📡 MQTT Broker ←→ 📱 设备B
📱 设备C ←→ (代理服务器) ←→ 📱 设备D
代理服务器的作用:
- 📮 消息转发:接收并转发消息
- 👥 客户端管理:管理连接的设备
- 🗂️ 主题管理:管理发布订阅关系
- 💾 消息存储:临时存储离线消息
📚 主题(Topic)
主题就像微信群的名称:
🏠 智能家居主题结构:
home/
├── living_room/
│ ├── temperature (客厅温度)
│ ├── humidity (客厅湿度)
│ └── li
相关文章:
网络协议通俗易懂详解指南
目录 1. 什么是网络协议? 1.1 协议的本质 1.2 为什么需要协议? 1.3 协议分层的概念 2. TCP协议详解 - 可靠的信使 📦 2.1 TCP是什么? 2.2 TCP的核心特性 🔗 面向连接 🛡️ 可靠传输 📊 流量控制 2.3 TCP三次握手 - 建立连接 2.4 TCP四次挥手 - 断开连接…...

OpenCV-Python Tutorial : A Candy from Official Main Page(持续更新)
OpenCV-Python 是计算机视觉领域最流行的开源库之一,它结合了 OpenCV (Open Source Computer Vision Library) 的 C 高性能实现和 Python 的简洁易用特性,为开发者提供了强大的图像和视频处理能力。具有以下优势: 典型应用领域: …...

【Vue】指令补充+样式绑定+计算属性+侦听器
【指令补充】 【指令修饰符】 指令修饰符可以让指令的 功能更强大,书写更便捷 分类: 1.按键修饰符(侦测当前点击的是哪个按键) 2.事件修饰符(简化程序对于阻止冒泡, 一些标签的默认默认行为的操作&…...
.Net Framework 4/C# 泛型的使用、迭代器和分部类
一、泛型的使用 泛型是用于处理算法、数据结构的一种编程方法。泛型的目标是采用广泛适用和可交互性的形式来表示算法和数据结构,以便它们能够直接用于软件构造。 泛型简单理解就是,在声明时暂时不固定其类型,例如 int 类型、double 类型等,在调用泛型时,再将要用的类型补…...

LLM 笔记:Speculative Decoding 投机采样
1 基本介绍 投机采样(Speculative Sampling)是一种并行预测多个可能输出,然后快速验证并采纳正确部分的加速策略 在不牺牲输出质量的前提下,减少语言模型生成 token 所需的时间 传统的语言模型生成是 串行 的 必须生成一个&…...

当SAP系统内计划订单转换为生产订单时发生了什么?
【SAP系统研究】 #SAP #计划订单 #生产订单 #采购申请 一、关于计划订单的一点疑惑 曾经对SAP为什么会有计划订单,是感到很疑惑的。 这个界面简单,配置点也不多,能被随意“摆布”,一旦要变形就消失得无影无踪的计划订单,why? 但是,再次重新审视过之后,才发现它其实…...

PDF转PPT转换方法总结
你是否遇到过这些场景? 收到客户发来的产品手册PDF,明天就要用它做演示; 公司历史资料只有PDF版,领导突然要求更新为幻灯片。 这时PDF转PPT工具就成了救命稻草。接下来,介绍三种PDF转PPT工具。 1. iLoveOFD在线转换…...

3D Web轻量化引擎HOOPS Communicator的定制化能力全面解析
HOOPS Communicator 是Tech Soft 3D推出的高性能Web工程图形引擎。它通过功能丰富的JavaScript API,帮助开发团队在浏览器中快速添加2D/3D CAD模型的查看与交互功能。该引擎专为工程应用优化,支持大规模模型的流畅浏览、复杂装配的智能导航、流式加载和服…...

【力扣链表篇】19.删除链表的倒数第N个节点
题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]…...
.Net Framework 4/C# 集合和索引器
一、ArrayList 类(集合) ArrayList 类位于 System.Collections 命名空间下,它可以动态地添加和删除元素。 ArrayList 提供了3个构造器,通过这3个构造器可以有3种声明方式: 默认构造器,将会以默认ÿ…...

如何使用Jmeter进行压力测试?
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是压力测试 软件测试中:压力测试(Stress Test),也称为强度测试、负载测试。压力测试是模拟实际应用的软硬…...

Grafana-ECharts应用讲解(玫瑰图示例)
工具: MySQL 数据库 MySQL Workbench 数据库管理工具(方便编辑数据) Grafana v11.5.2 Business Charts 6.6(原 Echarts插件) 安装 安装 MySQL社区版安装 MySQL Workbench安装 Grafana在 Grafana 插件中搜索 Business Charts 进行安装以上安装步骤网上教程很多,自行搜…...
洛谷P1591阶乘数码
P1591 阶乘数码 题目描述 求 n ! n! n! 中某个数码出现的次数。 输入格式 第一行为 t ( t ≤ 10 ) t(t \leq 10) t(t≤10),表示数据组数。接下来 t t t 行,每行一个正整数 n ( n ≤ 1000 ) n(n \leq 1000) n(n≤1000) 和数码 a a a。 输出格式…...

前端vue3 上传/导入文件 调用接口
点击按钮导入: <el-uploadaction"https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15":auto-upload"false":on-change"handleFileChange":show-file-list"false"><el-button type"warning"…...
概述侧边导航的作用与价值
侧边导航的作用与价值:介绍侧边导航的核心优势和用户体验提升点。设计原则:使用表格对比说明侧边导航的三大设计准则。基础实现方法:分步骤讲解静态侧边导航的实现技术。高级交互实现:提供滑动式侧边栏的完整交互解决方案。优化技…...

Python训练营-Day22-Titanic - Machine Learning from Disaster
Description linkkeyboard_arrow_up 👋🛳️ Ahoy, welcome to Kaggle! You’re in the right place. This is the legendary Titanic ML competition – the best, first challenge for you to dive into ML competitions and familiarize yourself w…...

FreeCAD:开源世界的三维建模利器
FreeCAD 开发模式 FreeCAD的开发采用多语言协作模式,其核心框架与高性能模块主要使用C构建,而用户界面与扩展功能则通过Python脚本实现灵活定制。具体来说: C核心层:作为基础架构,C负责实现与Open CASCADE Technology…...
指针的定义与使用
1.指针的定义和使用 int point1(){//定义指针int a 10;//指针定义语法: 数据类型 * 指针变量名int * p;cout << "sizeof (int(*)) --> " << sizeof(p) << endl;//让指针记录变量a的地址 & 取址符p &a ;cout << &qu…...

嵌入式里的时间魔法:RTC 与 BKP 深度拆解
文章目录 RTC实时时钟与BKPUnix时间戳UTC/GMT时间戳转换时间戳转换BKP简介BKP基本结构1. 电池供电模块(VBAT 输入)2. 侵入检测模块(TAMPER 输入)3. 时钟输出模块(RTC 输出)4. 内部寄存器组 RTC简介RTC时钟源…...
Java项目中常用的中间件及其高频问题避坑
Java项目中常用的中间件及其高频问题避坑如下: 一、常用中间件分类及作用 1. 消息队列中间件 作用:解耦系统、异步通信、削峰填谷。代表产品: Kafka:高吞吐量流处理,适合日志收集、实时分析。RocketMQ:金融级可靠性,支持事务消…...

图卷积网络:从理论到实践
图卷积网络(Graph Convolutional Networks, GCNs)彻底改变了基于图的机器学习领域,使得深度学习能够应用于非欧几里得结构,如社交网络、引文网络和分子结构。本文将解释GCN的直观理解、数学原理,并提供代码片段帮助您理…...

ES 学习总结一 基础内容
ElasticSearch学习 一、 初识ES1、 认识与安装2、 倒排索引2.1 正向索引2.2 倒排索引 3、 基本概念3.1 文档和字段3.2 索引和倒排 4 、 IK分词器 二、 操作1、 mapping 映射属性2、 索引库增删改查3、 文档的增删改查3.1 新增文档3.2 查询文档3.3 删除文档3.4 修改文档3.5 批处…...

Maven 构建缓存与离线模式
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…...

基于51单片机的光强控制LED灯亮灭
目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能: (1)按下按键K后光敏电阻进行光照检测,LCD1602显示光照强度值; (2)光照值小于15时,上面2个LE…...

【Linux操作系统】基础开发工具(yum、vim、gcc/g++)
文章目录 Linux软件包管理器 - yumLinux下的三种安装方式什么是软件包认识Yum与RPMyum常用指令更新软件安装与卸载查找与搜索清理缓存与重建元数据 yum源更新1. 备份现有的 yum 源配置2. 下载新的 repo 文件3. 清理并重建缓存 Linux编辑器 - vim启动vimVim 的三种主要模式常用操…...
gopool 源码分析
gopool gopool是字节跳动开源节流的gopkg包中协程池的一个实现。 关键结构 协程池: type pool struct {// The name of the poolname string// capacity of the pool, the maximum number of goroutines that are actually working// 协程池的最大容量cap int32…...

【Survival Analysis】【机器学习】【3】 SHAP可解釋 AI
前言: SHAP(SHapley Additive explanations) 是一种基于博弈论的可解释工具。 现在很多高分的 论文里面都会带这种基于SHAP 分析的图,用于评估机器学习模型中特征对预测结果的贡献度. pip install -i https://pypi.tuna.tsinghua.edu.cn/sim…...

ModuleNotFoundError No module named ‘torch_geometric‘未找到
ModuleNotFoundError: No module named torch_geometric’未找到 试了很多方法,都没成功,安装torch对应版本的torch_geometric都不行, 后来发现是pip被设置了环境变量,所有pip文件都给安装在了一个文件夹了 排查建议 1. 检查 p…...
iOS 门店营收表格功能的实现
iOS 门店营收表格功能实现方案 核心功能需求 数据展示:表格形式展示门店/日期维度的营收数据排序功能:支持按营收金额、增长率等排序筛选功能:按日期范围/门店/区域筛选交互操作:点击查看详情、数据刷新数据可视化:关…...
链表题解——环形链表【LeetCode】
141. 环形链表 方法一 核心思想: 使用一个集合 seen 来记录已经访问过的节点。遍历链表,如果当前节点已经存在于集合中,说明链表存在环;否则,将当前节点添加到集合中,继续遍历。如果遍历结束(h…...