路由表学习笔记

路由子系统的核心是转发信息库(Forwarding Information Base,FIB),即路由表。路由表是用来存储这样一些信息的:一是用以确定输入数据是应该上传给本机的上层协议还是继续转发的信息;二是如果需要转发,为转发数据报提供所需要信息;三是输出数据报应该从哪个具体的网络设备输出的信息

路由表项的维护以及查找涉及以下文件:

include/net/ip_fib.h 定义路由表等结构、宏和函数原型

net/ipv4/fib_lookup.h 定义路由查找的相关函数原型

net/ipv4/fib_hash.c 实现路由表的查找和维护

net/ipv4/fib_frontend.c 实现操作路由表的接口函数和通知

net/ipv4/route.c 实现路由缓存项的操作函数

路由要素:

(1)路由表

路由表是一个由路由表项组成的数据库,并为诸如IPv4等其他子系统提供了多种接口,其中最重要的接口就是路由查找

(2)作用范围

IP地址和路由都有作用范围,用于说明它们在哪些情况下是有意义并可以被使用的。IP地址的作用范围表示该IP地址距离本地主机由多远,而路由的作用范围表示到目的网络的距离。

IP地址的作用范围         描述

Host                   当一个地址只用于主机自身内部通信时,作用范围为Host,该地址在主机以外不可知                        并且不能被使用。例如环回地址127.0.0.1

Link                   当一个地址只在一个局域网(即每台计算机通过链路层互联的一个网络)内有意义且只                        在局域网内使用时,该地址的作用范围为Link。例如子网的广播地址。子网内一台主                        机发送到子网广播地址的数据报被送给同一子网内的其他主机

Universe               当一个地址可以在任何地方使用时作用范围为universe,这是大多数地址的默认                          scope

路由的作用范围           描述

Host                   当一条路由使目的地址为本地主机时,作用范围为host

Link                   当一条路由使目的地址为本地网络是,作用范围为Link

Universe               当一条路由使目的地址超过一跳时,作用范围为universe

(3)默认网关

默认网关通常是指0.0.0.0/0路由,当到一个目的地址不存在明确的路由项时使用该路由。

(4)特殊路由

当主机收到一个数据报后,路由子系统需要决定将它上传给本地上层协议还是继续转发出去。因此在路由子系统中,有两张特殊的路由表:

一张表用于本地地址,存储了所有的本地地址,如果在该表中能查到匹配表项,则表明数据报是发给本机的

一张表用于所有其他的路由,路由表项由用户手工静态配置或由路由协议动态配置

在路由查找时先扫描本地路由表,只有当查找该表未果的情况下,才会去查找另一路由表,以确定是否可以转发。

路由缓存

一个路由表中的路由项数量,在一般的主机中可能只是几条而已,而在路由器中,这个数目可以达到数十万条。因此很显然,在这种情况下维护一张更小的表来缓存路由查找结果是非常有必要的

路由缓存分为两部分:一部分是与协议(如IPv4等三层协议)相关的缓存,这就是缓存框架部分,每个元素被定义为一个由具体协议字段组成的集合;另一部分是与协议无关的缓存,通常被称为DST,嵌套在缓存框架中,只存储与协议无关的信息

路由表和路由缓存除了容量和结构不同之外,对象粒度也不同。路由表使用连续地址的集合,即子网,而缓存项与单个IP地址相关联。因此,路由表和路由缓存使用的查找算法也不同。

路由表结构

fib_table结构

对每个路由表实例创建一个fib_table结构,这个结构主要由一个路由表标识和管理该路由表的一组函数指针组成

struct fib_table {
	struct hlist_node tb_hlist;
	u32		tb_id;
	int		tb_default;
	int		(*tb_lookup)(struct fib_table *tb, const struct flowi *flp, struct fib_result *res);
	int		(*tb_insert)(struct fib_table *, struct fib_config *);
	int		(*tb_delete)(struct fib_table *, struct fib_config *);
	int		(*tb_dump)(struct fib_table *table, struct sk_buff *skb,
				     struct netlink_callback *cb);
	int		(*tb_flush)(struct fib_table *table);
	void		(*tb_select_default)(struct fib_table *table,
					     const struct flowi *flp, struct fib_result *res);

