您当前的位置:首页 > 电脑百科 > 网络技术 > 网络知识

一篇讲解IPv4路由表

时间:2022-08-13 13:25:28  来源:  作者:linux上的码农

如下IP命令添加路由表项,默认情况下路由添加在mAIn路由表中:

# ip route add 192.2.0.0/16 via 192.168.1.106## ip route show table main 192.2.0.0/16 via 192.168.1.106 dev ens32

也可指定路由表,如下在local/default表中添加相同目的网络,但是网关不同的路由项:

# ip route add 192.2.0.0/16 via 192.168.1.1 table local## ip route show table local192.2.0.0/16 via 192.168.1.1 dev ens32 ### ip route add 192.2.0.0/16 via 192.168.1.200 table default## ip route show table default192.2.0.0/16 via 192.168.1.200 dev ens32 

下面使用ping命令测试到目的网段192.2.0.0/16,可见其使用的是local表中的路由项,而不是main表中项:

# tcpdump -i ens32 host 192.2.0.1 -n -e &   // 后台启动tcpdump## ping 192.2.0.1PING 192.2.0.1 (192.2.0.1) 56(84) bytes of data.23:05:53.330337 00:0c:29:1e:20:e3 > 00:90:27:fe:c9:34, ethertype IPv4 (0x0800), length 98: 192.168.1.140 > 192.2.0.1: ICMP echo request, id 64942, seq 1, length 64 # # ip neigh show192.168.1.1 dev ens32 lladdr 00:90:27:fe:c9:34 REACHABLE

以下删除local表中添加的路由,再执行ping操作,这次是main表中的路由生效,网关使用的是192.168.1.106:

# ip route del 192.2.0.0/16 via 192.168.1.1 table local#  # ping 192.2.0.1PING 192.2.0.1 (192.2.0.1) 56(84) bytes of data.23:21:47.752867 00:0c:29:1e:20:e3 > 00:60:e0:6f:9c:e3, ethertype IPv4 (0x0800), length 98: 192.168.1.140 > 192.2.0.1: ICMP echo request, id 528, seq 1, length 64#  # ip neigh show192.168.1.106 dev ens32 lladdr 00:60:e0:6f:9c:e3 STALE

 

最后,删除main中的路由,

# ip route del 192.2.0.0/16 via 192.168.1.106 table main## ping 192.2.0.1           PING 192.2.0.1 (192.2.0.1) 56(84) bytes of data.23:50:55.690358 00:0c:29:1e:20:e3 > 00:60:e0:85:7a:06, ethertype IPv4 (0x0800), length 98: 192.168.1.140 > 192.2.0.1: ICMP echo request, id 2079, seq 1, length 64# # ip neigh 192.168.1.200 dev ens32 lladdr 00:60:e0:85:7a:06 STALE

路由表创建
在添加表项时,没有指定路由表ID,或者指定的表ID等于0,内核使用main表RT_TABLE_MAIN,函数fib_trie_table分配一个新的fib_table结构,代表一个新的路由表。对于main表,将其制赋值给命名空间中的fib_main成员。最后将其链接到哈希桶fib_table_hash的对应链表中。

如果指定的路由表ID等于RT_TABLE_LOCAL,但是此命名空间中没有配置过IPv4策略路由,也使用main路由表,作为alias,参见fib_trie_table。这种情况下,fib_new_table会在调用自身,参数ID使用RT_TABLE_MAIN,获取main表的结构,赋值与alias。

对于default表,目前不太清楚其使用情况,在创建之后,内核将其赋值给命名空间的fib_default成员。

