进行TCP重组时为TCP连接表计算哈希的最佳方法

时间:2018-08-20 19:59:07

标签: tcp cryptography network-programming tcp-ip

有什么好的算法可以计算(192.168.0.1,34829,80.229.161.151,80,6)中的哈希值,我可以使用这些算法在哈希表中查找连接?

192.168.0.1:34829 -> 80.229.161.151:80
(3232235521, 34829, 1357226391, 80, 6)

我在本文中读到,一种流行的方法是将整数加mod N,N是最大连接数。

3232235521 + 34829 + 1357226391 + 80 + 6 = 4589496827 mod 65536 = 10747

但这会与以下内容发生冲突:

3232235521 + 34818 + 1357226391 + 80 + 17 = 4589496827 mod 65536 = 10747

这样做会更好吗?

3232235521 ⊕ 34829 ⊕ 1357226391 ⊕ 80 ⊕ 6 mod 65536

只需确保以下TCP连接是不可能的,因为源端口80不可用,因为该端口已在该主机上处于侦听模式?

80.229.161.151:80 ->192.168.0.1:34829
(1357226391, 80, 3232235521, 34829, 6)

我可以使用toeplitz哈希还是仅用于对CPU核心的数据包进行负载平衡?

1 个答案:

答案 0 :(得分:2)

您可以将输入连接为字符串,然后使用任何常用的哈希函数(例如SHA-1),该函数速度很快(在现代PC上,每秒约有10-3000万个哈希)。您可以将值连接为字节而不是字符串,但这并不重要(例如,对于SHA-1,56字节以下的任何内容都是一个块)。

如果计算资源有限并且需要更高的速度,则可以使用CRC32或类似xxHash或MurmurHash的东西。一些现代的CPU支持crc32c指令,然后每个内核每秒的吞吐量高达10亿哈希。

您也可以使用Toeplitz哈希,但是它确实很原始,而且发生冲突的可能性更高。