Linux路由实现机制分析

合集下载

路由永久生效的5种方法及生效的优先级。

路由永久生效的5种方法及生效的优先级。

路由永久生效的5种方法及设置完毕后生效的优先级。

目的:为了在linux系统中设定路由方法一:找到/etc/rc.local (开机自动启动)推荐使用!使用vi编辑增加route add -net 192.168.3.0/24 dev eth0route add -net 192.168.2.0/24 gw 192.168.1.1注:/24 即是netmask 255.255.255.0 这是一个C类地址的子掩码/16 即是netmask 255.255.0.0 这是一个B类地址的子掩码/8 即是netmask 255.0.0.0 这是一个A类地址的子掩码重启电脑后方法二:切换到网络配置目录下/etc/sysconfig/network-scripts/ 推荐使用!使用vi编辑新建文档在这之前需要确认默认网口是否是eth0也可以分别为不同的网口配置不同的路由。

[root@mercyfu ~]# vi route-eth0192.168.7.0/24 via 192.168.1.1192.168.8.0/24 via 192.168.1.1:wq[root@mercyfu ~]#serviece network restart方法三:开启IP转发[root@mercyfu ~]#vi /etc/sysctl.conf--> net.ipv4.ip_forward=1 (永久开启)(设置后重启网络服务无反应,原因是:在打开内核IP转发功能后,我们就该为我们所假设的网络添加路由功能了。

在Linux变成路由功能,两种方法来实现,一种是通过IPTABLES工具的NAT转发功能,一种是使用IPROUTER2工具集中的IP ROUTE命令子集来实现。

这两种方法各有优缺点,使用哪种方法,主要看你所在的网络使用哪种方法连接互联网。

IPTABLES工具适合动态IP地址以及固定公网IP地址方式,同时,还提供了网络地址转换功能,此功能不仅能使使用私有IP地址的内网PC连接上互联网,而且还提供外网能过DNAT功能访问处于内网中的各种网络服务,以用隐藏内容IP网络段,增加了安全性。

openwrt nat代码-概述说明以及解释

openwrt nat代码-概述说明以及解释

openwrt nat代码-概述说明以及解释1.引言1.1 概述在计算机网络领域中,网络地址转换(Network Address Translation,简称NAT)是一种常见的网络技术,用于解决IP地址不足的问题以及增强网络安全性。

NAT的主要作用是将内部网络中的私有IP地址转换为公共IP地址,从而实现内网与外网之间的通信。

OpenWrt是一个基于Linux的开源操作系统,专注于嵌入式设备和路由器。

作为一个自由、可定制的操作系统,OpenWrt提供了丰富的功能和灵活的配置方式,能够满足各种网络环境的需求。

本文将重点探讨OpenWrt中的NAT实现,包括其概念和原理。

我们将深入了解NAT的工作原理以及在OpenWrt系统中的具体实现方式。

通过研究和分析OpenWrt NAT代码,我们将探讨其设计思路和关键功能,并对未来的发展进行展望。

通过阅读本文,读者将能够更好地理解NAT在网络中的重要性以及在OpenWrt系统中的应用。

同时,本文也将为开发者提供参考,帮助他们更好地理解和使用OpenWrt NAT代码,进一步发展和优化网络技术。

1.2文章结构文章结构部分是文中的一个小节,主要介绍了整篇文章的组织结构和内容安排。

下面是一个可能的编写内容:1.2 文章结构本文将按照以下结构进行组织:1. 引言:介绍文章的背景和目的,概述NAT的重要性以及OpenWrt NAT代码的意义。

2. 正文:2.1 NAT的概念和原理:详细介绍NAT的定义、工作原理和作用,包括地址转换、端口转换等内容。

2.2 OpenWrt中的NAT实现:讨论OpenWrt操作系统中NAT 的具体实现方式和相关代码的结构和功能。

3. 结论:3.1 总结NAT的重要性:总结NAT在网络通信中的作用和意义,强调其对于网络安全和资源有效利用的贡献。

3.2 对OpenWrt NAT代码的展望:探讨OpenWrt NAT代码的局限性和可改进之处,提出对未来开发的建议和展望。

linux内核kallsyms机制分析

linux内核kallsyms机制分析

linux内核kallsyms机制分析2016-07-24 15:59:41分类: LINUX原文地址:linux内核kallsyms机制分析作者:wangbaolin7191.一、前言2.Linux内核是一个整体结构,而模块是插入到内核中的插件。

尽管内核不是一个可安装模块,但为了方便起见,Linux把内核也看作一个模块。

那么模块与模块之间如何进行交互呢,一种常用的方法就是共享变量和函数。

但并不是模块中的每个变量和函数都能被共享,内核只把各个模块中主要的变量和函数放在一个特定的区段,这些变量和函数就统称为符号。

3.4.因此,内核也有一个module结构,叫做kernel_module。

另外,从kernel_module开始,所有已安装模块的module结构都链在一起成为一条链,内核中的全局变量module_list就指向这条链:5.struct module *module_list =&kernel_module;6.7.一般来说,内核只会导出由EXPORT_PARM宏指定的符号给模块使用。

为了使debugger提供更好的调试功能,需要使用kallsyms 工具为内核生成__kallsyms段数据,该段描述所有不处在堆栈上的内核符号。

这样debugger就能更好地解析内核符号,而不仅仅是内核指定导出的符号。

8.9.二、简介10.在v2.6.0 的内核中,为了更好地调试内核,引入新的功能kallsyms.kallsyms把内核用到的所有函数地址和名称连接进内核文件,当内核启动后,同时加载到内存中.当发生oops,例如在内核中访问空地址时,内核就会解析eip位于哪个函数中,并打印出形如:11.EIP is at cleanup_module+0xb/0x1d [client]的信息,12.调用栈也用可读的方式显示出来.13.Call Trace:14.[<c013096d>] sys_delete_module+0x191/0x1ce15.[<c02dd30a>] do_page_fault+0x189/0x51d16.[<c0102bc1>] syscall_call+0x7/0xb17.18.当然功能不仅仅于此,还可以查找某个函数例如的sys_fork 的地址,然后hook它,kprobe就是这么干的。

linux QOS(TC) 功能实现分析

linux QOS(TC) 功能实现分析

linux QOS 功能实现分析文档编号:00-6201-100当前版本:1.0.0.0创建日期:2008-7-24编写作者:wanghuaijialinux QOS 功能实现分析前言 (3)关于此文档 (3)参考资料 (3)Linux内核对QoS的支持 (5)对于入口数据包控制 (6)发送数据包的控制 (8)TC的具体设计与实现 (11)struct Qdisc_ops 说明 (15)LINUX 内核中安装策略对象过程 (17)前言关于此文档此文档是本人这段时间内学习QOS相关知识,总结并且整理出来的文档。

供大家参考。

