路由表插入流程分析
路由表基础知识

路由表基础知识路由表基础知识IID:1237A1⼀、路由概念掌握⽹络路由的关键是路由的分析,这⾥先看⼀下同⼀个接⼝在不同时刻的两个图表 1相同的抵达⽹络〈Network Destination〉,在不同的路由协议可能会发现不同的路由,但这些路由并不都是最佳的。
在某⼀时刻,到某⼀个抵达⽹络 Network Destination的当前路由仅能由惟⼀的路由协议来决定,下⾯就来介绍路由协议的基础内容。
静态路由与动态路由:1.静态路由:配置⽅便,对系统要求较低,适⽤于拓扑结构简单并且稳定的⼩型⽹络。
缺点是需⼈⼯配置。
2.动态路由:有⾃⼰的算法,能过⾃动适应⽹络拖布的变化,适⽤于具有⼀定数量三层设备的⽹络。
缺点是:配置⽐较复杂,对系统要求较⾼,占⽤⼀定的⽹络资源。
动态路由协议的分类:1.根据作⽤范围:内部⽹关协议IGP〈interior Gateway Protocol〉:在⼀个⾃治系统内部运⾏。
如:RIP、OSPF、IS-IS。
外部⽹关协议EGP〈exterior gateway Protocol〉:在两个⾃治系统之间运⾏。
如:EGP。
2.根据使⽤算法:距离⽮量协议〈Distance-vector〉:包括RIP和BGP。
BGP也称为路径⽮量协议〈Path-Vector〉。
链路状态协议〈link-state〉:包括OSPF和IS-IS.3.根据抵达⽹络 Network Destination址类型:单播路由协议〈unicast routing protocol〉:包括RIP、OSPF、BGP、IS-IS。
组播路由协议〈multicast routing protocol〉:包括PIM-SM、PIM-DM。
路由协议及路由优先级:对于相同的抵达⽹络 Network Destination,不同的路由协议〈包括静态路由〉可能会发现不同的路由,但这些路由并不都是最佳的。
在某⼀时刻,到某⼀个抵达⽹络 Network Destination的当前路由仅能由惟⼀的路由协议来决定。
静态路由的配置方法和过程

静态路由的配置方法和过程静态路由是一种简单且灵活的路由配置方式,它由网络管理员手动配置,以指定网络数据包的转发路径。
相比动态路由,静态路由不会自动更新路由表,需要管理员手动更新和维护。
静态路由配置的过程相对简单,本文将详细介绍。
一、静态路由的基本概念在介绍静态路由的配置方法之前,首先需要了解一些基本的概念。
1. 路由器(Router):用于连接不同网络的设备,它根据目标IP地址选择最佳的转发路径,实现网络之间的通信。
2. 路由表(Routing Table):用于存储路由器的转发策略,包括目标子网地址、下一跳的IP地址等信息。
3. 目标子网(Destination Subnet):表示要传送数据包的目标网络,通常用子网地址表示。
4. 下一跳(Next Hop):表示将数据包转发到的下一个路由器的IP地址,也可以是直连子网的出接口。
5. 接口(Interface):指路由器连接到子网的物理端口,不同接口之间相互隔离。
二、静态路由的配置方法静态路由的配置需要在路由器上进行,具体的步骤如下。
1. 登录路由器首先,需要通过终端或者远程登录方式登录到要配置静态路由的路由器,一般使用SSH、Telnet等协议进行登录。
2. 进入全局配置模式成功登录后,可以进一步进入全局配置模式,输入命令"configure terminal"或"conf t",并按下回车键。
3. 配置路由在全局配置模式下,可以使用"ip route"命令来配置静态路由。
该命令的基本语法如下:ip route {目标子网地址} {子网掩码} {下一跳的IP地址或出接口}其中,"目标子网地址"表示要传输的数据包的目标网络,"子网掩码"用于指定目标子网的范围,"下一跳的IP地址或出接口"表示下一跳路由器的IP地址或直连子网的出接口。
路由表详解

