路由的基本元素:
下面列出了一些术语定义:
互联网服务提供商(ISP)。
转发信息库(路由表)。
对称路由和非对称路由:一般来说,如果从主机A到主机B的路由与从主机B返回A的路由相同,这种路由称为对称路由,否则,叫非对称路由。
Metrics:一条路由配置上的一个可选参数。不要和路由协议中使用的metric混淆了。后者用于衡量一条路由的好坏。
Realm:一个用数值表示的域标识。
地址分类:IP地址被分为A,B,C,D,E类。
可路由地址和不可路由地址:IP规范中已经将一些特定范围内的地址规定为不可路由地址,如下图:
Scope:
在Linux中,路由的scope表示到目的网路的距离。下面是ip地址常用的scope:
主机(Host):当一个地址只能用于主机自身的内部通信时,其scope为主机。如127.0.0.1
链路(Link):当一个地址只在一个局域网内有意义时,该地址的scope为链路。
全域(Universe):当一个地址可以在任何地方使用时,其scope为全域,这是大多数地址的默认scope。
默认网关:
默认网关经常作为0.0.0.0/0路由,就是当没有其他到达目的地的确定路由时使用的路由。
定向广播:
Linux内核的路由子系统不允许丢弃任何定向广播(但你可以使用过滤系统来清除定向广播)。Linux对目的为广播地址的ICMP ECHO REQUEST 封包做特殊处理:当目的地址为本地子网广播地址时,管理员可以配置是否做出响应。
主地址与辅地址:
当在一个接口上配置一个IP地址时,同时也需要提供一个子网掩码,如果没有提供子网掩码,系统会选择一个默认的子网掩码。当配置一个地址时,如过该地址与同一个NIC上已经配置的地址在同一子网内,那么该地址被视为辅地址,因此地址的配置顺序很重要。下面举一个例子:
eth0上配置了10.0.0.1/24,然后又配置了10.0.0.2/24,那么前者就是主地址,后者是辅地址,可以添加多个辅地址。对一个特定的子网掩码,只能有一个主地址。但是如果又配置了10.0.0.3/25,那么该地址会成为另一个主地址。当删除一个主地址时,所有相关的辅地址都会被删除。但可以通过配置/proc,在主地址被删除时,让辅地址提升为主地址。
老版本的配置:接口别名
ifconfig是旧版本的接口配置命令,它不区分主地址和辅地址,甚至不显示辅地址。利用ifconfig在一NIC上配置多个地址的唯一方法就是定义类似eth0:0,eth0:1等虚拟设备,每个虚拟设备都可以当做一个真正的NIC使用,你可以在上面配置一个地址。举个例子:如果使用ip工具在eth0上配置了一个ip,然后使用ifconfig在别名设备eth0:0上又配置了一个IP地址,那么,eth0上配置的那个ip就是主地址。另外,ip工具不能在别名设备上配置多个地址,和ifocnfig不同,它没有将别名设备看做真正的设备。
路由表:
默认情况下,Linux使用两张路由表:一张用于本地地址,从该表中查找成功表明封包要提交给主机自己,一张用于所有其他路由,其数据项可以手动插入。
路由动作:
默认的路由动作是转发,但Linux允许用户根据需要来定义其他动作:
黑洞(black hole):将匹配的封包悄悄丢弃。
不可到达:丢弃封包,并发送icmp不可达到的信息。
禁止:丢弃封包,生成一个icmp封包被过滤的消息。
放弃:与策略路由联合使用。若匹配,路由器放弃查找当前路由表,继续查找其他路由表(如果存在的话)。
路由表和路由缓存:
路由缓存的垃圾回收:
同步回收:当内存不够用时,立即回收内存。
异步回收:使用一个周期性的定时器触发定期清理操作。
查找:
在有多条路由匹配的情况下,选择最长前缀匹配的路由。当有两条相同的最长前缀时,根据tos来区分获胜者(路由查找搜索的关键字中包含tos)。若根据tos也无法选出路由,优先级更高的路由被选中,若优先级一样,内核会简单选中第一条。
封包接收与传输:
arp封包不需要进行路由,但是arp需要查找路由表强化合理性检查。(参见二十八章)
通常一个封包只需要一次路由查找,但也有例外,比如IP-over-IP,在取出其有效载荷后,再进行一次路由查找。