IPv4 子网划分如何工作?

IPv4 子网划分如何工作?

子网划分如何工作,以及如何进行子网划分用手或者在你的脑海里? 有人能从概念上和几个例子来解释一下吗?Server Fault 收到了很多子网划分家庭作业问题,因此我们可以使用答案来引导他们了解 Server Fault 本身。

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

关于此问题的说明

在过去的几年里,我向大家提出了不少关于子网划分的问题这个问题服务器故障. 这是他们的典型问题关于 IPv4 和子网划分。

遗憾的是,我无法将超级用户上的 VTC 问题视为该问题的重复,因为从技术上讲它是另一个网站。

作为一个[临时]解决方案,我在这里复制该问题/答案,希望它能够成为超级用户的规范问题/答案。

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

答案1

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    |

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

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
  1          1          0         1         0         1         1

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

 64    |    32    |    16    |    8    |    4    |    2    |    1    |
x 1        x 1        x 0       x 1       x 0       x 1       x 1
---        ---        ---       ---       ---       ---       ---
       +          +          +         +         +         +         =

经过所有这些计算,你应该得出以下结论:

 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

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

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

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

因此,你的论文中应该包含:

 128    |    64    |    32    |    16    |    8    |    4    |    2    |    1    |

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

从最左边的数字开始,在数字上方(128)写上“218”,然后问自己:“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

顶部的数字只是计算时使用的注释,对我们来说意义不大。但在底部,你会看到一个二进制数“11011010”。果然,218 转换成二进制就是“11011010”。

按照这些非常简单的步骤,你可以不用计算器将二进制转换为十进制,然后再转换回来。数学非常简单,只需一点练习就可以记住规则。

拆分地址

将 IP 路由想象成披萨配送。

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

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

IP 网络上的每台计算机(或“主机”)都配置有唯一的 IP 地址和子网掩码。该 IP 地址可以分为“建筑物编号”部分(如上例中的“123”),称为“主机 ID”,以及“街道名称”部分(如上例中的“Main Street”),称为“网络 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

也以二进制形式写出子网掩码:

     255.     255.     192.       0
11111111.11111111.11000000.00000000

并排书写时,您可以看到子网掩码中“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

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

      10.      13.     192.       0
00001010.00001101.11000000.00000000 - Network ID

同样,通过使用子网掩码来“屏蔽” 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

我们人眼很难看出网络ID和主机ID之间的“断开”,就像披萨外送时物理地址中的“楼号”和“街道名称”之间的“断开”一样,但最终的效果是一样的。

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

更多术语

您将在整个互联网上以及本答案的其余部分看到子网掩码以 (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),否则我不建议您再了解它们。我不会进一步提及这些地址的“类别”,因为它在今天已不适用并且可能会造成混淆。

有些设备使用一种称为“通配符掩码”的符号。“通配符掩码”只不过是一个子网掩码,其中所有 0 都是 1,而所有 1 都是 0。/26 的“通配符掩码”为:

 11111111.11111111.11111111.11000000 - /26 subnet mask
 00000000.00000000.00000000.00111111 - /26 "wildcard mask"

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

路由器的工作原理

正如我之前所说,IP 路由器的工作与披萨送货司机类似,它们需要将货物(数据包)送到目的地。当收到发往地址 192.168.10.2 的数据包时,IP 路由器需要确定哪个网络接口最适合将该数据包送至目的地。

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

  • 以太网0 - 192.168.20.1,子网掩码/24
  • 以太网1 - 192.168.10.1,子网掩码/24

如果您收到一个数据包,其目标地址为“192.168.10.2”,那么很容易(用肉眼)判断该数据包应该从以太网 1 接口发送出去,因为以太网 1 接口地址与数据包的目标地址相对应。连接到以太网 1 接口的所有计算机的 IP 地址都将以“192.168.10.”开头,因为分配给以太网 1 接口的 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 位子网掩码 - 接口以太网 1

对于发往“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)

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

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

静态路由

到目前为止,我们讨论的都是假设路由器直接与网络相连。显然,世界并不是这样运转的。在披萨司机的类比中,有时司机只能到达前台,不能进入大楼更远的地方,必须将披萨交给其他人,然后才能送到最终的收件人手中(请暂时不要怀疑,请耐心听我扩展我的类比)。

首先,让我们将前面示例中的路由器称为“路由器 A”。您已经知道路由器 A 的路由表如下:

  • 网络 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”,其 Ethernet0 和 Ethernet1 接口的 IP 地址分别为 192.168.10.254/24 和 192.168.30.1/24。它具有以下路由表:

  • 网络 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

