【发布时间】:2011-09-26 03:33:44
【问题描述】:
我正在开发一种具有一些数据包嗅探和解码功能的专用网络工具。我正在寻找旨在帮助解析/解码任意数据包格式的语言。理想情况下,解决方案应该基于开放标准。有关于 SO 的相关问题,但大多数涉及数据包嗅探的整个生命周期(我不太关心捕获,还有其他库做得很好)。
总的来说,我正在寻找一种语言和支持框架,用于数据包格式的声明性定义和相应的运行时解码。因为这个问题可以推广到任何非网络二进制数据,所以对任意二进制流执行此操作的解决方案也在范围内。我有点惊讶,目前没有这样的标准存在于成熟和强大的状态(至少我能找到)——尽管似乎有很多有趣但不完全正确和几乎存在的项目(见下文)。也许这说明了问题的难度,或者可能是需求不足。
例如,我对以下类似的技术和想法感兴趣(排名不分先后):
- Packet.Net - 负责将二进制数据包表示转换为结构,但解析器都是硬编码的,它似乎无法处理更复杂的格式。
- DFDL - 我关注这个已经有一段时间了,甚至大约一年前参加了电话会议。该标准似乎已经成熟,但实施似乎具有挑战性。我不介意弄脏我的手,但我不确定我是否有资源在这个项目上为此目的从头开始实施如此广泛的标准。
- Network Monitor Open Source Parsers - 该项目描述了使用类似 C 语法的数据包,供 Microsoft 网络监视器使用。它已经定义了很多数据包,并且该语言看起来足够健壮,可以支持复杂的结构。不幸的是,执行引擎的唯一实现是在 NetMon 中,虽然该语言的语法可能会被逆向工程,但实现处理引擎可能非常困难。我还担心,由于解析器语言和 NetMon 工具之间存在明确的联系,因此该语言存在一些非通用方面,使其不适合在其他工具中使用。
- NetPDL - 这个看起来很有趣,但发展似乎已经停滞不前。也不完全清楚如何在他们自己的环境之外使用执行引擎。
- Wireshark Dissectors - 为此我考虑过包装/使用本机 Wireshark Dissectors,但它们与 Wireshark 本身紧密相关。解析器还使用代码来执行大部分解码,这与我正在寻找的有点相反 - 我更喜欢更具声明性的东西(尽管显然存在平衡,因为复杂的数据包结构通常需要切换和其他确定最终妆容的逻辑)。
- BSDL - 一种在概念上类似于 DFDL 的学术语言(见上文)。有趣且方向正确,但除了几篇论文之外似乎没有其他内容。
我不一定要在这里寻找完整的解决方案(尽管如果有人知道我没有介绍过的解决方案,那就太好了)。我对上面提到的技术的 cmet 或轶事以及我没有想到或未涵盖的路线的指针或想法更感兴趣。
【问题讨论】:
标签: c# parsing networking packet