IPv4 子网划分是如何工作的?

Hen*_*nes 0 networking routing ipv4 subnet community-faq-proposed

子网划分是如何工作的,您是如何手动或在头脑中完成的? 有人可以从概念上和几个例子来解释吗?Server Fault 有很多子网划分作业问题,因此我们可以使用答案将它们指向 Server Fault 本身。

  • 什么是无类路由?为什么基于类的路由已过时?
  • 如果我有一个网络,我如何弄清楚如何拆分它?
  • 如果给我一个网络掩码,我怎么知道它的网络范围是多少?
  • 有时有一个斜线后跟一个数字;那个数字是多少?
  • 有时有子网掩码,也有通配符掩码。它们看起来是一样的东西,但它们是不同的?
  • 有人提到了一些关于了解二进制的事情?
  • 什么是 NAT(网络地址转换)?

关于这个问题的注释

在过去的几年里,我在Server?Fault上针对这个问题提出了很多关于子网划分的问题。这是他们关于 IPv4 和子网划分的规范问题

可悲的是,我不能将 VTC 上的超级用户问题作为该问题的重复项,因为它在技术上是另一个站点。

作为 [临时] 解决方案,我在此处复制该问题/答案,希望它成为 Super?User 上的规范问题/答案。

如果您可以改进它,请发布答案或发表评论。

Hen*_*nes 6

IP 子网的存在允许路由器为数据包选择合适的目的地。出于逻辑原因(防火墙等)或物理需求(较小的广播域等),您可以使用 IP 子网来分解较大的网络。

简而言之,IP 路由器使用您的 IP 子网来做出路由决策。了解这些决策的工作原理,您就可以了解如何规划 IP 子网。

数到 1

如果您已经精通二进制(基数 2)表示法,则可以跳过本节。

对于剩下的人:为你不流利的二进制表示法感到羞耻!

是的——这可能有点苛刻。学习以二进制计数,并学习将二进制转换为十进制并返回的快捷方式真的非常非常容易。你真的应该知道怎么做。

二进制计数非常简单,因为您只需要知道如何计数到 1!

想想汽车的“里程表”,除了与传统里程表不同,每个数字只能从 0 到 1。当汽车刚出厂时,里程表读数为“00000000”。

当您行驶了第一英里时,里程表显示“00000001”。到现在为止还挺好。

当您行驶了第二英里时,里程表的第一个数字会回滚到“0”(因为它的最大值是“1”),而里程表的第二个数字会回滚到“1”,从而使里程表读数为“ 00000010"。这看起来像十进制表示法中的数字 10,但实际上是二进制表示法中的 2(到目前为止您驾驶汽车的英里数)。

当您行驶了第三英里时,里程表读数为“00000011”,因为里程表的第一位数字再次转动。以二进制表示的数字“11”与十进制数 3 相同。

最后,当您行驶了第四英里时,两个数字(在第三英里结束时读数为“1”)回滚到零位置,而第三个数字回滚到“1”位置,给我们“ 00000100"。那是十进制数 4 的二进制表示。

如果你愿意,你可以记住所有这些,但你真的只需要了解小里程表如何随着它计数的数字变大而“滚动”。它与传统十进制里程表的操作完全相同,只是在我们虚构的“二进制里程表”上,每个数字只能是“0”或“1”。

要将十进制数转换为二进制数,您可以向前滚动里程表,滴答滴答,大声计数,直到滚动的次数等于要转换为二进制数的十进制数。在所有这些计算和滚动之后,里程表上显示的任何内容都是您数到的十进制数的二进制表示。

既然您了解里程表如何向前滚动,您也会了解它如何向后滚动。要将里程表上显示的二进制数转换回十进制,您可以将里程表一次回滚一个刻度,大声计数直到里程表读数为“00000000”。完成所有计数和滚动后,您大声说出的最后一个数字将是里程表开始时使用的二进制数的十进制表示。

