摘要:对于普通的网络应用程序Linux可以通过用户层网络编程实现,但是对于一些特殊要求用户层网络编程无法实现,必须通过内核层网络编程。Filter机制和sk_buff网络数据包内存操作机制。通过将三种机制结合起来可以实现对流经本地主机的网络数据包的各种操作。
关键词:Linux;Filter;sk_buff
中图分类号:B82文献标识码:A文章编号:1674-7712 (2014) 08-0000-01
Linux网络编程包括用户层网络编程和内核层网络编程,对于普通的网络应用程序可以通过用户层网络编程实现,但是对于一些特殊要求用户层网络编程无法实现linux内核网络编程linux内核网络编程,必须通过内核层网络编程。Linux内核为实现内核网络编程在内核可加载模块机制的基础上,Filter机制和sk_buff网络数据包内存操作机制。Filter框架的检查点上linux系统装win7,从而实现对流经本地主机的网络数据包的各种操作。
一、Linux内核可加载模块编程
Linux操作系统可以分为用户空间和内核空间,在内核空间编写程序和在用户空间编写程序有很大的区别[11]。典型的用户空间应用程序有一个main()函数作为函数执行的入口点,而内核程序需要一个初始化函数和一个清理函数,在向内核空间插入模块时调用初始化函数,卸载模块时调用清理函数。Linux内核编程通常用可加载模块的方式,与直接编译内核相比可加载内核模块的方便性表现在不用重新编译内核、可动态加载卸载和便于调试。
内核模块编程的基本架构包括五部分:初始化函数、清除函数、描述信息声明、可导出符号表和加载模块,其中初始化函数和清除函数是不可或缺的部分。初始化函数在使用insmod命令的时候自动调用进行模块的初始化,主要是资源申请。清除函数在使用rmmod命令的时候自动调用进行模块退出之前的清理工作,主要是状态重置和资源释放。描述信息声明用来描述模块许可证声明、作者、用途、版本号、别名等信息。可导出符号表与用户空间编程时的库类似,内核模块中也可以调用其他模块中的函数或例程,或者允许其他模块调用本模块中的函数。导出的符号必须在文件的全局可见,不能将局部的符号导出。需要导出的变量要在函数体外进行声明,不需要导出的变量和函数等内核符号可以用static进行声明从而对内核的安全性有一定的保证。用户空间的应用函数可以接受用户的参数,Linux内核模块在加载的时候也可以通过加载参数部分来加载参数。在内核模块函数中可以调用printk()函数,然后通过dmesg命令查看内核输出日志文件便于调试。
二、Linux内核网络编程
Linux网络编程分为用户层网络编程和内核层网络编程。用户层网络编程即为套接字编程。套接字编程又分为标准套接字编程和原始套接字编程,标准套接字包括流式套接字和数据报套接字,其涵盖了一般应用层次的TCP/IP应用,几乎所有的应用程序都可以使用这两类套接字来实现。但是当要发送自定义的IP包时,或者监听网络上的数据包时,以及实现自定义的协议时,标准套接字无法实现需要使用原始套接字linux伊甸园论坛,原始套接字主要应用在底层网络编程。Filter。Filter框架可以在内核层对进出主机的网络数据包进行监听、捕获、修改等所有操作,可以实现防火墙、VPN、NAT、信息加密解密等。
现行实际网络协议簇标准是TCP/IP