路由与路由表
决定一个入口报文送给本地主机还是转发所需要的信息,以及转发时正确转发所需要的的信息,都存储转发信息库中FIB(Forwarding Information Base),也简称为路由表。路由表是由许多路由的集合,一条路由是一组参数,这些参数存储了到一个给定目的地转发流量的所有信息。一条路由所需要的最少参数集合:
- 目的网络
- 出口设备:与路由匹配项从该设备发送出去。
- 下一跳网关:当目的网络和本地主机不是直接相连时,需要其他路由器转发。下一跳网关就是指该路由器的地址。
路由的基本元素
对称路由和非对称路由:即来路由和回去路由是否一致来区分二者。
Metric是在一条路由上配置的一个可选参数,这些metric可被TCP用作内部变量的初值,也可以被TCP协议改变。如Path MTU,窗口,往返时间rtt,拥塞窗口等。
可路由地址与不可路由地址:IP规范中将特定范围内地址规定为不可路由地址,这些地址只能保留在局域网内使用。可路由地址必须是全球唯一的,不可路由地址不可以被提供因特网服务。如果不可路由地址主机需要和外部主机通信,路由器必须使用网络地址转换(NAT)隐藏本地不可路由子网。不可路由地址如下:
Scope
路由和IP地址都可以指定一个Scope,用来告诉内核这些IP地址在什么情况下有意义、可被使用。在Linux中路由的Scope表示到目的网络的距离。
常用Scope:
- 主机(Host):该地址只用于主机内通信,其Scope就是主机。例如回环地址127
- 链路(Link):当一个地址只在局域网内使用时,该地址的Scope就是链路。例如子网的广播地址。
- 全域(Universe):当一个地址可以在任何地方使用时,其Scope为全域。这时大多数地址的默认Scope。
Scope用于路由时表示的意思是
- 主机(Host):这一条路由表示的目的地是本地主机时,其Scope就是主机。
- 链路(Link):这一条路由表示的目的地是本地网络时,其Scope就是链路。
- 全域(Universe):这一条路由表示的地址超过一个下一跳时,其Scope为全域。
广播地址和回环地址又内核自动设定合适的Scope。
默认网关
当没有其他到达目的地的确定路由时使用的路由。
定向广播
广播报文时一个发往子网广播地址的简单报文。子网广播通常位于同一个子网中的主机发起。广播报文目的地是子网内所有的主机。
定向广播目的地是远端子网的广播地址。
主机地址与辅助地址
同一个NIC可以配置多个IP地址,某地址为主地址,某些为辅助地址。
路由表
路由表时路由子系统的核心,由路由数据库组成。
特殊路由
收到报文后需要决定将这个报文提交给本地协议栈还是转发,Linux使用一个独立的HASH表,表中只存本地地址,这张路由表中存储所有的监听地址,包括本地配置地址,也包括子网广播地址。
默认情况下linux使用两张路由表:
- 一张存储本地地址,从该表查找成功表明报文传递给自己。
- 一张表用于所有其他的路由。
路由类型与动作
Linux允许用户自定义报文匹配路由时的动作,默认动作为转发:
- 黑洞(Black hole)悄悄丢弃
- 不可到达 报文被丢弃产生ICMP主机不可达消息
- 禁止 报文被丢弃,生成ICMP报文被过滤
- 放弃 报文与该策略匹配,路由器放弃查找当前路由表,继续查找下一张表。
路由缓存
LInux将路由缓存分成两部分
- 与协议相关的缓存
- 与协议无关的缓存,通常被称为DST
Linux系统可以创建多个独立的路由表支持策略路由,但是只有一个路由缓存。
路由表与路由缓存
路由表使用子网连续地址存储,而缓存项与单个IP地址关联。
路由缓存垃圾回收
垃圾回收负责清理路由子系统不再使用的数据结构,被使用的数据结构也可以被删除,如为了存储更为重要的信息需要立即释放内存。回收操作不会导致数据丢失,只会导致缓存查找不命中。
垃圾回收机制:
- 同步回收 路由子系统认为需要释放内存时可以立即清理。如添加新的路由项,而缓存已经达到阈值或者邻居子系统需要内存。
- 异步回收 使用一个定时器周期性的触发清理操作。
路由查找
路由缓存查找使用hash算法寻找完全匹配项。
在路由表中查找基于最长前缀匹配算法(LPM)算法。到达一个目的地址存在多条路由,在有多条路由匹配情况下,路由算法使用LPM算法选择最佳路由,即子网最小或者子网掩码最长的路由。