IPv4子网划分如何工作?


439

这是有关IPv4子网的规范问题

有关:

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

  • 如果我有网络,我该如何解决如何将其拆分?
  • 如果给我一个网络掩码,我怎么知道它的网络范围是什么?
  • 有时会有一个斜线后跟一个数字,那个数字是什么?
  • 有时有一个子网掩码,但也有一个通配符掩码,它们看起来像是同一件事,但又有所不同?
  • 有人提到过一些有关二进制的知识吗?

这个分为两部分的答案解释了您想了解的有关IPv4地址计算的所有信息,以及更多内容。
罗恩·莫潘

Answers:


648

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

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

计数到1

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

对于剩下的那些人:对您不懂二进制表示法感到羞耻!

是的-可能有点苛刻。学习以二进制进行计数,以及学习将二进制转换为十进制然后返回的快捷方式确实非常容易。您真的应该知道该怎么做。

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

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

行驶第一英里后,里程表将显示“ 00000001”。到现在为止还挺好。

当您行驶第二英里时,里程表的第一位数字回滚至“ 0”(因为最大值为“ 1”),里程表的第二位数字回滚至“ 1”,使里程表显示为“ 00000010”。看起来就像十进制数字10,但实际上是二进制数字2(到目前为止您开车的里程数)。

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

最后,当您行驶了第4英里时,两个数字(在第3英里末尾读为“ 1”)都回滚到零位置,而第3个数字又滚回到了“ 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)。

从最左边的数字开始,在数字(218)上方写下“ 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地址可以分为称为“主机ID”的“建筑物编号”组件(如上例中的“ 123”)和称为“主机名”的“街道名称”组件(如上例中的“ Main Street”)。 “网络ID”。对于我们的人眼来说,很容易看到建筑物编号和街道名称在“ 123 Main Street”中的位置,但是在“ 10.13.216.41”中却很难看到该分区,子网掩码为255.255.192.0。

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

首先以二进制形式写出IP地址(如果您还没有学会使用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。

更多术语

您将看到在整个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)而不幸,否则我不建议您再学习这些子网掩码。我不再赘述这些地址的“类”,因为它在当今并不适用,并且可能会造成混淆。

一些设备使用称为“通配符掩码”的表示法。“通配符掩码”无非是一个子网掩码,其中全0表示1,而1全表示0。/ 26的“通配符掩码”为:

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

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

路由器如何工作

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

假设您是IP路由器,并且已连接的接口编号为:

  • 以太网0-192.168.20.1,子网掩码/ 24
  • 以太网1-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)

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

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

静态路线

至此,我们已经将虚拟路由器与网络直接相连。显然,这不是世界真正的运转方式。在驾驶披萨的类比中,有时不允许驾驶员进入比前台更远的建筑物,并且不得不将披萨交给其他人以交付给最终接收者(暂停您的怀疑并在我忍耐的同时请打个比方)。

让我们从前面的示例中的路由器“ Router 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

您会看到路由器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的路由表条目,那么我们假设来自PC的192.168.20.13数据包到达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

如果路由器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个字符)。)


13
@约瑟夫:这是一场我为了自己的利益而多次演讲的演讲。>微笑<,我来看看您的二进制部分。我不愿意讲授数学(这实际上是理解二进制的含义-以2为底数),因为我不太擅长数学。
埃文·安德森

2
关于分解答案的唯一问题是,在理解如何有效地将IP网络分解为子网之前,需要了解为什么存在子网划分(IP路由)。我从来没有找到一种很好的方法来将一个主题与另一个主题分开讨论。(实际上,使用VLSM设计IP网络是自然而然的事,在您理解IP路由之后才是“有意义的……”)
Evan Anderson 2009年

28
不要分手。
约瑟夫·科恩

3
+1是有史以来服务器故障最全面的帖子
Scott Lundberg

3
仅适用于里程表隐喻。现在,我知道如何向人们解释二进制的工作原理。
phuzion

142

续自: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个开关-第二个大功率是16
  • 97台客户端计算机-第二大幂是128

