您的位置:首页 > 理论基础 > 计算机网络

Linux2.4系列内核对于网络数据的处理

2010-11-10 22:04 302 查看
为了更好的了解Netfilter的工作机理,非常有必要先来分析一下Linux2.4系列内核对于网络数据是如何处理的。以下的分析全部基于以太网和IPv4协议。
1 收到数据,中断发生
通常的,当一块网卡接收到属于其自己MAC地址或者广播的以太网络数据帧时,就会引发一个中断,网卡驱动的中断处理程序获得机会,通过I/O,DMA复制网络帧数据到内存中。然后网络驱动程序将创建一个skb结构,将网络帧数据填充,设置时间戳,区分类型后,将skb送入对应的包接收队列(其实就是添加到系统中的一个双向链表中)。在新的2.4内核中,通过软中断(softirq)方式实现将数据包从队列中提取,传递到协议处理堆栈。和以前2.2/2.0 内核采用方式相比,软中断方式的最大的优点是支持针对多处理器的优化。在这里,网卡驱动的中断处理程序将调用 include/linux/interrupt.h:__cpu_raise_softirq()发起一个软中断,然后完成使命,退出。
2 数据接收软中断
内核调用kernel/softirq.c:do_softirq()执行数据包接收软中断(NET_RX_SOFTIRQ),将skb从CPU的接收队列中取出来,交给对应IPv4协议处理程序。协议处理程序将对传入的数据包进行一些完整性监测,如果监测失败,则将数据包丢弃。通过完整性监测以后,将进行一些必要的清理操作,去掉可能多余的填充数据,并且重新计算数据包的长度。接下来,数据包将进入Netfilter的第一个HOOK函数 NF_IP_INPUT的控制范围。从Hook函数出来以后,程序流程将转移到net/ipv4/ipv_input.c:ip_rcv_finish (),进行数据包的目的地址的判断,送给路由选择程序,决定数据包是(1)送往本地的应用进程(ip_local_deliver);(2)转发到其他主机(ip_forward);(3)多播转发(ip_mr_input);(4)错误,丢弃(ip_error)。
3 数据转发
我们来看那些需要转发的数据包。
对于数据包的转发工作,将由net/ipv4/ip_forward.c:ip_forward()来完成。首先检查IP包的TTL,如果小于0,则丢弃之,并且向源主机发送TTL超时错的ICMP包,否则,将TTL减1。然后比较包大小和目标网络接口的MTU,如果IP包标记不允许分包,则丢弃该数据包,并向源主机发送ICMP包,告知数据需要分包。接下来是Netfilter要处理的另一个HOOK地点:NF_IP_FORWARD Hook。如果我们在iptables规则中跳转到ACCEPT,则这里的HOOK将返回NF_ACCEPT,于是数据包将会顺利的通过 ip_forward_finish(),准备发送到另外的网络。而数据包在最终发送之前,将会落入Netfilter的第三个Hook陷阱,那就是 NF_IP_POST_ROUTING,满足规则的数据包最终被送入网卡驱动程序发送到另外的网络。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: