细说路由表
路由表,其实就是将路由空间(所有潜在的目的地,上限为 232),映射为本地物理接口/软件接口。
如果要将232个IP一一映射为本地接口,那么路由表将变得异常庞大,没有必要一一映射。对于主机来说,通常就两个接口,一个硬件接口、一个软件接口。
软件接口的IP = 127.0.0.1/8,那么只需要一条路由即可到达目的地127.0.0.1/8,对应接口为软件接口。硬件接口的IP通常是由DHCP Server分配的,比如 192.168.1.2/24,系统根据这个IP立马就生成一条路由,指向192.168.1.0/24,对应接口为硬件接口。
除了以上两个目的地,如何用最干练的路由表来高度归纳,其实很简单:
0.0.0.0/0 ----- > 硬件接口。对于普通的主机来说,以上三条路由就可以映射整个232个IP地址空间。
如果一个主机拥有两块硬件出口,路由表又如何变化呢?
至少要增加一条0.0.0.0/0 ----- > 另外一个硬件接口
主机有两条0.0.0.0/0路由,分别映射接口A、B,谁是更优的接口?
这就完全要看主机的操作系统的选择了,通常可以根据路由表的metric大小来优选,谁小用谁。如果一样呢,那么就负载均衡。路由表对于主机就是这么简单,可是对于路由器来说,就没有那么简单了。
主机生成路由表的逻辑是根据接口的IP、网络掩码、以及缺省网关来动态生成的。
路由器则没有那么简单,路由器为了与自己的邻居交换各自的路由表,运行了很多路由进程,比如OSPF路由进程、BGP路由进程。每个进程都独立自主运行着,然后将路由进程认为最优的路由表,尝试写入全局路由表。全局路由表的监控进程也不是那么好糊弄的,如果有多个路由进程都试图写入同样的路由表,比如17.0.0.0/8,哪个进程的路由表更优呢?是OSPF进程还是BGP进程?
通常每个厂商的路由器优选名称也不一致,Cisco优选名称为AD,Juniper优选名称为Preference,谁的值越小,谁更优。
以Cisco为例,默认EBGP的AD=20,而OSPF的AD= 110,那么自然会优选BGP的路由条目。问题来了,来自BGP路由进程的17.0.0.0/8一定会进入全局路由表?
不一定!为什么?因为BGP路由表的下一跳不是本地出接口,而是一个IP地址。如果这个下一跳可以通过全局路由表到达,那么这个BGP路由就可以进入全局路由器。否则就无法进入。
接下来会发生什么?由于BGP的路由条目17.0.0.0/8下一跳不可达,就失去了与OSPF竞争的机会,那么够资格进入全局路由表的,就只剩下OSPF了,那么OSPF的路由条目进入全局路由表。