mask subnetmask
指定与网络目标地址相关联的网掩码(又称之为子网掩码)。子网掩码对于 IP 网络地址可以是一适当的子网掩码,对于主机路由是 255.255.255.255 ,对于默认路由是 0.0.0.0。如果忽略,则使用子网掩码 255.255.255.255。定义路由时由于目标地址和子网掩码之间的关系,目标地址不能比它对应的子网掩码更为详细。换句话说,如果子网掩码的一位是 0,则目标地址中的对应位就不能设置为 1。
当我接收到广播数据包的目的网段是192.168.123.255时,我会将该数据从192.168.123.88接口以广播的形势发送出去,该路由记录的线路质量 1
第十条
组播路由:当路由器收到一个组播数据包时该如何处理
当我接收到组播数据包时,我会将该数据从192.168.123.68接口以组播的形势发送出去,该路由记录的线路质量 1
路由表说明
晓霞 16:15:19
改成210528
凌波微步+Y 16:15:31
现在的呢?
晓霞 16:15:48
1989506
493170234
------------------------------------------------------------------------------源码:--------------------------------------------------------------------------------
缺省路由:该路由记录的意思是:当我接收到一个数据包的目的网段不在我的路由记录中,我会将该数据包通过192.168.123.68这个接口发送到192.168.123.254这个地址,这个地址是下一个路由器的一个接口,这样这个数据包就可以交付给下一个路由器处理,与我无关。该路由记录的线路质量 1
路由引入原理

路由引入原理详解什么是路由在计算机网络中,路由(Routing)是指根据某种算法将数据包从源节点传输到目标节点的过程。
路由器(Router)是用来实现路由功能的设备,它根据网络中的路由表来选择最佳路径,并将数据包转发到下一个节点。
路由是网络通信中非常重要的一环,它决定了数据包的传输路径和时间。
因此,了解路由引入原理对于理解网络通信的工作原理非常重要。
路由引入原理在计算机网络中,路由引入(Routing Introduction)是指将路由器引入到网络中的过程。
它包括了配置路由器、建立路由表和选择路由算法等步骤。
1. 配置路由器在引入路由之前,首先需要配置路由器的基本参数,包括IP地址、子网掩码、网关等。
这些参数用来标识路由器在网络中的位置,并确定它的工作方式。
配置路由器的过程通常通过命令行界面(CLI)或Web界面来完成。
管理员可以通过这些界面输入命令或设置选项来完成路由器的配置。
2. 建立路由表建立路由表是路由引入的核心步骤。
路由表是一个记录了网络中各个节点之间连接关系的表格,它用来指导路由器选择最佳路径。
路由表通常由管理员手动配置,或通过动态路由协议自动学习。
手动配置路由表需要管理员了解网络拓扑结构,并根据实际情况填写路由表项。
而动态路由协议则可以自动学习网络中的路由信息,并更新路由表。
建立路由表的过程中,需要考虑以下几个因素:•路由器之间的连接方式:路由器之间可以通过直连方式连接,也可以通过交换机、集线器等设备连接。
不同的连接方式会影响路由表的构建和选择算法。
•网络拓扑结构:网络拓扑结构决定了数据包传输的路径选择。
常见的网络拓扑结构有星型、环形、树形等。
不同的拓扑结构需要采用不同的路由算法。
•路由器的性能和带宽:路由器的性能和带宽决定了数据包的传输速度和质量。
在建立路由表时,需要考虑路由器的性能和带宽,以选择最佳路径。
3. 选择路由算法路由算法是决定数据包传输路径的核心。
它根据路由表中的信息和一定的策略来选择最佳路径。
linux路由表详解

