关于我在TCP,UDP和MQTT方面的经验的几点思考,以及一些需要复查的其他资源。
使用UDP,我遇到了静默故障问题,其中一个网络节点(客户端)上的应用程序仅看到已发送的某些UDP消息。网络流量可能出问题的原因太多。UDP的问题在于,只要数据包生产者与数据包使用者之间的网络路径中的任何节点都可以保证,就可以丢弃很多数据包。请参阅Wikipedia主题数据包丢失。
问题是,在当前网络环境下,您的损失率是多少?因此,如果这是LAN或子网内的通信,则丢失率可能会很低。在WAN或整个Internet上,您的丢失率可能会很高。UDP数据包由于多种原因而被丢弃并被路由,但是网络条件允许该跳数递减。没有负责任的情况下将数据包发送到一个巨大的空白中,就可能导致无提示故障。
在您的情况下,这听起来像只是一个简单的ack,在超时后重新发送而没有收到ack就足够了。
我已经通过维护的TCP连接完成了XML消息,并且效果很好。我有一层将完整的消息分别在缓冲区中传递给应用程序层进行处理。我使用XML来打包消息,并使用XML开头标签作为消息的开头,并使用XML结束标签来知道何时接收到整个消息。
TCP确实具有一些功能,例如数据包的顺序顺序,无重复,并且作为连接的传输机制意味着您知道另一端是否消失,尽管可能需要一段时间才能发现。尽管网络条件可能导致TCP吞吐量降低,但在正常情况下,连接和断开连接会带来延迟,但不会带来麻烦。
MQTT是由网络传输层(通常为TCP)传输的协议。MQTT使用发布/订阅模型,因此没有消息存储。因此,如果发布者发布消息(如果订阅者当时未连接),则发布者发布消息时将看不到该消息。MQTT几乎是实时的,我想这就是首字母缩写词的遥测部分的全部内容。我确实喜欢小消息的MQTT,并且已经通过使用Mosquitto的MQTT通过JSON有效负载进行了一些实验。请参阅本文Mosquitto(MQTT)的可靠消息传递,并概述MQTT和服务质量。并查看这篇简短的文章,其中包含指向资源的链接,包括示例应用程序IoT – MQTT发布和订阅者C代码。
我对使用JSON文本和订户中的SQLite3数据库存储消息的MQTT的实验是在https://github.com/RichardChambers/raspberrypi/tree/master/mqtt上进行的,尽管源代码是C语言,并且非常混乱。
这是一个13分钟的视频,其#144互联网协议:CoAP与MQTT,网络嗅探以及为IKEA Tradfri Hacking做准备。这是一篇关于CoAP(受约束的应用协议)的有趣文章:CoAP是物联网的“现代”协议。CoAP的摘要如下:
早期采用者一致认为,受约束的应用协议对于受约束的网络和设备非常有效。不太为人所知的是:“在非常拥挤的无线网络(Wi-Fi或蜂窝网络)上,CoAP可以继续工作,而基于MQTT的基于传输控制协议(TCP)的协议甚至都无法完成握手, ” Vermillard说。
这是因为与大多数其他IoT协议不同,CoAP是基于UDP构建的。换句话说,这意味着没有TCP遇到的协议握手或纠错。Matthieu指出:“ CoAP可能不像HTTP那样可靠,或者不能保证像MQTT这样的消息传递,但是它非常快。” “如果您还可以接收一些消息,那么您可以在同一时间范围内发送更多消息。”
您可能还会看到其他一些内容,例如AMQP,STOMP和CBOR。请参阅CBOR标准网站以及本论文,CBOR协议的实现和评估。请参阅本文,选择消息传递协议:AMQP,MQTT或STOMP,它比较并对比了AMQP,MQTT和STOMP,并以关于RabitMQ代理的注释结尾:
希望这可以帮助许多人开始针对每个用例浏览协议汤。由于公司通常有许多具有不同需求的应用程序,因此肯定有可能需要跨不同应用程序的所有三个经纪人。这就是可靠的多协议,多语言经纪人(如RabbitMQ)进入的地方,因为它可以发送STOMP,MQTT或AMQP并取出其中一个。您不需要被这些协议之一所锁定-RabbitMQ代理支持所有这三个协议,使其成为应用程序之间互操作性的理想选择。该插件体系结构还使RabbitMQ能够发展为将来支持这些协议的其他版本或更新版本。
该幻灯片共享包中约有60张幻灯片,对四种不同的IoT协议进行了比较和对比,着眼于对可靠性和健壮性有不同需求的两个不同的IoT组(消费者和工业)的需求。物联网的正确消息传递标准是什么?。
Ack
不需要。我认为在UDP之上进行可靠性工作没有太大意义,这就是TCP的目的。