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

Kyl*_*ndt 461 networking tcpip subnet ipv4

这是一个关于 IPv4 子网的规范问题

有关的:

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

  • 如果我有一个网络,我如何弄清楚如何拆分它?
  • 如果给我一个网络掩码,我怎么知道它的网络范围是什么?
  • 有时有一个斜线后跟一个数字,那个数字是什么?
  • 有时有一个子网掩码,也有一个通配符掩码,它们看起来是一样的,但它们是不同的?
  • 有人提到了一些关于了解二进制的事情?

Eva*_*son 671

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”。A bit 是b nary dig

将二进制数(例如“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 1s in subnet mask, remaining bits set to 0
00000000.00000000.00011000.00101001 - Portion of IP address covered by 0s 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 0s 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.00010010.00011111.01011100)。

正如我们已经知道的,路由器 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(建筑物编号)构建正确数量的子网(街道),并使用路由器将子网相互连接(交叉点)。路由器中指定的有关允许的源地址和目标地址的规则可以进一步控制流量。防火墙可以充当强迫性的交通警察。

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

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

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

  • 不要打破它。 (31认同)
  • @Joseph:为了自己的利益,我已经讲过太多次了。>微笑<我会看看你的二进制部分。我不愿意教数学(这就是理解二进制的真正含义——以 2 为基数计数),因为我不太擅长数学。 (14认同)
  • +1 必须是*史诗般的万能之母* ;-) (4认同)
  • +1 是有史以来在 serverfault 上看到的最全面的帖子 (4认同)
  • 如果仅用于里程表比喻,则支持。现在我知道如何向人们解释二进制是如何工作的。 (3认同)
  • 这应该作为一本书出版。 (3认同)
  • 我唯一要解决的问题是,在理解如何有效地将 IP 网络分解为子网之前,需要先了解子网划分 * 存在 *(IP 路由)的原因。我从来没有找到一种孤立地讨论一个主题的好方法。(真的,在您了解 IP 路由之后,使用 VLSM 设计 IP 网络自然而然并且“有意义”......) (2认同)
  • @埃文安德森,我只是在重读这个。你的回答被截断了吗?在最后我们看到`并且,因此,你想打破这些`。似乎在某个时间点还有更多。 (2认同)
  • 我读过的最好的和建设性的答案之一。 (2认同)
  • @laertis - 神奇的互联网积分(并成为该网站上几年的顶级用户)足以支付。 (2认同)

Jos*_*ern 149

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

您的 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 部分全为 1 的地址。因此,对于任何给定的 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)
Run Code Online (Sandbox Code Playgroud)

仔细看看,直到它有道理。我们将子网掩码的长度增加了一位,从而使网络 ID 覆盖了本应用于主机 ID 的一位。由于那一位可以是 0 或 1,我们已经有效地将 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
Run Code Online (Sandbox Code Playgroud)

同样,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
Run Code Online (Sandbox Code Playgroud)

每个网络中的最后一个有效主机将是主机 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
Run Code Online (Sandbox Code Playgroud)

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

  • 客户端计算机 - 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
Run Code Online (Sandbox Code Playgroud)