在给定的IP子网中,保留了两个不能用作有效设备IP地址的地址-主机ID部分中的全零地址和主机ID部分中的全零地址。这样,对于任何给定的IP子网,可用的主机地址数量是32的幂乘以子网掩码中的位数减去2的乘方。因此,对于192.168.40.0/24,我们可以看到子网掩码有24位。剩下的8位可用于主机ID。我们知道2到8的幂是256-意味着256种可能的位组合适合8位宽的插槽。由于主机ID不允许使用这8位的“ 11111111”和“ 00000000”组合,因此,我们可以在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的工作方式的详细信息-肯定超出了此答案的范围)。在两个路由器之间严格点对点的链接。


小错误:“最后一个有效主机...”之后的代码恢复为称其为“第一个有效主机”。我认为应该仍然说“最后”。
JoeCool1986

@ JoeCool1986-很好。
埃文·安德森

2
我将对这个答案进行投票,以确保两个答案保持顺序。
l46kok

在从192.168.40.128创建两个子网并创建网络ID 192.168.40.192的那部分中,192的来源是什么?
user6607

@ user6607子网向后计数(无间隔)。例如,第一个子网0表示为00000000。第二个子网为,第三个子网表示为,128依此10000000类推。只需继续倒计数以找到新的子网。19211000000
Joseph Kern 2015年

76

子网划分

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

二元

二进制是以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)

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

1     1     1     1     1 = 31
16  + 8  +  4  +  2  +  1 = 31

所以... 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

像这样的二进制

IP     11000000.10101000.00000001.00000001
Subnet 11111111.11111111.11111111.00000000

再看一下二进制示例。注意我怎么说前三个八位字节用于网络吗?注意网络部分是全是什么吗?这就是所有子网划分。让我们扩展。

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

案例研究

假设我给了你下面的纸。

Create 4 networks with 192.168.1.0/24.

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

11111111.11111111.11111111.00000000 = 255.255.255.0
8bits   + 8bits  + 8bits  + 0bits   = 24bits

接下来,我们知道需要确定需要多少个子网。看起来像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

现在我们已经决定了/ 26,让我们开始分配主机。一些简单的数学运算:

32(bits) - 26(bits) = 6(bits) for host addresses.

我们在每个网络中为主机分配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

现在我们需要找出主机的位置。回到二进制!

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 ...

这样,您可以计算整个子网。

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

11111111.11111111.11111111.11000000 = 255.255.255.192 [Subnet]
00000000.00000000.00000000.00111111 = 0.0.0.63 [Wild Card]

进一步

Google的术语“超级网络”和“ VLSM(可变长度子网掩码)”,用于更高级的主题。

我现在可以看到我在响应时间太长......


1
“考虑到我的主机部分只有一个八位位组(在上面的示例中)。我只能拥有255台主机(255是一个八位位组的最大值)。但是还有另一个小窍门:您需要减去2个主机地址来自可用地址(当前为255)。范围中的第一个地址将用于网络(192.168.1.0),范围中的最后一个地址将是广播(192.168.1.255)。因此,您实际上有253个可用地址可用于一个网络中的主机。” ...这是不正确的。
joeqwerty

1
八位字节有256个可能的值:0到255,共256个。256 -2(网络和广播地址)= 254个可能的主机地址。
joeqwerty

哎呀。谢谢!:-)一个人,我不知道我是如何做到这一点的。
Joseph Kern

1
-1对不起,但是自1993年RFC 1519以来就没有“类”,没有人可以在历史背景之外谈论它们。它们令人困惑并引起很多误解。
克里斯S

克里斯,您也许是对的,但是直到2000年代初期,仍在CCNA和大多数本科课程中教授课程。
约瑟夫·科恩

34

简要的历史课程:最初,单播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

可以分为:

192.168.1.0/25
192.168.1.128/26
192.168.1.192/27
192.168.1.224/27

这样可以更有效地利用地址空间;子网的大小可以根据要连接到它们的主机/路由器的数量进行正确设置。

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

