linux网络协议栈分析笔记14-路由4-FIB3

FIB系统分析二(linux网络协议栈笔记) FIB配置过程续当给设备设置IP地址的的时候,内核给inetdev_chain通知链发送了一个NETDEV_UP事件,FIB系统正好对这个事件感兴趣,就把下面这个结构注册到了inetaddr_chain上: static struct notifier_block fib_inetaddr_notifier = { .notifier_call = fib_inetaddr_event, 阅读详情
看完fib的查找,弄清了一些数据结构的组织,我们再来看看路由表是如何创建的
从ip_fib_init注册的两个通知链来看,在IP地址发送变动时会触发通知链的处理函数,都会调用fib_add_ifaddr()来添加地址到路由中
这个里面由调用了fib_magic来进行路由地址的操作。
static void fib_magic(int cmd, int type, __be32 dst, int dst_len, struct in_ifaddr *ifa)
{
     struct net *net = dev_net(ifa->ifa_dev->dev);
     struct fib_table *tb;
     struct fib_config cfg = {                                   路由配置结构
          .fc_protocol = RTPROT_KERNEL,
          .fc_type = type,
          .fc_dst = dst,
          .fc_dst_len = dst_len,
          .fc_prefsrc = ifa->ifa_local,
          .fc_oif = ifa->ifa_dev->dev->ifindex,
          .fc_nlflags = NLM_F_CREATE | NLM_F_APPEND,
          .fc_nlinfo = {
               .nl_net = net,
          },
     };

     if (type == RTN_UNICAST)
          tb = fib_new_table(net, RT_TABLE_MAIN);
     else
          tb = fib_new_table(net, RT_TABLE_LOCAL);

     if (tb == NULL)
          return;

     cfg.fc_table = tb->tb_id;

     if (type != RTN_LOCAL)
          cfg.fc_scope = RT_SCOPE_LINK;
     else
          cfg.fc_scope = RT_SCOPE_HOST;

     if (cmd == RTM_NEWROUTE)         如果是添加命令 则插入
          tb->tb_insert(tb, &cfg);                         fn_hash_insert;
     else
          tb->tb_delete(tb, &cfg);          否则,进行删除
}

fib_new_table()
先看CONFIG_IP_MULTIPLE_TABLES开启的时候

struct fib_table *fib_new_table(struct net *net, u32 id)
{
     struct fib_table *tb;
     unsigned int h;

     if (id == 0)
          id = RT_TABLE_MAIN;
     tb = fib_get_table(net, id);            通过id查找路由表函数
     if (tb)
          return tb;

     tb = fib_hash_table(id);      申请创建路由表
     if (!tb)
          return NULL;
     h = id & (FIB_TABLE_HASHSZ - 1);
     hlist_add_head_rcu(&tb->tb_hlist, &net->ipv4.fib_table_hash[h]);
     return tb;
}

struct fib_table *fib_get_table(struct net *net, u32 id)
{
     struct fib_table *tb;
     struct hlist_node *node;
     struct hlist_head *head;
     unsigned int h;

     if (id == 0)
          id = RT_TABLE_MAIN;
     h = id & (FIB_TABLE_HASHSZ - 1);

     rcu_read_lock();
     head = &net->ipv4.fib_table_hash[h];                    得到冲突链头
     hlist_for_each_entry_rcu(tb, node, head, tb_hlist) {             匹配
          if (tb->tb_id == id) {
               rcu_read_unlock();
               return tb;
          }
     }
     rcu_read_unlock();
     return NULL;
}
当然FIB的东西还有很多很多,数据结构关系错综复杂,鉴于时间和精力,无法再深入分析,这里也只是弄清大概流程,拉通整个协议栈,等到有了系统的、全流程的观念后,我们再来仔细深入分析具体的模块。
这里有篇文章很好的阐述了linux kernel路由机制http://blog.youkuaiyun.com/bin323/article/details/642192  算是对上述的流程分析一个总结
Linux Fib实现分析 linux内核早先对于ipv4的fib支持Hash与trie两种数据组织方式,后续删除了hash,只留下了trie。 trie是一种最长前缀匹配算法,对于大量路由的情况下查找效率高于hash,但是这种算法会消耗更多的内存、算法更加复杂。 图1 原始数据 图2 trie 将图1中的数据用trie表示那么就可以得到图2的模型。那么是怎么画出这幅图的呢?实际上就是从根节点触发,往左子树走一步则增加一个... 阅读详情

相关推荐

内核函数之fib_add_ifaddr()

在通过ifconfig eth0 xxx 修改ip地址的时候内核流程为: fib_inetaddr_notifier{}:fib_inetaddr_event->fib_add_ifaddr() 在此我们已ifconfig eth0 192.168.11.103为例子看一下fib_add_ifaddr的执行过程 //ifconfig eth0 192.168.11.103 void ...

yldfree的博客 2828

linux 路由表 fib,linux内核 路由fib表之创建

2.2.2 路由创建当通过netlink,操作类型为RTM_NEWROUTE时,调用inet_rtm_newroute函数添加路由。功能:a)、将用户空间配置内容传过来b)、路由表的创建c)、路由表项的添加流程: 代码:static int inet_rtm_newroute(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)//其中nlh为...