本文档描述QOS相关知识,各章节说明如下:1前言,即此章节;2 QOS简介,介绍QOS基本知识、QOS提出的意义,以及QOS 的三种不同的服务模型;3:介绍QOS相关的技术,介绍了报文分类以及标记,拥塞管理技术,拥塞避免技术,以及流量整形和流量监管。

并且介绍了链路层相关的速度限制。

参考资料网络资源。

linux QOS 功能实现分析Linux内核对QoS的支持 (5)对于入口数据包控制 (6)发送数据包的控制 (8)TC的具体设计与实现 (11)struct Qdisc_ops 说明 (15)LINUX 内核中安装策略对象过程 (17)在传统的TCP/IP网络的路由器中,所有的IP数据包的传输都是采用FIFO(先进先出),尽最大努力传输的处理机制。

在早期网络数据量和关键业务数据不多的时候,并没有体现出非常大的缺点,路由器简单的把数据报丢弃来处理拥塞。

但是随着计算机网络的发展,数据量的急剧增长,以及多媒体,VOIP数据等对延时要求高的应用的增加。

路由器简单丢弃数据包的处理方法已经不再适合当前的网络。

单纯的增加网络带宽也不能从根本上解决问题。

所以网络的开发者们提出了服务质量的概念。

概括的说:就是针对各种不同需求,提供不同服务质量的网络服务功能。

提供QoS能力将是对未来IP网络的基本要求。

Linux信号机制解析

Linux信号机制解析
关键 词 : 号 ; 信 内核 ;n x l u i
中图分类号 :P 1 T 36
文献标识码 : A
文章编号 :0 9 34 (061一 15 O 10 — 042 0 )1O 一 2 1
An lzn h iu g a c a im ay igt e Ln xSin l Me h ns
要 分 支 B D 和 S s m V分 别 对 早期 的 信 号 进 行 了扩 展 ( 下 文 S yt e 见 信 号 的分类 ) 但 不 同 的 扩展 带 来 了兼 容 性 问题 , 。 因此 在 P SX 中 OI
(I _ F . SG D L) 在结束的地方又恢复 为原始处理方式。如果 在信号
维普资讯
电 脑 知 识 与 技 术
研 究 开 发 ,
Ln x iu 信号机制解析
张 威
( 济 大 学软 件 学院 , 海 2 10 ) 同 上 0 8 4 摘 要 : 析 了信 号机 制 的特 性 , 出 了早 期 信 号机 制 的 不 足 、 因 及 其 解 决 方 案 , 论 了不 可 靠 信 号 与 可 靠信 号 的 分 类 , 以 i8 分 指 原 讨 并 36平
台 为例 详 细 分析 了 l u 一 .. i x 2 2 本 标 准 内核 中信 号 机 制 的底 层 实现 , 要 包括 进 程 结 构 体 中 为 支持 信 号 机 制 而设 立 的 结 构 及 其 功 能 , n 4 0版 主
信 号 的 组 织 与 管理 , 号 的发 送 与 接 收 过 程 , 号 的检 测 与 处 理 过 程 , 信 信
对 信 号 机制 进 行 了标 准 化 。其 中 P Sx 1 定 了信 号 机 制 的 摹 本 0 I.规

Linux模块实现机制剖析

