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