以这种方式在二进制和十进制之间转换值会非常乏味。你可以这样做,但效率不会很高。学习一个小算法来更快地完成它会更容易。

顺便说一句:二进制数中的每个数字都称为“位”。那是“二进制”中的“b”和“数字”中的“it”。位是二进制数字。

将二进制数(例如“1101011”)转换为十进制是一个简单的过程,带有一个方便的小算法。

首先计算二进制数中的位数。在这种情况下,有 7 个。在一张纸上(在您的脑海中,在文本文件中等)上进行 7 个分区,然后从右到左开始填写。在最右边的位置输入数字“1”,因为我们总是从“1”开始。在左侧的下一个插槽中,输入右侧插槽中的值的两倍(因此,下一个为“2”,下一个为“4”)并继续直到所有插槽都已满。(你最终会记住这些数字,它们是 2 的幂,因为你这样做的次数越来越多。我脑子里最多是 131,072,但之后我通常需要一个计算器或纸)。

因此,您应该在纸上的小插槽中放置以下内容。

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
Run Code Online (Sandbox Code Playgroud)

从插槽下方的二进制数转录位,如下所示:

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
  1          1          0         1         0         1         1
Run Code Online (Sandbox Code Playgroud)

现在,添加一些符号并计算问题的答案:

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
x 1        x 1        x 0       x 1       x 0       x 1       x 1
---        ---        ---       ---       ---       ---       ---
       +          +          +         +         +         +         =
Run Code Online (Sandbox Code Playgroud)

做所有的数学计算,你应该想出:

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
x 1        x 1        x 0       x 1       x 0       x 1       x 1
---        ---        ---       ---       ---       ---       ---
 64    +    32    +     0    +    8    +    0    +    2    +    1    =   107
Run Code Online (Sandbox Code Playgroud)

就这样了。十进制的“1101011”是 107。这只是简单的步骤和简单的数学运算。

将十进制转换为二进制同样简单,并且是相同的基本算法,反向运行。

假设我们要将数字 218 转换为二进制数。从一张纸的右侧开始,写下数字“1”。向左,将该值加倍(因此,“2”)并继续向纸张左侧移动,将最后一个值加倍。如果您要写入的数字大于正在转换的数字,请停止写入。否则,继续将先前的数字加倍并写入。(使用此算法将大数字(例如 34,157,216,092)转换为二进制可能有点乏味,但肯定是可能的。)

所以,你的纸上应该有:

 128    |    64    |    32    |    16    |    8    |    4    |    2    |    1    |
Run Code Online (Sandbox Code Playgroud)

您在 128 处停止写数字,因为将 128 加倍,即得到 256,将比转换后的数字 (218) 大。

从最左边的数字开始,在其上方写上“218”(128)并问自己:“218 是否大于或等于 128?” 如果答案是肯定的,请在“128”下面划一个“1”。在“64”上方,写出 218 减 128 (90) 的结果。

看着“64”,问问自己:“90 是否大于或等于 64?” 是的,所以你应该在“64”下面写一个“1”,然后从 90 中减去 64,然后把它写在“32”(26)上面。

但是,当您到达“32”时,您会发现 32 不大于或等于 26。在这种情况下,在“32”下方写一个“0”,将数字 (26) 从 32”上方复制到“上方” 16”,然后继续问自己同样的问题,其余的数字。

完成后,您应该:

 218         90         26         26        10         2         2         0
 128    |    64    |    32    |    16    |    8    |    4    |    2    |    1    |
   1          1          0          1         1         0         1         0
Run Code Online (Sandbox Code Playgroud)

顶部的数字只是用于计算的注释,对我们没有多大意义。但是,在底部,您会看到一个二进制数“11011010”。果然,218,转换成二进制,就是“11011010”。

按照这些非常简单的过程,您可以使用计算器将二进制转换为十进制,然后再转换回来。数学非常简单,只需稍加练习即可记住规则。

拆分地址

把 IP 路由想象成披萨外卖。

