netfilter数据结构设计的艺术

netfilter较以前的ipchains提升了一个层次,在ipchains的东西中抽象出来共性的东 西然后形成了一个框架,从ipchains到netfilter的发展展现了软件发展的数据不断抽象的过程,也正是《重构》一书中讲的精髓。 netfilter不再为具体的过滤服务,而是提供了一个过滤模板,用户不再需要重新设计具体的过滤过程,而只需要填充这个模板就可以了,也就是说 netfilter只提供了机制,而策略需要用户空间的iptables程序来设置,然后在netfilter的框架机制上运行,这十分符合linux的 设计哲学,这个意义上,ipchains注定要被赶出去的,正如khttpd注定出局一样。netfilter框架中从低到高有几个概念:表 (table),链(chain),规则--匹配(match)/目标(target),一个表有若干条链,一条链有若干个规则,其中table和 chain作为底层的支撑提供运行机制,而规则(match/target)就是用户的策略,要iptables实用程序设置。因为框架主要提供过滤机制,因此这个框架就叫做netfilter,而这个框架最底层的是table,所以它的策略程序就叫做iptables,下面就开始扯netfilter 的更深层的意义。 

如果第一次看netfilter,那么肯定很多人都会被它的数据结构搞晕,因为在整个内核中,它几乎就是一个另类,c语言明明提供了struct和很多的 数据类型,而且linux的内核内存管理框架也提供了很多的机制,比如slab等等,但是netfilter似乎对这些并不感冒,它竟然自己实现了自己数 据结构的独特管理方式,包括数据结构设计,字段生成,数据定位以及修改。很容易迷惑的地方就是table,match,target的组织形式,这个和 linux路由表的组织类似但是更复杂,不是数据结构更复杂,而是数据结构的组织方式更复杂,如果在用户空间,那么你可以随意设计很多的数据结构,完全按照自己的设计意愿做出各种数据结构,然后用指针将它们按照自己的设计意愿组合在一起,因为用户空间的程序不必过于考虑效率问题和别的什么问题,那些都是标 准库或者操作系统的事,用户程序只要考虑应用本身就可以了,但是到了内核就不可以了,内核是机制的实现,很多用户或者库可以推掉的事情必须由内核来承担,比如用户程序可以不考虑内存的管理甚至不用管内存泄露,但是库必须要为用户程序擦屁股,如果库也不管,那么内核必须提供这样功能,起码要提供一个好的动态 内存管理接口以便库甚至应用程序自己可以更容易的实现一个,也就是说,底层的尽量惯着上层的,包括为之提供好的机制,为之实现错误检测,实在超越了自己的设计边界,那才由应用程序自己承担,这是一个强大的操作系统必须做到的。对于性能,这是操作系统必须要考虑的,因为绝对不允许在操作系统内核内部浪费哪怕 几个时钟周期,因为内核只是一个服务者,这个要求就好比饭店的服务员尽量不要比客户多一样。正是因为如此,netfilter的设计即体现用户应用策略但 是却又在内核实现才显得与众不同。 



 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1273648

上一篇:Elasticsearch结构化搜索_在案例中实战使用term filter来搜索数据


下一篇:Midway Serverless 能力介绍与设计分析