问题简介: 在我的应用程序,我必须本内容的数据报具有一定的格式。一个例子:

一个例子 任何包装的二进制数据,例如:4字节的标题中,4个字节的类型(型码具有预先定义的含义),然后源的地址,目的地的地址,等等。

以前,我做的家常实现的储存的数据在二进制文件(固定的记录的长度允许快速查询),但有时候我意识到我是发明某种类型的数据库。例如,我执行我自己的有效的二元格式存储非常大的数据文件。我还在执行我自己的索引,以迅速运行搜索的一些领域。我认为一个真正的DB(甚至简单的源码)可以使这些东西透明的简单。

问题1: 是星可用于储存这类数据,以及应该如何这样做?请注意,有没有1到许许多多对多映射在这里和其他先进的事情,它只是一个普通序列的分组有一定的内部结构,我要用户显示的,让他交互作用(即搜索一个特定场)。

问题#2: 现在假设使用者自己可以规定格式的,他分组,即在配置文件:每个字段的长度,它类型,有什么其价值观念的意思是(在情况下的一枚举)等。我怎么延长一个数据库支持执行这个吗?应该用户的定义DB模式?应配置文件将自动翻译成这种模式?奥姆?

问题3: 甚至更先进的...现在假设该数据包可以是不同的长度和内容。即, 对于类型#2的软件包,有一些领域,对于类型#3,其他一些领域,等等。但我仍然喜欢我的应用程序来处理它,显示一切都很好,也允许用户指定的格式,配置文件。它是如何做的?

在此先感谢。

有帮助吗?

解决方案

  

问题1:对于有用的DB   存储这些数据,以及应如何   完成?

当然,一个数据库是对于该应用是有用的。你可以实现自己的专用数据存储,也许这将是为特定应用程序更有效,因为你可以把它设计为专业化。关系数据库是更通用的,但你可以通过使用数据库避免周或数月的开发时间。

我回答另一个问题上如何处理扩展类型,其中每一个新的子类型都有其独特的属性集的主题今天早些时候。

产品表,许多样的产品,每个产品有许多参数。“

有关您的应用程序,我会选择混凝土表继承设计。

  

问题2:现在假设用户   本人可以指定的格式了   的数据包,即在配置文件中:   每个字段的长度,它的类型,   它是什么意思值(在的情况下,   枚举)等。我如何   延长一个DB支持实施   这个?

我假定包类型的数量相对较少,然后许多分组插入用几乎相同的结构。所以,你应该使用数据库的管理元数据的能力。我将定义一个额外的表为每个新的数据包类型。

我也将存储的报文“爆炸”,所以包的每个字段被存储在单独的数据库列。这样你可以单独索引每个列,以支持高效的搜索。

您还可以定义约束以使得一些字段是强制性的(NOT NULL)或它们的值由查找表的约束。再次,利用数据库的能力,以使用元数据来执行一致的结构,其中它的所希望的。

SQL已经支持标准的,声明性语言用于指定数据类型,约束等领域为什么要开发不同的语言,你就必须转换到SQL?

  

问题3:更先进的...现在   假设数据包都可以   不同的长度和内容。

这是在一个给定的数据包类型应当允许在相应列NULL可选字段。

其他提示

一个简单的规则是这样的:如果你要查询的数据,那么它应该是数据库中的表内的离散场。如果没有,你可以存储BLOB和与它做。

这就是说,如果要获得从BLOB“元数据”和索引,则可以做到这一点很容易地以及

如果数据类型是全等什么数据库可以支持(或可以被准确地转换),可以有一些值被爆炸的BLOB中参与向DB列很好地映射它的组成部分。

与限定“表在飞行中”(其可以容易地进行)的问题是没有这么多的表的定义,但表中的电势变化。正在改变(即一列添加,或删除等)的表往往是不可用于变化的持续时间。不是100行的问题。对于数百万行一个现实的问题。

如果数据的定义是相对静态的,然后创建一个映射工具,可以让您的用户描述BLOB,然后使用该定义都创建一个兼容的表和导入过程中适当转换的BLOB。

至于“不同类型的不同的行”,仍然可以在东西到单个表的数据。有些行已“未使用”的列比别人,每个行由类型识别。如果你有大量的行定义,和大量的变异,你会得到大量的空间浪费这样做。那么你可能要到有每一行类型的表,并持有该行的类型和引用到实际的表中的实际行的主表。如果你关心的原始数据包的相互关系(那么你可以将它们存储在接到命令,说,等)。