	unsigned char	tb_data[0];
};

struct hlist_node tb_hlist;

用来将各个路由表链接成一个双向链表

u32 tb_id;

路由表标识。在支持策略路由的情况下,系统中最多可以有256个路由表,枚举类型rt_class_t定义了保留的路由路由表ID

unsigned char tb_data[0];

路由表项的散列表起始地址。在FIB_HASH算法中指向fn_hash结构,而在FIB_TRIE算法中则指向trie结构

fn_zone结构

一个zone是一组有着相同目的地址掩码长度的路由表项的散列表

struct fn_zone {
	struct fn_zone		*fz_next;	/* Next not empty zone	*/
	struct hlist_head	*fz_hash;	/* Hash table pointer	*/
	int			fz_nent;	/* Number of entries	*/

	int			fz_divisor;	/* Hash divisor		*/
	u32			fz_hashmask;	/* (fz_divisor - 1)	*/
#define FZ_HASHMASK(fz)		((fz)->fz_hashmask)

	int			fz_order;	/* Zone order		*/
	__be32			fz_mask;
#define FZ_MASK(fz)		((fz)->fz_mask)
};

struct fn_zone*fz_next;

将活动的(路由表项不为空)zone链接在一起的指针,该链表的头部存储在fn_hash数据结构的fn_zone_list字段中。

struct hlist_head *fz_hash;

指向存储该zone中路由项的散列表。

int fz_nent;

在该zone的散列表中fib_node实例的数目,用于检查是否需要改变散列表的容量。

int fz_divisor;

表示散列表fz_hash的容量,以及散列表桶的数目。

u32 fz_hashmask;

其值为fz_divisor - 1,用来计算散列表的关键值

int fz_order;

网络掩码的长度,255.255.255.0的网络掩码长度为24

__be32fz_mask;

网络掩码

fib_node结构

fib_node实例代表每一个唯一的目的网络的路由表项,即同一个子网中所有路由表项所共享的信息。目的网络相同但其他配置参数不同的路由表项共享同一个fib_node实例,因此一个fib_node实例上存在着一个或多个路由表项。

struct fib_node {
	struct hlist_node	fn_hash;
	struct list_head	fn_alias;
	__be32			fn_key;
	struct fib_alias        fn_embedded_alias;
};

struct list_head fn_alias;

fn_alias指向一个或多个fib_alias结构实例构成的链表

__be32fn_key;

由IP地址和路由项的netmask与操作后得到,被用作查找路由表时的搜索条件

fib_alias结构

fib_alias实例代表一条路由表项,目的地址相同但其他配置参数不同的表项共享fib_node实例

struct fib_alias {
	struct list_head	fa_list;
	struct fib_info		*fa_info;
	u8			fa_tos;
	u8			fa_type;
	u8			fa_scope;
	u8			fa_state;
#ifdef CONFIG_IP_FIB_TRIE
	struct rcu_head		rcu;
#endif
};

struct list_head fa_list;

将共享同一个fib_node实例的所有fib_alias实例链接在一起

struct fib_info*fa_info;

指针指向一个fib_info实例,该实例存储着如何处理与该路由相匹配数据报的信息

u8 fa_tos;

路由的服务类型比特位字段

u8 fa_type;

路由表项的类型,如RTN_UNICAST、RTN_LOCAL等

u8 fa_scope;

路由表项的作用范围

u8 fa_state;

一些标志的位图

fib_info结构

fib_node结构和fib_alias结构的组合用于标识一条路由表项,同时存储相关信息,更多信息,比如下一跳网关等重要的路由信息则存储在fib_info结构中

