Linux路由流程

Linux路由流程

我想知道 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 位的路由。如果没有路由匹配(没有默认路由的情况),则无法转发数据包。

目的地网络,即地址在目的地的主机和网络部分中如何分割,在路由决策中不参与。发送主机通常不知道这一点,也不关心。

相关内容