可以使用单个前缀进行汇总/汇总:

172.16.0.0/14

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

10.1.1.0/24
  • 有类别的子网掩码是/ 8
  • 实际的子网掩码是/ 24
  • 已“借用”了16位(24-8)以使用子网划分。

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

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


4
实际上有5个班级。
dbasnett'5

5
是的,但是我们真的需要进入组播和保留的E类地址来解决“子网划分介绍”问题吗?:)
Murali Suriar'5

2
您将历史记录引入了介绍性问题中...然后不完整。不知道哪个更糟。
克里斯·S

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给我一个额外的位,它将主机数量加倍。


-1抱歉,但是如今在“历史”参考之外提及班级是不合适的。它们并没有“过时”,它们在1993年被RFC 1519正式弃用。它们令人费解,造成了很多误解。
克里斯·S

动态路由协议的某些实现沿类边界汇总,因此了解它们仍然很有帮助。

5

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

  • 为什么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位。点分十进制表示将每个数字转换为二进制,然后用0s 左填充。

例如.60.→60 = 32 + 16 + 8 + 4 111100→→ .00111100.

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

填充

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

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

这些十进制数字恰好代表视觉上方便的8位块,例如■■■■■■■■,■□□□□□□□和□■■■■■■■。所以,你从来没见过256 =2⁹由于8位的限制,以及127 = 128-1 =2⁸-1的幂的双和权力-的-两个是位翻转10………00000中的二进制

  • 168 = 10101000

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

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

■■□□□□■□|□□■■■■□□|□□■□□■■□|□□□□■□■□ IP
■■■■■■■■|■■■■■■■■|■■■■■■■■|□□□□□□□□ subnet

将前8 + 8 + 8 = 24位涂黑,而将最后8位涂黑,则是分割IP的一种方法。 ■□|□□□□■■■■分为两部分:

■■□□□□■□|□□■■■■□□|□□■□□■■□          network
                             □□□□■□■□ host

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

■■□□□□■□|□□■■■■□□|□□■□□■■□|□□□□■□■□ IP
■■■■■■■■|■■■■■■■■|□□□□□□□□|□□□□□□□□ subnet
■■□□□□■□ □□■■■■□□                    network
                   □□■□□■■□ □□□□■□■□ host

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

廉价人因此具有以下子网掩码:

255.255.255.0 =■■■■■■■■|■■■■■■■■■■■■■■■

更便宜的人有

255.255.255.128 =■■■■■■■■|■■■■■■■■■■■■■■■■

或255.255.255.192 =■■■■■■■■|■■■■■■■|■■■■■■

根据民间传说,它实际上不是Roger Miller,而是一个低级的系统管理员,最初写《King of the Road》时使用255.255.255.254掩码,用“我没有大烟头”代替“我没有大烟头”。 ”。

我把烟抽到屁股上

(为什么低端的掩码会填充这么高的数字?因为像Miller的叙述者一样,子网掩码会统计您没有的所有内容。)


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

由于子网掩码(将“他们的”与“我们的”分开)始终以1s 开头,并且由于我们讨厌对二的幂进行求和,甚至比我们一开始不愿计算二的幂更讨厌,因此有人发明了CIDR(IP后的斜杠)。

194.60.38.10/24的意思是“子掩码有24个,那么其余都是零”,因此

■■■■■■■■■■■■■■■■■■■■■■■■■■■■□□□□□□□□□属于“他们”的8 + 8 + 8位属于“我们”。

逆转上面的流浪汉的国歌,

  • /31 是词曲作者
  • /24是中产阶级(255.255.255.0=■■■■■■■■|■■■■■■■
  • /16 富有■■■■■■■■■■■■■■■■■■
  • /8 超级富有
  • /1或者/0是IANA之类的东西。





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


图片与答案有什么关系?只是专注于答案吗?:)
simhumileco

4