linux路由表详解⼀、查看路由表[root@VM_139_74_centos ~]# routeKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Ifacedefault gateway 0.0.0.0 UG 000 eth010.0.0.1010.139.128.1255.255.255.255 UGH 000 eth010.139.128.00.0.0.0255.255.224.0 U 000 eth0link-local 0.0.0.0255.255.0.0 U 100200 eth0172.17.0.00.0.0.0255.255.0.0 U 000 docker0172.18.0.00.0.0.0255.255.0.0 U 000 br-0ab63c131848172.19.0.00.0.0.0255.255.0.0 U 000 br-bccbfb788da0172.20.0.00.0.0.0255.255.0.0 U 000 br-7485db25f958[root@VM_139_74_centos ~]# route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface0.0.0.010.139.128.10.0.0.0 UG 000 eth010.0.0.1010.139.128.1255.255.255.255 UGH 000 eth010.139.128.00.0.0.0255.255.224.0 U 000 eth0169.254.0.00.0.0.0255.255.0.0 U 100200 eth0172.17.0.00.0.0.0255.255.0.0 U 000 docker0172.18.0.00.0.0.0255.255.0.0 U 000 br-0ab63c131848172.19.0.00.0.0.0255.255.0.0 U 000 br-bccbfb788da0172.20.0.00.0.0.0255.255.0.0 U 000 br-7485db25f958⼆、路由表各字段说明Destination⽬标⽹络或⽬标主机。
openwrt 路由表的知识

OpenWrt 路由表的知识一、什么是路由表?路由表是用来指导网络数据包在网络中传输的重要数据结构。
它存储了网络中各个主机或路由器的地址信息以及如何将数据包从源主机传输到目标主机的路由信息。
二、路由表的作用路由表的作用是为网络设备提供数据包转发的指引,它通过查询目标地址的路由信息,确定下一跳的地址,并将数据包发送到下一跳。
路由表的更新是动态的,它能够根据网络拓扑的变化自动更新路由信息。
三、路由表的组成路由表由多个路由项组成,每个路由项包含以下信息: 1. 目标地址:指的是数据包的目标地址。
2. 子网掩码:用于确定目标地址的网络部分和主机部分。
3. 下一跳地址:指的是数据包在当前路由器上的下一跳地址。
4. 出接口:指的是数据包从当前路由器出去的网络接口。
四、路由表的查找过程当一个数据包到达路由器时,路由器会根据数据包的目标地址进行路由表的查找,并根据查找结果进行数据包的转发。
路由表的查找过程如下: 1. 路由器会比较数据包的目标地址和路由表中的目标地址,找到最长匹配的路由项。
2. 如果找到匹配的路由项,则使用该路由项的下一跳地址和出接口进行数据包的转发。
3. 如果没有找到匹配的路由项,则路由器会将数据包丢弃或者发送到默认路由器。
五、路由表的维护与更新路由表的维护与更新是网络运维的重要工作,它需要及时更新路由表以适应网络拓扑的变化。
常见的路由表维护与更新方式有以下几种: 1. 静态路由:管理员手动配置路由表的路由项,适用于小型网络或者网络拓扑变化较少的情况。
2. 动态路由:路由器通过与相邻路由器交换路由信息,自动更新路由表。
常见的动态路由协议有OSPF、BGP等。
3. 默认路由:当路由表中没有匹配的路由项时,路由器会将数据包发送到默认路由器。
默认路由的设置可以减少路由表的大小。
六、OpenWrt中的路由表管理OpenWrt是一个基于Linux的开源路由器操作系统,它提供了丰富的路由表管理功能。
路由器的路由表详解

