我希望能够辨别网络流量。我将流定义为三个值(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获得,我们不允许引入库,我不知道我是否知道哈希函数只计算元素,而不是排序。
如何根据这些规则轻松区分流量?
答案 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>
。将它们添加到地图中并将它们指向相同的数据结构。