当您被要求向“主街 123 号”送披萨时,作为人类的您很清楚,您想去名为“主街”的街道上编号为“123”的建筑物。很容易知道你需要去Main Street的100街区,因为建筑物编号在100到199之间,大多数城市街区编号为数百。您“只知道”如何拆分地址。

路由器提供数据包,而不是披萨。他们的工作与披萨司机相同:将货物(包裹)运送到尽可能靠近目的地的地方。路由器连接到两个或多个 IP 子网(完全有用)。路由器必须检查数据包的目标 IP 地址并将这些目标地址分解为它们的“街道名称”和“建筑物编号”组件,就像披萨司机一样,以做出有关交付的决定。

IP 网络上的每台计算机(或“主机”)都配置有唯一的 IP 地址和子网掩码。该 IP 地址可以分为称为“主机 ID”的“建筑物编号”部分(如上例中的“123”)和称为“主机 ID”的“街道名称”部分(如上例中的“大街”)。 “网络标识”。对于我们的人眼,很容易看到“123 Main Street”中的建筑物编号和街道名称的位置,但很难看到“10.13.216.41,子网掩码为255.255.192.0”中的划分。

IP 路由器“只知道”如何将 IP 地址分成这些组成部分以做出路由决策。由于了解 IP 数据包的路由方式取决于了解此过程,因此我们也需要了解如何拆分 IP 地址。幸运的是,从 IP 地址和子网掩码中提取主机 ID 和网络 ID 实际上非常简单。

首先用二进制写出IP地址(如果你还没有在头脑中学会这样做,请使用计算器,但请记下学习如何去做——这真的非常容易,而且会给异性留下深刻印象)派对):

      10.      13.     216.      41
00001010.00001101.11011000.00101001
Run Code Online (Sandbox Code Playgroud)

也用二进制写出子网掩码:

     255.     255.     192.       0
11111111.11111111.11000000.00000000
Run Code Online (Sandbox Code Playgroud)

并排书写,您可以看到子网掩码中“1”停止的点与 IP 地址中的点“对齐”。这就是网络 ID 和主机 ID 分开的地方。所以,在这种情况下:

      10.      13.     216.      41
00001010.00001101.11011000.00101001 - IP address
11111111.11111111.11000000.00000000 - subnet mask
00001010.00001101.11000000.00000000 - Portion of IP address covered by 1's in subnet mask, remaining bits set to 0
00000000.00000000.00011000.00101001 - Portion of IP address covered by 0's in subnet mask, remaining bits set to 0
Run Code Online (Sandbox Code Playgroud)

路由器使用子网掩码“屏蔽”IP 地址中由 1 覆盖的位(用 0 替换未被“屏蔽”的位)以提取网络 ID:

      10.      13.     192.       0
00001010.00001101.11000000.00000000 - Network ID
Run Code Online (Sandbox Code Playgroud)

同样,通过使用子网掩码“屏蔽”IP 地址中被 0 覆盖的位(再次用 0 替换未被“屏蔽”的位),路由器可以提取主机 ID:

       0.       0.      24.      41
00000000.00000000.00011000.00101001 - Portion of IP address covered by 0's in subnet mask, remaining bits set to 0
Run Code Online (Sandbox Code Playgroud)

我们人眼看到网络ID和主机ID之间的“中断”并不像披萨外卖时物理地址中的“楼号”和“街道名称”之间的“中断”那么容易,但最终的效果是相同的。

现在您可以将 IP 地址和子网掩码分成主机 ID 和网络 ID,您可以像路由器一样路由 IP。

更多术语

您将看到在整个 Internet 上以及在本答案的其余部分中都将子网掩码写为(IP/号码)。这种表示法称为“无类别域间路由”(CIDR) 表示法。"255.255.255.0" 由开头的 24 位 1 组成,将其写为 "/24" 比 "255.255.255.0" 更快。要将 CIDR 数字(如“/16”)转换为点分十进制子网掩码,只需写出该数字 1,将其分成 8 位一组,然后将其转换为十进制。(例如,“/16”是“255.255.0.0”。)

