- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第章 Linux内核中网络部分Linux网络编程
第16章 Linux内核中网络部分结构以及分布
第5~15章介绍了Linux环境下的用户层网络编程知识,基本上可以满足应用程序开发的需要。从本章开始,第16章和第17章将介绍Linux内核层网络架构,主要介绍如何基于netfileter框架在Linux的内核层挂接自己的网络数据处理函数,对内核层网络数据进行过滤。本章介绍内核层网络架构的基本知识,主要包括以下内容。
内核中网络相关代码的基本情况:内核层的网络代码分布情况,内核层的网络处理流程,内核层提供的用户处理网络数据的可插入点,内核层的数据结构及编程框架等处理内核层网络数据的基本技术;
简单介绍netfilter框架;
介绍Iptables,如何使用Iptables控制netfilter;
内核层的软中断报文队列处理方式;
中断处理下半部的要点和方式;
与一个socket有关的数据如何在内核层处理。
16.1 概 述
Linux网络协议栈的实现在内核代码中,了解Linux内核的网络部分代码有助于深刻理解网络编程的概念。Linux内核层还提供了网络防火墙的框架netfilter,基于netfilter框架编写网络过滤程序是Linux环境下内核层网络处理的常用方法。
16.1.1 代码目录分布
Linux的内核源代码可以从/pub/Linux/kernel/网站上下载,本书使用Linux-版本(可能不是最新版本,读者可以去下载最新的版本),其代码目录结构参见图16.1。
Documentation:这个目录下面没有内核的代码,有一套有用的内核文档。其中的文档质量良莠不齐,有很多内核文档的质量很优秀并且相当完整,例如文件系统;但是有的则完全没有文档,例如进程调度。在这个目录里不时可以发现有用的 东西。
图16.1 Linux内核的源代码结构
arch:此目录下的所有子目录的东西都是体系结构特有的代码。每个体系结构特有的目录下面至少包含3个子目录:kernel,不同体系结构内核特有的实现方式,如信号量、计时器、SMP等;lib,不同体系结构下的高性能通用代码实现,如memcpy等;mm,不同体系结构特有的内存管理程序的实现。
drivers:内核的驱动程序代码。此部分的代码占内核代码的大部分,包括显卡、网卡、PCI等外围设备的驱动代码。
fs:文件系统代码。包含ext2、ext3等本地文件系统,CD-ROM、isofs等镜像系统,还有NFS等网络文件系统,以及proc等伪文件系统。
include:此目录中包含了Linux内核中的大部分头(*.h)文件。
init:内核初始化过程的代码。
ipc:进程间通信代码。
kernel:这部分是Linux内核中最重要的,包含了内核中平台无关的基本功能,主要包含进程创建、销毁和调度的代码。
lib:此目录中主要包含内核中其他模块使用的通用函数和内核自解压的函数。
mm:此目录中的代码实现了平台无关的内存管理代码。
scripts:此目录下是内核配置时使用的脚本,当使用make menuconfig或者make xconfig命令时,会调用此部分代码。
net:此目录中包含Linux内核的网络协议栈的代码。在子目录netfilter下为netfilter的实现代码,netfilter构建了一个框架,允许在不重新编译内核的情况下,编写可加载内核,在指定的地方插入回调函数,以用户自己的方式处理网络数据。子目录ipv4和ipv6为TCP/IP协议栈的IPv4和IPv6的实现,主要包含了TCP、UDP、IP协议的代码,还有ARP协议、ICMP协议、IGMP协议、netfilter的TCP/IP实现等代码实现,以及如proc、ioctl等控制相关的代码。本书的重点集中在这个目录中的相关技术。
图16.2所示是源代码组织的另一种表现形式,它映射到Linux代码的3个内核层。
图16.2 映射到Linux代码的3个内核层的源代码组织
如图16.2所示,以太网相关的为本书涉及的部分,其他(例如SLIP、IRDA等)部分是为了比较而用。
16.1.2 内核中网络部分流程简介
网络协议栈是由若干个层组成的,网络数据的流程主要是指在协议栈的各个层之间的传递。在第7.2节里介绍了TCP网络编程的流程,一个TCP服务器的流程按照建立socket(),绑定(bind())地址端口,侦听端口listen(),接收连接accept(),发送数据send(),接收数据recv(),关闭socket()的顺序来进行。与此对应内核的处理过程也是按照此顺序进行的,网络数据在内核中的处理过程主要是在网卡和协议栈之间进行:从网卡接收数据,交给协议栈处理;协议栈将需要发送的数据通过网络发出去。
图16.3总结了各层间在网络输入输出时的层间调用关系。由图中可以看
文档评论(0)