当运行ip addr add
为网络接口分配地址时,您需要(或可以)指定该接口的子网。因此,当您运行 ifconfig 时,您可以看到子网:
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.15 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::f36f:407:e015:2633 prefixlen 64 scopeid 0x20<link>
ether 08:00:27:73:e9:14 txqueuelen 1000 (Ethernet)
RX packets 105172 bytes 120417336 (120.4 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27040 bytes 4403397 (4.4 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
我不明白为什么这是必要的?我不认为它是用于路由目的,因为路由表就是用于此目的的,那么它有什么用呢?
编辑:更清楚地说:我知道网络掩码用于了解直接链接到网络的地址范围,即无需路由即可到达的地址范围。但这是在路由表中设置的。所以我的问题是:接口的设置和路由表之间有什么关系?
看来它们没有直接连接,请看这个:
root@yoav-VirtualBox:/home/yoav# ip addr add 192.168.1.2/24 dev first
root@yoav-VirtualBox:/home/yoav# ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: second@first: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether a2:a9:4f:c3:c5:be brd ff:ff:ff:ff:ff:ff
3: first@second: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether f2:38:32:ea:b4:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.1.2/24 scope global first
valid_lft forever preferred_lft forever
root@yoav-VirtualBox:/home/yoav# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
root@yoav-VirtualBox:/home/yoav#
答案1
在 Linux 上,为接口分配地址会添加一个隐含的基于此地址的 LAN 路由。该路由将使用分配给该地址的 CIDR 掩码(以及该地址本身作为提示源地址):
# ip link set eth0 down
# ip address flush dev eth0
# ip address add 192.0.2.3/24 dev eth0
# ip route
(没什么:路由也要求接口处于 UP 状态)
# ip link set eth0 up
# ip route
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.3
删除地址始终会删除由于缺少引用的地址或地址定义的网络而无法存在的路由。
# ip address flush dev eth0
# ip route
(没有什么)
对于某些特殊的网络设置(通常涉及使用冲突地址的其他接口),可以通过使用标志来避免添加此隐式路由noprefixroute
。 NetworkManager 等工具经常设置此标志,以便它们可以更好地控制配置路由的方式。
# ip address add 192.0.2.3/24 dev eth0 noprefixroute
# ip route
(没有什么)
此隐式 LAN 路由可能并不存在于所有操作系统上,并且可能必须始终在其中某些操作系统上显式设置。
答案2
子网指定哪些主机可以通过此接口到达,无需路由。在您的情况下,enp0s3
可以用于联系从 10.0.2.0 到 10.0.2.255 的任何主机(我在这里忽略不可能的值,因为不可能的定义正在演变),而无需使用网关(这是路由进入的地方)图片)。
答案3
路由表需要知道是否应该路由该数据包,或者是否应该使用底层 2 层协议将其传递到直接连接到同一“链路”/子网的主机。
注意:如果应路由数据包,则使用底层 2 层协议将其传送到下一跳/网关。因此,基本上,路由表告诉第 2 层要使用哪个下一跳 IP,该 IP 要么与数据包相同(如果位于同一子网中),要么与路由表中的下一跳相同。因此,路由表需要掩码来确定这一点。