IP包进入主机后的处理过程

1429阅读 0评论2012-08-17 platinaluo
分类:

   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可以参考这个过程
 
   
 
 
   
上一篇:epoll_create, epoll_ctl和epoll_wait 实例讲解
下一篇:MySQL拾遗