以太网接口设备写静态路由的时候为什么写下一跳ip地址?而不是出接口。(ensp模拟说明)

一、想要搞清楚这个问题,首先需要搞清楚下面几个基本问题:(ensp路由器举例)

1、重点:设备是如何看待并处理路由表中的直连路由和非直连路由的逻辑。非直连路由用静态和ospf举例。

2、设备的路由递归的本质是什么。

搞清楚上面的2两个问题就可以轻松明白,以太网接口设备写静态路由的时候写下一跳ip地址的原因。

二、

1、我们来先看第1个问题,设备如何处理直连路由和非直连路由的逻辑。

我们先按照正常的静态路由配置:就是配置下一跳ip地址,同时对应的ip路由表,如下:
image
image
讲解:

①、为什么路由表中显示直连网段的路由比如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的意义。
image
image
3、经过上面的铺垫:我们来解释:以太网接口设备写静态路由的时候为什么写下一跳ip地址?而不是出接口。
此时,我们在R1上面用出接口配置23.0.0.0/24的静态路由:如下图:
image
image
问题的最终解释:

我们惊奇的发现,路由表中的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的抓包。
image

所以,我们一般在以太网接口上面配置静态路由的话,一般写下一跳。

完结!!!

拓展问题:

问题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协议封装,那么此时写静态路由的话,就可以直接指定出接口。

posted @ 2026-02-28 12:34  HelloEclipse  阅读(24)  评论(0)    收藏  举报