Linux模块实现机制剖析
ke el, an yz ei ad an ge a dis dv ta s. hen t al ed bo th mo s rn al ed th r v ta s nd a an ge T i t k a ut e ti ye of n o cti n j tr du o of Li u nx
Ke wo d : o o { h C K r e y r s M n l t { e n 1;M C O K r e : K r e M d 1 : K r e S m o T b e i F e n l e n 1 o u e e n l yb I a l
0 引言
传统的 U i及大部分类 U i 操作系统基本上都属于一 nx nx
中 国分 类 号 :T 3 P9 文 献 标 识 码 :A 文 章 编 号 :1 7 — 7 2 (0 62 0 0 — 2 4 9 一 2 0 )— 0 7 0 61
Ab ta t T i p p r m i l i c s e w p r t n y t m o g n z t o o e s s r c : h s a e a n y d s u s d t o o e a i g s s e r a i a i n m d 1 :m n l t { e n n c o o o { h C k r e1 a d mi r
体化内核组织方式,而 M c 、W n o s N 、W n o 0 0 ah idw T idw201 x 等基本属于微 内核组 织方 式 P

现 代操作系统从功能构成上来说 主要包 括进 程管理 、 内 存 管理 、文件管理 、 设备管理 以及 网络通信等几大模块 。 为
了支持构建安全操作系统, 现代c P 一般都提供了至少两种

Linux信号机制的分析与研究

Linux信号机制的分析与研究

科技资讯科技资讯S I N &T NOLOGY I NFORM TI O N2008N O .11SC I ENC E &TEC HN OLO GY I NFO RM ATI O NI T 技术1信号的概念信号是UN I X 进程间通信的一种标准方式,又称软中断信号(s i gna l ,又简称为信号),是一种简单的通讯方式,在Li nux 中也存在其它的进程间通信方式,但由于信号相对简单和有效,它们仍然被广泛使用。

信号主要用来通知进程发生了异步事件。

但信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据,收到信号的进程对各种信号有不同的处理方法,本文研究对象为内核2.4版。

2信号的类型及意义在Li nux 系统发出信号的原因很多,可以由系统内核、Shel l 中的Ki l l 命令和进程调用相关函数等三种方式来产生,系统内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件;进程之间可以互相通过系统调用发送软中断信号,主要分类如下:(1)与进程终止相关的信号。

当进程退出,或者子进程终止时,发出这类信号;(2)与进程例外事件相关的信号。

如进程越界,或企图写一个只读的内存区域(如程序正文区),或执行一个特权指令及其他各种硬件错误;(3)与在系统调用期间遇到不可恢复条件相关的信号。

如执行系统调用e x e c 时,原有资源已经释放,而目前系统资源又已经耗尽;(4)与执行系统调用时遇到非预测错误条件相关的信号。

如执行一个并不存在的系统调用;(5)在用户态下的进程发出的信号。

如进程调用系统调用ki l l 向其他进程发送信号;(6)与终端交互相关的信号。

如用户关闭一个终端,或按下b r e a k 键等情况;(7)跟踪进程执行的信号。

在Li n ux 中信号值已经进行了标准化,每一个信号都有一个名字,它以三个字母S I G 开头,对应于特定的事件。

具体的信号及意义如下(主要是指前32中不可靠信号,后32种为可靠信号):(1)SI GH UP:本信号在用户终端连接(正常或非正常)结束时发出,通常是在终端的控制进程结束时,通知同一内的各个作业,这时它们与控制终端不再关联;(2)SI G I N T 程序终止(i nt er r upt )信号,在用户键入I NT R 字符(通常是Ct r l -C)时发出;(3)SI GQUI T 和SI GI NT 类似,但由QUI T 字符(通常在t t y 键上按Ct r l -\)来控制。

Linux platform驱动架构实现机制研究与应用

Linux platform驱动架构实现机制研究与应用
_
Ln x26内核 开发了全新的设备模型. n x iu . I u 设备驱 动模 型 A 采用面 向对象的思想 设 备驱动模型核心层 p tr l f 的一个虚拟总线 , 于 p t r 基 lf m驱动架构驱动设计方式在新 ao 版 l u 内核中大量使用. ix n
内核 中的 实现 机 制 , T 40开发 板 为 测 试平 台 , 于 p t r 驱 动 架构 设 计 实现 了按 键 驱 动. 以 Q24 基 lf m ao 实验 表 明 , 方 法切 实 可行 , 此
驱 动 具 有较 好 植 移 性 和 安 全性 .
关 键词 :设 备 驱 动 模 型 :l om; s ; 键 驱 动 pa r s f 按 f t ys
1 设 备 驱 动 模型
s il c t l t lc ; p no k i o k s
_
_
sut kb c kb; le r oj t oj e
s u t k e uevent o s t c s t r p
_ _
u v n _o s e e t p ;
} ;
“n x 备 驱 动 模 型 是 为 了 系 统 地 管 理 所 有 没备 , u设 内核 通 过 kbet和 ke 底 层 数 据结 构 来实 现 基 本 对 象 及 其层 ojc s st s
U 通 过 总 线 、 备 、 备 驱 动 三个 核 心 组 件 实 现 设 备 模 型 . X 设 设
设 备驱动模 型底层主要涉及 kbet oj 内核对象 、 st c K e 内 核对象集合两个数据结构 . bet I u . 引入 的设 k j 是 A x2 o c n 6新
备 管 理 机 制 , 设 备 模 型 的核 心 结构 , 是 内核 中用 s tkb t o— mc

linux kdump 实现原理

linux kdump 实现原理

linux kdump 实现原理kdump是一种在Linux系统中实现内核转储(crash dump)的机制。

通过kdump,当系统发生严重错误导致宕机时,可以将当前内核的内存转储到硬盘中,以便开发人员对宕机时的内核状态进行分析和调试。

本文将介绍kdump的实现原理,包括其工作原理、内存镜像的生成和转储、以及kdump的配置和使用。

1. kdump的工作原理:kdump是通过利用Linux内核的kexec功能实现的。

kexec是一种Linux内核中的系统调用,可以直接启动一个新的内核镜像而无需重新引导硬件。

kdump利用kexec功能,在系统内核崩溃时,通过加载一个特殊的内核映像,再次启动一个小型的第二内核,这个第二内核称为crash内核。

2.内存镜像的生成和转储:在宕机之前,首先需要生成一个内存映像文件。

kdump通过使用原始内核的/proc/vmcore文件实现此目的。

当系统崩溃时,原始内核暂停所有正在运行的任务,然后通过kexec工具加载crash内核,并将crash内核的入口点和参数传递给它。

然后crash内核启动,将原始内核的物理内存转储到磁盘上的/proc/vmcore文件中。

这个过程叫做转储(crash dumping)。

3. kdump的配置和使用:在Linux系统中配置和使用kdump需要以下步骤:a.安装kexec-tools软件包:kexec-tools是一组用户空间工具,用于加载第二内核映像。

b.确保系统有足够的空闲内存:kdump需要一定数量的内存用于存储crash内核。

c.配置kdump内核参数:需要编辑/etc/default/kdump文件,设置crash内核的路径、内存大小、转储方式等参数。

d.配置grub文件并重启:需要编辑boot loader(如GRUB)的配置文件,启用kdump并设置重启后启动crash内核。

e.测试kdump:重启系统后,可以通过执行`sysctl -wkernel.panic_on_oops=1`命令来模拟系统崩溃并测试kdump的效果。

Linux系统下的网络配置与优化

Linux系统下的网络配置与优化

Linux系统下的网络配置与优化在今天的信息时代,网络已经成为人们生活和工作的基础设施之一。

而对于IT行业的从业者而言,网络的稳定性和速度也成为了评判一款产品是否优秀的标准之一。

在Linux系统下,正确的网络配置和优化不仅可以让网络更加稳定和快速,还能提高工作效率和用户体验。

本文将探讨Linux系统下的网络配置和优化,包括IP地址的配置、网络嗅探、路由和QoS等方面。

IP地址的配置在Linux系统下,IP地址的配置可以通过修改网络配置文件来实现。

网络配置文件主要保存在/etc/sysconfig/network-scripts/目录下。

在该目录下,每个网卡对应着一个配置文件,比如eth0对应着ifcfg-eth0文件。

可以通过修改该文件来修改网卡对应的IP地址、子网掩码、网关等参数。

除此之外,Linux系统也提供了命令行工具来设置IP地址。

其中,最基本的命令是ifconfig。

通过该命令可以查看目前网络接口的状态,包括MAC地址、IP地址、子网掩码、广播地址等信息。

而通过ifconfig命令也可以修改IP地址等参数,比如ifconfig eth0 192.168.1.100可以将eth0的IP地址设置为192.168.1.100。

网络嗅探网络嗅探是指在网络中捕获和分析数据包的过程。

在Linux系统中,最常用的嗅探工具是tcpdump和wireshark。

Tcpdump是控制台下的命令行工具,可以在命令行中直接使用。

比如tcpdump -i eth0可以捕获以太网卡eth0接口的数据包,并将其打印出来。

而通过tcpdump命令的各种选项,如-f、-s、-c等,还可以控制不同的嗅探行为。

而wireshark则是一款图形化嗅探工具。

它能够以图形化的方式展现捕获的数据包,并提供强大的过滤和分析功能。

wireshark可以捕获所有经过主机网卡的数据包,无论它们是进入还是离开。

路由路由是网络中连接不同子网的核心设备之一。

Linux实验总结分析报告

Linux实验总结分析报告

Linux实验总结分析报告SA20225405 苏俊杰作业要求:1、请您根据本课程所学内容总结梳理出⼀个精简的Linux系统概念模型,最⼤程度统摄整顿本课程及相关的知识信息,模型应该是逻辑上可以运转的、⾃洽的,并举例某⼀两个具体例⼦(⽐如读写⽂件、分配内存、使⽤I/O驱动某个硬件等)纳⼊模型中验证模型。

2、然后将⼀个应⽤程序放⼊该系统模型中系统性的梳理影响应⽤程序性能表现的因素,并说明原因。

3、产出要求是发表⼀篇博客⽂章,长度不限,1要简略,2是重点,只谈⾃⼰的思考和梳理。

1.精简的Linux系统概念模型Linux操作系统:通俗的操作系统主要是包含软件和硬件两部分统⼀运⾏的,并由操作系统来统⼀管理硬件的软件系统,⽽linux是⼀个基于POSIX的多⽤户、多任务、⽀持多线程和多CPU的操作系统。

Linux系统主要包含4个主要部分:内核、shell、⽂件系统和应⽤程序。

其中内核、shell和⽂件系统⼀起形成了基本的操作系统结构,它们使得⽤户可以运⾏程序、管理⽂件并使⽤系统。

Linux操作系统相对于其他操作系统的特点是万物皆可看做⽂件,⽆论是软件资源还是硬件资源都看做⽂件进⾏操作。

Linux操作系统被抽象为不同的层级和模块,如下图所⽰。

如果让我们把Linux系统再精简些,就是下图所⽰的模样:如图中所⽰,我们可以看到,内核直接与硬件打交道,并给上层应⽤提供系统调⽤,让他们间接的使⽤硬件资源。

shell似乎Linux系统中⽅便⼈机交互的界⾯软件,库函数不属于Linux内核,但是它封装了基本的功能供⼈使⽤,提⾼了编程效率。

2.进程管理进程管理是linux系统的核⼼部分,在Linux内核中⽤⼀个数据结构struct task_struct来描述进程,直接或间接提供了进程相关的所有信息。

struct task_struct的结构包括了进程的状态、进程双向链表的管理,以及控制台tty、⽂件系统fs的描述、进程打开⽂件的⽂件描述符files、内存管理的描述mm,还有进程间通信的信号signal的描述等内容。

Docker容器跨主机通信之:直接路由方式

Docker容器跨主机通信之:直接路由方式

Docker容器跨主机通信之:直接路由⽅式⼀、Docker⽹络基本原理直观上看,要实现⽹络通信,机器需要⾄少⼀个⽹络接⼝(物理接⼝或虚拟接⼝)与外界相通,并可以收发数据包;此外,如果不同⼦⽹之间要进⾏通信,需要额外的路由机制。

Docker中的⽹络接⼝默认都是虚拟的接⼝。

虚拟接⼝的最⼤优势就是转发效率极⾼。

这是因为Linux通过在内核中进⾏数据复制来实现虚拟接⼝之间的数据转发,即发送接⼝的发送缓存中的数据包将被直接复制到接收接⼝的接收缓存中,⽽⽆需通过外部物理⽹络设备进⾏交换。

对于本地系统和容器内系统来看,虚拟接⼝跟⼀个正常的以太⽹卡相⽐并⽆区别,只是它速度要快得多。

Docker容器⽹络就很好地利⽤了Linux虚拟⽹络技术,在本地主机和容器内分别创建⼀个虚拟接⼝,并让它们彼此连通(这样的⼀对接⼝叫做veth pair)。

⼀般情况下,Docker创建⼀个容器的时候,会具体执⾏如下操作:1.创建⼀对虚拟接⼝,分别放到本地主机和新容器的命名空间中;2.本地主机⼀端的虚拟接⼝连接到默认的docker0⽹桥或指定⽹桥上,并具有⼀个以veth开头的唯⼀名字,如veth1234;3.容器⼀端的虚拟接⼝将放到新创建的容器中,并修改名字作为eth0。

这个接⼝只在容器的命名空间可见;4.从⽹桥可⽤地址段中获取⼀个空闲地址分配给容器的eth0(例如172.17.0.2/16),并配置默认路由⽹关为docker0⽹卡的内部接⼝docker0的IP地址(例如172.17.42.1/16)。

完成这些之后,容器就可以使⽤它所能看到的eth0虚拟⽹卡来连接其他容器和访问外部⽹络。

⽤户也可以通过docker network命令来⼿动管理⽹络。

⼆、Docker⽹络默认模式按docker官⽅的说法,docker容器的⽹络有五种模式:1)bridge模式,--net=bridge(默认)这是dokcer⽹络的默认设置,为容器创建独⽴的⽹络命名空间,容器具有独⽴的⽹卡等所有单独的⽹络栈,是最常⽤的使⽤⽅式。

Linux模块实现机制分析

Linux模块实现机制分析
管理 、 内存管理 、 文件管理 、 设备管理以及 网络通信
模式下运行, 则称之为一体化组织, 图二所示。 见
等几 大模块 。为 了支持构建安全操作系统,现代 C U一般都提供 了至少两种运行模式: P 特权模式与 用户模式。 根据各个管理模块是否放在特权模式下, 操作系统有微内核和一体化 内核两种组织方式。如 果仅把必需的进程通信管理 、中断管理以及内存管 理放在特权模式下运行, 而把设备管理模块、 文件系
推。
新定位。同时在操作系统内核符号表 中加入此 内核
模块 中定义的函数符号及变量,以便 内核 中的其它
子系统能够获得这个刚链人其中的模块的服务。例
如 内核模 块 中 n 原 来 的相 对地 址 为 1 , 由于在 装 5
入地址是 30 故重定位地址应为 3 还有原来在 0, ; 1 5 内核模块 中不知道 f, 时由于装入 内存时知道 B 3这 的内核地址是 5, 2 所以也要做相应设置 , 同时在操
。号 { }
・恭 ・鱿 pI | ● 蛮
作系统全局符号表中增加 内核模块所定义的功能函 数及变量符号。整个插入 内核模块操作系统 内核映
象如 图五 所示 。 2 模 块 技术分 析
Lu i x中超级 用户可 以通过 i m d和 r mo n n o s m d 图三 初始系统 内核映象 类似地, 图四是一个 内核模块映象, 其中除了程 命令显式地将模块载人核心或从核心 中将它卸载 。
_
结构用来将模块动态链接进核心,这是一个重要的 数据结构,主要记录两方面的信息:模块提供的函
数 、 量和 引用信 息 。前者 用于 核心 同模 块 的通 信 , 变
后者记录本模块引用其它模块的情况。两个结构间 通过由 mou 指 向它对应 的 s b l al 指针来 dl e y ot e m _b

Linux下IGMP以及多播路由分析

Linux下IGMP以及多播路由分析

Linux下IGMP以及多播路由分析(转载)最近在做多播这块,顺带研究了一下Linux Kernel对IGMPv3以及多播路由的支持.先简单介绍IGMPv3,一个网络协议总的说来无非多是"一问,一答",当然也有主动的去"报告",IGMPv3也不例外.1.看过IGMPv2以及v1的人会奇怪为什么要v3,v3能带来些什么?1>.IGMPv2/v1是典型的接受任意源多播(Any-Source Multicast)[ASM],即它只是关注多播组,而不关注是谁发送的,这样会有一些问题,比如说,假如一个局域网存在一个多播视频服务器,其它Host在上面点播视频;假如出现一个伪装者,也向这个多播组发送干扰数据,但Host无法辨别,这样可能引起视频的接受断断续续,影响服务的提供,显然这不是很理想;而IGMPv3的提出,就是为了解决这个问题,它提出了源特定多播(Source-Specific Multicast)[SSM],不仅关注多播组,也关注发送多播组的源.2>.包的类型IGMPv3主要有两种包:Type Number (hex) Message Name----------------- ------------0x11 Membership Query0x22 Version 3 Membership Report基于兼容的原因,还有IGMPv2/v1的几种包:0x12 Version 1 Membership Report [RFC-1112] 0x16 Version 2 Membership Report [RFC-2236] 0x17 Version 2 Leave Group [RFC-2236] 关于协议部分更详尽的细节,参考RFC3376(IGMPv3),RFC2236(IGMPv2),RFC1112(IGMPv1)2.Linux Kernel的IGMPv3以及多播路由的实现仔细看了这部分的代码,主要的文件比较少,分别为:igmp.c 内核实现的对IGMP的实现,可以兼容v2/c.ipmr.c 看文件名自然就可以猜测是多播路由的实现.其中,值得参考的文档是Sprint Labs的两份文档,一份是实现架构,一份是测试计划,不过从我读Code来看,这两份文档只具备参考意义,因为kernel的实现并不是按照其实现架构文档来实现的,看igmp.c/ipmr.c的文件注释可以知道多播部分的实现是其它人来实现的,并不遵循该设计文档(也许该实验室是准备实现的,但最终由于某些其它原因由其它人来实现,并且没有采取其设计文档),不过设计思想值得参考,实际的实现比那份设计文档要简洁一些.下面看看一些具体的数据结构,由于部分成员我也没看懂做什么用处,如果你知道,请告诉我:)net_device{}--------| |<------------------|~~~~~~~~| in_device{} ||--------| --------- || ip_ptr |--->| dev |----|--------| |---------|<------------------| | |~~~~~~~~~| ip_mc_list{} ||~~~~~~~~| |---------| --------- |-------- | mc_list |--->|interface|----|---------| |---------||~~~~~~~~~| |multiaddr|--------- |---------||~~~~~~~~~|---------通过上图可以看到3个结构之间的部分关系,我简单说说这三个结构:net_device:针对每个网络设备的一个抽象,比如你用ifconfig看到的eth0,就对应了一个该结构实例.in_device:针对IPv4的网络部分的描诉,因为Linux支持不仅仅是TCP/IP协议族,还用ATM等等,其底层设备是不同的,而对与网络设备的通用部分,用net_device{}描述,而针对不同协议私有部分,则使用不同结构,支持IPv4的设备,就使用该结构.ip_mc_list:描述的自然是IP设备的多播相关信息,我只花出了一个multiaddr,举例说来,我们说"eth0加入了多播组224.0.0.1",multiaddr就记录了该设备加入的一个多播组:224.0.0.1因此,结合上图,可以基本知道一个网络设备,如何记录它加入的多播组.下面来看igmp的处理流程:--------|ip_rcv()|[IP层的总入口]--------|V------------------|ip_local_deliver()|[本地分发,即目的地为本地]------------------|V----------|igmp_rcv()|[分发到IGMP的处理入口] ----------|V------------------------| [处理查询] |[处理报告]V V------------------ -------------------|igmp_heard_query()| |igmp_heard_report()|------------------ -------------------[开始计时器]| ++++++++++++++ |[停止计时器]----> +ip_mc_list{}+<----++++++++++++++|V------------------|igmp_send_report()|------------------在上面的文档里简要介绍了kernel对IGMP包的处理,其实下面才是重点,kernel 怎么处理多播包呢?即多播包怎么路由呢?这又涉及到UNIX常用的一个哲学"数据路径要分离于控制路径(最常见的说法是策略与机制,上面的说法是我自己理解后表述的,因为我老把这两者弄反,呵呵:))",这实际上是两个分离的问题:1).多播包在内核中怎么样被处理?2).该使用什么方法在应用程序中向内核添加路由?说道这里,我再次强调一下,注意区分在网路中的常见角色"Host"和"Router",时刻记得它们本质的区别是重要的:),它们最重要的区别在于是否能够转发包.好了,我们来依次解决上面的两个问题:我们不去考虑MAC层对多播的处理,只是理解就可以了,记得网络设备在MAC层可以实现一个不完全的过滤就可以了,相关知识,参考<TCP/IP详解>卷一,下面我们从IP层开始考虑(认为网卡支持多播,不过现在不支持多播的网卡很少了,呵呵)1>.多播包在kernel的处理流程自然,还是从ip_rcv()起步:),呵呵.##################################################################### ######--------|ip_rcv()|[IP层的总入口]--------|[单播的路由查找入口] V--------------------- ----------------|ip_route_input_slow()|<--|ip_route_input()|[路由查找总入口]--------------------- ----------------|[本地分发] V------------------- -------------------|ip_local_deliver() |<--|ip_route_input_mc()|[多播路由查找入口] ------------------- -------------------|V ***------------- *K*[在MFC中查找] |ip_mr_input()|[多播路由查找入口] *E*++++++++++++++++++ ------------- *R*+Multicast Forwar+------------->| *N*+ding Cache +<-------------V *E*++++++++++++++++++ --------------- *L*^ | |ip_mr_forward()|[根据找到的多播路由转发] ***| | --------------- || | V===================================================================== ======| V ^------------------- ||iset/getsocketopt()|[在应用层添加/删除多播路由] ***------------------- *A**P**P****##################################################################### ####上面是一个简要的流程,下面来稍微具体的谈谈:首先还是以关键的数据结构为开始:(给我看你的流程图而藏起你的表,我将仍然是莫名其妙。