回到“过去”,没有指定子网掩码,而是通过查看 IP 地址的某些位得出的。例如,以 0 - 127 开头的 IP 地址具有隐含的子网掩码 255.0.0.0(称为“A 类”IP 地址)。

这些隐含的子网掩码今天不再使用,我不建议您再学习它们,除非您不幸处理不支持无类 IP 寻址的非常旧的设备或旧协议(如 RIPv1)。我不打算进一步提及这些“类别”地址,因为它今天不适用并且可能会造成混淆。

某些设备使用称为“通配符掩码”的符号。“通配符掩码”只不过是一个子网掩码,在有 1 的地方全是 0,在有 0 的地方全是 1。/26 的“通配符掩码”是:

 11111111.11111111.11111111.11000000 - /26 subnet mask
 00000000.00000000.00000000.00111111 - /26 "wildcard mask"
Run Code Online (Sandbox Code Playgroud)

通常,您会看到用于匹配访问控制列表或防火墙规则中的主机 ID 的“通配符掩码”。我们不会在这里进一步讨论它们。

路由器的工作原理

正如我之前所说,IP 路由器的工作与披萨送货司机相似,因为他们需要将货物(数据包)送到目的地。当收到一个发往地址 192.168.10.2 的数据包时,IP 路由器需要确定哪个网络接口最能将该数据包靠近其目的地。

假设您是一个 IP 路由器,并且连接到您的接口编号:

  • Ethernet0 - 192.168.20.1,子网掩码/24
  • Ethernet1 - 192.168.10.1,子网掩码/24

如果您收到一个目标地址为“192.168.10.2”的数据包,很容易(用人眼)判断该数据包应该从接口 Ethernet1 发出,因为 Ethernet1 接口地址对应于数据包的目的地地址。连接到 Ethernet1 接口的所有计算机的 IP 地址都以“192.168.10.”开头,因为分配给接口 Ethernet1 的 IP 地址的网络 ID 是“192.168.10.0”。

对于路由器,路由选择过程是通过建立路由表并在每次要传递数据包时查阅该表来完成的。路由表包含网络 ID 和目标接口名称。您已经知道如何从 IP 地址和子网掩码中获取网络 ID,因此您正在构建路由表。这是我们这个路由器的路由表:

  • 网络 ID:192.168.20.0 (11000000.10101000.00010100.00000000) - 24 位子网掩码 - 接口 Ethernet0
  • 网络 ID:192.168.10.0 (11000000.10101000.00001010.00000000) - 24 位子网掩码 - 接口 Ethernet1

对于我们发往“192.168.10.2”的传入数据包,我们只需要将该数据包的地址转换为二进制地址(作为人类——路由器一开始就将其作为二进制文件)并尝试将其与我们路由中的每个地址匹配表(最多为子网掩码中的位数),直到我们匹配一个条目。

  • 传入数据包目的地:11000000.10101000.00001010.00000010

将其与路由表中的条目进行比较:

11000000.10101000.00001010.00000010 - Destination address for packet
11000000.10101000.00010100.00000000 - Interface Ethernet0
!!!!!!!!.!!!!!!!!.!!!????!.xxxxxxxx - ! indicates matched digits, ? indicates no match, x indicates not checked (beyond subnet mask)

11000000.10101000.00001010.00000010 - Destination address for packet
11000000.10101000.00001010.00000000 - Interface Ethernet1, 24 bit subnet mask
!!!!!!!!.!!!!!!!!.!!!!!!!!.xxxxxxxx - ! indicates matched digits, ? indicates no match, x indicates not checked (beyond subnet mask)
Run Code Online (Sandbox Code Playgroud)

Ethernet0 的条目可以很好地匹配前 19 位,但随后停止匹配。这意味着它不是正确的目标接口。可以看到接口 Ethernet1 匹配了目的地址的 24 位。啊哈!该数据包绑定到接口 Ethernet1。

