ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Eclipse Mosquitto 1.5 发布:逐项解析 Broker、客户端库与命令行工具的新特性

Eclipse Mosquitto 1.5 发布:逐项解析 Broker、客户端库与命令行工具的新特性 物联网消息队列后端【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mosquit/mosquitto点击查看免费下载Eclipse Mosquitto 1.5发布日期 20180502是一个功能版本features release覆盖 Broker、C 客户端库 libmosquitto、命令行客户端mosquitto_pub/mosquitto_sub以及构建系统四个层面。本文以官方发布公告为主体结合当前仓库的配置模板 mosquitto.conf 与配置解析源码 src/conf.c 等实现细节逐项解析 1.5 引入的新能力、行为变更与修复帮助开发者理解每个特性背后的设计意图、配置方式与升级影响。版本概览一次聚焦安全与队列行为的迭代Mosquitto 1.5 于 2018 年 5 月 2 日发布属于特性版本。它的主题非常集中安全选项的细化per_listener_settings、allow_anonymous默认行为变更、消息队列的字节级控制max_queued_bytes、QoS1 消息重试语义的调整以及客户端库 API 的易用化扩充mosquitto_subscribe_simple、mosquitto_subscribe_callback、mosquitto_validate_utf8等。安全修复CONNECT 报文引发的内存泄漏1.5 修复了一个可由恶意 CONNECT 报文触发的内存泄漏内存泄漏问题本身在当时尚未分配 CVE 编号对应 Eclipse bugtracker 的 #533493。对运行在公网、接受匿名连接的 Broker 而言这类由畸形报文驱动的资源消耗问题值得在升级后配合memory_limit等防护项一起评估。Broker 新特性详解per_listener_settings认证与访问控制按监听器隔离这是 1.5 最受关注的安全特性。此前 Mosquitto 的所有安全选项都是全局的per_listener_settings true之后以下选项全部变为按 listener 独立配置acl_fileallow_anonymousallow_zero_length_clientidauto_id_prefixpassword_filepluginplugin_opt_*psk_file从配置模板 mosquitto.conf 可以看到完整清单同时官方强烈建议该选项必须放在其他选项之前声明。这一点在源码中有硬性约束——src/conf.c 在解析到per_listener_settings时会检查cur_security_options是否已存在若之前已经出现过安全选项则直接报错退出Error: per_listener_settings must be set before any other security settings.解析器还通过REQUIRE_LISTENER_IF_PER_LISTENER宏src/conf.c保证在per_listener_settings true模式下password_file、acl_file等安全选项必须出现在某个listener定义之后否则报xxx option requires a listener to be defined first。而conf__set_cur_security_options()src/conf.c则决定安全选项写入哪里开启该特性时写入cur_listener-security_options否则写入全局config-security_options。一个典型的按端口隔离认证的配置形如per_listener_settings true listener 1883 127.0.0.1 allow_anonymous true listener 8883 password_file /etc/mosquitto/pwfile allow_anonymous false即内网明文端口允许匿名TLS 端口强制口令认证。从源码结构看该特性还影响持久化与会话恢复开启后断线重连的持久化客户端clean session 为 false会使用其最近一次所连接 listener 的 ACL 设置配置模板中的明确说明persist_read.c中也会按持久化的 listener 端口重新定位安全上下文见 src/persist_read.c。有限度的 listener 配置热重载1.5 支持对已定义 listener 的设置进行重载通过 SIGHUP 触发但端口号不允许变更。这意味着你可以调整某个 listener 的 TLS 证书、密码文件或 ACL 而无需重启整个 Broker但若想增删端口仍必须重启进程。这与per_listener_settings配合使用时Broker 会因端口不匹配给出明确的报错提示src/mosquitto.c 附近。SUBSCRIBE 报文的访问控制1.5 为认证插件增加了拒绝 SUBSCRIBE 报文的能力在此之前插件只能控制 read/write 两类访问。注意发布公告明确说明该能力当时仅对认证插件auth plugin开放普通 ACL 文件尚未支持按订阅行为做细粒度拒绝。QoS1 消息不再按超时重试这是一个值得部署方注意的行为变更发往客户端的 QoS1 消息PUBLISH/PUBREL在超时后不再自动重试而是等待客户端重连后再重发。公告给出的设计理由很清晰若连接因网络问题已断开但双方均未察觉重连后自然会重发此时多余的 PUBLISH/PUBREL 毫无意义若客户端过载、无法响应或链路缓慢多发重复报文并不能帮助客户端追上积压一旦积压清空客户端自会应答。该变更同时应用于 Broker 与客户端库lib/下的发送逻辑。对依赖旧重试语义做故障检测的部署需要同步调整心跳与断线检测策略。use_subject_as_username证书主体整体作为用户名针对证书双向认证场景1.5 新增use_subject_as_username选项启用后客户端用户名取整个证书 subject 字段而非仅 CN从而支持更细粒度的证书身份区分对应 Eclipse #469467。此前的use_identity_as_username只取 CN两者可配合password_file/ACL 实现“以证书身份授权”。$SYS 树新增存储统计主题移除时间戳1.5 新增两个存储统计主题并标记旧主题弃用$SYS/broker/store/messages/count弃用$SYS/broker/messages/stored$SYS/broker/store/messages/bytes同时移除所有构建时间戳信息包括$SYS/broker/timestamp对应 #651这有利于实现可复现构建。公告同时提醒sys tree 的输出格式不应被依赖随时可能变化对应 #470246。max_queued_bytes按真实字节数限制队列此前队列仅能以消息条数max_queued_messages默认 1000限制无法约束真实内存占用。1.5 新增max_queued_bytes按字节数限制每个客户端的 QoS 1/2 积压队列默认 0即无限制。配置模板说明若两个选项同时设置队列将先触达哪个限制即停止排队mosquitto.conf。对应的结构体字段定义于 src/mosquitto_broker_internal.h它让运维人员能更直接地把“单客户端积压内存上限”与机器内存预算挂钩。set_tcp_nodelay禁用 Nagle 算法新增set_tcp_nodelay选项可对客户端 socket 禁用 Nagle 算法默认 false见 mosquitto.conf。效果是降低单条消息的传输延迟代价是可能增加小包数量与带宽开销——适合对延迟敏感、消息量适中的内网场景。对应字段见 src/mosquitto_broker_internal.h。allow_anonymous默认行为变更升级必读这是 1.5 中最容易影响存量部署的语义变更旧行为未显式设置时默认允许匿名访问新行为只要设置了其他安全选项如password_file且未显式设置allow_anonymous则默认拒绝匿名显式设置allow_anonymous true仍可放开匿名。其实现位于 src/conf.callow_anonymous默认初始化为 -1未设置配置解析完成后若设置了任一安全选项且该值仍为 -1则统一改写为false。开启per_listener_settings时该判定逐 listener 进行。换句话说1.5 之后“配了密码文件却忘了写allow_anonymous”的配置会从“匿名可用”变成“匿名拒绝”这是期望的安全收紧但升级前务必确认每个 listener 的匿名预期。其他 Broker 改进内存优化通过 UHPA一种堆分配复用策略减少 malloc 调用接收与存储消息时减少不必要的 malloc/memcpy对应 #470258。最小支持 libwebsockets 版本提升到 1.3Websocket 监听器不再禁用 IPv6。systemd 启动通知与 service 文件对应 #471053见 service/systemd。Bridge 默认使用 MQTT v3.1.1支持配置 bridge 仅向本地 Broker 发送通知。mosquitto_db_dump工具可输出客户端统计见 apps/db_dump。对 will、订阅、退订主题执行 UTF-8 校验。Windows XP 支持移除。include_dir按字母序加载配置文件对应 #17配置文件单行长度不再限制为 1024 字符对应 #652。Broker 修复要点公告列出的 Broker 修复中以下几项值得特别留意修复 MQTT 3.1.1 下无主题的 UNSUBSCRIBE 被错误接受#665两个 bridge 共用同一local_clientid时报错queue_qos0_messages未遵守max_queued_*限制的问题已修复密码比较改用常数时间 memcmp降低时序侧信道风险修复 PSK key 带前导零时选错 key 的问题客户端库同步修复修复use_identity_as_username在 websockets 客户端上失效、以及 websockets 上未授权连接不发 CONNACK 等问题修复含 NULL 字节的输入字符串处理#693客户端 ID 被占用时若旧客户端带 will连接时正确发送其遗嘱消息#26Windows 上最大连接数提升至 2048移除全部构建时间戳信息。客户端库libmosquitto新特性两个“傻瓜式”辅助函数1.5 新增两个高层辅助函数大幅简化订阅场景的样板代码mosquitto_subscribe_simple()一行式地从 Broker 拉取消息内部完成连接、订阅、收齐后断开适合脚本化取数mosquitto_subscribe_callback()注册回调处理 Broker 推送的消息。二者的完整可编译示例位于 examples/subscribe_simple提供single.c、multiple.c、callback.c三个变体并配套 Makefile。这是 1.5 对新手最友好的一处改进。UTF-8 校验与主题检查新增mosquitto_validate_utf8()按 UTF-8 规范及 MQTT 规范的额外限制校验字符串所有主题输入在库侧即做 UTF-8 校验。新增mosquitto_pub_topic_check2()、mosquitto_sub_topic_check2()、mosquitto_topic_matches_sub2()与原有同名函数行为一致但额外接收长度参数便于处理非 NUL 结尾的缓冲区对应底层实现见 lib/util_topic.c。连接回调与 SSL 上下文控制mosquitto_connect_with_flags_callback_set()注册第二个连接回调暴露 connect flags 参数对应 #738/#128mosquitto_userdata()读取客户端 userdata 成员对应 #111MOSQ_OPT_SSL_CTX允许用户传入自建SSL_CTX取代 libmosquitto 内部生成的默认上下文从而精细控制 TLS 选项对应 #715MOSQ_OPT_SSL_CTX_WITH_DEFAULTS与MOSQ_OPT_SSL_CTX配合在用户提供的SSL_CTX上叠加 libmosquitto 的默认配置对应 #567。默认行为调整连接默认协议从 v3.1 变为MQTT v3.1.1Broker 的 bridge 连接同步变更DNS-SRV 支持默认关闭此前默认开启SNI 主机名支持加入。命令行客户端新特性mosquitto_sub -F自定义输出格式mosquitto_sub -U退订主题mosquitto_sub --retained-only收完全部 retained 消息后即退出mosquitto_sub -W超时后停止处理入站消息mosquitto_pub -c支持 clean session 标志使用 TLS 时默认端口改为8883mosquitto_sub收到 CONNACK 拒绝后不再反复尝试连接修复mosquitto_pub -l处理空文件的问题#676。构建系统与依赖变化新增WITH_STRIP默认 no设为 yes 时安装过程会剥离可执行文件与共享库符号新增WITH_STATIC_LIBRARIES默认 no设为 yes 时额外构建并安装客户端库的静态版本OpenSSL 1.0.0/1.0.1 支持移除上游已停止维护这两个版本编译期需使用更新的 OpenSSL编译期禁用 TLS-PSK 时不再运行 TLS-PSK 测试#636文档中弃用的c_rehash全部替换为openssl rehash。构建选项的完整上下文可参见根目录 README-compiling.md 与 config.mk。升级路径与配置检查清单结合以上特性从 1.4 升级到 1.5 时建议依次核对检查每个 listener 的匿名预期由于allow_anonymous默认行为已变凡配置了password_file/acl_file/psk_file且未显式写allow_anonymous的部署匿名访问将被拒绝如需保留匿名请显式写allow_anonymous true。若计划启用per_listener_settings务必放在配置文件最前部且所有安全选项移到listener块之后确认持久化客户端的 ACL 归属语义变化可接受。评估 QoS1 重试语义变更依赖超时重发来兜底的应用应改依赖重连后的重发。确认依赖版本libwebsockets ≥ 1.3、OpenSSL ≥ 1.0.21.0.0/1.0.1 不再支持、放弃 Windows XP。关注队列上限如需更精确的内存管控可组合使用max_queued_messages与新增的max_queued_bytes。总体而言1.5 是一次“安全细化 内存可控 客户端易用化”的迭代per_listener_settings让多端口多租户的认证隔离成为可能max_queued_bytes补上了字节级队列管控的缺口而mosquitto_subscribe_simple/callback与 UTF-8/主题校验函数则显著降低了 libmosquitto 的上手门槛。升级前重点核对allow_anonymous与 QoS 重试两项行为变更即可平滑完成迁移。赞分享物联网消息队列后端【免费下载链接】mosquittoEclipse Mosquitto - An open source MQTT broker项目地址https://gitcode.com/gh_mirrors/mosquit/mosquitto点击查看免费下载相关推荐Eclipse Mosquitto 1.6.3 发布详解Broker、客户端库与命令行工具的关键缺陷修复Eclipse Mosquitto 1.6.3 发布详解Broker、客户端库与命令行工具的关键缺陷修复 导读 Mosquitto 1.6.3 是 Eclip后端消息队列消息路由Eclipse Mosquitto 1.6.7 版本发布解读Broker、客户端库与命令行工具的 Bugfix 修复全览Eclipse Mosquitto 1.6.7 版本发布解读Broker、客户端库与命令行工具的 Bugfix 修复全览 导读 Eclipse Mosquit物联网消息队列后端网络/通信Eclipse Mosquitto 1.5 版本技术解析安全修复、Broker 新特性与客户端库增强Eclipse Mosquitto 1.5 版本技术解析安全修复、Broker 新特性与客户端库增强 本文基于 Mosquitto 官方 1.5 版本发布公告物联网消息队列后端网络/通信上一篇BookGet v25.0517古籍资源下载工具的全面解析下一篇MHY_Scanner 2025全攻略米哈游游戏扫码登录神器使用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表