linux操作系统 基础、原理与应用 pdf

linux操作系统 基础、原理与应用 pdf

linux操作系统基础、原理与应用 pdf一、引言Linux操作系统是一种功能强大、安全可靠、易于使用的开源操作系统,广泛应用于服务器、超级计算机和移动设备上。

为了帮助读者全面了解Linux操作系统的基本概念、原理和应用,我们编写了这份《Linux操作系统基础、原理与应用pdf》。

本文档将涵盖以下内容:1. Linux基础概念2. Linux操作系统原理3. Linux应用场景和案例分析二、Linux基础概念1. Linux内核:介绍Linux内核的组成、功能和运行机制。

2. 文件系统:讲解Linux中的文件系统和目录结构,包括ext4、Btrfs等常用文件系统。

3. 进程管理:介绍Linux中的进程管理概念,包括进程、线程、僵尸进程等。

4. 系统用户和组:讲解Linux中的用户和组管理,包括用户和组的概念、创建、删除和权限设置等。

5. 设备管理:介绍Linux中的设备管理概念,包括硬件设备驱动、设备文件等。

6. 包管理:讲解Linux中的包管理工具,如APT、yum、dnf等。

7. 系统日志:介绍Linux中的系统日志和日志管理工具,如Syslog、Nagios等。