您只需要这个主表

真的,这一切都归结到你有你想要多少工作要做VS多少你已经做了,有多少数据,你有多少期待,等等。

您不妨考虑另一种选择是的Berkeley DB 或它的克隆之一。 BDB是相当低的水平,没有SQL。这几乎是一个非常小的,非常快文件支持的哈希表。它永远存在了,而在很多地方,速度和简单性是最重要的使用。你需要在上面添加一些功能做你想要什么来完成,虽然。

尽管你说有没有一对多关系的事实,主要有:)

我建议创建用于分组存储两个表。一个用于存储“报头”或“标量”的信息,这是共同的包和 - 虽然它可以定义哪些数据是本 - isn't存储在信息包的实际数据。

您第二表将存储数据对于每个分组,与表示在该表中的一行的每个字段值的组合。例如,下面的两个表:

create table packet
(
    packet_id int identity(1, 1) primary key,
    destination varchar(50),
    sender varchar(50),
    packet_type_id int not null
)

create table packet_field
(
    packet_field_id int identity(1, 1) primary key,
    packet_id int not null references packet (packet_id),
    field_id int not null,
    data varbinary(500)
)

显然这两个表所做的关于类型和所存储的数据的大小假设,并没有什么,他们会需要存储无遗。然而,该基本结构将允许动态地定义的数据包格式,并且是真实容易索引的模式(例如,在packet_id+field_id packet_field添加索引将是显而易见的)。

您所有应用然后负责被拆包分组,并且它在DB在此模式存储,然后再包装(如果需要)。

当然,从这个角度,你需要存储的数据包的实际格式表。类似...

create table packet_type
(
    packet_type_id int identity(1, 1) primary key,
    name varchar(200) not null
)

create table packet_type_field
(
    field_id int identity(1, 1) primary key,
    packet_type_id int not null references packet_type (packet_type_id)
    field_offset int not null,
    name varchar(200) not null
)

再次明显简化,但它显示的基本思想。你将不得不在一个给定的数据包中每个数据包格式的packet_type表中的单个记录,并在packet_type_field每个字段一行。这应该给你的大部分信息,你需要能够处理的二进制数据的任意块到上述数据包存储架构。

三种方法想到。

的sFlow和IPFlow可以传送有限的一组数据包的内容。这可以直接登录到几个不同的数据库。

另一种更有针对性的方法将是一个写一个非常简单的Snort规则如源或目标地址。然后有Snort的捕获数据包的有效载荷。这样,你只会得到您所需要的实际数据。举例来说,你可以抢包里的数据仅仅领域。例如密码等

的ngrep也可以抓住选择性数据右断丝。

当然每个这些可能需要一个水龙头或端口的监控会话,如果你不这样做,服务器/工作站本身的采集。

虽然我不是一个巨大风扇该实现的,我们有一些软件,基本上为一些呼叫名单。从本质上讲,这是什么他们这样做:

  1. 一个表,列定义-叫它tblColumnDefs.该表含有列如"名字"、"类型"、"长度"和"介绍"
  2. 一个实例主表(tblPacketNames).基本上,只是"PacketTypeID","PacketName",以及"说明"对每个分组类型你要定义
  3. 一个实例定义表(对于你来说,这将是tblPacketColumns).该表中收集的预定列在一起,形成数据结构你的存储。例如,它可能举行"PacketTypeID","列号","ColumnID".在数据库的正常化-说,这是一个多对多表,因为它的地图列为分组,使用它们。
  4. 在第二个数据库(因为动态SQL/注射的影响这一步骤),表格是创造的动态举行的实际数据。例如,如果你一定义(步骤2/3)的一个分组类型称为"PING",可能有一个表叫做"PING"在你的数据库以保持这些数据。你会用tblPacketColumns,与tblColumnDefs,以找出什么样的领域种类型创建并有多大,他们应该是。你结束了一个集合表相匹配的分组类型的定义从第3步,使用列步骤1。

注:我不特别喜欢的SQL-注射影响问题的第4步。创建表态可能会导致一些后果,如果安全是不是设计适当和输入从任何用户输入的领域在应用程序是不洁净的正常,尤其是如果这种应用程序都有一个接口,可以不受信任的呼叫者(即互联网)。

使用这个,你可以创建的索引,但是你想要的时候表是创建(也许你有一个列于步骤1,你标志的某些列为"可",并创建索引他们上当时的表格。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top