您可以看到路由器 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(192.168.10.0 网络中路由器 A 的 IP 地址)

这将在这些路由器之间通过 192.168.10.0/24 网络创建一条在 192.168.30.0/24 网络和 192.168.20.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 等动态路由协议实际上只不过是路由器之间交换路由信息的一种方式,实际上可以使用静态路由进行配置。不过,与静态路由相比,使用动态路由协议的一个巨大优势是,动态路由协议可以动态地根据网络条件(带宽利用率、接口“关闭”等)更改路由表,因此,使用动态路由协议可能会导致“绕过”网络基础设施中的故障或瓶颈的配置。(动态路由协议是方式但是超出了这个答案的范围。)

你不能从这里到达那里

以我们的示例路由器 A 为例,当发往“172.16.31.92”的数据包进入时会发生什么?

查看路由器 A 路由表,目标接口和静态路由均与 172.18.31.92 的前 24 位不匹配(顺便说一下,即 10101100.00010000.00011111.01011100)。

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

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

                              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

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

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

  • 网络 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 是我们知道如何将数据包传送到。当面对一个数据包发往我们没有特定路由表条目的目的地时,这个“默认网关”条目将始终匹配(因为它匹配目标地址的零位),并为我们提供了一个可以发送数据包进行传送的“最后手段”位置。您有时会听到默认网关被称为“最后手段网关”。

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

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

城市规划和 IP 路由

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

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

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

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

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

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

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

就此答案而言,构建子网是我们唯一主要关注的问题。与城市规划不同,我们采用十进制,而是采用二进制来描述每个子网的边界。

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

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

答案2

这是一种非常简单的观察方法,那些刚接触子网划分的人会发现它很容易理解。

因此,您将得到您的网络,并被要求将其分成更小的网络。

假设我们有 172.18.0.0 /16 网络,我们想将其拆分成更小的网络。为此,我们需要从给定的网络中借用一些主机位。现在,我们的网络位是 172.18 八位字节,而我们的主机位在 0.0 八位字节中。在二进制中,这将是一堆 1 和 0,但为了帮助您直观地看到这一点,我将使用 N 表示网络,使用 H 表示主机位。

我们将得到 nnnnnnnn.nnnnnnnn.hhhhhhhh.hhhhhhhh。为了使我们的网络更小,我们需要取其中一些“h”位并将其变为“n”位。这个公式是 2^n。然后这将告诉您可以建立多少个网络。因此,如果我们只借用一个“h”位,我们将取 2^1=2。所以现在我们的八位字节看起来像 nnnnnnnn.nnnnnnnn.nhhhhhhh.hhhhhhhh。由于八位字节的位值为 128 16 32 16 8 4 2 1,我们的新网络位使用 .128。所以我们的网络将是 172.18.0.0 /17 和 172.18.128.0 /17。

如果我们的任务是将网络分成 8 个较小的网络,我们只需要找到 2^n = 8。由于 2^3 = 8,我们将借用三个主机位。所以现在我们的位看起来应该是 nnnnnnnn.nnnnnnnn.nnnhhhhh.hhhhhhhh。由于我们的网络位现在使用的是 32 位,所以我们的网络将以 32 为单位。因此,您的四个网络将是 172.18.0.0 /19、172.18.32.0 /19、172.18.64.0 /19 等等,直到您到达最后一个网络 172.18.224.0/19。

在另一个示例中,让我们将 10.0.0.0 /8 划分为四个子网。同样,我们的位将看起来像 nnnnnnnn.hhhhhhhh.hhhhhhhh.hhhhhhhh。现在我们需要找出 2^n = 4。由于 2^2 = 4,我们将借用两个主机位,并将它们用作网络位。因此我们的八位字节现在看起来像 nnnnnnnn.nnhhhhhh.hhhhhhhh.hhhhhhhh。我们的网络将是 10.0.0.0 /10 和 10.64.0.0 /10。

现在我们知道了网络地址,找到每个子网的广播地址和节点数就很容易了。例如,我们的第一个 172.18.0.0 网络是 172.18.0.0 /17,下一个网络是 172.18.32.0 /17。广播地址始终是子网的最后一个地址,因此对于 172.18.0.0 网络,它将是 172.18.31.255。对于 172.18.32.0 网络,它将是 172.18.63.255。