所以,现在我们已经将 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(有关 /31 的工作方式的详细信息,请参阅http://www.faqs.org/rfcs/rfc3021.html -它们肯定超出了本答案的范围)网络用于两个路由器之间严格点对点的链路。

  • 我将对该答案进行投票,以确保两个答案按顺序排列。 (2认同)

Jos*_*ern 78

子网

子网划分并不困难,但可能令人生畏。因此,让我们从最简单的步骤开始。学习二进制数。

二进制

二进制是基数为 2 的计数系统。仅由两个数字(1 和 0)组成。计数以这种方式进行。

1 = 001 ( 0 + 0 + 1 = 1)
2 = 010 ( 0 + 2 + 0 = 2)
3 = 011 ( 0 + 2 + 1 = 3)
4 = 100 ( 4 + 0 + 0 = 4)
5 = 101 ( 4 + 0 + 1 = 5)
Run Code Online (Sandbox Code Playgroud)

因此,如果您只是想象每个 1 是一个值的占位符(所有二进制值都是 2 的幂)

1     1     1     1     1 = 31
16  + 8  +  4  +  2  +  1 = 31
Run Code Online (Sandbox Code Playgroud)

所以... 100000 = 32。和 10000000 = 128。和 11111111 = 255。

当我说“我的子网掩码为 255.255.255.0”时,我的意思是“我的子网掩码为 11111111.11111111.11111111.00000000”。我们使用子网作为简写。

地址中的句点分隔每 8 个二进制数字(一个八位字节)。这就是 IPv4 被称为 32 位 (8*4) 地址空间的原因。

为什么是子网?

IPv4 地址 (192.168.1.1) 供不应求。子网为我们提供了一种增加可用网络(或主机)数量的方法。这是出于管理原因和技术原因。

每个 IP 地址被分成两个独立的部分,网络和主机。默认情况下,C 类地址 (192.168.1.1) 使用前 3 个八位字节 (192.168.1) 作为地址的网络部分。和第四个八位字节 (.1) 作为主机部分。

默认情况下,C 类地址的 IP 地址和子网掩码如下所示

IP     192.168.1.1 
Subnet 255.255.255.0
Run Code Online (Sandbox Code Playgroud)

像这样的二进制

IP     11000000.10101000.00000001.00000001
Subnet 11111111.11111111.11111111.00000000
Run Code Online (Sandbox Code Playgroud)

再看一下二进制示例。请注意我是如何说前三个八位字节用于网络的?请注意网络部分是如何全部为 1 的?这就是所有子网。让我们展开。

鉴于我的主机部分只有一个八位字节(在上面的示例中)。我只能拥有 256 个主机(256 是一个八位字节的最大值,从 0 开始计数)。但是还有一个小技巧:您需要从可用的主机地址中减去 2 个主机地址(当前为 256 个)。该范围内的第一个地址将用于网络 (192.168.1.0),而该范围内的最后一个地址将是广播 (192.168.1.255)。所以你真的有 254 个可用地址供一个网络中的主机使用。

案例研究

假设我给了你下面的一张纸。

Create 4 networks with 192.168.1.0/24.
Run Code Online (Sandbox Code Playgroud)

让我们来看看这个。/24 称为 CIDR 表示法。我们只引用网络所需的位,而不是引用 255.255.255.0。在这种情况下,我们需要来自 32 位地址的 24 位 (3*8)。用二进制写出来

11111111.11111111.11111111.00000000 = 255.255.255.0
8bits   + 8bits  + 8bits  + 0bits   = 24bits
Run Code Online (Sandbox Code Playgroud)

接下来我们知道我们需要弄清楚我们需要多少个子网。看起来像 4. 因为我们需要创建更多的网络(目前我们只有一个)让我们翻转一些位

11111111.11111111.11111111.00000000 = 255.255.255.0   = 1 Network OR /24
11111111.11111111.11111111.10000000 = 255.255.255.128 = 2 Networks OR /25
11111111.11111111.11111111.11000000 = 255.255.255.192 = 4 Networks (remember powers of 2!) OR /26
Run Code Online (Sandbox Code Playgroud)

现在我们已经决定使用 /26,让我们开始分配主机。一个简单的数学:

32(bits) - 26(bits) = 6(bits) for host addresses.
Run Code Online (Sandbox Code Playgroud)

我们在每个网络中为主机分配 6 位。请记住,我们需要为每个网络减去 2。

h = host bits    
2^h - 2 = hosts available

2^6 - 2 = 62 hosts 

Finally we have 62 hosts in 4 networks, 192.168.1.0/26
Run Code Online (Sandbox Code Playgroud)

现在我们需要弄清楚主机去哪里了。回到二进制!

11111111.11111111.11111111.00,000000 [the comma is the new network/hosts division]

Begin to calculate:

11000000.10101000.00000001.00,000000 = 192.168.1.0 [First IP = Network Adress]
11000000.10101000.00000001.00,000001 = 192.168.1.1 [First Host IP]
11000000.10101000.00000001.00,000010 = 192.168.1.2 [Second Host IP]
11000000.10101000.00000001.00,000011 = 192.168.1.3 [Third Host IP]

And so on ... until ...

11000000.10101000.00000001.00,111110 = 192.168.1.62 [Sixty Second Host IP]
11000000.10101000.00000001.00,111111 = 192.168.1.63 [Last IP = Broadcast Address]

So ... On to the NEXT network ....

11000000.10101000.00000001.01,000000 = 192.168.1.64 [First IP = Network Address]
11000000.10101000.00000001.01,000001 = 192.168.1.65 [First Host IP]
11000000.10101000.00000001.01,000010 = 192.168.1.66 [Second Host IP]

And so on ... until ...

11000000.10101000.00000001.01,111110 = 192.168.1.126 [Sixty Second Host IP]
11000000.10101000.00000001.01,111111 = 192.168.1.127 [Last IP = Broadcast Address]

So ... On to the NEXT network ....

11000000.10101000.00000001.10,000000 = 192.168.1.128 [First IP = Network Address]
11000000.10101000.00000001.10,000001 = 192.168.1.129 [First Host IP]

Etc ...
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以计算整个子网。

通配符 通配符掩码是反向子网掩码。

11111111.11111111.11111111.11000000 = 255.255.255.192 [Subnet]
00000000.00000000.00000000.00111111 = 0.0.0.63 [Wild Card]
Run Code Online (Sandbox Code Playgroud)

更远

谷歌搜索术语“超级网”和“VLSM(可变长度子网掩码)”,了解更高级的主题。

我现在可以看到我花了太长时间来回应......叹气

  • -1 抱歉,自 1993 年 RFC 1519 以来就没有“类”了,没有人应该在历史背景之外谈论它们。它们令人困惑并引起很多误解。 (3认同)

Mur*_*iar 35

简史课:最初,单播 IPv4 地址分为 3 类,每类都有一个关联的“默认”掩码长度(称为有类子网掩码)

  • A 类:1.0.0.0 -> 127.255.255.255 范围内的任何值。255.0.0.0 的有类子网掩码(CIDR 表示法中的 /8)
  • B 类:128.0.0.0 -> 191.255.255.255 范围内的任何内容。255.255.0.0 的有类子网掩码(CIDR 表示法中的 /16)
  • C 类:192.0.0.0 -> 223.255.255.255 范围内的任何内容。255.255.255.0 的有类子网掩码(CIDR 表示法中的 /24)

这个想法是可以为不同规模的组织分配不同类别的 IP 地址,以有效利用 IP 地址空间。

然而,随着 IP 网络的发展,很明显这种方法有其问题。仅举三个:

在有类世界中,所有子网必须具有 /8、/16 或 /24 的掩码。这意味着可以配置的最小子网是 /24,它允许 254 个主机地址(分别保留 .0 和 .255 作为网络地址和广播地址)。这非常浪费,尤其是在仅连接两个路由器的点对点链路上。

即使在放宽此限制之后,早期的路由协议(例如RIPv1)也不会通告与 IP 前缀关联的掩码长度。在没有特定掩码的情况下,它将使用同一有类网络中直接连接的接口的掩码,或者回退到使用有类掩码。例如,如果您想将网络 172.16.0.0 用于具有 /30 掩码的路由器间链接,则172.16.0.0 - 172.16.255.255 之间的所有子网都必须具有 /30 掩码(16384 个子网,每个子网有 2 个可用 IP )。

互联网路由器的路由表开始占用越来越多的内存;这被称为“路由表爆炸”。例如,如果提供商有 16 个连续的 /24 个网络,他们将需要通告所有 16 个前缀,而不是覆盖整个范围的单个摘要。

两个相关的改进使我们能够超越上述限制。

  1. 可变长度子网掩码 (VLSM)
  2. CIDR(无类别域间路由)

VLSM 是指路由协议在同一类网络中支持不同子网掩码的能力。例如:

192.168.1.0/24
Run Code Online (Sandbox Code Playgroud)

可以分为:

192.168.1.0/25
192.168.1.128/26
192.168.1.192/27
192.168.1.224/27
Run Code Online (Sandbox Code Playgroud)

这允许更有效地使用地址空间;子网的大小可以根据连接到它们的主机/路由器的数量进行正确调整。

CIDR 采用 VLSM 并以另一种方式扩展它;除了将单个有类网络拆分为较小的子网之外,CIDR 还允许将多个有类网络聚合到一个汇总中。例如,以下 B 类 (/16) 网络:

172.16.0.0/16
172.17.0.0/16
172.18.0.0/16
172.19.0.0/16
Run Code Online (Sandbox Code Playgroud)

可以用单个前缀聚合/总结:

172.16.0.0/14
Run Code Online (Sandbox Code Playgroud)

在子网划分方面:子网掩码是 32 位长。掩码长度表示有多少位标识地址的网络部分。例如:

10.1.1.0/24
Run Code Online (Sandbox Code Playgroud)
  • 有类子网掩码是 /8
  • 实际子网掩码是/24
  • 16 位 (24-8) 已“借用”用于子网划分。

这意味着,假设整个 10.0.0.0/8 网络被子网划分为 /24s,则此范围内将有 65536 (2 ^ 16) 个子网。(这是假设您使用的平台支持 0 和 255 的子网号。请参阅 Cisco 的 ip subnet-zero)。

地址的“主机部分”中还剩下 8 位。这意味着有 256 个可用的 IP 地址(2^8),其中 2 个是保留的(10.1.1.0 是网络地址,10.1.1.255 是子网定向广播地址)。这在该子网上留下了 254 个可用的 IP 地址。((2^8) - 2)

  • 是的,但是我们真的需要为“子网划分简介”问题进入多播和保留的 E 类寻址吗?:) (5认同)
  • 实际上有5个班级。 (4认同)
  • 你把历史带入了一个介绍性问题……然后让它不完整。不确定哪个更糟。 (2认同)

