可以说XML是冗长的,但应该意识到这种冗长并不是相对于内容而言的所有“开销”,因为它封装了语义,因此应该对此加以调整。开销是任何强调动态而不是静态结构的协议的症状。例如,HTML实际上是XML的一种宽松形式,它以动态结构传达内容,该结构可以被视为内容的一个方面。您可以将表的内容与表本身区分开来,但是内容是具有特定关系的表格数据这一事实是该内容不可或缺的一部分。如果我只是把每个单元格都当作一个长字符串传输,那么那个结构和那些关系就消失了,那么我就丢失了信息,那不是内容吗?
让我们考虑一个8字节的消息,它可能构成一些表格数据。如果我使用一个非常静态的协议,那么只需定义以下协议,就可以最少地传输该协议而没有额外的开销:
- 每个消息正好是8个字节,因此我们无需指出长度或包含任何终止序列。
- 始终将八个字节用于引用2 x 2网格,其中每个单元格包含一个16位值。
如果我所有的消息都一样,那么使用XML,HTML或XMPP可能被认为是愚蠢的-我在浪费总是相同且预定的结构组件上的带宽,并浪费了创建和解析它的两端的相应计算时间。一个最小的正确的HTML页面,其中仅包含一个2 x 2表,每个单元格中都有几个字符,可能至少要有100个字节才能容纳格式和协议开销。
但是,如果不是我所有的消息都完全一样,那么指定消息的类型可能不是“有效载荷”的字面意思,而是从内容角度而言是必要的组成部分。我可以再加上两个字节就可以做到这一点,并引入更多的动态性:
- 现在,消息的长度是可变的,为0-255字节,第一个字节表示长度。
- 对于不同的预定义消息类型,有(最多)256个代码,其中之一是“ 2 x 2表”,即第二个字节。
现在,我的8个字节的表内容需要2个字节的开销,但是就可以使用此自定义协议发送的消息种类而言,存在更多的可能性。
它仍然远远没有HTML页面或XML名称空间规范(或XMPP本质上是它的集合)的可能性。
因此,基于此,如果您主要是在发送简单的8字节消息,则XMPP可能会过大。但是,不一定那么多。在我看来,乍看一下相关的RFC,“从IOT连接的设备向服务器发送一个字节的数据的单个请求/响应交换大于0.5 kB”的说法似乎是一种夸张的说法(但是nb,所有我所做的只是一眼,我从未实现或使用XMPP)。我毫不怀疑您可以构造一个这样的例子,但这可能不是一个最小的例子。
由于该协议是面向TCP的,因此仅在我们做完一件事情时,才需要将建立“由'jabber:client'名称空间限定的XML流”视为消息的一部分-设备与服务器联系以向其发送8个字节,然后发送数据,断开连接。如果这种关系是更持久的(通常在IoT环境中),那么我们可以假设设备已经与目标建立了连接。在这种情况下,如果消息的最终目标是服务器(与服务器要将消息传递到的另一个客户端相反),则协议开销可能最小。
<message><body>8 bytes.</body></message>
33个字节的“开销”。这里值得指出的是XML是文本,因此,如果您的消息通常是二进制的,那么它将变得不那么合适,因为该数据需要进行编码(例如,编码为base64),这会进一步增加开销和计算量要求。
因此,最终:
XMPP是否会对发送短而频繁的消息的IoT设备产生大量开销?
如果存在持久连接,并且消息在很大程度上是非结构化的,那么我不这么认为。但是,如果您不需要它提供的功能(关于结构的动态性),那么可能会有更合适的方法。
为此,如果我们有一个上下文,其中单个中央服务器正在处理和/或依赖各种设备之间的消息,即使这些设备中的任何一个正在执行的操作总是很简单明了的,那么可以封装一个协议的协议各种消息仍然有用。如果客户端设备的资源有限,我们可以对大部分协议进行硬编码,然后包装来自该端的每条消息就变得非常简单;我相信许多部署HTTP服务器的IoT设备都可以做到这一点(这与“简单客户端,复杂服务器”相反)。这些服务器无法处理任何类型的HTTP请求(通过预先格式化的拒绝除外),并且具有一组定义明确,重点突出的功能,这些功能可以执行操作以及它们将发送的响应,但是由于它们仍然可以像HTTP服务器那样正常运行,