理论上,IP 地址的每个部分都是 0 到 255 之间的数字(总共 256 个可用槽)。
但是为什么0
在第 4 部分中任何 IP 地址都不使用,并且在 IP 地址计算中总是从 1 开始?
例如:
127.0.0.1 <=== logically this should start from 0 as the first usable IP address.
192.168.0.1 <=== for example even default router IP address is set to 1 rather than to be 0
10.10.0.1
.
.
为什么0
从最后一部分开始总是跳过这个槽位?
答案1
但是为什么任何 IP 地址的第四部分都不使用 0,而是在 IP 地址计算中总是从 1 开始?
相对于该标题您的问题的,至少在 Linux 下,127.0.0.0
是一个非常有用的地址(像任何其他127.*
地址一样映射到环回接口)。
例如,我可以在以下位置启动网络服务器127.0.0.0:8080
:
docker run -d --rm --hostname node1 --name node1 -p 127.0.0.0:8080:8080 alpine \
sh -c "apk add --update darkhttpd; mkdir /srv; hostname > /srv/index.html; darkhttpd /srv --port 8080"
然后启动另一个绑定到127.0.0.1:8080
:
docker run -d --rm --hostname node2 --name node2 -p 127.0.0.1:8080:8080 alpine \
sh -c "apk add --update darkhttpd; mkdir /srv; hostname > /srv/index.html; darkhttpd /srv --port 8080"
现在我可以通过各自的地址访问这些服务器:
$ curl 127.0.0.0:8080
node1
$ curl 127.0.0.1:8080
node2
答案2
在 IPv4 中,子网的第一个地址被保留,原因确实不清楚,但最有可能是因为很久以前它曾经是“广播”地址。(后来,最后一个地址成为标准广播地址。)
因此,从技术上讲,现在可能可以使用第一个地址,但大多数现有的网络堆栈仍将其视为“保留”(有点像整个前“E 类”240.0.0.0/4 空间意外变得无法使用)。
请注意,它具体是子网的第一个地址,并不总是0
地址。这些仅在 /24 子网的情况下匹配。但例如,/16 子网将保留.0.0
,但不是 .1.0
或者.47.0
– 它们位于 /16 的中间,因此它们是完全有效的主机地址。
(另一方面,较小的 /27 子网不仅可以从 开始,.0
还可以从.32
开始.192
- 即使它们没有在 /24 中保留,它们也会在 /27 中保留。)
还请注意,这仅适用于广播子网(例如以太网)。此类地址仍可用于点对点链接或作为 /32 单独路由。
答案3
在 IPv4 规范中,任何 IPv4 网络中的最低地址都被保留为网络地址,该网络地址的用途与广播地址不同,广播地址通常是网络中的最高地址(尽管如果您喜欢,可以对其进行不同的配置)。在无类网络和子网掩码出现之前,网络地址的概念更有意义。子网和子网掩码背后的概念是 IPv4 的附加内容,原始规范中没有出现。
更新:它以“.0”结尾并没有什么神奇之处,只是它是子网中的最低地址(可能并不总是.0)。
最初,IPv4 是有类别的,分为 5 类:A、B、C、D 和 E。A 类网络是所有 IP 的最高有效位为 0,或者换句话说,IP 从 0.0.0.0 到 127.255.255.255。IPv4 地址的高两位为 10 的地址为 B 类,对应于地址 128.0.0.0 到 191.255.255.255。C 类地址的第一个八位字节以 110xxxxx 开头,或地址 192.0.0.0 到 223.255.255.255。D 类地址的第一个八位字节与 1110xxxx 匹配,因此 IP 为 224.0.0.0 到 239.0.0.0。最后,E 类是 1111xxxx 或 IP 240.0.0.0 到 255.255.255.255。E 类地址被视为保留地址,除 255.255.255.255 之外没有明确用途。D 类是多播地址,用于将数据包一起发送到计算机组。AC 类是您的普通单播 IP,其中单个设备在某些网络上获得一个 IP。
话虽如此,每个网络的大小是由其类别决定的。A 类网络定义为将前 8 位或第一个八位字节作为地址的网络部分,其余 24 位是单个 IPv4 网络上地址的主机特定部分。B 类将其分为 16 位和 16 位或各 2 个八位字节。C 类网络使用前 24 位作为网络部分,后 8 位作为主机部分。用现代术语来说,A 类网络有 /8 子网,B 类是 /16,C 类是 /24 子网。IPv4 地址的网络部分和主机部分之间的分离对于路由数据包非常重要,也是任何设备决定是否可以直接将其发送到本地网络上的系统或是否必须将其发送到路由器以转发到其他地方的方式。在 IPv4 网络堆栈和协议实现子网划分之前,这种区别是从 IP 本身硬编码的。
您可以在 RIPv1 路由协议等协议中看到这种现象的残留。它只通告 IP,而不通告子网掩码,因此主机地址和网络地址之间的区别至关重要。如果 RIPv1 地址通告地址 192.0.0.0,则这是 B 类网络中的最低地址,因此它是整个网络的网络地址。它会告诉其他设备,从 192.0.0.0 到 192.0.255.255 的所有系统都可从该路由获得(因为 B 类使用前两个八位字节表示网络,本例中为 192.0)。但是,如果它通告 192.0.0.1,则这不是该网络中的最低地址,因此它是主机地址。这意味着 RIPv1 正在为单个特定主机而不是整个网络通告路由。可能是拨号调制解调器,或者有其他原因需要获取唯一路由,但该通告仅针对该主机。
现在子网已经很常见,而且 RIPv2 等较新的协议会随 IP 一起发送子网掩码,因此整个网络地址的概念就有点多余了,但由于历史原因,我们仍坚持使用它。可以使用子网掩码 255.255.255.255 来通告主机特定路由,但我们仍必须与假定网络地址存在于网络范围底部的软件保持兼容性。
更新:为了进一步说明,下面举几个例子。如果将 10.xxx IP 地址范围划分为 /26 子网,则每个子网将有 64 个地址(其中 62 个可用于主机),因为 32 位 IP 中只有 6 位用于主机部分。前五个子网网络地址将是 10.0.0.0、10.0.0.64、10.0.0.128、10.0.0.192 和 10.0.1.0。默认广播地址将是子网中的最高地址,分别对应于 10.0.0.63、10.0.0.127、10.0.0.191 和 10.0.1.63。如果使用 /23 子网,则每个网络将有 512 个地址(其中 510 个可用)。前五个子网是 10.0.0.0、10.0.2.0、10.0.4.0 和 10.0.6.0。相应的广播地址是 10.0.1.255、10.0.3.255、10.5.255 和 10.7.255。请注意,在后一个示例中,10.0.1.0、10.0.3.0 等不是网络地址。它们完全可以用作主机的常规 IP,因为它们位于子网范围的中间。只有第一个和最后一个地址是特殊的。10.0.0.255 也同样可以用作常规主机。
答案4
在 IPv4 中,任何以 .0 结尾的 IP 都表示当您使用前缀 /24 时它是(默认)网络地址。您不能使用此地址并将其分配给计算机。“允许”分配的 IP 范围是从 .1 到 .254。您也不能使用 .255,因为它被用作网络的“广播”地址。