weixin_39956009的博客 588

fib系统分析(linux网络协议栈笔记)

FIB系统初始化在Linux路由系统中主要保存了三种与路由相关的数据,第一种是在物理上和本机相连接的主机地址信息表——相邻表:neigh_table{ },第二种是保存了在网络访问中判断一个网络地址应该走什么路由的数据表——路由规则表:fib_table{ },第三种表是最新使用过的查询路由地址的缓存地址数据表——路由缓存:rtcache,由rtable{ }节点组成。它们三者之间的关系如下图:

viewsky11的专栏 8394

linux路由表生成,路由表(FIB)内容的生成(一)

前面已经讲到过路由表的初始化,路由表是一个比较复杂的数据结构,一下子并不好理解。下面我们通过模块初始化时Linux的notify机制所触发的网络设备事件回调myfib_netdev_event,来逐步分析如何向FIB插入路由项,来进一步理解FIB。每一个网络设备接口在启动时或者模块my_inet被插入到内核空间时,都会有NETDEV_UP事件发生,通知内核,设备启动。myfib_netdev_ev...

weixin_30696613的博客 873

linux网络协议栈分析笔记13-路由3-FIB2

当然,我们选择路由1那章的遗留的接口进入分析 fib_lookup()       我们前面提到过fib初始化时,CONFIG_IP_MULTIPLE_TABLES  宏导致了两种方式的fib表初始化, 因此存在了有多路由表存在和无多路由表存在的情况,我们先看无多路由表的情况 static inline int fib_lookup(struct net *net, const stru

白水煮鸡蛋 2503

linux网络协议栈分析笔记12-路由2-FIB1

上一章我们看到了通过fib_lookup去查找了路由信息,这一章我们就看看fib到底是什么 FIB(Forward Information Base) 转发信息库 inet_init()->ip_init()->ip_rt_init()-> ipv4_dst_ops.kmem_cachep =           kmem_cache_create("ip_dst_cache"

白水煮鸡蛋 2046

linux网络协议栈源码分析 - 路由查找树

linux内核路由查找树

arm7star的博客 2734

linux网络协议栈分析笔记11-路由1-路由缓存

来吧,路由 路由是网络的核心,是linux网络协议栈的核心,我们找个入口进去看看 还记得在笔记5-IP层的处理1中ip_rcv_finish走到过一个岔口 ->ip_rcv_finish()      ->ip_route_input()  查找路由信息      ->if (iph->ihl > 5 && ip_rcv_options(skb)) 如果IP头部大于20字节,则表

白水煮鸡蛋 3348

Linux内核网络协议栈TCP/IP分析:ip route路由表

一 概述 1.1 概念 (1)路由:跨越从源主机到目标主机的一个互联网络来转发数据包的过程; (2)路由器:能够将数据包转发到正确的目的地,并在转发过程中选择最佳路径的设备; (3)路由表:在路由器中维护的路由条目,路由器根据路由表做路径选择; (4)静态路由:是由管理员手工配置的,是单向的; (5)默认路由:当路由器在路由表中找不到目标网络的路由条目时,路由器把请求转发到默认路由接口 。 1.2...

wenze123的博客 2261

网络层路由系统(linux网络协议栈笔记)

查找出口当要发送一个报文时,必定要查询发送接口,这个过程被Linux分为3个步骤: 第一个步骤是查询路由cache, 第二个步骤是查询FIB表, 第三步是将查询结果填入路由cache中以便将来查询。现在来介绍一下路由cache。 路由cache 当确定了一条路由时,路由表项就被放入路由cache中,这意味着一旦知道路由并放入cache后,经过同样路由的报文能够立即找到出口。一个报文在本地机

viewsky11的专栏 1770

网络配置过程分析(linux网络协议栈笔记)

配置过程分析在本篇,我们先介绍配置普通设备的IP地址的内部过程,接着再转到loopback接口的配置过程,这两个过程有相似之处,所以一起解说。然后再转入FIB系统,讲解路由系统,并用图例演示路由表的变化。最后介绍接口状态的变化,这对于驱动程序开发人员来说也是比较重要的。 .1)配置是如何下达到内核的? 我们假设在安装我们的Linux系统时,没有配置IP地址,也没有挂上网线,完完全全是一台“裸机”

viewsky11的专栏 2581

linux 内核网络协议栈--linux内核路由机制(一)

内核的路由部分是是网络中重要部分,目前在Linux内核中默认的路由查找算法使用的是Hash查找,所以你会看到很多的数据结构是XXX_hash什么之类(例如fn_hash)。Linux内核从2.1开始就支持基于策略的路由,那么什么是基于策略的路由呢?我们一般的最基本的路由转发是考虑IP包的目的地址,但是有些时候不仅仅是这些,还有例如IP协议,传输端口等之类的考虑因素,所以采用所谓基于策略的路由。 或许这样理解更好,Linux默认有三种策略路由:本地路由,主路由和默认路由,那么与之对应的就是三张路由表:本地路由

bob的博客 1454

Rocky Linux 9.0国内yum源一键替换指南(上海交大镜像站实测)

本文详细介绍了如何将Rocky Linux 9.0的yum源替换为上海交大镜像站,以解决国内用户访问官方源速度慢的问题。通过实测验证,上海交大镜像站提供高速下载和稳定更新,并提供了完整的替换步骤、常见问题解决方案及高级优化配置,帮助用户提升软件包下载效率。

weixin_29304985的博客 357

linux内核路由转发表的组成,Linux内核网络协议栈TCP/IP分析:ip route路由表

一 概述1.1 概念(1)路由:跨越从源主机到目标主机的一个互联网络来转发数据包的过程;(2)路由器:能够将数据包转发到正确的目的地,并在转发过程中选择最佳路径的设备;(3)路由表:在路由器中维护的路由条目,路由器根据路由表做路径选择;(4)静态路由:是由管理员手工配置的,是单向的;(5)默认路由:当路由器在路由表中找不到目标网络的路由条目时,路由器把请求转发到默认路由接口 。1.2 路由表Lin...

weixin_29094979的博客 877

【R语言-生存分析之观察生存率计算】

全人群肿瘤登记资料常用的统计分析指标包括发病率、死亡率、现患率以及生存率等,其中肿瘤生存率是评估肿瘤治疗效果和肿瘤负担的必要指标,其计算涉及肿瘤患者的发病、 死亡和随访三个方面的资料, 数据整理和计算过程均较为复杂, 如何及时、 准确地计算肿瘤生存率, 并使其可以在不同地区、 不同人群、不同时期间被客观公正地比较和评价,仍然是统计学家们一直在研究的主题。

weixin_46579654的博客 5439

银河麒麟V10-ARM架构-postgresql安装与部署指南

本文详细介绍应用源码进行pgsql的安装步骤,本文以postgresql-12.0为例。提示:以下是本篇文章正文内容,下面案例可供参考银河麒麟系统安装程序比较繁琐,潜在问题比较多,个人建议均通过源码自定义编译安装。国产系统还需努力啊!

idols_man的博客 1万+

linux 内核网络协议栈

Linux网络协议栈之数据包处理过程 1前言 本来是想翻译《The journey of a packet through the linux 2.4 network stack》这篇文章的。但在查阅相关的资料时,发现需要补充一些技术细节,才使得我这种菜鸟理解更加深刻,所以综合了上面两篇文档,在加上自己的裁减和罗嗦,就有了下面的文字。我不知道这是否侵犯了作者权益。如果有的话,请告知,我会及时删除这篇拼凑起来的文档。 引用作者Harald Welte的话:我毫无疑问不是内核导师级人物,也许...

wqwqh的博客 1323

Vue中实现word文档渲染、在线编辑、保存

Vue3对word文档进行渲染、编辑、保存。word转成html,html转成word

h18749849699的博客 1328

内核IPv4路由选择子系统(简述)

内核IPv4路由选择子系统(简述)

qq_53111905的博客 2811

SAP-ABAP:接口多继承与复合接口设计:复杂业务场景下的能力组合实现方案

本文介绍了ABAP中通过接口多继承与复合接口设计实现能力组合的方案。文章首先辨析了类实现多个接口与接口继承接口的核心概念,指出ABAP虽不支持类多继承,但可通过这两种机制灵活组合能力。随后详细讲解了类实现多个接口的语法规则与三种调用方式,并给出了五个基础能力接口的设计示例(日志记录、权限校验、数据导出、消息通知、格式转换)。作者通过对比单继承与接口多重实现的差异,强调后者在解耦和扩展性上的优势,为复杂业务场景下的能力组合提供了实用解决方案。

baidu_35680696的博客 244

Python-自动化绘制股票价格通道线

创建更强大、更可靠的价格通道检测算法。

探索人工智能领域 947

Linux wlan网络协议栈-路由框架详解

根据PRE_ROUTING钩子点的作用,我们也可以得来ip_rcv_finish和PRE_ROUTING的关系。环回地址的IP范围:127.0.0.0/8 (127.0.0.1 到 127.255.255.254)struct net_device *orig_dev // 原始设备(用于桥接等场景)struct packet_type *pt // 包类型(对于IP协议固定)struct net_device *dev // 接收数据的网络设备。1)反向路径检查(防止IP欺骗)

weixin_42271802的博客 917

windows exe爬虫:exe抓包

在不知情所拦截应用使用的流量时,所以建议用Wireshark。本文利用python代码,实现自动拦截,写入pcap包,并用代码分析流量的协议。这样会在本地目录下生成capture_inbound.pcap,可以用wireshark分析,也可以利用python代码进行分析,如果使用python代码进行分析,需要借助pyshark或者scapy。使用的python WinDivert的包,当然前提也是需要安装Wireshark软件,设置环境变量,并安装pydirvert包。

youbingchen的博客 615

linux 内核网络协议栈——linux内核路由机制 (二)篇

首先通过hash找到这个队列首部的chain,然后在chain的队列中进行匹配,如果匹配到那么OK,否则进行完整的查询。 我们知道Linux最多可以支持255张路由表,默认有三张路由表,即本地路由表,主路由表和默认路由表,三个优先级递减(数字越大优先级越小),也就是查询顺序递减。我们先需要知道怎么样得到这三张路由表先。三张路由表就是三个规则,所以需要看看下面的路由信息结构规则结构体。 表255: 本地路由表(local ) 本地接口地址,广播地址,已及NAT地址都放在这个表。该路由表由系统自动维护,管

qq_39005860的博客 419

14、网络切片技术:原理、应用与挑战

本文详细探讨了网络切片技术的原理、应用场景及其在5G网络中的重要性。网络切片作为一种关键的网络架构技术,能够在同一物理网络上创建多个独立的逻辑网络,以满足不同应用对安全性、可靠性和性能的多样化需求。文章深入分析了网络切片在5G、SDN/NFV等技术背景下的发展与挑战,并探讨了其在制造业、交通运输、零售等多个行业的实际应用。此外,还介绍了网络切片的部署流程、未来发展趋势以及相关技术难点,为读者全面了解网络切片技术提供了有价值的参考。

palm99的专栏 253

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: linux网络协议栈分析笔记13-路由3-FIB2
下一篇: 敏捷地写博客
白水煮鸡蛋
博客等级 码龄15年 106粉丝 46原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值