我想知道 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 的网络地址,以便将其与路由表进行匹配。我对这个流程可能完全错误。需要解释以了解系统的数据包流。
答案1
首先,网络代码为要发送的数据包选择正确的接口。然后它应用相应的源 IP 地址。
在您的情况下,接口可能是一个地址为
192.168.16.X
由于您显然将掩码“255.255.240.0”应用于接口 br0,因此这将是传出接口。但要注意:
192.168.21.2
在您的情况下,与 .16.X 地址位于同一网络上(由于网络掩码),因此在可以通过 ARP 成功检索到 21.1 的 MAC 地址之后,传出数据包将简单地发送到接口。
如果您将数据包发送到不同子网中的目标(-->(目标地址和掩码)给出不同的值),可以说
192.168.32.1
然后数据包将被发送到网关(通过使用其 MAC 地址)进行路由。
答案2
基本上,路由代码会遍历整个路由表,并且对于表中的每一行,它都会记录其中的行(destIP & netmask) == destination)
。可以有零到 N 个匹配项。如果有多个,则选择“最具体”的路由,即网络掩码中具有最多 1 位的路由。如果没有路由匹配(没有默认路由的情况),则无法转发数据包。
目的地网络,即地址在目的地的主机和网络部分中如何分割,在路由决策中不参与。发送主机通常不知道这一点,也不关心。