从理论上讲,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
插槽总是从最后一部分跳过?
在 IPv4 中,保留子网的第一个地址是出于……不清楚的原因,实际上,但很可能是因为很久以前它曾经是“广播”地址。(后来,最后一个地址变成了标准的广播地址。)
因此,从技术上讲,现在可能可以使用第一个地址,但大多数现有的网络堆栈仍然将其视为“保留”(有点像整个前“E 级”240.0.0.0/4 空间意外地变得不可用)。
请注意,它专门是子网的第一个地址,并不总是
0
地址。这些仅在 /24 子网的情况下匹配。但是例如,/16 子网将.0.0
保留,但没有.1.0
保留,或者.47.0
- 它们位于 /16 的中间,因此它们是完全有效的主机地址。(另一方面,较小的 /27 子网不仅可以开始于
.0
,也可以开始于.32
或.192
- 将再次在 /27 中保留,即使它们没有在 /24 中保留。)另请注意,这仅适用于广播子网(例如以太网)。此类地址仍可用于点对点链接或单独路由为 /32。
在 IPv4 规范中,任何 IPv4 网络中的最低地址都被保留为网络地址,该地址与通常是网络中最高地址的广播地址有不同的用途(尽管如果您正在寻找乐趣,可以进行不同的配置) . 在无类网络和子网掩码出现之前,网络地址的想法更有意义。子网和子网掩码背后的概念是原始规范中不存在的 IPv4 的附加组件。
更新:它以“.0”结尾并没有什么神奇之处,只是它是子网中的最低地址(可能并不总是 .0)。
最初,IPv4是有类的,分为5类;A、B、C、D 和 E。A 类网络都是最高有效位为 0 的 IP,或者换句话说,IP 从 0.0.0.0 到 127.255.255.255。高两位为 10 的 IPv4 地址是 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 网络堆栈和协议实现子网划分之前,
您可以在 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 个可用于主机),因为主机部分仅保留 6 位 32 位 IP。前五个子网网络地址为 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 也同样可用作常规主机。
关于您的问题的标题,至少在 Linux 下,
127.0.0.0
是一个非常有用的地址(与任何其他127.*
地址一样映射到环回接口)。例如,我可以在以下位置启动一个网络服务器
127.0.0.0:8080
:然后开始另一个绑定到
127.0.0.1:8080
:现在我可以通过它们各自的地址访问这些服务器:
几十年前,127.0.0.0/8 地址被指定为内部环回地址。仅适用于与本地 PC 的本地流量。
自从多年前做出决定以来,每个路由器制造商都将该地址指定为不可路由。许多旧路由器可能是硬编码且不可移动的。有些需要新固件,制造商已将它们指定为生产线末端,因此他们永远不会获得新固件。这将需要更换成百上千台路由器。有些确实存在,您可以重新编程。
因此,互联网上的每一个路由器都会丢弃任何发往 127.0.0.0/8 地址的流量。因此,流量将永远无法通过互联网。
从字面上看,必须重新编程数以万计的路由器才能允许路由该地址。你和你的目的地之间有一个不兼容的路由器,数据包永远不会到达你。
即使现在进行了更改,数据包也需要数年时间才能可靠地通过。
在 IPv4 中,任何以 .0 结尾的 IP 都意味着当您使用前缀 /24 时它是(默认)网络地址。您不能使用此地址并将其分配给计算机。要分配的“允许”IP 是从 0.1 到 0.254。您也不能使用 .255,因为它被用作网络的“广播”地址。
问题已加载 - IPv4 地址不是您声称的,但它们可以表示为 0 到 255 之间的四个数字(但许多其他表示是可能的、使用的和有效的,例如 10.5、0x7f.0 等)。
您想知道的是为什么子网中的第一个地址通常不被使用。但这与八位字节为零无关,如下例所示,它们都是其子网中的第一个地址:10.0.0.248、127.1.0.160、192.168.101.2。
经常保留首地址的原因有历史和兼容性的原因——如果你可以浪费首地址,增强与旧设备和损坏设备的兼容性可能是谨慎的。由于如今 IPv4 地址非常昂贵,因此这种情况变得不那么普遍了。