草庐IT

java - 二进制和文本结构(数据包)的高效解码

coder 2024-03-17 原文

背景

有一个著名的工具叫做 Wireshark .我已经使用它很多年了。这很棒,但性能是个问题。常见的使用场景包括几个数据准备步骤,以便提取数据子集以供稍后分析。如果没有这一步,过滤需要几分钟时间(如果痕迹很大,Wireshark 几乎无法使用)。

实际的想法是创建一个更好的解决方案,快速、并行和高效,用作数据聚合器/存储。

要求

实际要求是使用现代硬件提供的所有电源。我应该说不同类型的优化都有空间,我希望我在上层做得很好,但技术是现在的主要问题。根据当前的设计,有几种类型的数据包解码器(解析器):

  • 交互式解码器:解码逻辑可以在运行时轻松更改。这种方法对协议(protocol)开发人员非常有用——解码速度不是那么关键,但灵 active 和快速结果更为重要
  • 嵌入式解码器:可以用作库。这种类型应该具有良好的性能并且足够灵活以使用所有可用的 CPU 和内核
  • 解码器即服务:可以通过干净的 API 访问。这种类型应该提供同类产品中最好的性能和效率

结果

我目前的解决方案是基于 JVM 的解码器。实际的想法是重用代码,消除移植等,但仍然有很好的效率。

  • 交互式解码器:在 Groovy 上实现
  • 可嵌入解码器:在 Java 上实现
  • 解码器即服务:Tomcat + 优化 + 嵌入到 servlet 中的解码器(二进制输入,XML 输出)

待解决的问题

  • Groovy 提供了强大的功能和一切,但在这种特殊情况下运气不好
  • 将协议(protocol)解码成树结构是死胡同——太多的资源被简单地浪费了
  • 内存消耗有点难以控制。我做了几次优化,但对分析结果仍然不满意
  • 具有各种花里胡哨的 Tomcat 仍然会带来很多开销(主要是连接处理)

我在任何地方都使用 JVM 是否正确?您是否看到任何其他好的和优雅的方式来实现最初的目标:获得易于编写的高度可扩展和高效的协议(protocol)解码器?

协议(protocol)、结果格式等不固定。

最佳答案

我发现了几个可能的改进:

交互式解码器

通过使用扩展 Groovy 语法,可以大大提高 Groovy 的表现力 AST Transformations .因此,有可能简化解码器创作仍然提供良好的性能。 AST(代表抽象语法树)是一种编译时技术。

When the Groovy compiler compiles Groovy scripts and classes, at some point in the process, the source code will end up being represented in memory in the form of a Concrete Syntax Tree, then transformed into an Abstract Syntax Tree. The purpose of AST Transformations is to let developers hook into the compilation process to be able to modify the AST before it is turned into bytecode that will be run by the JVM.

我不想重新发明轮子,引入另一种语言来定义/描述协议(protocol)结构(有 ASN.1 就足够了)。这个想法是为了简化解码器的开发,以提供一些快速的原型(prototype)制作技术。基本上,要引入某种DSL。

Further reading

可嵌入解码器

Java 会引入一些额外的开销。有几个库可以解决这个问题:

坦率地说,除了 Java 之外,我看不到这一层的任何其他选择。

解码器即服务

这一层不需要Java。最后我有一个不错的选择,但价格相当高。 GWan看起来真的不错。

需要一些额外的移植,但这绝对是值得的。

关于java - 二进制和文本结构(数据包)的高效解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13649233/

有关java - 二进制和文本结构(数据包)的高效解码的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  7. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