要找出节点数,最难的方法是取 2^h。H 是您拥有的主机位数。因此,对于 172.18.0.0 /17 网络,我们有 15 个主机位,因此我们将取 2^15 = 32768。

我不确定大家对子网划分的整体看法,但这里有一些捷径。如果您想要找出子网的数量,只需取 128 64 32 16 8 4 2 1 的位值并将其除以 256。在上面的例子中,我们需要八个子网。您所要做的就是取 256/32 = 8。然后您将以 32 为单位来计算网络,因为您使用的是 32 值的位。

要查找每个网络的节点数,只需将数字加倍即可。/30 总共可以有 4 个主机,其中 2 个可用。/29 有 8 个,/28 有 16 个,依此类推。最后一个八位字节实际上是按位值计算的,因此它就是 128 64 32 16 8 4 2 1。这就是主机总数,如果减去 2,那就是可用主机的数量。

然后,一旦到达 /23,就开始从前一个八位字节加倍。/24 是 256,/23 是 512,/22 是 1024。然后每次增加一位值时就加倍。

答案3

续上文:https://serverfault.com/questions/49765/how-does-subnetting-work/49836#49836

您的 ISP 为您提供网络 ID 范围 192.168.40.0/24 (11000000.10101000.00101000.00000000)。您知道您想使用防火墙/路由器设备来限制网络不同部分(服务器、客户端计算机、网络设备)之间的通信,因此,您想将网络的各个部分划分为 IP 子网(防火墙/路由器设备可以在这些子网之间路由)。

你有:

  • 12 台服务器计算机,但您可能最多可以多获得 50%
  • 9 个开关
  • 97 台客户端计算机,但您可能会获得更多

将 192.168.40.0/24 分成这些部分的好方法是什么?

以 2 的偶数幂来思考,并处理更多可能的设备,你可以得出:

  • 18 台服务器计算机 - 下一个最大的 2 的幂是 32
  • 9 个开关 - 下一个最大的 2 的幂是 16
  • 97 台客户端计算机 - 下一个最大的 2 的幂是 128

在给定的 IP 子网中,有两个地址被保留,不能用作有效的设备 IP 地址 - 主机 ID 部分全为零的地址和主机 ID 部分全为一的地址。因此,对于任何给定的 IP 子网,可用的主机地址数为 32 的 2 次方减去子网掩码的位数再减去 2。因此,在 192.168.40.0/24 的情况下,我们可以看到子网掩码有 24 位。这样就剩下 8 位可用于主机 ID。我们知道 2 的 8 次方是 256 - 这意味着 256 种可能的位组合可以放入 8 位宽的插槽中。由于这 8 位的“11111111”和“00000000”组合不能用作主机 ID,因此在 192.168.40.0/24 网络中可以分配的主机可能为 254 个。

在这 254 台主机中,看起来我们可以将客户端计算机、交换机和服务器计算机放入该空间,对吗?我们试试吧。

您有 8 位子网掩码可供“使用”(IP 地址 192.168.40.0/24 的其余 8 位未被 ISP 提供的子网掩码覆盖)。我们必须想办法使用这 8 位来创建多个可容纳上述设备的唯一网络 ID。

从最大的网络开始 - 客户端计算机。您知道可能的设备数中下一个较大的 2 的幂是 128。数字 128 用二进制表示为“10000000”。幸运的是,它适合我们可用的 8 位插槽(如果不适合,则表明我们的起始子网太小,无法容纳所有设备)。

让我们获取 ISP 提供的网络 ID,并向其添加一位子网掩码,将其分成两个网络:

11000000.10101000.00101000.00000000 - 192.168.40.0 network ID
11111111.11111111.11111111.00000000 - Old subnet mask (/24)

11000000.10101000.00101000.00000000 - 192.168.40.0 network ID
11111111.11111111.11111111.10000000 - New subnet mask (/25)

11000000.10101000.00101000.10000000 - 192.168.40.128 network ID
11111111.11111111.11111111.10000000 - New subnet mask (/25)

仔细检查,直到看明白为止。我们将子网掩码的长度增加了一位,导致网络 ID 覆盖了原本用于主机 ID 的一位。由于那一位可以是零或一,我们有效地将 192.168.40.0 网络分成了两个网络。192.168.40.0/25 网络中的第一个有效 IP 地址将是第一个最右边位为“1”的主机 ID:

11000000.10101000.00101000.00000001 - 192.168.40.1 - First valid host in the 192.168.40.0/25 network