在现实生活中的路由器中,路由表的排序方式是,首先检查最长的子网掩码是否匹配(即最具体的路由),然后以数字方式进行排序,以便一旦找到匹配项,就可以路由数据包并且不需要进一步的匹配尝试(意味着 192.168.10.0 将首先列出而 192.168.20.0 将永远不会被检查)。在这里,我们稍微简化一下。花哨的数据结构和算法使 IP 路由器更快,但简单的算法将产生相同的结果。

静态路由

到目前为止,我们已经讨论了我们假设的路由器,因为它具有直接连接到它的网络。显然,这不是世界真正运作的方式。在比萨饼驾驶的比喻中,有时司机不允许比前台更远地进入大楼,并且必须将比萨饼交给其他人以交付给最终的接收者(暂停你的怀疑并容忍我请扩大我的类比)。

让我们从前面的示例“路由器 A”中调用我们的路由器开始。您已经知道 RouterA 的路由表为:

  • 网络 ID:192.168.20.0 (11000000.10101000.00010100.00000000) - 子网掩码 /24 - 接口 RouterA-Ethernet0
  • 网络 ID:192.168.10.0 (11000000.10101000.00001010.00000000) - 子网掩码 /24 - 接口 RouterA-Ethernet1

假设有另一个路由器“路由器 B”,其 IP 地址 192.168.10.254/24 和 192.168.30.1/24 分配给它的 Ethernet0 和 Ethernet1 接口。它具有以下路由表:

  • 网络 ID:192.168.10.0 (11000000.10101000.00001010.00000000) - 子网掩码 /24 - 接口 RouterB-Ethernet0
  • 网络 ID:192.168.30.0 (11000000.10101000.00011110.00000000) - 子网掩码 /24 - 接口 RouterB-Ethernet1

在漂亮的 ASCII 艺术中,网络看起来像这样:

               Interface                      Interface
               Ethernet1                      Ethernet1
               192.168.10.1/24                192.168.30.254/24
     __________  V                  __________  V
    |          | V                 |          | V
----| ROUTER A |------- /// -------| ROUTER B |----
  ^ |__________|                 ^ |__________|
  ^                              ^
Interface                      Interface
Ethernet0                      Ethernet0
192.168.20.1/24                192.168.10.254/24
Run Code Online (Sandbox Code Playgroud)

您可以看到路由器 B 知道如何“到达”网络 192.168.30.0/24,而路由器 A 对此一无所知。

假设 IP 地址为 192.168.20.13 的 PC 连接到连接到路由器 A 的 Ethernet0 接口的网络,将数据包发送到路由器 A 进行传送。我们假设的数据包的目的地是 IP 地址 192.168.30.46,这是一个连接到路由器 B 的 Ethernet1 接口的网络的设备。

对于上面显示的路由表,路由器 A 的路由表中的任何条目都与目标 192.168.30.46 不匹配,因此路由器 A 会将数据包返回给发送 PC,并带有消息“目标网络无法访问”。

为了让路由器 A “知道” 192.168.30.0/24 网络的存在,我们将以下条目添加到路由器 A 的路由表中:

  • 网络 ID:192.168.30.0 (11000000.10101000.00011110.00000000) - 子网掩码 /24 - 可通过 192.168.10.254 访问

通过这种方式,路由器 A 有一个路由表条目,该条目与示例数据包的目标 192.168.30.46 匹配。该路由表条目有效地表明“如果您收到一个发往 192.168.30.0/24 的数据包,请将其发送到 192.168.10.254,因为他知道如何处理它。” 这类似于我之前提到的“在前台交出比萨饼”的动作——将包裹传递给知道如何让它更接近目的地的其他人。

“手动”向路由表添加条目称为添加“静态路由”。

