应用程序的请求与Linux内核中的响应的在线匹配

时间:2016-12-20 08:03:10

标签: c linux algorithm kernel netfilter

使用Netfilter的钩子我已经实现了一个Linux内核模块,用于检查主机的所有传入和传出数据包。使用该模块,我可以监视在该主机上运行的给定应用程序的流程,即,通过知道src / dst端口/ IP,我可以在接收/发送相关数据包时过滤掉(分类)。

我接下来要做的是在运行时匹配传入的应用程序的请求以及相应的传出响应。每个请求/响应由src / dst IP和唯一ID标识。

天真的实施是流动的:

  • 将每个传入的请求存储在列表(数组/链接列表等)中
  • 每个传出回复:
    • 搜索列表以查找匹配的请求。如果找到请求,请将其从列表中删除。
  • 定期删除请求列表,以删除超过X秒的请求。

问题是针对每个响应,这种天真的算法需要通过请求列表进行线性搜索来识别匹配。这在高费率下是昂贵的。

你能否提出一种可以降低复杂性的算法?牺牲精度(松散一些匹配)来保持性能是可以接受的。

谢谢!

1 个答案:

答案 0 :(得分:1)

你可以使用哈希表来减少查找操作,在Linux内核3.7+中有通用哈希表implementation,您可以在内核模块中使用它。它具有非常易于使用的功能。

你必须建立一个符合你要求的密钥,比如src / dest ip& port +请求唯一id并在哈希表中使用它,哈希表存储每个键的值,该值可以是指向实际请求有效载荷的指针。基于其实现,它可能具有O(n)的最坏情况,但具有良好填充因子的哈希表可以容易地实现O(1)或O(logN)。

要进行更多优化,您可以使用布隆过滤器,布隆过滤器可用于过滤无效或丢弃的请求。它非常快,并且没有哈希表等内存访问惩罚。但与哈希表不同,它不会为每个键存储值,因此您也需要哈希表。 Linux内核here

有bloom过滤器实现