同样,192.168.40.128 网络中的第一个有效主机将是第一个最右边位带有“1”的主机 ID:

11000000.10101000.00101000.10000001 - 192.168.40.129 - First valid host in the 192.168.40.128/25 network

每个网络中的最后一个有效主机将是主机 ID,每个位除了最右边的位设置为“1”:

11000000.10101000.00101000.01111110 - 192.168.40.126 - Last valid host in the 192.168.40.0/25 network
11000000.10101000.00101000.11111110 - 192.168.40.254 - Last valid host in the 192.168.40.128/25 network

因此,通过这种方式,我们创建了一个足够大的网络来容纳我们的客户端计算机,然后我们可以应用相同的原理将第二个网络分解为更小的网络。让我们记下来:

  • 客户端计算机 - 192.168.40.0/25 - 有效 IP:192.168.40.1 - 192.168.40.126

现在,为了分解我们的服务器和交换机的第二个网络,我们做同样的事情。

我们有 12 台服务器计算机,但我们可能会再购买 6 台。我们计划购买 18 台,这样 2 的下一个最高幂就是 32。在二进制中,32 是“100000”,长度为 6 位。192.168.40.128/25 中还剩下 7 位子网掩码,因此我们有足够的位来继续“玩”。再增加一位子网掩码,我们就可以得到两个网络:

11000000.10101000.00101000.10000000 - 192.168.40.128 network ID
11111111.11111111.11111111.10000000 - Old subnet mask (/25)

11000000.10101000.00101000.10000000 - 192.168.40.128 network ID
11111111.11111111.11111111.11000000 - New subnet mask (/26)
11000000.10101000.00101000.10000001 - 192.168.40.129 - First valid host in the 192.168.40.128/26 network
11000000.10101000.00101000.10111110 - 192.168.40.190 - Last valid host in the 192.168.40.128/26 network

11000000.10101000.00101000.11000000 - 192.168.40.192 network ID
11111111.11111111.11111111.11000000 - New subnet mask (/26)
11000000.10101000.00101000.11000001 - 192.168.40.193 - First valid host in the 192.168.40.192/26 network
11000000.10101000.00101000.11111110 - 192.168.40.254 - Last valid host in the 192.168.40.192/26 network

因此,现在我们将 192.168.40.128/25 分成另外两个网络,每个网络都有 26 位子网掩码,或者总共 62 个可能的主机 ID -- 2 ^ (32 - 26) - 2。

这意味着这两个网络都有足够的地址供我们的服务器和交换机使用!让我们做个记录:

  • 服务器 - 192.168.40.128/26 - 有效 IP:192.168.40.129 - 192.168.40.190
  • 交换机 - 192.168.40.192/26 - 有效 IP:192.168.40.193 - 192.168.40.254

这种技术称为可变长度子网掩码 (VLSM),如果正确应用,会导致“核心路由器”具有较小的路由表(通过称为“路由汇总”的过程)。就本例中的 ISP 而言,他们可能完全不知道我们如何对 192.168.40.0/24 进行子网划分。如果他们的路由器有一个发往 192.168.40.206(我们的一台交换机)的数据包,他们只需知道将其传递给我们的路由器(因为 192.168.40.206 与他们路由器的路由表中的网络 ID 和子网掩码 192.168.40.0/24 相匹配),我们的路由器就会将其发送到目的地。这使我们的子网路由不出现在他们的路由表中。(我在这里简化了,但您明白我的意思。)

您也可以用同样的方式规划地理上非常大的网络。只要您预先进行正确的“城市规划”(准确预测每个子网中的主机数量并着眼于未来),您就可以创建一个大型路由层次结构,在核心路由器上,“总结”为非常少的路由。正如我们上面所看到的,路由器路由表中的路由越多,其执行速度就越慢。使用 VLSM 设计 IP 网络并保持路由表较小是一件好事(tm)。

例子的不现实

这个答案中的虚构世界显然是虚构的。通常,您可以在现代交换以太网上创建子网,主机数量超过 254 个(取决于流量配置文件)。正如评论中指出的那样,在路由器之间使用 /24 网络与 Real Life(tm) 不一致。它提供了一个可爱的例子,但却浪费了地址空间。通常,/30 或 /31(请参阅http://www.faqs.org/rfcs/rfc3021.html有关 /31 如何工作的详细信息 - 它们肯定超出了本答案的范围)网络用于两个路由器之间严格点对点的链路。

相关内容