《深入理解Linux网络技术内幕》阅读笔记 --- 路由基本概念
一、路由的基本概念
1、一条路由就是一组参数,这些参数存储了往一个给定目的地转发流量所需的信息,而一条路由所需的最少的参数集合为:(1)目的网络,(2)出口设备,(3)下一跳网关
2、路由中的相关术语:(1)对称路由:如果从主机A到主机B的路由与从主机B返回主机A的路由相同,这样的路由称为对称路由,(2)metric:是一条路由上配置的可选参数,不要与路由协议中的metric混淆,后者用于衡量一条路由的好坏,路由协议metric的例子有端到端延迟(end-to-end delay),跃点数(the number of hops),配置权值(weight)或开销(cost)等
3、IP地址的Scope:在Linux中,IP地址的scope表示该IP地址距离本地主机有多远。IP地址常用的scope:(1)、主机(host):当一个地址只用于主机自身的内部通信时,其scope为主机,在这个主机以外不知道该地址,并且不能被用于外部通信。(2)、链路(link):当一个地址只在一个局域网内有意义且只在局域网内使用时,该地址的scope为链路。(3)、全域(Universe):当一个地址可以在任何地方使用时,其scope为全域,这是大多数地址的默认scope。需要注意的是,scope不能反映不可路由(私有)与可路由(公开)地址之间的区别,两者都可以是链路或全域
4、路由的Scope:路由的scope表示到目的网络的距离,路由常用的scope:(1)、主机(host):当一条路由表示目的地址为本地主机时,其scope为主机,(2)、链路(link):当一条路由表示的目的地址为本地网络时,其scope为链路,(3)、全域(universe):当一条路由表示的目的地址超过下一跳时,其scope为全域
5、主地址与辅助地址:当在一个接口上配置一个IP地址时,同时需要提供一个子网掩码,否则系统将根据IP所属的类来自动选择一个默认的子网掩码只能有一个主地址,而对于不同的子网掩码,即使两个子网覆盖的地址有重叠,也会各自拥有一个主地址。注意:当主机为本地生成的流量选择源IP地址时,只考虑主地址
6、Linux中使用一张独立的、基于Hash的路由表,该表只存储本地地址,更准确的说,在这张路由表中存储所有监听到的地址,既包括本地配置的地址,也包括子网广播地址。在默认情况下,Linux使用两张路由表:一张表用于本地地址,从该表中查找成功表明封包要提交给主机自己,另一张用于其他所有的路由,其数据项可由用户手工配置或路由协议动态插入
7、路由查找:当根据最长前缀进行匹配时,如果有多条路由都满足,则根据查找搜索关键字中的服务类型(Type of Service, TOS)进行选择。若根据TOS也无法选择路由,则优先级更高(优先权值较低)的路由被选中。如果根据优先级也无法选出路由,内核就简单地选择第一条
二、Linux内核中路由相关的主要数据结构
在数据结构名称中的rt、fib与fn前缀分别表示路由(route),转发信息库(Forwarding Information Base)和功能(function)
- struct fib_result:对路由表查找后返回该结构,它的内容并不是简单的包含下一跳信息,而且包含其他特性,例如策略路由所需的更多参数。
- struct fib_rule:表示由策略路由在路由流量时选择路由表的规则
- struct fib_node:一条路由表项。例如,该数据结构用于存储由route add或ip route add命令添加一条路由时生成的信息。
- struct fn_zone:一个zone表示子网掩码长度相同的一组路由
- struct fib_table:表示一张路由表
- struct fib_info:不同路由表项之间可以共享一些参数,这些参数被存储在fib_info数据结构中,当一个新的路由表项所用的参数与一个已经存在的路由表项所用的参数匹配时,则重复使用已经存在的fib_info结构。一个引用技术用于跟踪该结构重复使用的次数
- struct fib_alias:达到相同网络的路由,因为其他一些参数而不同,例如TOS,不同的路由是通过fib_alias实例来区分的
- struct fib_nh:表示下一跳
- struct fn_hash:该结构包含指向33个fn_zone链表头的指针,以及一个链表。这个链表将活动的zone(active zone,即那些至少有一个元素的zone)链接在一起,链表中的元素按照子网掩码长度的降序排列
- struct fn_zone_list:非空的fn_zone bucket被链接在一起,该链表的头保存在fn_zone_list中
- struct fib_info_hash:所有fib_info结构被插入到这个hash表中,用fib_find_info函数来查找该表
- struct fib_info_laddrhash:只有在路由表项有一个首选源地址时,才将fib_info结构插入到这个表中。这个hash表主要是为了方便地删除由于删除了本地配置IP地址而影响的路由
- struct flowi:类似于访问控制列表(ACL):它是根据从L3与L4包头中选择的字段值,例如,IP地址、L4端口号等,来定义一个流量集,可以将它用来作为路由查找时的搜索关键字
路由缓存相关:
1、struct dst_entry:表示路由缓存项中与协议无关的部分(DST)。适用于任何L3协议的路由表缓存项字段被放在该结构内,在L3协议所用到的数据结构内,通常嵌入该结构来表示路由缓存项
2、struct dst_ops:表示DST核心代码使用虚函数(VFT),该表用于向三层协议通知特定的事件。每个三层协议各自提供一组函数,按照自己的方式来处理这些事件,并不是所有的协议都使用VFT的每一个字段
3、struct rtable:在IPv4中表示一条路由表缓存项的数据结构,在IPv6中使用struct rt6_info
每个单独的子网对应一个fib_node实例,用变量fn_key识别,它的值就表示该子网。例如,对于子网10.1.1.0/24,fn_key为10.1.1。目的子网相同的不同路由(即fn_key相同)共享同一个fib_node。每条路由有自己的fib_alias结构。每个fib_alias实例都与一个fib_info结构相关联,该结构保存着真实路由信息(即如何到达目的地)。
《深入理解Linux网络技术内幕》阅读笔记 --- 路由基本概念的更多相关文章
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- 深入理解linux网络技术内幕读书笔记(十)--帧的接收
Table of Contents 1 概述 1.1 帧接收的中断处理 2 设备的开启与关闭 3 队列 4 通知内核帧已接收:NAPI和netif_rx 4.1 NAPI简介 4.1.1 NAPI优点 ...
- 深入理解linux网络技术内幕读书笔记(九)--中断与网络驱动程序
Table of Contents 1 接收到帧时通知驱动程序 1.1 轮询 1.2 中断 2 中断处理程序 3 抢占功能 4 下半部函数 4.1 内核2.4版本以后的下半部函数: 引入软IRQ 5 ...
- 深入理解linux网络技术内幕读书笔记(四)--通知链
Table of Contents 1 概述 2 定义链 3 链注册 4 链上的通知事件 5 网络子系统的通知链 5.1 包裹函数 5.2 范例 6 测试实例 概述 [注意] 通知链只在内核子系统之间 ...
- 深入理解linux网络技术内幕读书笔记(二)--关键数据结构
Table of Contents 1 套接字缓冲区: sk_buff结构 1.1 网络选项及内核结构 1.2 结构说明及操作函数 2 net_device结构 2.1 MTU 2.2 结构说明及操作 ...
- 深入理解linux网络技术内幕读书笔记(八)--设备注册与初始化
Table of Contents 1 设备注册之时 2 设备除名之时 3 分配net_device结构 4 NIC注册和除名架构 4.1 注册 4.2 除名 5 设备初始化 6 设备类型初始化: x ...
- 深入理解linux网络技术内幕读书笔记(七)--组件初始化的内核基础架构
Table of Contents 1 引导期间的内核选项 2 注册关键字 3 模块初始化代码 引导期间的内核选项 linux运行用户把内核配置选项传给引导记录,然后引导记录再把选项传给内核. 在引导 ...
- 深入理解linux网络技术内幕读书笔记(五)--网络设备初始化
Table of Contents 1 简介 2 系统初始化概论 2.1 引导期间选项 2.2 中断和定时器 2.3 初始化函数 3 设备注册和初始化 3.1 硬件初始化 3.2 软件初始化 3.3 ...
- 深入理解linux网络技术内幕读书笔记(六)--PCI层与网络接口卡
Table of Contents 1 本章涉及的数据结构 1.1 pci_device_id结构 1.2 pci_dev结构 1.3 pci_driver结构 2 PCI NIC设备驱动程序的注册 ...
- 深入理解linux网络技术内幕读书笔记(一)--简介
Table of Contents 1 基本术语 1.1 本书常用的缩写 2 引用计数 2.1 引用计数函数 3 垃圾回收 3.1 异步 3.2 同步 4 函数指针 4.1 缺点 5 goto语句 5 ...
随机推荐
- 2.请求库之requests
requests模块阅读目录: 介绍 基于GET请求 基于POST请求 响应Response 高级用法 一.介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requ ...
- 蓝牙(CoreBluetooth)-外部设备(服务端)
蓝牙(CoreBluetooth)-外部设备(服务端) 主要内容 1. 创建外部管理器对象 2. 设置本地外设的服务和特征 3. 添加服务和特征到到你的设置的数据库中 4. 向外公布你的的服务 5. ...
- C++忽略字符大小写比较
在项目中用到对两个字符串进行忽略大小写的比较,有两个方法实现 1.使用C++提供的忽略大小写比较函数实现 代码实现: /* 功能 :忽略大小写进行字符串比较 */ #ifdef __LINUX__ # ...
- PBOC联机交易中ARQC及ARPC的计算
金融IC卡在申请联机交易时,终端会进行发卡行认证,验证卡片的合法性,终端通过GAC得到卡片返回的ARQC,与终端自身产生的ARQC进行比较,如果一致,则说明是由发卡行发行的合法卡片,同时对ARQC及认 ...
- Unix系统编程()close系统调用
close系统调用关闭一个打开的文件描述符,并将其释放回调用进程,供该进程继续使用.当一进程终止时,将自动关闭其已打开的所有文件描述符. int close(int fd); 显式关闭不再需要的文件描 ...
- Java中模拟POST上传文件
/** * * @param url 请求URL * @param filePath 本地文件地址 * @return */ public static String upload(String ur ...
- 卧槽! JavaScript JVM运行Java!!
由于任何计算机语言都具有巨大的灵活性,软件世界变得有点疯狂.一旦你已经吸收了用这种语言编写的编译器的想法,那么它会编译还有什么可以留下来的?但是......用JavaScript编写的Java虚拟机J ...
- mogndb 慢查询
0 摘要 在MySQL中,慢查询日志是经常作为我们优化查询的依据,那在MongoDB中是否有类似的功能呢?答案是肯定的,那就是开启Profiling功能.该工具在运行的实例上收集有关MongoDB的 ...
- import _mysql----ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
背景:安装了mysql,练习sql 操作,提示 ImportError DLL load failed: %1 不是有效的 Win32 应用程序 解决方法: 操作系统win10,64位,查看安装的my ...
- css3学习笔记(一)
1. IE下的渐变: filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff',endColorstr='# ...