三、Linux操作系统原理1. Linux进程调度:介绍Linux中的进程调度算法和实现方式。

2. Linux内存管理:讲解Linux中的内存管理机制和原理。

3. Linux文件系统存储:介绍Linux中的文件系统存储机制和RAID技术。

4. Linux网络通信:讲解Linux中的网络通信机制和原理,包括TCP/IP协议栈、路由和DNS解析等。

5. Linux安全机制:介绍Linux中的安全机制和防护措施,如SELinux、防火墙等。

四、Linux应用场景和案例分析1. 服务器运维:介绍如何在服务器上安装和配置Linux,以及如何进行系统管理和维护。

2. 容器技术:讲解Docker和Kubernetes等容器技术的基本概念和使用方法。

因特网6to4机制的分析与实现

因特网6to4机制的分析与实现

第29卷第2期 2006年4月 电 子 测 量 技 术 EL ECTRON IC M EASUREM EN T TECHNOLO GY信息技术因特网6to4机制的分析与实现杨 闽 于 健 戴居丰(天津大学电子信息工程学院天津300072)摘 要:6to4机制用于解决孤立的IPv6站点之间的通信问题。

文中通过配置6to4边界路由器和6to4主机实现了IPv6主机与6bone网络的连接。

结果表明在IPv4和IPv6的共存阶段6to4机制具有一定的应用价值。

