如何辨别网络流量

时间:2014-03-08 19:08:22

标签: c++ networking map packet flow

我希望能够辨别网络流量。我将流定义为三个值(sourceIP, destIP, protocol)的元组。我将它们存储在c ++ map中以便快速访问。但是,如果destinationIP和sourceIP不同,但包含相同的值,(例如)

[packet 1: source = 1.2.3.4, dest = 5.6.7.8] 

[packet 2: source = 5.6.7.8, dest = 1.2.3.4 ]

我想创建一个将这些视为同样的密钥。

我可以通过创建辅助密钥和主键来解决这个问题,如果主键不匹配,我可以遍历表中的元素并查看辅助键是否匹配,但这似乎效率很低。 / p>

我认为这可能是散列的绝佳机会,但似乎字符串哈希只能通过boost获得,我们不允许引入库,我不知道我是否知道哈希函数只计算元素,而不是排序。

如何根据这些规则轻松区分流量?

2 个答案:

答案 0 :(得分:2)

将源IP和目标IP的值比较为64位数。使用较低的一个作为哈希键,并将较高的一个,协议和方向作为值。

以相同的方式查找,使用较低的值作为键。

答案 1 :(得分:2)

如果您认为单个客户端可以与服务建立多个连接,您会发现实际上需要四个值来唯一标识一个流:源和目标IP地址以及源和目标端口。例如,假设同一办公室中的两个开发人员同时搜索StackOverflow。它们都连接到stackoverflow.com:80,并且它们都具有相同的源地址。但源端口将不同(否则公司的防火墙不知道路由返回的数据包的位置)。因此,您需要通过<address, port>对来识别每个节点。

一些想法:

  • 如同斯塔克建议的那样,对源节点和目标节点进行排序,将它们连接起来并对结果进行散列。

  • 散列源,散列目标,并对结果进行异或。 (请注意,这可能会削弱哈希并允许更多冲突。)

  • 通过散列为每个流程输入2个条目 <src_addr, src_port, dst_addr, dst_port>以及 <dst_addr, dst_port, src_addr, src_port>。将它们添加到地图中并将它们指向相同的数据结构。