既然 IPv4 地址已经提供了网络和主机的信息,为什么还需要子网掩码?
第一个八位字节已经指定了网络类别(1-127:A、128-191:B、192-223:C 等)。A、B 或 C 表示网络的八位字节数(分别为 255.0.0.0、255.255.0.0、255.255.255.0),它会自动告诉您每个网络类别允许多少个主机。
IP 提供了子网掩码所具有的所有信息,甚至更多信息。为什么我们需要子网掩码?如果子网包含的信息不完全是 IP 内部信息的一个子集,那么它还包含什么或子网还做了什么,需要我们单独指定它?
答案1
我们需要 IPv4 地址的子网掩码,因为该地址不提供有关网络大小的任何信息。类大小不是网络大小。在实际网络中,所有 IPv4 网络都被分解为子网比班级规模小。
例如,您可以将 C 类网络 200.200.200.0/255.255.255.0 拆分为两个较小的网络(可能位于不同的位置)200.200.200.0/255.255.255.128 和 200.200.200.128/255.255.255.128,假设两者都不需要超过 126 个主机。实际上,大多数公司只为需要连接到公共互联网的服务器获得足够的 IPv4 地址。我亲眼见过设置了 32、16 和 8 个地址网络(掩码分别为 255.255.255.224、255.255.255.240 和 255.255.255.248)
仅以类大小块的形式拥有 IP 网络在限制允许的网络数量方面过于严格 - 127 个 A 类网络占据了一半的空间。更不用说拥有 240 亿个节点的网络是完全无法管理的。相反,在 1993 年无类域间路由 (CIDR)被引入以允许网络分裂。
另外要明确的是,子网掩码的目的是确定哪些主机在本地网络上,哪些主机在网络之外。主机可以直接与同一网络上的主机通信,但它们需要与路由器与外部网络上的主机对话。
答案2
第一个八位字节已经指定了网络类别(1-127:A、128-191:B、192-223:C 等)。A、B 或 C 表示网络的八位字节数(分别为 255.0.0.0、255.255.0.0、255.255.255.0),它会自动告诉您每个网络类别允许多少个主机。
没错,但是如果有人要对该网络进行子网划分,则需要子网掩码来知道您所在的子网有多大。是的,使用有类寻址,类别会告诉您网络的大小,并允许您判断主机是否与您在同一个网络中,但如果该网络已划分子网,而没有子网掩码,您怎么知道另一个节点是否与您在同一个子网中?
假设您使用以太网。我们使用带子网划分的分类寻址。您的 IP 地址是1.2.3.4
,您想要访问1.3.1.1
。您是否使用 ARP 来访问该地址?嗯,这取决于 和 是否1.2.3.4
在1.3.1.1
同一个子网。即使它们在同一个网络中,如果它们在不同的子网中,则需要使用路由器。如果它们在同一个子网中,则应该使用 ARP。
因此,如果使用子网划分,即使是有类网络,也需要子网掩码。
实际上,我认为您混淆了子网划分和 CIDR。如果没有 CIDR,即使有子网划分,您也不需要行政区域之间的子网掩码。但在网络内部您仍然需要它!
答案3
子网掩码用于对 IP 地址和网络地址进行逐位运算。如果我没记错的话,你可以取一个 IP 地址,然后对其和给定网络的子网掩码进行逐位与运算。如果结果等于网络地址,则 IP 地址位于该特定网络上。具有网络地址和子网掩码路由表的路由器可以使用简单的二进制数学(速度非常快,即使不是计算机处理速度最快的)来找出从哪个接口发出数据包。
答案4
“第一个八位字节已经指定网络类(1-127:A、128-191:B、192-223:C 等)。”
如今,已没有多少常用协议能够遵守这一点(请参阅 @Fiasco Labs 评论 - RIP 是我能想到的唯一协议)。因此,您问题中的这句话:
IP 提供子网掩码所具有的所有信息,以及更多信息。
但对于当今互联网上使用的绝大多数协议来说,情况并非如此。
如果您有多台机器相互连接,并且只相互通信,而不涉及路由器,那么子网掩码实际上并不是必需的(尽管现代 TCP/IP 堆栈要求您指定一个)。
路由器定义(子)网络的边缘。任何需要通过路由器的东西都在不同的网络上 - 反之亦然:任何需要进入不同网络的东西都需要通过路由器。
子网掩码是所有机器判断流量是发往当前网络还是需要发送到路由器才能到达目的地的方式。如果目的地在子网掩码内,计算机的 TCP/IP 堆栈会将其流量直接发送到目的地,否则它会查询其路由表,通常情况下,它会将其他流量发送到默认网关。