IP 路由表

Last Modified: 2022/12/11

概述

本篇中我们将会介绍 ip 路由表(routing table),会详细介绍路由表存储的内容以及他们的含义。

注:路由表和转发表是同一个概念,以下会混用。

什么是路由表

路由表是存储在路由器中的一段信息,可以将这个信息看成是一张表,表格中记录了目标网络的抵达方式,路由器查询路由表就可以知道应该将数据包从哪个接口转发到哪里。在 Linux 中可以通过 route -n 查看路由表信息:

Destination     Gateway         Genmask         Flags Metric Ref  Use Iface
0.0.0.0         172.16.191.253  0.0.0.0         UG    100    0      0 eth0
172.16.176.0    0.0.0.0         255.255.240.0   U     0      0      0 eth0
192.47.67.0     10.0.0.1        255.255.255.0   U    100     0      0 eth2

假如待转发包的目标 ip 是 192.47.67.5,路由器通过 ip & Genmask 得到目标网络前缀,具体到这里就是 192.47.67.5 & 255.255.255.0 得到 192.47.67.0,这个正好匹配上了最后一行,因此数据包通过 eth2(iface 列,interface 的简写) 接口转发到 10.0.0.1(Gateway 列)。

以下对转发表中的一些常用列给出说明:

  • Destination:目标网络列,该列也可以是一个具体的 ip 地址,如果是具体 ip 地址,该条路由则被称为主机路由;该列是用来和 目标ip & Genmask 匹配以确定下一跳地址;
  • Gateway:网关,代表下一跳地址,即数据包的下一站地址。路由器不可能预知途经的每一站地址,也不可能记录所有可能的途经地址,仅仅是记录下一站的地址,将数据包转发到下一站就结束了,之后的转发就留个下一个网关。经过层层转发后,数据包最终到达目标地址;
  • Genmask:用来和目标地址做“与运算“,从而得到一个网络前缀,再将这个网络前缀和 Destination 列匹配,如果匹配,那么就可以确定下一跳地址和接口(iface)等信息。
  • Iface:网络接口,即从哪个网络接口可以抵达下一跳地址。数据报的原始发送方的网络接口决定了发送方的源 ip 地址。

一台电脑可能有多个网络接口(如:多块网卡),特别是服务器。每块网卡连接的网络是不同的,因此在发送数据包的时候需要选择其中一块网卡将数据包发出去。查路由表可以确定从哪块网卡发出,确定了网卡也就确定了源 ip。

目标ip & Genmask 得到目标网络前缀(DP),如果 DP == Destination,则匹配成功,但是可能有多个匹配的情况,这个时候就查看 Genmask,将 Genmask 转化为二进制,1 的位数越多,则认为匹配的更好。看下面的例子,假设路由表当前的内容如下:

Destination     Gateway         Genmask         Flags Metric  Ref  Use Iface
0.0.0.0         172.16.191.253  0.0.0.0         UG    100     0    0 eth0
192.47.67.0     10.0.0.1        255.255.255.0   U     100     0    0 eth2
192.47.0.0      10.1.0.1        255.255.0.0     U     300     0    0 eth3

假设数据包目标 ip 地址为 192.47.67.5,通过 ip & Genmask,我们发现最后两行都匹配,但是倒数第二行的 Genmask 转化为二进制后的 1 的个数比最后一行的多,因此数据包最后通过倒数第二行的路由转发出去。

如果 Iface 字段的值(ip 地址)等于 Gateway 字段的 ip 地址,则数据包是直接交付,即不需要经过路由器转发。

0.0.0.0

0.0.0.0 是一个特殊地址,表示默认路由,如果所有的 Destination 和目标地址都无法匹配,那么就经过这条默认路由对应的的网关转发出去。

有问题吗?点此反馈!

温馨提示:反馈需要登录