`

连接计数的变化

阅读更多
本文档的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减少计数。


分享到:
评论

相关推荐

    FDC2214-纸张计数装置完整代码 后端cstm32f103zet6使用IIC与FDC2214电容传感模块连接,获取被测纸张厚

    FDC2214_纸张计数装置完整代码 后端cstm32f103zet6使用IIC与FDC2214电容传感模块连接,获取被测纸张厚度变化的数值,通过查表法计算纸张数量,发送给串口屏显示,具有自校准,无纸提示.zip

    FDC2214_纸张计数装置完整代码

    stm32f103zet6使用IIC与FDC2214电容传感模块连接,获取被测纸张厚度变化的数值,通过查表法计算纸张数量,发送给串口屏显示,具有自校准,无纸提示,自校准后能准确测量1到82张A4纸,彩色卡纸也可以,人民币也可以,...

    数字逻辑与数字电路实验.rar

    (4) 实验内容2:使用VerilogHDL语言设计一个模16计数器,含计数使能端(en)与异步清零端(clr),当en为高电平时开始计数,为低电平时停止计数,将计数器与7段数码显示译码器使用原理图进行连接,并仿真及下载。...

    TCP_IP详解卷1

    18.7.1 到不存在的端口的连接请求 187 18.7.2 异常终止一个连接 187 18.7.3 检测半打开连接 188 18.8 同时打开 189 18.9 同时关闭 191 18.10 TCP选项 191 18.11 TCP服务器的设计 192 18.11.1 TCP服务器端口号 193 ...

    数字频率计电路设计与分析.pdf

    将信号的正负变化次数计数,并且计数时间控制为1S即为频率计,本设计将定时器(定时为1S),计数器、显示器等主要部件连接起来,

    6sense:在保护隐私的同时对设备进行计数

    该软件在设计时考虑了隐私,因为只能输出一系列信号电平和每天都在变化的不可追踪的ID。如何安装npm install 6sense先决条件是 具有监控功能的wifi接口。快速开始6sense每个部分基本上都是连接加密狗的有限状态机。...

    基于单片机的频率计数器课程设计.doc

    2.1.2 状态译码器(74LS138) 图3 74LS138译码器 74LS138译码器输出的状态控制数码管的亮与灭,它有6个状态,连接到数码管的位选, 达到点亮数码管点亮的要求。 2.1.3 数据显示电路 图4 显示电路图 数据显示电路由...

    网上书城(被评为本科毕业论文)

    最关键的是 这个系统在你的电脑上可以运行起来,...这里面有好多工具如:编辑工具,时间工具,在线计数,统计访问量,在线聊天,购物车,图片切换,变化这个网页的背景......等等,如果你是初学者这个东西是值得的。

    双复头铆钉组装设备.rar

    实现了设备自动化控制——缺料检测、自动计数、镦压异常、不合格品分离(头部厚度尺寸、钉脚于头部同心度变化产生不合格)等检测控制;实现了车间数字化生产控制——以40台设备为一个组,可通过一台终端(上位机)与...

    摇一摇统计系统-基于51单片机-上海大学微机原理课程项目-使用汇编语言-包括课程项目报告和代码-Keil、Proteus

    摇动提供的水银开关,通过水银与导线的接触与断开实现高低电平转换(利用延时进行去抖),然后我们是通过利用电平转换触发中断,跳转到中断程序进行计数值加一,用来实现计数,然后每当计数值发生变化(即又摇了一...

    电子发声设计实验(2).doc

    首先确 定单位延时时间程序(根据CPU的频率不同而有所变化)。然后确定每个音符演奏需要几 个单位时间,将这个值送入DL中,调用DALLY子程序即可。 下面提供了乐曲《友谊地久天长》实验参考程序。 频率表和时间表是...

    电子发声设计实验.doc

    首先确 定单位延时时间程序(根据CPU的频率不同而有所变化)。然后确定每个音符演奏需要几 个单位时间,将这个值送入DL中,调用DALLY子程序即可。 下面提供了乐曲《友谊地久天长》实验参考程序。 频率表和时间表是...

    STM32单片机人流量检测器设计程序代码.zip

    实物方面:在最小系统板用杜邦线连接各个模块进行调试,逐个编写代码测试没问题,就将代码组合起来。系统开机整个进行初始化:有io口、串口、OLED驱动、ds1302驱动、按键引脚等。先读取ds1302的实时时间,显示出来。...

    角度位移传感器工作原理及实际应用解析

    角度位移传感器是利用角度变化来定位物体位置的电子元件。适用于汽车,工程机械,宇宙装置、飞机雷达天线的伺服系统以及注塑机,木工机械,印刷机,电子尺,机器人,工程监测,电脑控制运动器械等需要测量位移的场合...

    单片机频率计数器课程设计.doc

    由于要尽可能的使用最少的元件,在满足设计要求的前提下,我将P1.7口与P3.4口( 即T0)用导线连接,在设定程序时,利用T1定时的同时在P1.7口输出一个设定好的方波 ,以便直观的检测频率计数器的软件、硬件是否达到...

    课程设计数字电子闹钟.doc

    控制十位的3- 8译码器的A1,A0一起控制十位从0-2变化。 4、完整的闹钟电路图(ewb设计图) 四、电路安装及调试 电路安装要求 1.布局合理 2.导线横平竖直,且不要从集成块上跳线 3.导线紧贴面包板,连接可靠 4.交叉线...

    角度位移传感器实际应用及工作原理解析

    角度位移传感器是利用角度变化来定位物体位置的电子元件。适用于汽车,工程机械,宇宙装置、飞机雷达天线的伺服系统以及注塑机,木工机械,印刷机,电子尺,机器人,工程监测,电脑控制运动器械等需要测量位移的场合...

    单片机简易频率计课程设计.doc

    本系统采用测量频率法,可将频率脉冲直接连接到AT89C51的T0端,将T/C1用做定时 器。T/C0用做计数器。在T/C1定时的时间里,对频率脉冲进行计数。在1S定时内所计脉 冲数即是该脉冲的频率。见图1: 图1测量时序图 由于...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    说明:用于连接到oracle数据库,也可实现用户的切换 用法:conn 用户名/密码 [as sysdba/sysoper] 注意:当用特权用户连接时,必须带上sysdba或sysoper 例子: 3. 断开连接(disc) 说明:断开与当前数据库的连接 ...

    实用文库汇编之单片机简易频率计课程设计.doc

    本系统采用测量频率法,可将频率脉冲直接连接到AT89C51的T0端,将T/C1用做定时 器。T/C0用做计数器。在T/C1定时的时间里,对频率脉冲进行计数。在1S定时内所计脉 冲数即是该脉冲的频率。见图1: 图1测量时序图 由于...

Global site tag (gtag.js) - Google Analytics