小智 8

在此过程中,我将提出并回答一些相关问题:

  • 为什么255.255.255.0经常看到?
  • 为什么192.168.0.1
  • 为什么127.0.0.1

为什么会有这么奇怪的数字——255、192、168、127?


8+8+8+8位点分十进制

194.60.38.10这样的 Internet 地址使用点分十进制表示法将 32 位分成 8+8+8+8 位。点分十进制表示将每个数字转换为二进制,然后用0's左填充它。

例如.60.→ 60=32+16+8+4 → 111100.00111100.

所以 194.60.38.10 是 4×8=32 位地址的点分十进制11000010.00111100.00100110.00001010,因为 38 → 100110、 10 →1010等等。194 需要全部 8 位;其余的被填充。

加垫

一旦你考虑了 8 位二进制中的 255、192 和 127,你就会更容易理解为什么某些十进制数如此普遍:

  • 255 = 11111111
  • 192 = 11000000
  • 127 = _1111111
  • 128 = 10000000

这些十进制数字恰好代表了视觉上方便的 8 位块,如 ????????、?????????? 和 ??????????。所以你从未见过 256=2?由于 8 位的限制,127=128−1=2?−1 是 2 的幂的位翻转,而 2 的幂是10………00000二进制的。

  • 168 = 10101000