路由器的路由表详解路由器是网络中的重要设备,它用来连接不同的网络,并将数据包转发到正确的目的地。
在路由器中,有一个重要的组成部分就是路由表。
路由表指导着路由器如何选择下一跳并进行数据包的转发。
一、路由表的概念和作用路由表是路由器中存储路由信息的一种数据结构,它记录了各个目的网络的网络地址以及到达该网络的下一跳路由器的地址。
路由表的作用是根据目的网络地址选择最优的路径进行数据包转发。
二、路由表的组成1. 目的网络地址:路由表中的每一项都会有一个目的网络地址。
目的网络地址是指数据包的最终目的地的网络地址,如IP地址。
2. 下一跳地址:路由表中的每一项还会有一个下一跳地址。
下一跳地址是指数据包在路由器中下一步应该转发到的地址,也即到达目的网络的下一个路由器的地址。
3. 路由器接口:路由表中还会记录数据包从路由器的哪个接口进入和退出的信息。
接口是路由器与其他网络设备连接的通道。
三、路由表的建立和更新1. 静态路由表:静态路由表是管理员手动配置的路由表。
管理员可以根据网络拓扑和需求手动添加和修改静态路由表。
静态路由表的优点是配置简单,但对网络变化不敏感,不适合大规模网络。
2. 动态路由表:动态路由表是通过网络协议自动学习和更新的路由表。
常见的动态路由协议有RIP、OSPF、BGP等。
动态路由表的优点是能及时适应网络拓扑的变化,但配置相对复杂。
四、路由表的查找和转发当路由器接收到一个数据包时,它会根据数据包的目的网络地址去路由表中查找匹配的项。
路由表查找的原则是最长前缀匹配,即选择最长匹配目的地址的路由表项。
找到匹配的路由表项后,路由器就知道应该通过哪个接口和下一跳地址将数据包转发出去。
五、路由表的优化为了提高路由表的查找和转发效率,路由器采用了一些优化方法:1. 路由聚合:将多个小的目的网络地址聚合成一个较大的地址块,减少路由表中的表项数量,提高查找效率。
2. 路由过滤:根据需要过滤和选择路由信息,避免不必要的路由信息进入路由表。
路由表说明(详解routeprint)

