MacOS 路由表不完整 IP 地址和掩码

mul*_*sen 2 routing ip-address ipv4 macos

如果您netstat -rn在 Mac 上运行(我使用的是 Mojave 10.14.6,但我怀疑这适用于所有 MacOS),您将获得 IP 路由表,但某些 IP 地址不完整,并且网络掩码列不存在:

$ netstat -rn
Routing tables



Internet:

Destination        Gateway            Flags        Refs      Use   Netif Expire

default            192.168.1.1        UGSc          192        0     en0       

127                127.0.0.1          UCS             0        0     lo0       

127.0.0.1          127.0.0.1          UH              1      248     lo0       

169.254            link#5             UCS             1        0     en0      !

192.168.1          link#5             UCS             1        0     en0      !

192.168.1.1/32     link#5             UCS             1        0     en0      !

192.168.1.1        xx:xx:xx:xx:xx:xx  UHLWIir        68     1450     en0   1144

192.168.1.101      yy:yy:yy:yy:yy:yy  UHLWI           0        0     en0   1073

192.168.1.103/32   link#5             UCS             0        0     en0      !

224.0.0/4          link#5             UmCS            2        0     en0      !

224.0.0.251        z:z:zz:zz:z:zz      UHmLWI          0        0     en0       

239.255.255.250    1:1:11:11:11:11    UHmLWI          0      540     en0       

255.255.255.255/32 link#5             UCS             0        0     en0      !
Run Code Online (Sandbox Code Playgroud)

我该如何解释不完整的IP地址?例如,什么是127?我应该将其解释为吗127.0.0.0?这是否始终是规则 - 假设丢失的八位字节为 0 并且 Mac 路由表中显示的八位字节是最重要的八位字节(即127is127.0.0.0和 not 0.0.0.127)?

此外,在 Windows ( route print) 和 Linux ( route -n) 上还有一个网络掩码/genmask 列。但由于 Mac 上没有这样的列,我猜测它被替换为“目标”列中的 CIDR 表示法(例如,192.168.1.1/32而不是192.168.1.1使用 的掩码255.255.255.255)。但并非所有路由的“目标”列中都有 CIDR 表示法 - 例如239.255.255.250上表中的示例。当目标列中的 IP 地址省略斜杠和后面的掩码时,我们是否假设掩码始终为0.0.0.0

Gor*_*son 5

netstatmacOS(也许还有其他 BSD 派生的 UNIX?)附带的版本使用了一种有点特殊的速记方式来表示地址和网络掩码。正如您推断的,它在列中使用 CIDR 表示法destination,而不是具有单独的网络掩码列。但它使用了一些基于 CIDR 之前的“有类”寻址系统的缩写(感谢@grawity 指出了这一点并让我查看源代码来确认它)。

简短摘要:在旧的有类系统中,第一个八位字节所在的地址0- 127(保留 0 和 127)是“A 类”网络,其网络掩码为255.0.0.0(我们现在称之为/8)。128.x-191.x是“B 类”网络,网络掩码为255.255.0.0( /16)。192.x.x-223.x.x是“C 类”网络,网络掩码为255.255.255.0( /24)。其余地址空间是“D 类”(用于多播)和“E 类”(保留),具有未定义的网络掩码。该系统不灵活且效率低下,因此在 1993 年被无类别域间路由 (CIDR) 所取代(!),但它的痕迹仍然存在于各个地方,包括这里。

基本上,netstat所做的就是省略与有类系统下期望的内容相匹配的内容(因此可以从该系统中推断出)。好吧,除了它将 D 类和 E 类视为具有与 C 类相同的隐式网络掩码(即/24)。

  • 如果地址以0八位位组结尾,其中主机部分位于旧系统下,则它会忽略这些八位位组。例如,10/24是 的缩写10.0.0.0/24。但177.0.0.0/24只会缩短为177.0/24,因为这将是 B 类网络,因此第二个八位字节被假定为重要。
  • 如果网络掩码与旧系统下的网络掩码匹配,或者如果它是“主机”路由条目,则 CIDR 后缀将被省略。例如,169.254是 的缩写,169.254.0.0/16因为169属于 B 类范围。

这有点复杂,但将其转换回完整列表很容易:如果它没有列出 CIDR 后缀,则它只是显式列出的八位字节数的 8 倍(或主机条目的 /32);如果没有列出 4 个八位字节,请根据需要在地址部分添加“.0”。例如,169.254-> 169.254/16-> 169.254.0.0/16