为什么一个 IP 对象有多个 IP 地址?

Why are there multiple IP addresses for a IP object?

在scapy中,我看到了以下内容。

>>> a=IP(dst="www.slashdot.org/30")
>>> [p for p in a]
[<IP  dst=216.105.38.12 |>,
 <IP  dst=216.105.38.13 |>,
 <IP  dst=216.105.38.14 |>,
 <IP  dst=216.105.38.15 |>]

但我没有看到 dig 的多个目标。有谁知道为什么会这样?上面IP命令中的“/30”是什么意思?

$ dig www.slashdot.org a +noall +answer
www.slashdot.org.   384 IN  A   216.105.38.15

子网数学

/30指的是CIDR notation。它相当于子网掩码 255.255.255.252。 本质上,它是一个掩码,用于确定 IPv4 地址的哪些位是网络位和主机位。

/30 和 216.105.38.15 二进制是

11111111.11111111.11111111.11111100
11011000.01101001.00100110.00001111

要获取网络地址,请使用二进制 & 获取 216.105.38.12。该子网由主机位可变的所有地址组合组成。所以最后两位可以是 00、01、10 或 11(即 0、1、2、3)。这转化为我们看到 scapy 输出的 .12、.13、.14、.15。

Scapy classes

根据 scapy IP class (scapy.layers.inet.IP), when you input a subnet for the dest IP (scapy.layers.inet.DestIPField) with dst=, it's interpreted as a subnet (scapy.base_classes.Net),返回子网中的所有地址。

因此,如果我将子网传递给 Net class,我将得到相同的结果。

>>> from scapy.base_classes import Net  # if in Python and not Scapy
>>> a = Net("www.slashdot.net/30")
>>> [p for p in a]
['216.105.38.12', '216.105.38.13', '216.105.38.14', '216.105.38.15']