关键词:6to4 隧道技术 6bone.Analysis and implementation of Internet6to4mechanismYang Min Yu Jian Dai J ufeng(School of Electronics Information Engineering,Tianjin University,Tianjin,300072)Abstract:6to4mechanism allows isolated IPv6sites to communication with each other.With configuring the6to4 router and host,the connection of IPv6sites with6bone is realized.The results show that the application of6to4 mechanism has practical value during the period of co2existence of IPv4and IPv6.K eyw ords:6to4,tunneling technique,6bone.0 6to4机制6to4[1]是一种地址分配和路由器到路由器的自动隧道技术,它为IPv6站点和主机之间提供了跨IPv4Internet的单播IPv6连通性,解决了在没有Internet服务提供商提供IPv6互连服务的条件下,孤立的IPv6站点与其他孤立站点以及与IPv6主干网内部各站点之间的通信问题。

SO_DONTROUTE和SO_BINDTODEVICE的深层次分析

SO_DONTROUTE和SO_BINDTODEVICE的深层次分析

SO_DONTROUTE和SO_BINDTODEVICE的深层次分析2010-08-15 19:02 1763人阅读评论(2) 收藏举报SO_DONTROUTE并没有跳过路由表的查找,而只是将查找范围缩小到了直连的同三层网段主机,SO_BINDTODEVICE亦没有跳过路由表查找,而只是将外出设备固定,也就是增加了一个查找键,因此二者都无法跳过查找路由表的过程,本质上,SO_DONTROUTE也是增加了一个查找键。

路由表的查找在linux 实现的协议栈中是无法越过的,但是却可以增加若干的限制条件,以hash路由表为例,在fn_hash_lookup 函数中:if (f->fn_scope < flp->fl4_scope) //检查路由的范围(**)continue;err = fib_semantic_match(f->fn_type, FIB_INFO(f), flp, res);if (err == 0) {//找到}在fib_semantic_match中:if (!flp->oif || flp->oif == nh->nh_oif) //***break; //找到可见在核心的查找函数中,DONTROUTE和BINDTODEVICE只是做了一些限制,并且在核心查找函数的任意层次调用函数中都没有绕过路由查找的逻辑。

