在运行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#
在 Linux 上,为接口分配地址会添加基于此地址的隐式LAN 路由。此路由将使用分配给地址的 CIDR 掩码(以及地址本身作为提示源地址):
(没什么:路由要求接口也必须是 UP)
删除地址总是会删除由于缺少引用地址或地址定义的网络而无法存在的路由。
(没有什么)
一些特殊的网络设置(通常涉及使用冲突地址的其他接口)可以通过使用 flag 来避免添加此隐式路由
noprefixroute
。NetworkManager 之类的工具经常设置此标志,以便他们更好地控制配置路由的方式。(没有什么)
此隐式 LAN 路由可能并非在所有操作系统上都存在,并且可能必须始终在其中一些操作系统上显式设置。
子网指定可以通过该接口访问哪些主机,而无需路由。在您的情况下,
enp0s3
可用于联系从 10.0.2.0 到 10.0.2.255 的任何主机(我在这里忽略了不可能的值,因为不可能的定义正在演变),而不必使用网关(这是路由进入图片)。路由表需要知道该数据包是否应该被路由,或者是否应该使用底层第 2 层协议直接将其传递到连接到同一“链接”/子网的主机。
注意:如果应路由数据包,则使用底层第 2 层协议将其传递到其下一跳/网关。所以基本上,路由表告诉第 2 层要使用哪个下一跳 IP,它要么与数据包相同(如果它在同一子网中),要么与路由表中的下一跳相同。因此,路由表需要掩码来确定。