如果路由器 B 想要将数据包传送到 192.168.20.0 子网掩码 255.255.255.0 网络,则它的路由表中也需要一个条目:

  • 网络 ID:192.168.20.0 (11000000.10101000.00010100.00000000) - 子网掩码 /24 - 可通过:192.168.10.1(路由器 A 在 192.1068 网络中的 IP 地址).10

这将创建一条路径,用于在 192.168.30.0/24 网络和 192.168.20.0/24 网络之间跨越这些路由器之间的 192.168.10.0/24 网络进行传送。

您总是希望确保这种“间隙网络”两侧的路由器都有一个“远端”网络的路由表条目。如果我们示例中的路由器 B 没有连接到路由器 A 的“远端”网络 192.168.20.0/24 的路由表条目,我们假设来自位于 192.168.20.13 的 PC 的数据包到达位于 192.168.30.46的目标设备,但是 192.168.30.46 尝试发回的任何回复都将被路由器 B 返回为“目标网络无法访问”。单向通信通常是不可取的。始终确保你想想在流动的交通两个方向,当你想在计算机网络通信。

您可以从静态路线中获得很多里程。EIGRP、RIP 等动态路由协议实际上只不过是路由器之间交换路由信息的一种方式,实际上可以配置静态路由。然而,与静态路由相比,使用动态路由协议的一大优势是动态路由协议可以根据网络条件(带宽利用率、接口“关闭”等)动态更改路由表,因此,使用动态路由协议路由协议可能导致配置“绕过”网络基础设施中的故障或瓶颈。(动态路由协议,WAY这个答案的范围之内,虽然)。

你不能从这里到达那里

在我们的示例路由器 A 的情况下,当一个发往“172.16.31.92”的数据包进来时会发生什么?

查看路由器 A 路由表,无论是目的接口还是静态路由都无法匹配 172.18.31.92 的前 24 位(即 10101100.00010000.00011111.01011100,BTW)。

正如我们已经知道的,路由器 A 将通过“目标网络不可达”消息将数据包返回给发送方。

假设有另一个路由器(路由器 C)位于地址“192.168.20.254”。路由器 C 已连接到 Internet!

                              Interface                      Interface                      Interface
                              Ethernet1                      Ethernet1                      Ethernet1
                              192.168.20.254/24              192.168.10.1/24                192.168.30.254/24
                    __________  V                  __________  V                  __________  V
((  heap o  ))     |          | V                 |          | V                 |          | V
(( internet )) ----| ROUTER C |------- /// -------| ROUTER A |------- /// -------| ROUTER B |----
((   w00t!  ))   ^ |__________|                 ^ |__________|                 ^ |__________|
                 ^                              ^                              ^
               Interface                      Interface                      Interface
               Ethernet0                      Ethernet0                      Ethernet0
               10.35.1.1/30                   192.168.20.1/24                192.168.10.254/24
Run Code Online (Sandbox Code Playgroud)

如果路由器 A 可以将与任何本地接口都不匹配的数据包路由到路由器 C,以便路由器 C 可以将它们发送到 Internet,那就太好了。输入“默认网关”路由。

在路由表的末尾添加一个条目,如下所示:

  • 网络 ID:0.0.0.0 (00000000.00000000.00000000.00000000) - 子网掩码 /0 - 目标路由器:192.168.20.254

当我们尝试将“172.16.31.92”与路由表中的每个条目匹配时,我们最终会命中这个新条目。起初,这有点令人困惑。我们希望将目标地址的零位与……等等……什么?匹配零位?所以,我们根本不是在寻找比赛。这个路由表条目基本上是说,“如果你到了这里,与其放弃交付,不如将数据包发送到位于 192.168.20.254 的路由器并让他处理它”。

192.168.20.254就是我们的目的地DO知道如何传送数据包。当遇到发往目的地的数据包时,我们没有特定的路由表条目,这个“默认网关”条目将始终匹配(因为它匹配目标地址的零位),并为我们提供了一个“最后的手段”位置,我们可以发送数据包进行交付。您有时会听到称为“最后的网关”的默认网关。