尽管上面的方法是正确的(抱歉,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

计算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.248。

现在,如果我们要扩展到超过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 ^ 4)。因此,我们从32减去该幂数4,得到28。对于子网掩码255.255.255.240,我们的CIDR表示法是/ 28。

如果给定CIDR / 28,则从32中减去(28)得出4;将2提高到(4th)次幂(2 ^ 4)以得到16; 然后从256中减去(16)得到240; 或255.255.255.240。


谢谢。但是我仍然不清楚PC如何使用子网掩码。当PC上的应用程序要发送数据时,它将数据封装到数据包中。子网掩码是否确定数据包的封装方式?例如,如果个人计算机要在本地网络上发送数据包,则将使用以太网帧en.wikipedia.org/wiki/Ethernet_frame,如果要在网络外部,则将使用tcp数据包en.wikipedia.org/wiki /…
aquagremlin

基本上,我不知道个人计算机如何确定将其数据发送到哪里。以太网就像总线一样,无处不在。通过PC的以太网插孔放出数据包是一个通用事件,因此,数据包本身必须确定谁对此做出响应。注定要由本地设备(局域网中的交换机或其他PC)拾取的数据包必须看起来与将要由路由器拾取的数据包不同。
aquagremlin

这发生在TCP下的一层。每个设备都有一个与每个设备的ARP表中的IP地址关联的硬件地址(MAC)。这是通过发现构建的。当数据包发往本地网络上的主机时,将用目标设备的MAC进行标记。当数据包发往远程主机时,将用本地网络上路由器的MAC标记。当它通过路由器时,MAC被剥离,然后用下一跳路由器的MAC标记。子网仅定义了本地网络的范围。(这是简单的<500个字符的版本。)
Jonathan J

2

我还觉得应该至少提及NAT,因为在IPv4地址耗尽等诸多方面,它们在现代网络中通常代替子网使用。(此外,当我第一次学习子网时,我很困惑子网划分与WiFi路由器创建的网络之间的关系)。

NAT(网络地址转换)是一种(通常)用于通过将一个地址空间(IP:端口)映射到另一个地址空间来创建专用网络的技术。通常,它用于在一个公共地址后面创建多个私有IP的私有网络,例如在Wifi路由器中,由组织(如大学或公司)或有时由ISP组成。

实际的地址转换在具有NAT功能的节点(通常是路由器)中透明地完成。它可能有多种形式,包括完整锥体,受地址限制,受端口限制等,或这些形式的混合,决定了如何启动跨节点的连接。

完整详细信息可以在Wikipedia上找到,但是例如考虑连接了2个设备的Wifi路由器。路由器的公共IP是10.9.20.21/24,设备的IP(私有IP)是A: 192.168.0.2B: 192.168.0.3路由器的IP 是R: 192.168.0.1。因此,如果A要连接到服务器S: 10.9.24.5/24,(实际上是路由器所在的其他子网):

  1. A将IP数据包R与源IP 192.168.0.2,src端口(例如)14567和目标IP 发送到(这将是默认网关):(10.9.24.5尽管端口实际上是TCP标头的一部分)。
  2. 路由器(具有NAT功能)将端口映射14567到设备A,并将IP数据包上的源更改为10.9.20.21(路由器的公共IP)。这与上述子网划分相反,在子网划分中,IP数据包实际上从未更改
  3. S接收一系列TCP数据包(具有src IP:10.9.20.21,src Port :),14567并在目标字段中发送具有这些值的响应数据包。
  4. R检查目标端口是14567,并将数据包转发到A
  5. A 接收响应数据包。

在上述情况下,如果B尝试在同一源端口(14567)上打开连接,则R在发送到之前,该连接将被映射到另一个端口(并且更改了输出数据包中的端口)S。也就是说,还将有端口转换,而不仅仅是IP。

这里要注意两件事:

  1. 由于此地址转换,通常不使用某些特殊技术就无法启动到专用网络中设备的连接。
  2. 现在,对从同一设备到服务器的TCP连接总数的限制(65536 = 2 ^ 16)共同适用于NAT后面的所有设备,采用上面使用的NAT形式。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.