- 论坛徽章:
- 0
|
Netfilter的连接跟踪表,是通过一个hash表来维护的,其首先把一个数据包根据来源/端口/协议转换成一个"tuple",然后根据这个"tuple"来计算hash值:
- static u_int32_t
- hash_conntrack(const struct ip_conntrack_tuple *tuple)
- {
- #if 0
- dump_tuple(tuple);
- #endif
- return (jhash_3words(tuple->src.ip,
- (tuple->dst.ip ^ tuple->dst.protonum),
- (tuple->src.u.all | (tuple->dst.u.all << 16)),
- ip_conntrack_hash_rnd) % ip_conntrack_htable_size);
- }
复制代码
其中ip_conntrack_hash_rnd是一个通过get_random_bytes函数产生的四字节的随机数,ip_conntrack_htable_size是hash表的大小。
- static inline u32 jhash_3words(u32 a, u32 b, u32 c, u32 initval)
- {
- a += JHASH_GOLDEN_RATIO;
- b += JHASH_GOLDEN_RATIO;
- c += initval;
- __jhash_mix(a, b, c);
- return c;
- }
复制代码
__jhash_mix宏定义如下:
- /* NOTE: Arguments are modified. */
- #define __jhash_mix(a, b, c) \
- { \
- a -= b; a -= c; a ^= (c>>13); \
- b -= c; b -= a; b ^= (a<<8); \
- c -= a; c -= b; c ^= (b>>13); \
- a -= b; a -= c; a ^= (c>>12); \
- b -= c; b -= a; b ^= (a<<16); \
- c -= a; c -= b; c ^= (b>>5); \
- a -= b; a -= c; a ^= (c>>3); \
- b -= c; b -= a; b ^= (a<<10); \
- c -= a; c -= b; c ^= (b>>15); \
- }
复制代码
宏JHASH_GOLDEN_RATIO 定义如下:
- /* The golden ration: an arbitrary value */
- #define JHASH_GOLDEN_RATIO 0x9e3779b9
复制代码
这个hash算法看了个半懂,请哪位大哥分析一下这个算法,说说这样设计的好处,呵呵!! |
|