六、路由转发
1、最长匹配原则
最长匹配原则 是支持IP路由的设备默认的路由查找方式(事实上几乎所有支持IP路由的设备都是这种查找方式)。当路由器收到一个IP数据包时,会将数据包的目的IP地址与自己本地路由表中的表项进行逐位(Bit-By-Bit)的逐位查找,直到找到匹配度最长的条目,这叫最长匹配原则。
这里有几个概念要先搞清楚:
上图,这是一个形象化的二维空间图。深灰色的空间 172.16.0.0/16,这个网络号我们称为主类网络号。
主类网络号:意思是该网络号按照其所属的IP地址类别区分后,对应上的默认的子网掩码长度后得到的网络号。
如:172.16.0.0 这是一个B类地址,B类地址的默认子网掩码长度是16位,因此 172.16.0.0/16 本身就是一个主类网络号。
如:10.1.12.0/24,首先10开头的,这是一个A类地址,A类地址默认的掩码是 255.0.0.0,因此10.1.12.0/24 它的主类网络号是 10.0.0.0/8。
上图,从172.16.0.0/16开始往上走,下一个网络号是172.16.10.0/24,很明显是应用了(VLSM)可变长子网掩码之后,得到的一个172.16.0.0/16这个主类网络的一个子网。
子网(subnet):可以理解为是在网络号所属类别的默认掩码长度的基础上,将掩码“拉长”或者向主机位借位从而得到的一个子网络号。
实际上172.16.0.0/16 是将172.16.10.0/24 囊括在内的一个区间。那么在这里,如果我们有一个IP 172.16.10.1,实际上这个IP既可以理解为在172.16.0.0/16网络内,也是在172.16.10.0/24 网络内,当然,这里我们能看出来,谁更能精确匹配172.16.10.1 这个IP呢?很明显是 172.16.10.0/24 更精确,我们说,它的匹配长度相比172.16.0.0 更长。
当然子网172.16.10.0/24还可以进一步划分子网,得到172.16.10.0/30,甚至172.16.10.1/32,那么如果这些前缀都存在的情况下,当我要去查找172.16.10.1,谁的匹配度最高呢?很明显,是 172.16.10.1/32 这条主机前缀,或者说,主机路由,对吧?这就是最长匹配原则。
回到 172.16.0.0/16 这个主类网络号,然后我们向下走,看上图。172.0.0.0/8 实际上是将这个B类地址的掩码向左移了8bits,这样一来得到的这个网络号实际上是囊括了 172.16.0.0/16 在内的一个大的网络号,我们称其为 超网。
下面我们通过一个具体的例子来深入理解最长匹配原则:
路由表一共有三个条目:172.16.1.0/24、172.16.2.0/24、 172.16.0.0/16,这三个路由条目分别指向不同的出接口。那么当路由器收到一个数据包,去往172.16.2.1的时候,它怎么做决策呢?
很简单,把三个路由条目都写成二进制,对应上路由条目各自的掩码(前缀长度),掩码为1的位是需要严格匹配的,掩码为0的位则无所谓(图中标识x的位)。
然后把数据包的目的IP地址:172.16.2.1也写成二进制,接下去就是从左往后的逐位匹配。剔除不匹配的路由条目1,剩下路由条目2和3,由于目的地址172.16.2.1和路由条目172.16.2.0/24的匹配长度最长,因此路由条目2胜出,最终数据包被从接口S1转发出去。这就是最长匹配原则。
最长匹配示例
下面看几个宏观的例子:
上图,当R1收到一个数据包,去往172.16.1.1,数据包将命中那一条路由呢?那么实际上,172.16.1.1是“掉落”在172.16.1.0/24及172.16.0.0/16网络中的,两者貌似皆可,但是172.16.1.0/24显然,匹配度要更长,因此,最终这个数据包根据路由条目“172.16.1.0/24”的指示被转发给了R2。
同理若有数据包去往172.16.2.1呢?首先路由表中172.16.1.0/24这条前缀肯定是不匹配的,最后172.16.2.0/24这个条目匹配度最高,因此数据被从S1口扔给了R3。
而当有数据包去往172.17.1.1时,由于172.16.1.0/24及172.16.0.0/16这两条路由均不匹配,于是数据只能“求助于”0.0.0.0/0这条缺省路由,从S2口转发给R4。
下面我们总结一下路由器关于路由查找的几个重点内容:
不同的路由前缀(注意路由前缀包含网络号+掩码,缺一不可),在路由表中属于不同的路由。
相同的路由前缀,通过不同的协议获取,先比优先级,优选优先级小的,后比cost。这是一般情况,当然有二般情况,这就要看特定的环境和特定的路由协议了。
默认采用最长匹配原则,匹配,则转发;无匹配,则找默认路由,默认路由都没有,则丢弃。
路由器的行为是逐跳的,到目标网络的沿路径每个路由器都必须有关于目的地的路由。
数据是双向的,考虑流量的时候,要关注流量的往返。
根据最长匹配原则进行匹配,能够匹配192.168.2.2 的路由存在两条,但是路由的掩码长度中,一个为16 bit,另一个为24 bit,掩码长度为24 bit的路由满足最长匹配原则,因此被选择来指导发往192.168.2.2的报文转发。
根据最长匹配原则匹配,能够匹配到192.168.3.2的路由只有一条,此路由为最终转发依据。
路由器查找FIB表时,将报文的目的IP地址和FIB表中各表项的掩码进行按位“逻辑与”,得到的地址符合FIB表中的网络地址则匹配。最终选择一个掩码最长的FIB表项转发报文。
FIB表信息查看命令:display fib【slot-id】
slot-id:显示指定槽位号的FIB表信息。整数形式,取值范围请根据设备实际配置选取.
FIB表中的字段说明:
Total number of Routes:路由表总数。 Destination/Mask:目的地址/掩码长度。
Nexthop:下一跳。
Flag:当前标志,G、H、U、S、D、B的组合。
G(Gateway):网关路由,表示下一跳是网关。
H(Host):主机路由,表示该路由为主机路由。
U(Up):可用路由,表示该路由状态是Up。
S(Static):静态路由。
D(Dynamic):动态路由。
B(Black Hole):黑洞路由,表示下一跳是空接口。
TimeStamp:时间戳,表示该表项存在的时间,单位是秒。
Interface:到目的地址的出接口。
TunnellD:表示转发表项索引。该值不为0时,表示匹配该项的报文通过隧道转发(如:MPLS隧道转发)。该值为0时,表示报文不通过隧道转发。
如果一个数据包的目的IP地址是10.3.3.3,路由器将会把这个数据包从哪个接口转发出去呢?
FIB表中每条转发项都指明到达某网段或某主机的报文应通过路由器的哪个物理接口或逻辑接口发送,然后就可到达该路径的下一个路由器,或者不再经过别的路由器而传送到直接相连的网络中的目的主机。
2、路由转发流程
1、来自10.0.1.0/24网段的IP报文想要去往40.0.1.0/24网段,首先到达网关。
2、网关查找路由表项,确定转发的下一跳、出接口,之后报文转发给R2。
3、报文到达R2之后,R2通过查找路由表项转发给R3。
4、R3收到后查找路由表项,发现IP报文目的IP属于本地接口所在网段,直接本地转发。最终该报文被发往目的主机。
IP路由表小结
当路由器从多种不同的途径获知到达同一个目的网段的路由(这些路由的目的网络地址及网络掩码均相同)时,会选择路由优先级值最小的路由;如果这些路由学习自相同的路由协议,则优选度量值最优的。总之,最优的路由加入路由表。
当路由器收到—个数据包时,会在自己的路由表中查询数据包的目的IP地址。如果能够找到匹配的路由表项,则依据表项所指示的出接口及下一跳来转发数据;如果没有匹配的表项,则丢弃该数据包。
路由器的行为是逐跳的,数据包从源到目的地沿路径每个路由器都必须有关于目标网段的路由,否则就会造成丢包。
数据通信往往是双向的,因此要关注流量的往返(往返路由)。
3、如何根据掩码来确定IP地址网段
如何确定子网掩码和判断IP地址的网段。通常我们在划分vlan的时候会使用以下例子:
创建vlan1:IP地址:192.168.1.1 子网掩码:255.255.255.0
创建vlan2: IP地址:192.168.2.1 子网掩码:255.255.255.0
那么他们是不是在同一个网段呢?平时配置IP地址较多的朋友,可以直观的判断,他们并不是属于同一个网段,那么如何计算呢?要想判断两个IP地址是不是在同一个网段,只需将IP地址与子网掩码做与运算,如果得出的结果一样,则这两个IP地址是同一个子网当中。
详细计算
将ip地址192.168.1.1转换为二进制 将子网掩码255.255.255.0转换成二进制
11000000 10101000 00000001 00000001 11111111.11111111.11111111.00000000
将两者相“与(and)"运算:
11000000 10101000 00000001 00000001
11111111.11111111.11111111.00000000
然后得到:
11000000 10101000 00000001 00000000 转换成网络号就是:192.168.1.0
将ip地址192.168.2.1转换为二进制 将子网掩码255.255.255.0转换成二进制
11000000 10101000 00000010 00000001 11111111.11111111.11111111.00000000
然后将两者相“与(and)"运算:
11000000 10101000 00000010 00000001
11111111.11111111.11111111.00000000
然后得到:
11000000 10101000 00000010 00000000 转换成网络号就是:192.168.2.0
很明显,二者的结果是不一样的,一个是网段192.168.1.0,一个是网段192.168.2.0,所以不是一个网段。
案例2
IP地址1:192.168.1.1 子网掩码:255.255.252.0
IP地址2:192.168.2.1 子网掩码:255.255.252.0
很明显,我们这个和上面例1的IP地址是一样的,只是子网掩码不一样,如果不看子网掩码,首先可能就判断他们不是同一个网段。
这里面和上面例1中唯一变化就是子网掩码从255.255.255.0换成了255.255.252.0了,那我们来看下,他们是否属于同一个网段。
详细计算
将ip地址192.168.1.1转换为二进制 将子网掩码255.255.252.0转换成二进制
11000000 10101000 00000001 00000001 11111111.11111111.11111100.00000000
然后将两者相“与(and)"运算:
11000000 10101000 00000001 00000001
11111111.11111111.11111100.00000000
然后得到:11000000 10101000 00000000 00000000 转换成网络号就是:192.168.0.0
将ip地址192.168.2.1转换为二进制 将子网掩码255.255.252.0转换成二进制
11000000 10101000 00000010 00000001 11111111.11111111.11111100.00000000
然后将两者相“与(and)"运算:
11000000 10101000 00000010 00000001
11111111.11111111.11111100.00000000
然后得到:11000000 10101000 00000000 00000000 转换成网络号就是:192.168.0.0
很明显,二者的结果是一样的,都是属于192.168.0.0网段,所以他们是同属于一个网段。
当然,如果对子网较熟了就不需要经过这些运算了,大部分的网段可以通过分析子网掩码与IP地址就可以判断出来是否属于网一网段,但前提是你需要熟悉网段的原理与运算的方法。
4、如何根据ip地址推算子网掩码
确定IP地址子网掩码,大部分的情况下,我们网络中只要不超过254台主机的的话,子网掩码都可以设置成255.255.255.0。那么超过了254台主机的话怎么办呢?
可以划分vlan,也可以设置成一个大网段,划分vlan我们就不说了,上面有例子,设置成一个大网段就有一个难点,如何确定这个大网段里面的子网掩码呢?
例如:假设监控网络中有600个点位,我们现在也不想把它划分vlan(实际项目中大部分是会划分vlan的),假设只想用一个大网段把这600个点位分配IP地址,如何设置IP地址,如何确实子网掩码?
分析:首先我们知道600个点位,可以使用3个254个IP地址段来分配。可以使用
IP段一:192.168.0.1——192.168.0.254
IP段二:192.168.1.1——192.168.1.254
IP段三:192.168.2.1——192.168.2.254 每个网段有254个IP地址,完全够600个点位用的。
那么问题来了,如果要使这三个IP段在同一个网段内,那么这个大网段共同的子网掩码是多少呢?我们来分析下:
将IP地址192.168.0.1转换为二进制 11000000 10101000 00000000 00000001
将IP地址192.168.1.1转换为二进制 11000000 10101000 00000001 00000001
将IP地址192.168.2.1转换为二进制 11000000 10101000 00000010 00000001
转换成了二进制,可以看得出,三个IP段的二进制前面22位的是不变的,那么可以将他们表示成:
IP段一:192.168.0.1/22 IP段二:192.168.1.1/22 IP段三:192.168.2.1/22
这种192.168.2.x/22形式的IP地址相信大家平时都见过,就是已经告诉了子网掩码了。也就是说他们共同的子网掩码二进制前面22个都是1。
11111111 11111111 11111100 00000000
转换成十进制,那就是255.255.252.0,所以他们共同的子网掩码就是255.255.252.0。
当然在实际项目中,与网络接触较多的人不需要通过一系列的换算,直接可以通过简单的判断估算出来这个大网段的子网掩码,因此,今天是讲原理,方便大家理解,所以所有的换算都是通过运算出来的。
整个华为数通学习笔记系列中,本人是以网络视频与网络文章的方式自学的,并按自己理解的方式总结了学习笔记,某些笔记段落中可能有部分文字或图片与网络中有雷同,并非抄袭。完处于学习态度,觉得这段文字更通俗易懂,融入了自己的学习笔记中。如有相关文字涉及到某个人的版权利益,可以直接联系我,我会把相关文字删除。【VX:czlingyun 暗号:CSDN】