《深入理解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 ...
随机推荐
- 详解Java中格式化日期的DateFormat与SimpleDateFormat类
DateFormat其本身是一个抽象类,SimpleDateFormat 类是DateFormat类的子类,一般情况下来讲DateFormat类很少会直接使用,而都使用SimpleDateFormat ...
- 折腾WordPress感想
以前在cnblogs上写博客没感觉什么,一旦要搭建自己的博客,我感觉好麻烦啊,具体就体现在一下方面: 1. 域名得要申请 2. 还要购买虚拟机 3. 自己搭建php,mysql,wordpress,a ...
- css3兼容代码
1. 渐变:.gradient{ width:300px; height:150px; filter:alpha(opacity=100 finishopacity=50 style=1 startx ...
- 控件禁用与启easyui用
1.validatebox可以用的用法:前两种适用于单个的validatebox;第三种应用于整个form里面的输入框; <1>.$("#id").attr(" ...
- Django升级到1.10,MEDIA_ROOT发生TypeError错误
Getting error: “TypeError: view must be a callable or a list/tuple in the case of include().” when r ...
- Enterprise Architect UML建模
UML建模 前言 UML建模资料已经很多了,有人想用有人不用,有人会用也有人不会用,本文只是作者的一篇UML建模总结,不想去写太细,因为真正的你去用下,去画下就基本都会了.工具毕竟是工具,设计和思想才 ...
- (转)java Exception层次结构详解
转自:http://www.importnew.com/14688.html 1. JAVA异常层次结构 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程 ...
- (转)javascript日期格式化扩展
转自:http://blog.csdn.net/vbangle/article/details/5643091 javascript Date format(js日期格式化) 方法一:这个很不错, ...
- 【Raspberry pi】GPIO使用指南
http://www.cnblogs.com/qtsharp/archive/2013/02/28/2936800.html 树莓派RaspberryPi的RPi.GPIO使用指南 Python操 ...
- ADO编程:error C2011: 'LockTypeEnum' : 'enum' type redefinition
C++ Code 123 // Import the ADO type library #import "C:\\Program Files\\Common Files\\syste ...