我在这个问题中看到,路由表有:
192.168.1.1/32 link#4 UCS 2 0 en0
openwrt.lan 46:94:fc:63:fc:7 UHLWIir 11 3610 en0 1200
192.168.1.125/32 link#4 UCS 2 0 en0
拥有子网掩码是什么意思,/32
在这种情况下,它的网络 ID 是什么?如果我们将上述视为单个主机,主机是否可以在没有网络 ID 的情况下存在?
据我所知,分配给该网络中主机的网络 ID 和 IP 地址是两个不同的东西。192.168.0.0 是一个网络 ID,如果它的子网是 255.255.255.0,那么这个网络中的主机可以是 192.168.0.1 - 192.168.0.254。在这种情况下,没有网络 ID 的主机如何存在?
/32
寻址一般来说,
/32
这意味着网络只有一个 IPv4 地址,所有流量都将直接在具有该 IPv4 地址的设备和默认网关之间传输。该设备将无法与本地子网上的其他设备通信。据我所知,这有几个可能的原因。它可能是:
网络 ID
IP 地址的网络 ID部分由子网掩码确定。例如:
/24
子网掩码为1111.1111.1111.0000
,这意味着前 3 个八位字节是网络 ID,最后一个八位字节用于分配主机 ID(256 个可用 ID,但通常保留一些)。/16
子网掩码为1111.1111.0000.0000
,这意味着前 2 个八位字节是网络 ID,最后一个八位字节用于分配主机 ID(65536 个可用 ID,但通常保留一些)。在 的情况下
/32
,这不适用,因为地址既是网络 ID 又是主机 ID。/31
地址也是所有主机 ID,没有保留的第 0 个地址。这里有点混乱;/32 不是指任何(子)网络的大小,而是指特定路由表条目适用的地址范围。通常两者是相同的(因为您将网络或子网作为一个单元进行路由,对吗?),但 macOS 对同一本地网络上的其他主机的处理方式略有不同。让我在你引用的那些之前添加一些行:
请注意,192.168.1(192.168.1.0/24 的缩写)通过 en0(也称为 link#4)路由;不是通过任何网关,而是通过接口本身。这是 Mac 本身所在的网络。192.168.1.1 和 192.168.1.125 都是该网络范围内的特定地址。如果将那些 /32 条目与 192.168.1 条目进行比较,它们基本上是重复的;他们说同样的话,只是关于特定地址而不是整个网络范围。
我不知道为什么 macOS 会创建这些冗余的特定于地址的条目,但这可能与您在上面的清单中看到的另一件事有关:macOS 在路由表中列出了它的 ARP 表条目。上面的“openwrt.lan”条目(我很确定实际上是 192.168.1.1,只是按名称而不是数字列出)表示它通过 en0 路由到 MAC 地址 46:94:fc:63:fc:7 .
因此,您在路由列表中看到的是实际网络路由(如“默认”和 192.168.1 条目)和每个主机条目(/32 和 MAC-targeted 条目)的混合。
最简单的事情是网络搜索和阅读与
subnet mask
和subnet mask binary shorthand
和相关的文章CIDR
也退房
subnet calculators
the
/32
是 CIDR(简写),指的是子网掩码中有多少个 1。因为/32
那是255.255.255.255
或11111111.11111111.11111111.1111111
这意味着在需要网关/路由器离开该网络之前,您的网络上只能有一个 IP 地址。/32 就是你。 子网掩码是定义网络中可用 IP 地址范围的数字
CIDR = 无类域间路由
使用 /32 是什么意思:我不认为这是一个无效的设置,但是它有效地关闭了网络...或者将网络限制为只有您...如果您没有网关,您只能自言自语设置为到达该网络掩码之外。
它的网络 ID 是什么:我假设你的意思是 ip 地址是什么,ip 地址将是你设置的任何内容。IP 地址和子网掩码(这是您正在处理的)是两个不同但相关的事物。
主机可以没有网络 ID [IP 地址吗?]:没有名字和姓氏或没有地址可以存在吗?是的,主机可以存在。有点需要更好地定义你所说的存在的意思。
它只是 CIDR 值。您可以在此处了解有关 CIDR 的更多信息。
TL;博士
您正在查看的不是子网掩码。它们表示路由表¹ 前缀的长度。
路由表的简单实现会列出每个可能的 IP 地址,这样,在给定任何 IP 地址的情况下,您都可以查找确切的 IP 地址并取回与其关联的路由信息²。
显然需要某种压缩。路由信息的本质是相邻的地址很可能使用相同的信息,因此我们可以使用一种基数树的形式将它们压缩在一起。在这里,简要说明它是如何工作的。
给定数字 0-7,我们可以用二进制表示它们:
现在,如果我们有两个路由表条目,一个用于地址 0 和 1,另一个用于地址 2 和 3,我们可以将它们存储在它们共享的二进制前缀下。如果我们使用 a
.
来指示前缀末尾后的“未使用”位,00.
则范围为 0-1 和01.
范围 2-3。表示这一点的标准方法是使用范围中的最小数字,后跟前缀的长度;在这种情况下,这些将
0/2
用于范围 0-1 和2/2
范围 2-3。但是如果我们要查找地址 6 的路由信息会怎样呢?通常我们会添加一组带有前缀的“默认”路由信息
0/0
,即匹配任何位,然后当我们搜索时我们寻找最具体的信息,即我们可以找到的最长匹配前缀。所以我们刚刚描述的完整路由表是:子网掩码也可以用前缀来描述,所以经常使用这种方案。但请记住,仅仅因为此方案可用于描述子网并不意味着它仅用于描述子网。
作为路由表前缀不是子网的示例,您可以将两个网络接口连接到同一网络,例如 192.168.2.0/24。(这可以通过将两个单独的网卡连接到同一个交换机来实现,每个网卡都有自己的电缆。)然后您可以设置路由表以使用两个路由表条目“平衡”两个接口之间的传出流量:
这会将发往该网络上地址 0-127 的数据包发送出去
eth0
,但发送发往该网络上地址 128-255 的数据包eth1
。这是一种糟糕的做法(出于我不会在这里讨论的原因),但演示了路由前缀和网络地址可能如何不匹配。¹不幸的是,关于路由表的维基百科文章说前缀字段包含“网络 ID”。虽然这在路由表的某些特定实现中可能是正确的,但在一般情况下它并不总是网络 ID,如您提供的示例和本答案后面的示例所示。
²此路由信息通常包括诸如要使用的接口、在该接口上联系的路由器(如果有)、主机的 MAC 地址(对于可通过该接口直接访问的主机)、我们应该在数据包中放置的源地址(如果主机)有多个源地址、安全信息等。那里可能有各种各样的数据,但对于本次讨论而言,这些都不重要,因为我们只是在谈论如何为给定地址查找正确的数据集,而不是数据集中的内容本身.
还有另一个用例,如果您熟悉 Cisco SD-Access(软件定义的访问)。每个边缘交换机都会在其环回接口上收到一个 /32 地址,并被视为特殊主机。