子网掩码:我的就是我的 + 你的就是你的

然后子网掩码将每个 32 位 Internet 地址分解为一个网络 ID 和一个主机 ID。互联网地址可以是 1 和 0 的任意混合,而子网掩码仅以 1 开头,仅以 0 结尾。

????????|????????|????????|???????? IP
????????|????????|????????|???????? subnet
Run Code Online (Sandbox Code Playgroud)

将前 8+8+8=24 位涂黑,然后将最后 8 位涂白是一种分割 IP 的方式??|???????? 分成两部分:

????????|????????|????????          network
                             ???????? host
Run Code Online (Sandbox Code Playgroud)

如果子网所有者(比如OmniCorp)想要更多内部 IP,他们可以购买更多(比如 8+8=16 位)网络右侧,如下所示:

????????|????????|????????|???????? IP
????????|????????|????????|???????? subnet
???????? ????????                    network
                   ???????? ???????? host
Run Code Online (Sandbox Code Playgroud)

显然,在 32 位 = 2³² = 4,294,967,296 选项地址空间中存在折衷:如果您购买更多网络 ID(左侧),您的内部网络将分配更多主机 ID(右侧)。

因此便宜的人有一个子网掩码

255.255.255.0 = ????????|??????????|????????|??????????。

再便宜的人也有

