连接计数的变化

本文档的Copyleft归yfydz所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,
严禁用于任何商业用途。
msn: yfydz_no1@hotmail.com
来源:http://yfydz.cublog.cn

1. 前言

连接(ip_conntrack)的计数是很重要的, 用来表示正在使用该连接的用户的数量, 当计数为0时, 将
释放该连接的内存, 本文讨论一下连接计数的变化情况。

内核代码版本2.6.19.2.

2. 初始化

在连接分配函数中计数初始化为1.

/* net/ipv4/netfilter/ip_conntrack_core.c */

struct ip_conntrack *ip_conntrack_alloc(struct ip_conntrack_tuple *orig,
struct ip_conntrack_tuple *repl)
{
......
atomic_set(&conntrack->ct_general.use, 1);
......
}

3. 计数增加1

调用以下函数时会增加连接的计数:
/* net/ipv4/netfilter/ip_conntrack_core.c */
struct ip_conntrack_tuple_hash *
ip_conntrack_find_get(const struct ip_conntrack_tuple *tuple,
const struct ip_conntrack *ignored_conntrack)

int
__ip_conntrack_confirm(struct sk_buff **pskb)

static inline void nf_conntrack_get(struct nf_conntrack *nfct)

以下两个函数也会增加计数, 不过在函数出口处就会调用ip_conntrack_put()函数减少计数, 因此实
际不改变连接计数:
static int early_drop(struct list_head *chain)

static struct ip_conntrack *
get_next_corpse(int (*iter)(struct ip_conntrack *i, void *data),
void *data, unsigned int *bucket)


4. 计数减少1

最常见的减少计数是:
static inline void
ip_conntrack_put(struct ip_conntrack *ct)

实际该函数直接调用了
static inline void nf_conntrack_put(struct nf_conntrack *nfct)

而在释放skb数据包函数中也会减少连接计数:
void __kfree_skb(struct sk_buff *skb)

5. 变化情况总结

当一个数据包进入时, 如果是新连接, 会在ip_conntrack_alloc()函数中将连接计数初始化为1, 如
果是已建连接的后续包, 会通过ip_conntrack_find_get()函数将数据包和连接联系起来, 并增加连
接; 然后进入规则处理, 如果丢包, 会最终调用__kfree_skb()函数减少连接计数, 而如果顺利通过,
会在出netfilter架构前调用__ip_conntrack_confirm(), 如果是新包, 会继续增加计数(此时计数至
少为2), 而已连接包则不会再增加计数;数据包出netfilter架构后, 正常发出后, 数据包本身也被
释放, 连接计数再减1, 这样如果没有数据包附着于该连接, 该连接的计数将剩1, 等连接超时后, 调
用death_by_timeout()函数, 其中调用了ip_conntrack_put()减少连接计数, 此时连接计数为0, 将
调用destroy_conntrack()函数释放连接的资源。注意,ip_conntrack_get()函数不影响计数。

发表于: 2008-01-05,修改于: 2008-01-05 22:09,已浏览2410次,有评论1条 推荐 投诉
网友: xiaosuo 时间:2008-01-06 15:05:49 IP地址:221.238.129.★


ip_conntrack_get不增加引用计数确实是挺奇怪的,奈何历史原因,也许以后会改变,变得更加统一些,xx_get增加计数,xx_put减少计数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值