答案1
这是一个符号问题。
通常,此类条目代表“在线”路由,又称“连接”路由,即可通过该接口直接访问的网络没有任何网关。换句话说,就是本地子网。
然而,不同的操作系统,甚至不同的用户界面,有不同的方式来记录这样的路线。
Solaris 和 OpenBSD “netstat -rn” 使用接口的本地地址(没有“G”标志,表示这是非网关路由)。而且它也不显示网络掩码。
$ netstat -rn Destination Gateway Flags Ref Use Interface -------------------- -------------------- ----- ----- ---------- --------- default 192.168.1.1 UG 5 280064959 aggr1 192.168.1.0 192.168.1.7 U 3 11962636 aggr1
然而,Linux 上的相同“netstat -rn”使用 0.0.0.0,因为实际接口存储在单独的字段中。
$ netstat -rn Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eno1 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eno1
FreeBSD 和 NetBSD 将显示网关是一个“链接”:
$ netstat -rn Destination Gateway Flags Refs Use Mtu Interface default 192.168.1.1 UGS - - - wm1 192.168.1/24 link#2 UC - - - wm1 192.168.1.8 link#2 UHl - - - lo0
如今,Linux 使用一套完全不同的 CLI 工具;“ip route show”使用灵活的输出格式,在显示此类路由时简单地省略了“via <gateway_addr>”部分。
$ ip -4 route show default via 192.168.1.1 dev eno1 192.168.1.0/24 dev eno1
Cisco IOS 省略了网关并说“直接连接”(加上“C”标志):
Cisco1760# show ip route Codes: C - connected, S - static, R - RIP, M - mobile, B - BGP D - EIGRP, EX - EIGRP external, O - OSPF, [...] 10.0.0.0/8 is variably subnetted, 73 subnets, 4 masks O 10.147.241.56/30 [110/3] via 10.147.18.1, 09:35:51, FastEthernet0/0 C 10.147.241.60/30 is directly connected, Serial1/1 C 10.147.18.0/24 is directly connected, FastEthernet0/0
Windows 显示“正在链接”:
C:\> route print Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 192.168.1.254 192.168.1.100 35 192.168.1.0 255.255.255.0 On-link 192.168.1.100 291
Mikrotik RouterOS 将接口名称在网关字段(加上显示“C”标志,表示“已连接”):
> /ip route print detail 1 A S dst-address=0.0.0.0/0 gateway=192.168.1.1 distance=1 scope=30 target-scope=10 2 ADC dst-address=192.168.1.0/24 pref-src=192.168.1.9 gateway=ether1 distance=0 scope=10
答案2
路由器接口就是下一跳。企业级路由器通常拥有多个网络的多个接口,并在它们之间路由流量。
因此,如果一台 PC 想要连接到存储网络上的文件共享,则该 PC 的网关是 PC 网络上的路由器接口,下一跳是同一路由器的存储网络接口。您可以将此上下文中的“网关”视为用于到达特定网络的“出口接口”。
此场景与下一跳为上游的场景的唯一区别在于,所讨论的路由器在两个网络上都有接口。您可以轻松想象它们由两个不同的路由器托管,网关是该路由器上的接口。这两种情况在功能上是相同的。