以太网接口设备写静态路由的时候为什么写下一跳ip地址?而不是出接口。(ensp模拟说明)
一、想要搞清楚这个问题,首先需要搞清楚下面几个基本问题:(ensp路由器举例)
1、重点:设备是如何看待并处理路由表中的直连路由和非直连路由的逻辑。非直连路由用静态和ospf举例。
2、设备的路由递归的本质是什么。
搞清楚上面的2两个问题就可以轻松明白,以太网接口设备写静态路由的时候写下一跳ip地址的原因。
二、
1、我们来先看第1个问题,设备如何处理直连路由和非直连路由的逻辑。
我们先按照正常的静态路由配置:就是配置下一跳ip地址,同时对应的ip路由表,如下:


讲解:
①、为什么路由表中显示直连网段的路由比如12.0.0.0/24路由的下一跳是设备自己的接口地址12.0.0.1?
直连路由下一跳为自身接口地址的核心原因:路由器的协议设计逻辑,本质是标识 “该网段为本地直连,无需跨三层转发”,直接走二层。
比如静态路由 23.0.0.0/24,下一跳是 12.0.0.2;此时正确的流程是:
假设:R1 ping 23.0.0.3,R1查看自己要去往 23.0.0.3,R1查路由表发现去往23.0.0.3是非直连路由需要三层转发,路由显示需要把数据包发给 12.0.0.2(R2)直连路由,R1 马上问:我怎么到 12.0.0.2?再查路由表:→ 12.0.0.0/24 是直连,从 G0/0/0 发出。直连的话,走二层,那么R1 不关心 12.0.0.2 这个 IP 本身,只关心它的 MAC,然后发 ARP → 拿到 12.0.0.2 的 MAC。此时R1中的数据包直接开始封装:二层封装的目标mac就是R2的mac,源mac就是R1的mac,然后三层封装的就是:12.0.0.1和23.0.0.3,封装完成,此时把数据包从g0/0/0接口发出,R2 收到后,解封装,查看是去往23.0.0.3的数据包,查看路由表是直连路由,走二层,此时直接询问对方的mac地址后,再对数据包进行封装,然后发出去,R3成功收到数据包。数据包从R3回包的流程原理是一样的。
总结:重点:也就是说,设备的路由表中但凡是出现下一跳(NextHop)是设备自身的接口地址时(就像上面的12.0.0.0/24的直连路由那样),那么,就是设备在区分该路由是直连路由和非直连路由。直连路由的话,那么下一跳就是自己的接口地址,非直连路由的话,下一跳就不是自己的接口的地址。
此时设备从而判断去往直连路由的时候---设备直接请求到对方的mac就可以封装数据包了。
设备查看需要去往非直连路由的时候---就需要根据路由表选择转发数据给下一跳设备了。
路由表中的下一跳 IP 只是设备判断是否查找直连网段MAC 的工具。
直连网段,那么就直接通过arp就能要到对方的mac地址。
走二层:就是R1需要到达直连网段的时候,arp直接拿到对方的mac,就可以封装数据包了。
走三层:R1去往23.0.0.3的话,R1判断需要查看路由表将数据包封装,转发给R2,重点是需要转发,这就是走三层的意思。
2、我们说下什么是路由递归(也称路由迭代)。非直连的静态路由需要路由递归。
①、递归路由核心含义是:这条路由的下一跳需要通过路由表中的其他路由条目,递归查询出最终的出接口。这里的重点是,必须在路由表中通过多次查询找出这条路由的最终的出接口。
②、出接口是转发的 “物理 / 逻辑出口”,决定了报文从路由器的哪个接口发出,是转发的 “硬件层面路径”。真正干活也就是出接口,出接口就是用来转发数据的。
重点理解:我们举例静态路由23.0.0.0/24这条路由条目,这条路由条目的下一跳不是R1设备的接口地址,那么意味着这不是直连路由,需要三层转发,同时经设备查看是静态路由,同时下一跳是12.0.0.2,此时就需要递归了,设备递归出去往23.0.0.0需要通过直连先把数据包从R1的g0/0/0接口出去交给R2,那么此时递归出,去往23.0.0.0的出接口就是R1的g0/0/0接口,递归完成。
此时查看路由表中23.0.0.0/24的静态路由中有标识符“R”,R(relay)就是华为设备中的递归。意思这条非直连的静态路由需要递归出来出接口。
④、需要理解:带 R / 不带 R,只看一件事
带 R:这条路由只知道下一跳 IP,不知道出接口,必须再去递归查询路由表,才能找到从哪个口发出去。
不带 R:这条路由下一跳 + 出接口都已经明确,不用再去翻路由表二次查找。
⑤、把拓扑的配置变成ospf,来看路由表中23.0.0.0/24路由不带R。(即就是不需要递归)
此处的不带R是因为,OSPF 靠 SPF 算法,从 1 类、2 类 LSA 里算出「去 23.0.0.0 要走 R2,从 G0/0/0 出」,这是OSPF 协议层面的计算,不是路由表层面的递归(R),不用通过查看路由表递归出该路由的出接口。
所以此处需要理解路由带R的意义。


3、经过上面的铺垫:我们来解释:以太网接口设备写静态路由的时候为什么写下一跳ip地址?而不是出接口。
此时,我们在R1上面用出接口配置23.0.0.0/24的静态路由:如下图:


问题的最终解释:
我们惊奇的发现,路由表中的23.0.0.0/24网段的静态路由的下一跳是12.0.0.1,也就是R1设备自己的接口地址,同时不带R,那么此时设备会理解去往23.0.0.0/24的路由是直连路由,那么此时R1去往23.0.0.0/24网段,从路由表来看直接是走二层直达,不需要三层转发。那么此时R1设备ping测23.0.0.2或者23.0.0.3就会直接从R1的g0/0/0接口发送arp请求23.0.0.3或者23.0.0.2的mac地址,然后封装数据包,那么这显然拿不到23.0.0.3或者23.0.0.2的mac地址,那么R1就无法封装数据包到23.0.0.3或者23.0.0.2的icmp数据包,那么结果就是ping不通的。
下面就是R1上面ping 23.0.0.2和23.0.0.3的抓包。

所以,我们一般在以太网接口上面配置静态路由的话,一般写下一跳。
完结!!!
拓展问题:
问题1、:假设我们在R1上面配置了静态路由写的是出接口,那么可以搞通吗?
答案:是可以的!!!
举例:R1 ping 23.0.0.3
此时我们只需要在R2的接口g0/0/0(R2与R1连接的直连接口)上面开启arp代理就行,arp代理就是说R1 arp询问R2,请你把23.0.0.3的mac地址给我,此时R2会先查自己能否拿到23.0.0.3的mac地址,能拿到的话,此时R2就把g0/0/0接口(R2和R1直连的接口)的mac地址回复给R1,R1此时拿到的其实是R2的g0/0/0接口的mac地址,不是23.0.0.3地址所在接口的mac地址,那么此时R1就能封装数据包,然后直接将数据包给R2,R2再查看自己路由表将数据包直接走二层交给R3,就通了。回程数据原理一样。
开启arp代理命令:
R2:
int g0/0/0
arp-proxy enable
问题2、:我们在广域网的点到点接口,用的是ppp协议二层封装的话,配置静态路由可以配置出接口,这是为什么?
答案:1、ppp协议封装,不要要mac地址。
2、点到点链路上只有对端一台设备,没有第二个邻居,只要指定报文从某个接口发出去就一定能到达对端。
所以结论,p口或者s口,用ppp或者hdlc协议封装,那么此时写静态路由的话,就可以直接指定出接口。

浙公网安备 33010602011771号