为了使默认网关路由有效,它必须引用可使用路由表中的其他条目访问的路由器。例如,如果您尝试在路由器 A 中指定默认网关 192.168.50.254,则传送到此类默认网关将失败。192.168.50.254 不是路由器 A 知道如何使用其路由表中的任何其他路由将数据包传送到的地址,因此这样的地址作为默认网关是无效的。这可以简单地说:默认网关必须设置为使用路由表中的另一条路由已经可达的地址。

真正的路由器通常将默认网关存储为路由表中的最后一条路由,以便在无法匹配表中的所有其他条目后匹配数据包。

城市规划和 IP 路由

将 IP 子网分解为更小的 IP 子网类似于城市规划。在城市规划中,分区用于适应景观的自然特征(河流、湖泊等),影响城市不同部分之间的交通流量,并隔离不同类型的土地利用(工业、住宅等) . IP 子网划分实际上大同小异。

对网络进行子网划分的三个主要原因:

  • 您可能希望通过不同的通信媒体进行通信。如果您在两座建筑物之间有 T1 WAN 连接,则可以在这些连接的末端放置 IP 路由器,以促进跨 T1 的通信。每一端的网络(也可能是 T1 本身的“间隙”网络)将被分配到唯一的 IP 子网,以便路由器可以决定哪些流量应该通过 T1 线路发送。

  • 在以太网网络中,您可以使用子网划分来限制网络给定部分中的广播流量。应用层协议将以太网的广播功能用于非常有用的目的。但是,随着越来越多的主机被打包到同一个以太网网络中,有线(或无线以太网中的空中)广播流量的百分比可能会增加到导致非广播流量传输出现问题的程度。(在过去,广播流量可能会迫使主机检查每个广播数据包,从而使主机的 CPU 不堪重负。今天这种可能性较小。)交换以太网上的过多流量也可能以“帧泛滥到未知目的地”的形式出现。这种情况是由以太网交换机无法跟踪网络上的每个目的地引起的,这也是交换式以太网网络无法扩展到无限数量主机的原因。出于子网划分的目的,将帧泛洪到未知目的地的影响类似于过量广播流量的影响。

  • 您可能想要“监管”不同主机组之间流动的流量类型。也许您有打印服务器设备,而您只希望获得授权的打印排队服务器计算机向它们发送作业。通过限制允许流向打印服务器设备子网的流量,用户无法将他们的 PC 配置为直接与打印服务器设备通信以绕过打印计费。您可以将打印服务器设备放入一个子网,并在连接到该子网的路由器或防火墙中创建规则,以控制允许向打印服务器设备发送流量的主机列表。(路由器和防火墙通常都可以根据数据包的源地址和目标地址来决定如何或是否传送数据包。防火墙通常是具有强迫性个性的路由器的一个亚种。他们可能非常非常关心数据包的有效载荷,而路由器通常会忽略有效载荷而只传递数据包。)

在规划城市时,您可以规划街道如何相互交叉,并可以使用仅转弯、单向和死胡同来影响交通流量。您可能希望 Main Street 有 30 个街区长,每个街区最多有 99 座建筑物。规划街道编号非常容易,这样 Main Street 的每个街区都有一系列街道编号,每个街区增加 100。很容易知道每个后续块中的“起始编号”应该是多少。

在规划 IP 子网时,您关心的是使用正确数量的可用主机 ID(建筑物编号)构建正确数量的子网(街道),并使用路由器将子网相互连接(交叉点)。路由器中指定的有关允许的源地址和目标地址的规则可以进一步控制流量。防火墙可以充当强迫性的交通警察。

就本回答而言,构建子网是我们唯一的主要关注点。不像城市规划那样使用十进制,而是使用二进制来描述每个子网的边界。

继续:https : //serverfault.com/questions/49765/how-does-subnetting-work/226445#226445

(是的……我们达到了答案的最大大小(30000 个字符)。)