在正常的数据发送过程中,查找路由的时候是没有出口设备信息的,出口设备由路由表的匹配结果来决定,而在通过setsockopt设置了SO_BINDTODEVICE之后,在查找路由之前就有了出口设备信息,ip_queue_xmit中,查找键fl中会添加.oif = sk->sk_bound_dev_if这个信息(没有bindtodevice的情况下,sk->sk_bound_dev_if为0),然后路由查找按照往常的方式继续,到达fib_semantic_match的时候,在***处起作用;对于SO_DONTROUTE这个选项,同样的道理,在**处起作用,linux内核协议栈将“路由范围”定义成了一个枚举,一共N中类型:enum rt_scope_t{RT_SCOPE_UNIVERSE=0, //任意的地址路由RT_SCOPE_SITE=200, //用户自定义RT_SCOPE_LINK=253, //本地直连的路由RT_SCOPE_HOST=254, //主机路由RT_SCOPE_NOWHERE=255 //不存在的路由};数值逐渐增大,越大的越不易匹配,因此在**处,如果由于设置SO_DONTROUTE而配置了RT_SCOPE_LINK的话,如果目的主机在外部,路由表中的scope就是RT_SCOPE_UNIVERSE,这样就不会匹配,因此也就找不到了,因此如果设置了SO_DONTROUTE的话,即使一个目的地址存在路由,只要它在外部,那就是不可达的。

Linux中软RAID程序的机制分析

Linux中软RAID程序的机制分析

来说 , 看起来 就象一个单独 的逻辑存储单元或 磁
收 稿 日期 : 0 5 0 — 8 2 0 - 92
RAI D其他 的各级 别 , 个级别 使 用 的时间较 长 l 这
作者简介: 文
亮 , 1 8  ̄) 武汉工程职业技术学院信息工程系教师. 男( 9 0 。
维普资讯
21 R I . A D的特点
()增强 了存取 速度 ; 1 ()扩容 了存储 能力 ( 2 以及 更 多 的便 利 ) ;
( )可高效恢 复磁 盘 ; 3 ()尽量 的平 衡 C U 与 内存 及磁 盘 的性 能差 4 P
异, 提高 电脑 的整 体工作性 能 。
22 R I . A D的分级
() eeO 1 L vl —— RAI , 常称为 “ 区”, D 0级 通 带
接成 一个 磁盘 , 其容 量 高达几 百至 上千兆 。RAI 使 D
是 利用 带 区数 据 映 射 技 巧 的 R D模 式 。也 就 是 AI 说, 当数据 写入磁 盘 组 的时 候 , 分 成带 区 , 被 交错 写 入磁 盘组 的磁盘 中 。0级具 有高 IO性 能 , 开销 , / 低 但 不提供 任何冗余 。磁 盘组 的存储 量 等于总 的各 磁 盘 容量之 和 。
( AI )的技 巧 , 数据 分 布到 各 个磁 盘 上 , 到 R D1 把 达
少 冗余 、 低延迟 、 读写 的高带 宽 以及 硬 盘毁坏后 的最 大 可恢复 性 RAI 的概 念 , 操 作 系统 来 说 , 是 D 对 就 把 各个硬 盘上 的空 间组 合成 一个 虚拟 的逻辑 盘 。在
个 块被组 成一个 “ 区 ” 而 每 个 磁 盘 的第 二 个 块 又 带 ,

Linux下的Capabilities安全机制分析

Linux下的Capabilities安全机制分析

Linux下的Capabilities安全机制分析Linux下的Capabilities安全机制分析笪已墅型埋一――‘≤运画爱爹一――Capabmties安全机制分析解放军信息工程学院巫晓明郭玉东摘要熟悉和掌握Lmux操作系统所提供的安全机制.对于提高系统安全以及开发出高安全性的应用软件是非常关键的.本文从内核源码角度分析了Lmux下的capabl|_ties的实现机制,同时分析了如何利用capab_|it惜安全机制来提高系统安全性.关键词:L『nuxcapabf|_tles安全机制文件访问权限引言Lnux是典型的多用户操作系统.早期Llnux中的访问控制机制主要是传统uNIx中的基于用户身份鉴别的自主访问控制DAc(DIscreIlonaryAccesscontroI】.uNl×将文件的访身份.从而可以进行任伺特权操作。

目前.置有seIu,d标志的root用户程序是L川x最大的安全隐患,攻击者最常用的攻击途径就是利用r。

ot用户的se㈨d程序存在的安全漏洞来获取root身份.从而获得整个系统的控制权.问者分为三类群体即文件属主(Dwner)与文件属主同组的用户(group).以及其他用户(other).同时将对文件的操作分为读、写执行三种因此不同的访问者与不同的操作方式组成了不同文件访问权限.DAc的主要思想是由文件属se㈨d机制所带来的安全问题主要在于L川x系统将权限过分集中于root用户为此.人们提出了种分割root用户权限的称为capab…t啪的安全访问控制模型.主来指定文件的访问权限.在L…x中.文件node节点中的mod8域的第九位用来存储文件访问权限.同样的.Lmux在系统中设立了个超级用户root用于系统管理.root用户对系统具有一切特权操作.比如,可以访问系统中的任何文件.修改任何文件的文件访问权限、加载{或卸载)系统模块等等.对于普通用户的一些只有root用户才能完成的操作需要(如用户修改口令时.就需要root权限来读写系统的口令文一.Cap.biIities安全模型介绍capabI㈨es的主要思想在于分割root用户的特权.即将r00t的特权分割成不同的capabIlIty(本文译为权能),每种权能代表一定的特权操作.例如.权能cAP―sYs―MoDuLE表示用户能够加载(或卸载)内核模块操作的特权操作.而cAP―sETuID表示用户能够修改进程用户身份的特权操作.在c日pab㈨嘲中系统将根据进程拥有的权能来进行特权操作的访问控制.在capabl|It|es中,只有进程和可执行文件才具有权能.每个进程拥有三组权能集.分别称为cap―effecllve件).L川×提供了一种称为setuId的机制来解决.setuid机制即允许进程在运行过程中改变用户身份,从而可以获得不同的访问权限.L-nux中的进程因此拥有丰富的用户身份信息uld(真实用户号}euld(有效用户号).suId(保存用户号}.fsu-d(文件系统用户号】,通过这些用户号进程可以方便灵活地对其用户身份做暂时改变或恢复等操作.进程改变用户身份有两种方式一种是给可执行文件置上某种标志C称为se㈨d标志).进程执行这些文件时便拥有与文件属主cap―mhe…able、cap―permⅢed(分别简记为:pEp.pP).其中.cap―permltted表示进程所能拥有的最大权能集.cap―effectlve表示进程当前可用的权能集.而cap―lnheⅢ曲Je则表示进程可以传递给其子进程的权能集.系统根据进程的c8p―effectlve权能集来进行访问控制,cap―effect_ve为cap―permmed的子集.进程可以通过取消cap―effecllve中的某些权能来放弃进程的一些特权。

Linux系统网络安全的研究与分析

Linux系统网络安全的研究与分析

然后 ,使用 it l 命令配置包过滤规则 。 pa e bs it l 的语法通常可以简化为 下面的形式 : pa e bs
it l [t al】 C pa e 一 be MD [ a ] [ l— ace] [j bs t c i r em t r hn u h -
t gห้องสมุดไป่ตู้ a e r 】
3 阶段 : 个
#e h co
_
计算机 安全技术
1’ >/ o /ysnelp 4/p fr r pr cs / tiv i o wad
()修改脚本/t ssof /e ok 2 e / cn g t r。 cy i n w
将 F R R —P 4 fl O WA D IV =a e s 改 为 F R R —P 4 t e O WA D IV =r u
Ab t a t T i d t i d a ay i o iu y tm e u i c a ims i e t y p s i l e u i s s gv n t e a p o rae sr c : h s e al n l ss fL n x s s e e s c r y me h n s , d n i o s e s c r y r k , ie h p rp it t f b t i s c rt oiy a d t e p n i lso iu a k t l rn i w l a d c n g r t n meh d . e u y p l n r cp e fL n x p c e t ig f e a l n o f u a i t o s i c h i i f e r i o
用 的功 能是可 以用 它来 检测 系统 的 2 tle 3( n t e )和 10(o 3 1 pp ) 端 口上 的数据传送 以轻松得到 系统 的登录 口令 和 m i帐号密 al
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

37计算机应用Linux 路由实现机制分析西安电子科技大学机电工程学院 周 帆 李红艳摘要 通过对Linux2.4.20版内核路由模块代码的分析和研究,详尽地阐述了Linux 路由机制的实现思想和技术特点,对于更好地使用Linux 的路由功能和在Linux 路由上进行二次开发都具有实际的指导意义。

关键词 Linux IP 路由 1 引言Linux 软件包中包含了简单的路由模块,主要包含了路由表和路由规则的建立以及路由查找等功能。

Linux 的路由模块基本实现了RFC1812中规定的路由处理功能。

系统启动时建立路由表并根据配置文件设置路由规则,当系统接收到一个需要转发的数据包时,内核启动路由查找算法并根据特定的路由规则在路由表中查找合适的路由信息,然后将数据包在此路由上发送出去。

开放的Linux 源代码为我们深入地了解路由模块的运行机制提供了良好的机会。

我们将根据Linux 内核网络部分的源码,详细地讨论其路由机制的各个方面。

2 路由实现中涉及的主要数据结构路由中主要的数据结构就是路由表的结构。

Linux 内核中保存着三种路由表:邻居表(neighbor table )、路由高速缓存表(Route cache )及转发信息表(Forwarding information base ,FIB )。

2.1 邻居表邻居表中保存着物理上与本机直接相连的主机信息,其表项是动态的——在使用时才建立,一段时间不使用的话,对应的表项将被删除。

如果本机一直没有和临节点进行数据交换,那么邻居表就没有任何表项;反之,如果本机最近和所有与它物理相连的主机都进行过通信,那么在邻居表中对应每个物理相连的主机都有相应的表项。

邻居表是由neigh_table (include/net/neighbour.h )结构的链表来表示,以邻居(neighbour ,定义于include/net/neighbour.h )结构为节点,其结构关系图如图1。

邻居表结构邻居表结构邻居表结构图1 邻居表结构关系图邻居表结构中定义了两个指针数组:struct neighbour *hash_buckets [NEIGH__HASHMASK+1]和struct neighbour *phash_buckets [PNEIGH_HASHM ASK+1],前者包含了与这个邻居表相关联的邻居的哈希数据,后者包含了与它相关联的pneigh_entry 结构的哈希数据,pneigh_entry 中定义了设备接口的指针和关键字(keys )结构。

parms 用于存放邻居表的一些描述信息,比如:报文传送时间、队列长度等等。

next 指向下一个邻居表。

邻居结构记录着每一个“邻居”的详细信息:*dev 指向和该邻居连接的设备;mud_state 用来确定路由的状态;当本机向“邻居”发送数据时,需要在数据报中添加硬件头信息,这个信息就存放在*hh 中; arp_queue 指向该“邻居”发送的ARP 数据报。

收稿日期:2005-09-132.2 路由高速缓存路由高速缓存(Route Cache)是Linux内核中最重要的路由表,其中存储的是正在使用的和最近刚使用过的路由信息,它是内核最快地获得一条路由信息的手段和方式。

和邻居表一样,路由高速缓存也是一张动态的路由表。

路由高速缓存涉及到的数据结构为rt_hash_bucket(net/ipv4/route.c)、rtable(include/net/rou te.h)和dst_entry(include/net/dst.h),其关系结构如图2。

图2 路由高速缓存结构关系图rt_hash_bucket是一个指针数组,每一项都有一个其数据成员chain用来指向高速路由缓存组成的链表。

rtable是路由缓存中用于保存路由信息的重要数据结构。

每一个rtable结构包含了去往特定目的地址的路由信息,包括源地址(rt_src)、目的地址(rt_dst)、该路由要经过的网络接口索引号(rt_iif)、查找该路由节点的哈希值key等。

在Linux的/proc/net/rt_cache文件中,我们可以看到当前主机中保存的路由缓存信息。

2.3 转发信息表当内核在高速路由缓存中无法找到匹配的路由信息时,就会转而到转发信息表中进行查询。

转发信息表是一个非常复杂且非常重要的路由表,它是一张静态的路由表,其中包含了前往所有合法IP地址的路由信息。

转发信息表是内核用来决策如何转发数据包的最终依据。

转发表的每一条记录描述了具有一类目的地址的IP包应该使用哪个输出设备发给个哪个目的主机。

转发表记录按网络区域进行分类。

Linux内核中可以有多张转发信息表,让管理者可以更灵活、更快速地管理路由系统的运作。

在没有定义CONFIG_IP_MULTIPLE_TABLES的情况下,内核中只有三张表:本地表(local table)、主表(main table)和默认表(default table)。

本地表中保存了本地网络内的路由信息,其它网段的路由信息都存放在主表中,默认表中存放着默认的路由信息。

在Linux 2.4中转发信息表由fib_table (include/net/ip_fib.h)结构定义,其结构图如图3所示。

从图中可看出,结构fn_hash包含了一个指针数组fn_zones[33]和一个fn_zone类型的指针fn_zone_list。

前面我们提到转发信息表是按网络区域进行分类,实现上就是在fn_zones[ ]上得到体现的:路由信息按照其IP地址中网络地址的长度i存入到对应的fn_zones[i]中,i[0,32]∈为网络掩码。

fn_zones[i]中i值越大说明匹配越精确,fn_zone_list将所有不为空的fn_zones[]按i的值,从大到小地链接起来,这样做的好处就在于当内核用数据包目的地址的网络掩码来搜索路由信息时,从fn_zone_list开始逐个地在fn_zones[]中搜索,网络地址最长的路由信息会被最先找到,这符合我们的要求:送往特定IP的规则优于送往此IP所在网络的规则。

结构fib_node(net/ipv4/fib_hash.c)中记录了基本的路由信息:fn_type、fn_tos、fn_scope等。

fn_key 是哈希表的键;*fn_next中保存了下一个fib_node结构的地址,*fn_info指向fib_info结构。

fib_info中记录了某一个fib_node结构的一些相关的数据信息,如发送设备指针、下一跳网关等等。

一个fib_info中记录的信息可能在很多路由信息中都是相同的,那么这些路由条目可以共享这一fib_info结构。

所有的fib_info形成一个双向链表,fib_info_list指向此链表的头。

3 路由处理流程3.1 路由表的建立路由表的初始化可以追溯到网络层初始化函数inet_init(net/ipv4/af_inet.c)。

网络层初始化函数中分38别又调用地址解析协议初始化函数arp_init (net/ipv4/arp.c)和IP初始化函数ip_init (net/ipv4/ip_output.c),对ARP和IP协议模块进行初始化。

ARP协议的初始化过程中创建了邻居表;而路由高速缓存和转发信息表则在IP模块初始化过程中建立。

其流程可参见图4。

图4 路由表建立流程3.1.1 邻居表的建立邻居表的建立是在ARP层初始化当中进行的:负责初始化ARP层的地址解析协议初始化函数中调用了邻居表初始化函数neigh_table_init (net/core/neighbour.c),对邻居表进行初始化,在这里内核为邻居表分配了缓存空间并确定了表项的失效时间等。

邻居表由ARP协议来维护,当需要记录一个“邻居”节点的信息时,首先调用__neigh_lookup(include/net/neighbour.h),查找该“邻居”节点是否已经记录过,如果没有就调用neigh_creat (net/core/neighbour.c),创建一个新的邻居节点并调用neigh_add(net/core/neighbour.c),将该邻居节点添加到邻居表里。

经过一个timeout时间,本机一直没有与某个“邻居”联系的话,则调用neigh_release和neigh_destroy删除掉该邻居结构。

当“邻居”的数据发生变化的时候,主机就要使用neigh_update (net/core/neighbour.c)来更新自己的邻居表结构,从而保证网络操作的正确性。

3.1.2 路由高速缓存的建立路由缓存的建立是在内核IP模块初始化时进行的。

IP路由初始化函数中通过kmem_cache_create (mm/slab.c)尝试在slab上创建路由缓存中的rtable 结构。

IP路由初始化函数中主要是建立了路由高速缓存表的框架,具体的路由信息还是要等到有数据包进行转发时才填进来。

一个还没有和其它主机进行交换的计算机的路由高速缓存中只存储了本机回环设备的路由信息,只有当内核为需要进行转发的数据到转发信息表中查找路由信息时,才调用rt_intern_hash (net/ipv4/route.c)函数将它填入路由高速缓存中。

3.1.3 转发信息表的建立如图4所示,转发信息表的建立是从IP层转发信息表初始化函数ip_fib_init(net/ipv4/fib_frontend.c)开始的,这个函数创建了路由规则——本地表和主表,并调用fib_hash_init(net/ipv4/fib_hash.c),分别对其进行初始化。

真正向路由表中填入路由信息是从ip_auto_config(net/ipv4/ipconfig.c)开始的,ip_auto_ config中调用ic_setup_routes(net/ipv4/ipconfig.c)开始建立路由信息,然后ic_setup_routes调用ip_rt_ioctl 用来接收对路由表进行操作的ioctl调用,这里的ioctl 只有两种,一是SIOCADDRT,用来增加新的路由信息,由函数tb->tb_insert执行;另外一个是SIOCDELRT,从路由表中删除条目,由函数tb->tb_delete执行。

返回到fib_hash_init中可以看到tb->tb_insert和tb->tb_delete实际上是分别通过fn_hash_insert和fn_hash_delete来进行具体操作的。

进一步深入到fn_hash_insert函数中可以发现真正在填写路由表的是fib_create_info(net/ipv4/fib_semanti cs.c),其中包括了设置发送设备、下一跳网关等。

相关文档
最新文档