Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1405311
  • 博文数量: 277
  • 博客积分: 2551
  • 博客等级: 少校
  • 技术积分: 3918
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-21 22:46
文章分类

全部博文(277)

文章存档

2017年(3)

2016年(9)

2015年(65)

2014年(27)

2013年(85)

2012年(61)

2011年(27)

分类: 网络与安全

2011-08-07 22:19:47

   IP包在内核中的netfilter处理大致可以分为5个部分:
   1>NF_IP_LOCAL_IN
   2>NF_IP_LOCAL_OUT
   3>NF_IP_PRE_ROUTING
   4>NF_IP_FORWARD
   5>NF_IP_POST_ROUTING
 
   其实它们在内核中表现为钩子函数,也可叫netfilter。
   
   数据包到达网卡时,通过DMA方式将其转移至rx_ring,然后发出Recv Interrupt。在中断的ISR code中,将数据从网卡rx_ring缓冲区转移到backlog queue (per cpu have one)通过netif_rx(或者是NAPI netif_rx_schedule),然后启动软中断(或者微任务),交给后续的流程处理,如ip_recv。
 
   NF_IP_PRE_ROUTING也就是在ip_recv之后,ip_rcv_finish之前。
   在ip_rcv_finish中会分析包是否是给本机的,从而决定走不同的流程。如果是给本机的,就通过    ip_lcoal_delivery进入了NF_IP_LOCAL_IN, NF_IP_LOCAL_IN的结束处,通过ip_local_deliver_finish
 做出判断传递给不同的传输层协议处理;如果不是给本机的,就要查找路由表FIB了,这时候路由规则就起作用了。通过分析路由规则,找到下一跳,就进入ip_forward了,在到达ip_forward_finish之前会调用NF_IP_FORWARD。ip_forward_finish结束时,会调用ip_output,这里会有IP fragment的问题要处理,
处理完后也就是ip_output_finish了,它会调用NF_IP_POST_ROUTING netfilter,结束时调用ip_finish_output2将包提交给邻居子系统,之后再给流量控制子系统。
 
   至于NF_IP_LOCAL_OUT的netfilter是在传输层将数据包给ip_output_mc/ip_output之前要走的流程。
 
   ALG可以参考这个过程
 
   
 
 
   
阅读(2653) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~