关于TCP数据包格式化有什么好的建议吗?

关于TCP数据包格式化有什么好的建议吗?,tcp,Tcp,我正在为手机创建一个应用程序,它通过TCP连接将加速度测量发送到服务器 我希望尽可能地减少消息长度,但同时我希望能够扩展当前的格式,而无需修改接收方解析机制 开始时,我以以下格式发送字符串: ##measurementTime#AccelerationX#AccelerationY#AccelerationZ 但是在实现后不久,我在消息中添加了一些其他数据,我意识到如果我必须频繁修改格式,这将需要很多时间 我曾经考虑过XML,但是它增加了很多负载,这当然是我想要避免的(测量值每100-250毫

我正在为手机创建一个应用程序,它通过TCP连接将加速度测量发送到服务器

我希望尽可能地减少消息长度,但同时我希望能够扩展当前的格式,而无需修改接收方解析机制

开始时,我以以下格式发送字符串:

##measurementTime#AccelerationX#AccelerationY#AccelerationZ
但是在实现后不久,我在消息中添加了一些其他数据,我意识到如果我必须频繁修改格式,这将需要很多时间


我曾经考虑过XML,但是它增加了很多负载,这当然是我想要避免的(测量值每100-250毫秒发送一次)。

我真诚地建议将数据包结构更改为二进制格式。如果您想减小数据包的大小,这还将允许根据数据包的定界方式轻松实现可伸缩性

您可以采取以下措施:

n字节开始+大小
n字节时间
2-8字节x
2-8字节y
2-8字节z


如果需要完全坚持ASCII文本类型流,建议发送简单的键名/值对。关键字名称用于描述每个值传达的字段名称,类似于原始提案:

##keyName1=value1#keyName2=value2#
或者,您可以以二进制标记格式发送数据,例如:

<tagCodeNum><lengthInBytes><tagValueAsBytes>

其中tagCodeNum可能是一个字节或单词,长度是一个字节或单词,具体取决于您的需要。这种格式的思想是,接收者可以识别它通过代码编号理解的字段,然后也可以跳过它不知道如何解码的标签。通过这种方式,编码变得可扩展。如果需要将多个标记分组到逻辑消息中,我会将一组二进制编码的标记打包到整个消息层次结构中:

<messageCodeNum><lengthInBytes><tag><tag><tag>

其中,上面的标记是上面描述的先前标记构造的复制,长度描述了组合在一起的所有标记的字节长度


注意:如果您考虑这个结构,它与XML类型的结构没有太大的不同,但是它更加简洁和受限,因此几乎不需要解码

思考一些优化的东西:
-仅发送与上一个值的差值
-不时发送完整的帧
-不要使用xml,创建结构定义

我想在一点基础上再接再厉。这就是通常所说的标记长度值编码。想法是第一个代码是标记,它告诉您如何解释值。第二个代码是长度,它告诉您值中有多少字节。这是一种进行可扩展二进制编码的好方法,在MPEG编码中被大量使用

我想补充一些关于良好功能二进制协议的提示/要求:

  • 在每条消息中包含一个版本号,说明消息的协议版本
  • 对中的每个多字节字段进行编码
  • 请仔细考虑每个字段的大小
  • 考虑对整数使用多字节编码方案:我找不到一个好的参考,但其思想是,如果有更多字节,则顶部位为1,如果这是最后一个字节,则顶部位为0,并且每个字节中较低的七位包含值
  • 将所有内容以字节的形式打包到线路上,而不使用结构
  • 第一点非常重要。更重要的是,您要计划更改并仔细决定协议将如何更改。如果客户端不支持版本号,则不应尝试解释消息。从来没有

    第五个问题在实现稳定时非常重要。我已经为嵌入式设备编写了很多二进制协议实现,使用压缩结构是我最后悔的错误。我有太多与忘记字节交换数字字段或不打包结构相关的缺陷。只需编写一个漂亮的字节打包和解包原语库,彻底测试它,并认真使用它

    如果您在设计和实现协议时牢记这些原则,那么当您需要支持和扩展时,您的生活将变得更加轻松。我强烈推荐的最后一件事是为您的协议编写一个解析器。它还将使部署、测试和支持变得更容易。只要确保完全理解编写这种剥离器的可能的法律意义,以及在考虑它之前部署一个。 我在考虑XML,但它增加了很多负载


    您可以改用JSON。它不会像二进制格式那样紧凑,但比XML紧凑得多。您可以轻松地扩展数据格式。

    请解释“如果我必须频繁修改格式,这将花费大量时间”这是什么意思?解析消息时遇到问题吗?发送是否花费太长时间?现在我计算“#”字符的实例并解析消息。这不是一个问题,但我很高兴听到任何可以简化解析的建议。请用其他事实更新您的问题。什么语言?