struct fib_info {
	struct hlist_node	fib_hash;
	struct hlist_node	fib_lhash;
	struct net		*fib_net;
	int			fib_treeref;
	atomic_t		fib_clntref;
	int			fib_dead;
	unsigned		fib_flags;
	int			fib_protocol;
	__be32			fib_prefsrc;
	u32			fib_priority;
	u32			fib_metrics[RTAX_MAX];
#define fib_mtu fib_metrics[RTAX_MTU-1]
#define fib_window fib_metrics[RTAX_WINDOW-1]
#define fib_rtt fib_metrics[RTAX_RTT-1]
#define fib_advmss fib_metrics[RTAX_ADVMSS-1]
	int			fib_nhs;
#ifdef CONFIG_IP_ROUTE_MULTIPATH
	int			fib_power;
#endif
	struct fib_nh		fib_nh[0];
#define fib_dev		fib_nh[0].nh_dev
};
时间: 2024-10-15 12:32:58

路由表学习笔记的相关文章

HCNP学习笔记之OSPF协议原理及配置9-基础知识特殊区域

为了减少外部路由对内部路由器的影响,可以通过设置特殊区域减少路由的数量. 因为对于内部路由不需要知道外部路由的明细. 即特殊区域是为了减少LSDB的规模. 1 stub区域,过滤了4类,5类 LSA,以一条到外部网络的默认路由替代. stub 区域实例: 由路由表可以看出,区域间路由(3类 network-summary-LSA)可以通告到stub中. 5类as-external-LSA被过滤,外部路由被转换成一条默认路由. 2 完全stub区域,过滤了3,4,5类LSA,拓扑和上例相同. 3

EIGRP 学习笔记

3EIGRP的特性 **************************************************************************************************** 1.高级的距离矢量 2.触发的.增量的更新 3.组播和单播代替广播 4.灵活的网络设计(igrp) 5.支持VLSM(无类)与不连续子网(关闭自动汇总) 6.支持等价和非等价负载 7.配置简单 8.增强的度量计算(5) EIGRP 协议的特点: 运行EIGRP 的路由器之间形成

【转】TCP/IP详解学习笔记(二)

TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节 1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据包的IP地址来选择路由.这里就不重复了.首先来看看一个简单的系统路由表. Destination     Gateway         Genmask         Flags Metric Ref    Use Iface192.168.11.0    *               255.

HCNA学习笔记4

这是我3月14号和3月15号的学习内容,主要包括ACL.AAA.VPN相关知识.SNMP原理配置以及IPv6的一些基础知识. 网络安全知识 ACL ACL(Access Control List)访问控制列表,定义一系列不同的规则,设备根据这些规则对数据包进行分类,针对不同类型的报文进行不同的处理. 三种ACL:基本ACL.高级ACL.二层ACL. 基本ACL:编号范围:2000-2999,使用报文的源IP地址.分片标记和时间段信息来匹配报文: 高级ACL:编号范围:3000-3999,使用报文

iproute2学习笔记

一.替代arp, ifconfig, route等命令 显示网卡和IP地址 [email protected]:~# ip link list 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mt

FreakZ学习笔记:路由应答机制

FreakZ学习笔记:路由应答机制 路由应答机制是建立在路由发现和路由请求完成之后进行的,换句话说就是在通信链路建立完成之后,帧信息被传输到目的节点时,由目的节点进行的应答机制:路由应答机制在NWK.c下的mac_data_ind函数被调用,该函数的功能在另一篇文章<FreakZ学习笔记:接收过程详解>中有解释,这里不再赘述:相应代码如下: switch (cmd.cmd_frm_id) { case NWK_CMD_RTE_REQ: if(nib.dev_type != NWK_END_DE

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

[学习笔记] 理解ASP.NET MVC的路由系统

引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请求URL最终被传递给特定Controller的特定Action进行处理.而在相反的方向上,MVC框架的渲染器同样要利用这张路由表,生成最终的HTML页面并返回URL.所以,理解整个ASP.NET MVC的路由系统,有两个必须出现的关键元素:Controller与Action,有两个方向的操作:传入的

计算机网络基础学习笔记——理论

历史:第一代:50年代:(多台)终端(terminal)-->计算机(host) 缺点:1.主机负荷重,效率低.  2.终端速率低,线路利用低,费用高. 60年代:通信控制处理机CCP(communication control processer)或FET(front end processor)    集中器.第二代:60年代末:计算机--计算机   1969年,美国国防部国防高级研究计划署(简称ARPA Advanced Research Project Agency)试验.   1972