IP 路由表
概述
本篇中我们将会介绍 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 和目标地址都无法匹配,那么就经过这条默认路由对应的的网关转发出去。
温馨提示:反馈需要登录