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可以参考这个过程
阅读(2631) | 评论(0) | 转发(1) |