网络中各种网络设备对业务数据的转发主要有二层转发和三层转发。二层转发主要由交换机在同一个VLAN内实现,其转发依据是MAC地址表。如果MAC地址表中存在目的MAC地址表项,就从对应接口发出去,否则会从所有接口都发出去寻找接收者,同时,对ARP请求等广播帧也会从所有接口发出去。二层转发的特点导致可能存在环路,需要STP等协议防止二层环路。
三层转发主要由三层交换机或路由器在不同VLAN间或不同网段间实现,其转发依据是路由表。如果路由表中有目标网段的路由表项,就从对应接口或下一跳发出去,否则就把数据包丢弃。同时,三层转发不会在不同网段间转发广播包。
那么,是不是说三层转发没有环路呢?
并不是!我们在《网络工程师(10):让路由告诉你该去哪》一文中曾介绍了静态路由。如果因为静态路由配置错误,依然会造成环路。
如图中,在RTA上配置静态路由,目标网段20.0.0.0/24的下一跳为RTC,RTC上配置目标网段20.0.0.0/24的下一跳为RTB,而RTB上错误地配置的目标网段20.0.0.0/24的下一跳为RTA。
其实,这样并不会有环路!不同的路由来源拥有不同的优先级。20.0.0.0/24网段是RTB的直连路由,拥有最高优先级,即使在RTB上配置了目标网段20.0.0.0/24的静态路由,也不会选择。
那么,如果RTB连接PC的链路故障了呢?
这时,由于RTB上20.0.0.0/24的直连路由消失,所配置的静态路由就起作用了,于是形成了环路:RTA把目的地址为20.0.0.1的数据包发给RTC,RTC发给RTB,RTB又发给RTA,RTA再发给RTC,如此循环下去!
数据包会永远循环下去吗?
事实上,在设计IP协议时就考虑到了这个问题。如果网络中因为配置或其他错误而造成路由环路,由IP协议报文封装中的TTL字段来解决,避免永远循环下去。
IP封装中的TTL字段字面意思是Time to Live包生存时间,实际上和时间没什么关系。路由器在转发数据包之前,会先把TTL字段内容减去1,如果结果大于零,则正常转发给下一跳,如果结果为零,则把数据包丢弃。
所以,三层转发不像二层转发,没有专门的协议来防止路由环路。三层转发的环路一是依靠TTL,二是依靠路由协议本身来考虑。
我们所说的路由表,通常是指IP路由表,也叫全局路由表。每台网络设备只有一个全局路由表,路由器转发数据也是查找全局路由表。
但并不是说路由器只有一个路由表,事实上,除了直连和静态路由,每个动态路由协议都有自己的路由表,如RIP路由表、OSPF路由表、BGP路由表,等等。
所以,为了正确选择路由,不同的路由来源拥有不同的优先级(思科叫管理距离),包括直连、静态及各种动态路由协议。如果目标网段和掩码都相同,会优选优先级最高的路由来源加入全局路由表;如果路由来源相同,则优选开销最小的路由加入全局路由表;如果都相同,那么都加入到全局路由表中,称为多路径等值路由或等价路由,可以实现负载分担。
有了路由表,路由器就可以根据路由表来转发三层数据包了。当路由器收到一个数据包,先遍历整个全局路由表,如果没有找到匹配项,则丢弃数据包,否则在找到的所有匹配项中选择掩码最长的路由表项,查看该表项的下一跳地址是否是路由器的直连路由,如果是直连,把数据包送到对应接口,封装为帧后发给目标电脑。如果不是直连,则解析下一跳的MAC地址,封装为帧后发给下一跳路由器。