255.255.255.128 = ????????|??????????|????????|????????

或 255.255.255.192 = ??????????|??????????|??????????|????????。

根据民间传说,这实际上不是 Roger Miller,而是一个拥有 255.255.255.254 面具的低级系统管理员,他最初编写了《公路之王》,用“我没有大子网”代替“我没有香烟” ”。

我把烟抽到屁股

(为什么低等人的掩码会填上这么高的数字?因为,就像米勒的叙述者一样,子网掩码会计算你没有的所有东西。)


IP 后面的斜杠是什么意思?(例如,194.60.38.10/24)

由于子网掩码(将“他们的”与“我们的”分开)总是以1's开头,而且由于我们更讨厌总结 2 的幂,甚至比我们讨厌计算 2 的幂更甚,所以有人发明了CIDR(IP 后的斜杠)。

194.60.38.10/24 表示“子掩码有 24 个 1,其余都是 0”,所以

????????|????????|????????|?????????? 8+8+8 位属于“他们”,8 位属于“我们”。

颠倒上面流浪汉的国歌,

  • /31 是作曲家
  • /24是中产阶级(255.255.255.0= ??????????|??????????|????????|??????????
  • /16 有钱吗??????????|????????|??????????|???????
  • /8 是超级富豪??????????|????????|??????????
  • /1或者/0是 IANA 或其他什么。





† 使用bc -l; obase=10; 60例如。


gbj*_*anb 7

网络范围:网络总是由 2 个数字引用:一个用于确定网络,另一个用于确定该网络上的计算机(或主机)。由于每个网络地址的长度为 32 位,因此这两个数字都必须适合这 32 位。

网络编号很重要,因为这是当您要求网络 IP 范围时 ICANN 分发的编号。如果我们没有它,就没有人能够分辨出我的网络和 AT&T 之间的区别。因此,虽然这些编号必须是唯一的,但没有其他人愿意为我网络上的主机分配编号。因此分裂 - 第一部分由网络人员管理,第二部分全部由我提供给我想要的任何机器。

网络号不是固定在一定数量的位上——例如,如果我只有 200 台机器来管理自己,我会非常满意使用 24 位的网络号,而我自己只有 8 位- 最多可容纳 255 台主机。由于网络号使用 24 位,我们可以拥有很多,这意味着很多人可以拥有自己的网络。

过去,这被称为 C 类网络。(B类网络号使用16位,A类使用8位,所以A类网络只有少数存在)。

如今,这种命名约定已经过时了。它被称为 CIDR 的概念所取代。CIDR 明确地将您的主机的位数放在斜杠之后。所以我上面的例子(C 类)现在被称为 CIDR /24。

这确实给了我们更多的灵活性,之前如果我要管理 300 台主机,我需要一个 B 类网络!现在,我可以得到一个 /23 CIDR,所以我有 9 位给我,23 位给网络号。ICANN 可能没有这种类型的网络,但如果我有一个内部网络,或者从 ISP 租用部分网络,这会更容易管理 - 特别是因为他们的所有客户都可以得到 /29(离开我 . . 3 位或最多 8 台机器),这允许更多人拥有自己的一小部分可用 IP 地址。在我们获得 IPv6 之前,这非常重要。


但是......虽然我知道 /24 CIDR 相当于旧的 C 类网络,/ 16 是 B 类,/ 8 是 A 类......我仍然难以计算 /22我的头。幸运的是,有一些工具可以为我做到这一点:)

