我想知道 Linux 在访问另一个 IP 时如何使用路由表。正如我所知道的,例如当我们运行“ssh 192.168.21.2”时,系统将创建目标 ip 为 192.168.21.2 的 tcp 数据包,并参考下一跳的路由表。路由表条目如下所示:
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.16.1 0.0.0.0 UG 0 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 1005 0 0 br0
169.254.0.0 0.0.0.0 255.255.0.0 U 1006 0 0 br1
192.168.16.0 0.0.0.0 255.255.240.0 U 0 0 0 br0
192.168.66.0 0.0.0.0 255.255.255.128 U 0 0 0 br1
在这里,系统将找到目标网络地址并将其与目标网络地址匹配,如果找到匹配,则将该数据包通过接口发送到相应的网关。
我的疑问是系统如何以及何时计算目标 ip 的网络地址以将其与路由表匹配。在这个流程上我可能完全错了。需要解释以了解来自系统的数据包流。
首先,网络代码为要发送的数据包选择正确的接口。然后它应用相应的源 IP 地址。
在您的情况下,接口可能是一个地址为
由于您显然将掩码“255.255.240.0”应用于您的接口 br0,因此这将是传出接口。但要注意:
与您的情况下的 .16.X 地址位于同一网络上(由于网络掩码),因此在可以通过 ARP 成功检索 21.1 的 MAC 地址之后,传出数据包将简单地发送到接口。
如果您将数据包发送到不同子网中的目的地( --> (dest-address & mask) 给出不同的值),可以说
然后数据包将被发送到网关(通过使用其 MAC 地址)进行路由。
基本上,路由代码会遍历整个路由表,并且对于表中的每一行,它都会记下
(destIP & netmask) == destination)
. 可以有零到 N 个匹配项。如果不止一个,则选择“最具体”的路由,即网络掩码中具有最多一位的路由。如果没有路由匹配(在没有默认路由的情况下),则无法转发数据包。目标网络,即地址如何在主机和目标网络部分中拆分,在路由决策中没有任何作用。发送主机通常对此一无所知,也不在乎。