我正在开发一个特殊用途的网络工具,其中包含一些数据包嗅探和解码功能。我正在寻找可以协助解析/解码任意数据包格式的语言。理想情况下,解决方案应基于开放标准。虽然SO上有相关问题,但大多数涉及数据包嗅探的完整生命周期(我不太关心捕获,因为有其他库可以很好地完成)。
总的来说,我要寻找一种语言和支持框架,用于声明式定义数据包格式和相应的运行时解码。由于这个问题可以推广到任何非网络二进制数据,因此解决这个问题的方案也在范围内。我有点惊讶,目前没有成熟且稳健的标准存在(至少我没有找到)-尽管似乎有很多有趣但不太正确和接近的项目(见下文)。也许这说明了问题的难度,或者是需求缺乏。
举例来说,我对以下技术和思想感兴趣(无特定顺序):
总的来说,我要寻找一种语言和支持框架,用于声明式定义数据包格式和相应的运行时解码。由于这个问题可以推广到任何非网络二进制数据,因此解决这个问题的方案也在范围内。我有点惊讶,目前没有成熟且稳健的标准存在(至少我没有找到)-尽管似乎有很多有趣但不太正确和接近的项目(见下文)。也许这说明了问题的难度,或者是需求缺乏。
举例来说,我对以下技术和思想感兴趣(无特定顺序):
- Packet.Net - 能够将二进制数据包转换为结构体,但解析器都是硬编码的,似乎无法处理更复杂的格式。
- DFDL - 我一直在关注这个项目,甚至一年前还参加了电话会议。标准似乎已经成熟,但实现似乎很有挑战性。虽然我不介意亲自动手,但我不确定我是否有足够的资源从头开始实现如此广泛的标准。
- Network Monitor Open Source Parsers - 该项目使用类C语法来描述数据包,供Microsoft Network Monitor使用。它已定义许多数据包,并且语言似乎足够强大以支持复杂的结构。不幸的是,唯一的执行引擎实现在NetMon中,虽然该语言的语法可能被反向工程出来,但实现处理引擎可能非常困难。我还担心由于解析器语言与NetMon工具之间的显式联系,该语言存在非通用方面,可能不适合在其他工具中使用。
- NetPDL - 这个项目看起来非常有趣,但开发似乎已经停滞了。还不太清楚如何在他们自己的环境之外利用执行引擎。
- Wireshark Dissectors - 我考虑过包装/使用原生的Wireshark Dissectors来实现这个目的,但它们与Wireshark本身紧密相连。解析器也使用代码执行大部分解码操作,这与我想要的有点相反——我更喜欢一些更声明式的东西(尽管显然需要平衡,因为复杂的数据包结构通常需要切换和其他逻辑来确定最终的组成)。
- BSDL - 一个类似于DFDL(见上文)的学术语言。有趣且朝着正确的方向发展,但除了几篇论文之外,似乎没有其他存在。
我并不一定在这里寻找完整的解决方案(虽然如果有人知道我没有涵盖的解决方案,那将是很好的)。我更感兴趣的是关于我指出的技术的评论或轶事,以及我没有考虑或涵盖的路线的指针或想法。