但是 - 如果您知道 /24 是主机的 8 位(而网络是 24 位),那么我知道 /23 给了我一个额外的位,它使主机数量加倍。


Jon*_*n J 6

虽然以上是正确的(对不起,TL;DR),但计算子网仍然让许多网络管理员感到非常悲伤。其实有一个很简单的方法来做子网计算,你可以在你的脑海里做大部分,而且你需要记住的很少。对于大多数应用程序,甚至不需要理解二进制表示,尽管它有助于全面理解子网划分。这里我只讨论IPv4;IPv6 不在本讨论的范围内。

记住这一点:

需要记住三个关键点:所有子网都基于 2 的幂,并且有两个关键数字:256 和 32。稍后会详细介绍。

首先,让我们看一个包含 2 次幂的表格:

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
Run Code Online (Sandbox Code Playgroud)

计算 2 的幂很容易:幂每增加一个整数,结果就会加倍。1+1=2、2+2=4、4+4=8、8+8=16,以此类推。子网中的地址总数必须始终是 2 的幂

由于 IPv4 子网的每个八位字节最多可达 256,因此256是一个非常重要的数字,并构成了其余数学运算的基础。

调整子网大小

我们将从一个简单的问题开始:“如果掩码是 255.255.255.248,子网中有多少地址?” 我们现在将忽略前三个八位字节并查看最后一个。这是多么容易:从 256 中减去 248。256 减去 248 等于 8。有 8 个地址可用(包括网络地址和广播地址)。反之亦然:“如果我想要一个有 16 个地址的子网,子网掩码是什么?” 256 减 16 等于 240。子网掩码将为 255.255.255.240。

现在,如果我们想要扩展到 256 个地址以外(历史上,“C 类”),它只会变得稍微复杂一点:如果我们的最后一个八位字节是 0,我们的第三个八位字节是,比如说,240,(255.255.240.0)那么我们对第三个八位字节进行计算,发现将有 16 个地址。所以我们将 16 乘以 256(最后一个八位字节中的地址数)得到 4,096。如果最后两个八位字节都是 0,(例如 255.240.0.0),那么我们从第二个八位字节(我们会再次说它是 16)中减去结果,乘以 256(第三个八位字节中的地址),再次乘以256(最后一个八位字节中的地址)得到 1,048,576 个地址。就这么简单!(好吧,反过来有点困难。如果我们想要一个有 1,048,576 个地址的子网,我们必须将该数字除以 256 几次才能得到一个可以从 256 中减去的数字。)

网络地址

现在我们知道了如何计算子网掩码,我们如何计算网络地址?这很简单:它始终是我们子网中地址数量的倍数。因此,如果我们的子网中有 16 个地址,则可能的网络地址将是 0、16、32、48、64 等等,直到 240。(请注意,0 是任何数字的有效倍数,因为任何数字乘以0 等于 0。)

当然,广播地址将是范围内的最后一个地址。因此,如果我们的子网中有 16 个地址,并且我们选择了 10.3.54.64 的网络地址,则广播地址将为 (64+16-1=79) 10.3.54.79。

CIDR 表示法

那么 CIDR 表示法呢?如何将其与 IPv4 样式的子网掩码相互转换?

还记得我们的两个幂吗?好吧,现在除了 256 之外,我们还有另一个要记住的关键数字:32。请记住,CIDR 表示法描述了 IPv4 地址中有效位的数量,IPv4 地址中有 32 位,每个八位字节为 8。所以如果我们有一个 255.255.255.240 的子网掩码,那就是 16 个地址。如果我们查看上面的“2 的幂”表,我们会看到 16 是 2 的四次幂 (2^4)。所以我们从 32 中减去那个幂数 -- 4 -- 得到 28。我们的子网掩码 255.255.255.240 的 CIDR 表示法,我们的 CIDR 表示法是 /28。

如果我们得到的 CIDR 为 /28,我们从 32 中减去 (28) 得到 4;将 2 的 (4th) 次方 (2^4) 提高到 16;然后从 256 中减去 (16) 得到 240;或 255.255.255.240。