struct fib_table *fib_new_table(struct.NET *net, u32 id){    struct fib_table *tb, *alias = NULL;    unsigned int h;    if (id == 0)        id = RT_TABLE_MAIN;    tb = fib_get_table(net, id);    if (tb)        return tb;    if (id == RT_TABLE_LOCAL && !net->ipv4.fib_has_custom_rules)        alias = fib_new_table(net, RT_TABLE_MAIN);    tb = fib_trie_table(id, alias);    if (!tb)        return NULL;    switch (id) {    case RT_TABLE_MAIN:        rcu_assign_pointer(net->ipv4.fib_main, tb);        break;    case RT_TABLE_DEFAULT:        rcu_assign_pointer(net->ipv4.fib_default, tb);        break;    default:        break;    }    h = id & (FIB_TABLE_HASHSZ - 1);    hlist_add_head_rcu(&tb->tb_hlist, &net->ipv4.fib_table_hash[h]);    return tb;

对于main路由表,以及其它路由表,fib_trie_table的参数alias为空;但是对于local路由表,alias执向main表结构,就不用重新分配trie结构了。对于所有的路由表,都需要分配一个fib_table结构。

对于local路由表,其数据字段指向main路由表的数据字段。可见local表不是一个完全单独的路由表,其数据与main表是公用的。所以local路由表不需要进行以下对数据字段的初始化操作。

struct fib_table *fib_trie_table(u32 id, struct fib_table *alias){         struct fib_table *tb;    struct trie *t;    size_t sz = sizeof(*tb);          if (!alias)        sz += sizeof(struct trie);          tb = kzalloc(sz, GFP_KERNEL);    if (!tb)        return NULL;      tb->tb_id = id;    tb->tb_num_default = 0;    tb->tb_data = (alias ? alias->__data : tb->__data);      if (alias)        return tb;    t = (struct trie *) tb->tb_data;    t->kv[0].pos = KEYLENGTH;    t->kv[0].slen = KEYLENGTH;#ifdef CONFIG_IP_FIB_TRIE_STATS    t->stats = alloc_percpu(struct trie_use_stats);    if (!t->stats) {        kfree(tb);        tb = NULL;    }#endif    return tb;

路由查找

如下内核的路由查询入口函数fib_lookup,可见其查询顺序为:路由策略->main路由表->default路由表。对local路由表的查询包含在main路由表查询中。

static inline int fib_lookup(struct net *net, struct flowi4 *flp,                 struct fib_result *res, unsigned int flags){       struct fib_table *tb;    int err = -ENETUNREACH;      flags |= FIB_LOOKUP_NOREF;    if (net->ipv4.fib_has_custom_rules)        return __fib_lookup(net, flp, res, flags);    rcu_read_lock();          res->tclassid = 0;          tb = rcu_dereference_rtnl(net->ipv4.fib_main);    if (tb)        err = fib_table_lookup(tb, flp, res, flags);          if (!err)        goto out;      tb = rcu_dereference_rtnl(net->ipv4.fib_default);    if (tb)        err = fib_table_lookup(tb, flp, res, flags);

由函数fib_insert_alias可知,在trie树叶子节点中,路由表项时按照表ID由大到小排列的,如果local和main表中存在相同的路由,优先选择的是local表中的路由,宏RT_TABLE_LOCAL(255)大于RT_TABLE_MAIN(254)。

static int fib_insert_alias(struct trie *t, struct key_vector *tp,                struct key_vector *l, struct fib_alias *new, struct fib_alias *fa, t_key key){    if (!l)        return fib_insert_node(t, tp, new, key);    if (fa) {        hlist_add_before_rcu(&new->fa_list, &fa->fa_list);    } else {        struct fib_alias *last;        hlist_for_each_entry(last, &l->leaf, fa_list) {            if (new->fa_slen < last->fa_slen)                break;            if ((new->fa_slen == last->fa_slen) &&                (new->tb_id > last->tb_id))                break;            fa = last;        }        if (fa)            hlist_add_behind_rcu(&new->fa_list, &fa->fa_list);        else            hlist_add_head_rcu(&new->fa_list, &l->leaf);    }


Tags:IPv4   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
开放OVHcloud:自带IP服务进行IPv4故障转移
法国云提供商OVHcloud推出了一项self-IP服务,允许客户在发生中断时重复使用现有的公共IPv4块作为故障转移地址。名为BYOIP的“自带IP导入”服务允许客户通过其OVHcloud控制面...【详细内容】
2022-09-08  Search: IPv4  点击:(378)  评论:(0)  加入收藏
一篇讲解IPv4路由表
如下IP命令添加路由表项,默认情况下路由添加在main路由表中:# ip route add 192.2.0.0/16 via 192.168.1.106## ip route show table main 192.2.0.0/16 via 192.168.1.106 de...【详细内容】
2022-08-13  Search: IPv4  点击:(567)  评论:(0)  加入收藏
用户IPv4/IPv6双栈开启验证方法
IPv6是英文“Internet Protocol Version 6”(互联网协议第6版)的缩写,是互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议,其地址数量号称可以为全世界的每一粒沙子编上一...【详细内容】
2021-11-23  Search: IPv4  点击:(736)  评论:(0)  加入收藏
IPv6过渡技术,双栈,IPv6 over IPv4 隧道技术,一分钟了解下
IPv6过渡技术1、双栈技术网络中所有的设备都需要支持 IPv6 和 IPv4 协议。对设备要求较高。2、IPv6 over IPv4 隧道技术用于过渡初期,IPv4 网络为主体,IPv6 网络是孤岛,需要通...【详细内容】
2021-03-03  Search: IPv4  点击:(1023)  评论:(0)  加入收藏
IPv4自动获取有dhcp协议,那IPv6是否有dhcpv6协议
奔涌的IPv6背后,DHCPv6协议你了解多少?随着IPv6技术的普及,DHCPv6 作为基础技术是每一位IT人或多或少都需要了解的。本文将依托腾讯云CVM来详细剖析 DHCPv6 的工作原理,希望可以...【详细内容】
2020-05-06  Search: IPv4  点击:(425)  评论:(0)  加入收藏
IPv5 发生了什么?为什么有 IPv4、IPv6 但没有 IPv5?
答案是肯定的,曾经有一个 IPv5。让我解释一下这里发生的事。 来源:https://linux.cn/article-12168-1.html 作者:John Paul 译者:geekpi如果你花过很多时间在互联网上,那么你应...【详细内容】
2020-04-30  Search: IPv4  点击:(437)  评论:(0)  加入收藏
中国互联网基础资源:IPv4地址3.8亿个、国际出口带宽迎来20%增长
中国互联网络信息中心(CNNIC)现已发布的第45次互联网发展报告 , 该报告非常详实建议有兴趣的用户阅读原文。前文我们已经提到中国网民属性数据以及中国宽带和网络速率情况,本...【详细内容】
2020-04-29  Search: IPv4  点击:(584)  评论:(0)  加入收藏
IPv4和IPv6基本知识点专题分享,带你一分钟全部掌握
1、IPv4Internet Protocol version 4地址长度:32位,约43亿个表示法:点分十进制表示法,/后表示网络号长度(如192.168.1.1/24表示,IP地址前24位表示网络号)IPv4地址可以分5类:分类 前...【详细内容】
2019-11-13  Search: IPv4  点击:(754)  评论:(0)  加入收藏
从 IPv4 到 IPv6 过渡,无法错过这些知识点
理解网络模型网络的设计大佬们想出了分层的设计,将各个功能分开,交付给不同的层,这样的好处是便于更新和维护(IPv6的到来并没有使整个网络重新设计),也便于我们的学习和理解...【详细内容】
2019-09-20  Search: IPv4  点击:(844)  评论:(0)  加入收藏
华为交换机如何配置IPv4静态路由
配置IPv4静态路由示例组网需求如图1所示,属于不同网段的主机通过几台Switch相连,要求不配置动态路由协议,使不同网段的任意两台主机之间能够互通。图1 配置IP静态路由组网图 配...【详细内容】
2019-09-19  Search: IPv4  点击:(1308)  评论:(0)  加入收藏
▌简易百科推荐
学生偷看“不良网站”,手机上3个痕迹无法清除,网友:咋不早说
众所周知,中国的常规教育中,总是“谈性色变”,但在这个信息爆炸的互联网时代,即便是一些年纪很小的孩子,也能轻易接触到一些所谓的不良网站,因此这一方面的教育缺失,其实是很可怕的...【详细内容】
2024-03-28    叶姐生活指南  Tags:不良网站   点击:(11)  评论:(0)  加入收藏
什么是网络中的路由器?核心功能解释
路由器是互联网连接的核心元素,是一种允许多个设备连接到互联网,并促进将数据包转发到各自的目标地址的设备。使用动态路由技术,路由器检查数据并在各种可用路径中选择最有效的...【详细内容】
2024-03-07    千家网  Tags:路由器   点击:(31)  评论:(0)  加入收藏
过年该不该升级Wi-Fi 7路由?看完就知道
打开电商网站不难发现,从2023年第三季度到现在,Wi-Fi 7路由器新品越来越多。而且价格不再是高高在上,已经基本和Wi-Fi 6路由价格差不多了。看到这些Wi-Fi 7新品路由,不少朋友就...【详细内容】
2024-02-27    中关村在线  Tags:Wi-Fi   点击:(37)  评论:(0)  加入收藏
聊聊 Kubernetes 网络模型综合指南
这篇详细的博文探讨了 Kubernetes 网络的复杂性,提供了关于如何在容器化环境中确保高效和安全通信的见解。译自Navigating the Network: A Comprehensive Guide to Kubernete...【详细内容】
2024-02-19  云云众生s  微信公众号  Tags:Kubernetes   点击:(39)  评论:(0)  加入收藏
SSL协议是什么?关于SSL和TLS的常见问题解答
SSL(安全套接字层)及其后继者TLS(传输层安全)是用于在联网计算机之间建立经过身份验证和加密的链接的协议。尽管SSL协议在 1999年已经随着TLS 1.0的发布而被弃用,但我们仍将这些...【详细内容】
2024-02-06  IDC点评网    Tags:SSL协议   点击:(69)  评论:(0)  加入收藏
从零开始了解网络协议:TCP/IP详解
从零开始了解网络协议:TCP/IP详解 在当今数字化的时代,网络协议已经成为我们生活中不可或缺的一部分。作为互联网的基础,网络协议规定了数据如何在不同的网络设备之间传输。TC...【详细内容】
2024-02-01    简易百科  Tags:TCP/IP   点击:(59)  评论:(0)  加入收藏
BGP路由属性:互联网路由的灵活控制器
在互联网的庞大网络中,边界网关协议(BGP)是确保不同自治系统(AS)间路由信息有效交换的关键协议。然而,BGP的功能远不止于此。其核心组成部分,即BGP路由属性,赋予了BGP强大的灵活性,使...【详细内容】
2024-01-26  诺诺爱生活    Tags:互联网路由   点击:(40)  评论:(0)  加入收藏
简易百科之什么是网络延迟?
简易百科之什么是网络延迟?随着互联网的普及和发展,网络已经成为我们生活中不可或缺的一部分。然而,我们在使用网络时可能会遇到一种情况,那就是网络延迟。那么,什么是网络延迟呢...【详细内容】
2024-01-24    简易百科  Tags:网络延迟   点击:(148)  评论:(0)  加入收藏
网络延迟与网络速度有什么区别?分享具体的答案
通常,许多人抱怨网速测试。速度还是不错的,但是他们玩游戏的时候怎么会卡住,还是断开连接等等问题,这一系列问题始终困扰着大家。那么,网络延迟与网络速度有什么区别呢?请不要担心...【详细内容】
2024-01-24  萌新小郭    Tags:网络延迟   点击:(51)  评论:(0)  加入收藏
揭秘IP地址的网络威胁与攻击类型
在当今数字化时代,网络攻击已经成为网络安全的一大挑战。IP地址,作为互联网通信的基础,也成为网络威胁和攻击的焦点之一。本文将深入探讨不同类型的网络威胁和攻击,以及如何防范...【详细内容】
2024-01-22  IP数据云    Tags:IP地址   点击:(78)  评论:(0)  加入收藏
站内最新
站内热门
站内头条