看了nello的路由表,就找来这片文章,比较详细的解释了路由表,这个还是比较常用的,和大家共享路由表说明ActiveRoutes:Network Destina tion Netmask Gateway Interfa ce Metric0.0.0.00.0.0.0192.168.123.254192.168.123.8810.0.0.00.0.0.0192.168.123.254192.168.123.681127.0.0.0255.0.0.0127.0.0.1127.0.0.11192.168.123.0255.255.255.0192.168.123.68192.168.123.681192.168.123.0255.255.255.0192.168.123.88192.168.123.881192.168.123.68255.255.255.255127.0.0.1127.0.0.11192.168.123.88255.255.255.255127.0.0.1127.0.0.11192.168.123.255255.255.255.255192.168.123.68192.168.123.681192.168.123.255255.255.255.255192.168.123.88192.168.123.881224.0.0.0224.0.0.0192.168.123.68192.168.123.681224.0.0.0224.0.0.0192.168.123.88192.168.123.881255.255.255.255255.255.255.255192.168.123.68192.168.123.681Default Gateway: 192.168.123.254-------------------------------------------------------------------------------------- 当前的路由:destina tion目的网段mask子网掩码interfa ce到达该目的地的本路由器的出口ipgateway下一跳路由器入口的ip,路由器通过interfac e和gate way定义一调到下一个路由器的链路,通常情况下,interfa ce和gat eway是同一网段的metric 跳数,该条路由记录的质量,一般情况下,如果有多条到达相同目的地的路由记录,路由器会采用m etric值小的那条路由第一条缺省路由:意思就是说,当一个数据包的目的网段不在你的路由记录中,那么,你的路由器该把那个数据包发送到哪里!缺省路由的网关是由你的连接上的default gateway决定的该路由记录的意思是:当我接收到一个数据包的目的网段不在我的路由记录中,我会将该数据包通过192.168.123.88这个接口发送到192.168.123.254这个地址,这个地址是下一个路由器的一个接口,这样这个数据包就可以交付给下一个路由器处理,与我无关。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
路由表在内核中存在路由表fib_table_hash和路由缓存表rt_hash_table。
路由缓存表主要是为了加速路由的查找,每次路由查询都会先查找路由缓存,再查找路由表。
这和cache是一个道理,缓存存储最近使用过的路由项,容量小,查找快速;路由表存储所有路由项,容量大,查找慢。
首先,应该先了解路由表的意义,下面是route命令查看到的路由表:Destination Netmask Gateway Flags Interface Metric169.254.0.0255.255.0.0*U eth01192.168.123.0255.255.255.0*U eth01 default0.0.0.0192.168.123.254UG eth01一条路由其实就是告知主机要到达一个目的地址,下一跳应该走哪里。
比如发往192.168.22.3报文通过查路由表,会得到下一跳为192.168.123.254,再将其发送出去。
在路由表项中,还有一个很重要的属性-scope,它代表了到目的网络的距离。
路由scope可取值:RT_SCOPE_UNIVERSE, RT_SCOPE_LINK, RT_SCOPE_HOST在报文的转发过程中,显然是每次转发都要使到达目的网络的距离要越来越小或不变,否则根本到达不了目的网络。
上面提到的scope很好的实现这个功能,在查找路由表中,表项的scope一定是更小或相等的scope(比如RT_SCOPE_LINK,则表项scope只能为RT_SCOPE_LINK或RT_SCOPE_HOST)。
路由缓存路由缓存用于加速路由的查找,当收到报文或发送报文时,首先会查询路由缓存,在内核中被组织成hash表,就是rt_hash_table。
static struct rt_hash_bucket *rt_hash_table __read_mostly; [net\ipv4\route.c]通过ip_route_input()进行查询,首先是缓存操作时,通过[src_ip, dst_ip, iif,rt_genid]计算出hash 值hash = rt_hash(daddr, saddr, iif, rt_genid(net));此时rt_hash_table[hash].chain就是要操作的缓存表项的链表,比如遍历该链表for (rth = rt_hash_table[hash].chain; rth; rth = rth->u.dst.rt_next)因此,在缓存中查找一个表项,首先计算出hash值,取出这组表项,然后遍历链表,找出指定的表项,这里需要完全匹配[src_ip, dst_ip, iif, tos, mark, net],实际上struct rtable中有专门的属性用于缓存的查找键值– struct flowi。
/* Cache lookup keys */struct flowi fl;当找到表项后会更新表项的最后访问时间,并取出dstdst_use(&rth->u.dst, jiffies);skb_dst_set(skb, &rth->u.dst);路由缓存的创建inet_init() -> ip_init() -> ip_rt_init()rt_hash_table = (struct rt_hash_bucket *)alloc_large_system_hash("IP route cache",sizeof(struct rt_hash_bucket),rhash_entries,(totalram_pages >= 128 * 1024) ?15 : 17,0,&rt_hash_log,&rt_hash_mask,rhash_entries ? 0 : 512 * 1024);其中rt_hash_mask表示表的大小,rt_hash_log = log(rt_hash_mask),创建后的结构如图所示:路由缓存插入条目函数rt_intern_hash()要插入的条目是rt,相应散列值是hash,首先通过hash值找到对应的bucket rthp = &rt_hash_table[hash].chain;然后对bucket进行一遍查询,这次查询的目的有两个:如果是超时的条目,则直接删除;如果是与rt相同键值的条目,则删除并将rt插入头部返回。
while ((rth = *rthp) != NULL) {if (rt_is_expired(rth)) { // 超时的条目*rthp = rth->u.dst.rt_next;rt_free(rth);continue;}if (compare_keys(&rth->fl, &rt->fl) && compare_netns(rth, rt)) { //重复的条目*rthp = rth->u.dst.rt_next;rcu_assign_pointer(rth->u.dst.rt_next, rt_hash_table[hash].chain);rcu_assign_pointer(rt_hash_table[hash].chain, rth);……}……rthp = &rth->u.dst.rt_next;}在扫描一遍后,如rt还未存在,则将其插入头部rt->u.dst.rt_next = rt_hash_table[hash].chain;rcu_assign_pointer(rt_hash_table[hash].chain, rt);如果新插入rt满足一定条件,还要与ARP邻居表进行绑定Hint:缓存的每个bucket是没有头结点的,单向链表,它所使用的插入和删除操作是值得学习的,简单实用。
路由缓存删除条目rt_del()要删除的条目是rt,相应散列值是hash,首先通过hash值找到对应的bucket,然后遍历,如果条目超时,或找到rt,则删除它。
rthp = &rt_hash_table[hash].chain;spin_lock_bh(rt_hash_lock_addr(hash));ip_rt_put(rt);while ((aux = *rthp) != NULL) {if (aux == rt || rt_is_expired(aux)) {*rthp = aux->u.dst.rt_next;rt_free(aux);continue;}rthp = &aux->u.dst.rt_next;}spin_unlock_bh(rt_hash_lock_addr(hash));路由表的创建inet_init() -> ip_init() -> ip_fib_init() -> fib_net_init() -> ip_fib_net_init()[net\ipv4\fib_frontend.c]首先为路由表分配空间,这里的每个表项hlist_head实际都会链接一个单独的路由表,FIB_TABLE_HASHSZ表示了分配多少个路由表,一般情况下至少有两个–LOCAL和MAIN。
注意这里仅仅是表头的空间分配,还没有真正分配路由表空间。
net->ipv4.fib_table_hash = kzalloc(sizeof(struct hlist_head)*FIB_TABLE_HASHSZ, GFP_KERNEL);ip_fib_net_init() -> fib4_rules_init(),这里真正分配了路由表空间local_table = fib_hash_table(RT_TABLE_LOCAL);main_table = fib_hash_table(RT_TABLE_MAIN);然后将local和main表链入之前的fib_table_hash中hlist_add_head_rcu(&local_table->tb_hlist,&net->ipv4.fib_table_hash[TABLE_LOCAL_INDEX]);hlist_add_head_rcu(&main_table->tb_hlist,&net->ipv4.fib_table_hash[TABLE_MAIN_INDEX]);最终生成结构如图,LOCAL表位于fib_table_hash[0],MAIN表位于fib_table_hash[1];两张表通过结构tb_hlist链入链表,而tb_id则标识了功能,255是LOCAL表,254是MAIN表。
关于这里的struct fn_hash,它表示了不同子网掩码长度的hash表[即fn_zone],对于ipv4,从0~32共33个。
而fn_hash的实现则是fib_table的最后一个参数unsigned char tb_data[0]。
注意到这里fn_zone还只是空指针,我们还只完成了路由表初始化的一部分。
在启动阶段还会调用inet_rtm_newroute() -> fib_table_insert() -> fn_new_zone() [fib_hash.c]来创建fn_zone结构,前面已经讲过,fn_zone一共有33个,其中掩码长度为0[/0]表示为默认路由,fn_zone可以理解为相同掩码的地址集合。
首先为fn_zone分配空间struct fn_zone *fz = kzalloc(sizeof(struct fn_zone), GFP_KERNEL);传入参数z代表掩码长度, z = 0的掩码用于默认路由,一般只有一个,所以fz_divisor只需设为1;其它设为16;这里要提到fz_divisor的作用,fz->fz_hash并不是个单链表,而是一个哈希表,而哈希表的大小就是fz_divisor。
if (z) {fz->fz_divisor = 16;} else {fz->fz_divisor = 1;}fz_hashmask实际是用于求余数的,当算出hash值,再hash & fz_hashmask就得出了在哈希表的位置;而fz_hash就是下一层的哈希表了,前面已经提过路由表被多组分层了,这里fz_hash就是根据fz_divisor大小来创建的;fz_order就是子网掩码长度;fz_mask就是子网掩码。