IPv4子网如何工作?[关闭]


0

子网划分如何工作,以及如何手动或在脑海中完成? 有人可以在概念上和几个例子中解释吗?服务器故障会产生大量的子网划分作业问题,因此我们可以使用答案将它们指向服务器故障本身。

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

关于这个问题的说明

在过去的几年里,我已经在服务器故障上针对这个问题划分了一些关于子网划分的问题。这是他们关于IPv4和子网划分的规范问题

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

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

如果你可以改进它,请发表答复或发表评论。


4
社区常见问题不应该是CWs吗?
加拿大卢克

2
在同一个问题中包含NAT和什么是IPv4子网是非常荒谬的。它们都是重要的主题,不应该在同一个答案中真正解决
barlop


3
几个想法:1)你已经付出了很多努力,所以谢谢你。2)您将问题中的两部分答案归因于此,但每个答案都应从作者的归属开始。3)如果这将是一个规范线程,它必须有点广泛,但对SU来说这个问题似乎非常广泛。在一个问题和“一个”答案中涵盖与主题相关的所有内容是关于该主题的一般知识的教科书,其不太适合该网站的模型。(我没有downvote,BTW)
fixer1234

3
来自网络中另一个网站的复制意大利面对我来说几乎比对SE内容批发的网站感觉更糟糕......至少这里的一切都需要一个免责声明,提及原始作者的来源并提供可靠的归属,但更好的是原作者发布自己并获得了他们应得的尊重,这是一个史诗般的问答。我已经问过这种复制粘贴是否可以接受以及我们应该对meta做什么。
Mokubai

Answers:


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”和“数字”中的“它”。一位是二进制数字。

将二进制数(例如“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”(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

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

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

拆分地址

想想像比萨饼送货一样的IP路由。

当你被要求将比萨送到“123 Main Street”时,作为一个人,你很清楚你想要去名为“Main Street”的街道上编号为“123”的建筑物。很容易知道你需要去大街的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

用二进制写出子网掩码:

     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路由器与披萨送货司机的工作类似,因为他们需要将货物(包)送到目的地。当出现绑定地址为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接口的所有计算机都将具有以“192.168.10。”开头的IP地址,因为分配给您的接口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”的传入数据包,我们只需要将该数据包的地址转换为二进制数据(因为人类 - 路由器将其作为二进制文件从线路开始)并尝试将其与我们的路由中的每个地址相匹配table(最多为子网掩码中的位数),直到我们匹配一个条目。

  • 传入数据包目标: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”中调用我们的路由器开始。您已经将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

假设还有另一台路由器“Router B”,其IP地址为192.168.10.254/24,分配给Ethernet0和Ethernet1接口的为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知道如何“到达”路由器A一无所知的网络192.168.30.0/24。

假设连接到路由器A的Ethernet0接口的网络连接的IP地址为192.168.20.13的PC将数据包发送到路由器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.168.10.0网络中的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个建筑物。计划您的街道编号非常容易,因此每个街区的每个街区都有一系列街道编号增加100。很容易知道每个后续块中的“起始编号”应该是什么。

在规划IP子网时,您需要考虑使用正确数量的可用主机ID(建筑物编号)构建正确数量的子网(街道),并使用路由器将子网彼此连接(交叉点)。关于路由器中指定的允许的源和目标地址的规则可以进一步控制流量的流量。防火墙可以像强迫交通警察一样行事。

出于本答案的目的,构建我们的子网是我们唯一关注的主要问题。与城市规划一样,您不是像十进制一样工作,而是使用二进制来描述每个子网的边界。

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

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


1
你写“(是的......我们达到了一个答案的最大尺寸(30000个字符)。”“< - 这表明可能是问题,并且你因此试图解决的问题太多了。教给一个不知道二进制的人的子网..所以挤在二进制课上,荒谬
barlop

4

这是一种非常简单的查看方式,那些刚接触Subnetting的人发现它非常容易理解。

所以你给了你的网络,并告诉他们将它们分解成更小的网络。

让我们说我们有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.nhhhhhhhhhhhhhhh。由于八位字节的位值为128 16 32 16 8 4 1 1,因此我们的新网络位使用.128。所以我们的网络将是172.18.0.0 / 17和172.18.128.0 / 17。

如果我们被赋予将我们的网络分成8个较小网络的任务,我们只需要找到2 ^ n = 8.由于2 ^ 3 = 8,我们将借用三个主机位。所以现在我们的位看起来像nnnnnnnn.nnnnnnnn.nnnhhhhhhhhhhhh。由于我们的网络位现在使用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.hhhhhhhhhhhhhhhh。现在我们需要找出2 ^ n = 4.由于2 ^ 2 = 4,我们将借用两个主机位,并将它们用作网络位。所以我们的八位字节现在看起来像nnnnnnnn.nnhhhhhh.hhhhhhhhhhhhhhhh。我们的网络将是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.在上面的示例中,我们需要8个子网。您需要做的就是取256/32 = 8.然后您将网络数量计算为32,因为您使用的是32位值。

要查找每个网络的节点数,您只需要开始加倍数字。A / 30可以有4个主机总数,2个可用。a / 29有8,/ 28有16等。最后一个八位字节实际上是按比特值,所以它只会去128 64 32 16 8 4 2 1.这是总主机的数量,如果你减2,那就是可用主机的数量。

然后,一旦你到达/ 23,你开始从之前的octect加倍。A / 24是256,/ 23是512,/ 22 1024.然后每次增加一位值时加倍。


我可以轻松地遵循它。但话说回来,我知道子网的工作原理。
Hennes

-1你还没有用过classless这个词,所以你显然没有明确地提出他的问题
barlop 2016年

@Hennes我很容易跟随,因为了解子网lol。但是我已经对完全混淆的人使用了解释,然后在上面的解释之后能够接受它。
DrZoo 2016年

1
@barlop在我发布答案后10分钟也编辑了这个问题。当我发布答案时,我不知道要解决一个不存在的问题。现在问题还在于提出多个问题,这些问题在技术上违背了问题指南。
DrZoo 2016年

@DrZoo很好,从你的回答中删除了downvote
barlop

2

续读者: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分解成这些部分的好方法是什么?

想到两个人的力量,并使用大量可能的设备,你可以想出:

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

在给定的IP子网中,有两个保留的地址不能用作有效的设备IP地址 - 主机ID部分中全零的地址和主机ID部分中全部为1的地址。因此,对于任何给定的IP子网,可用的主机地址数量是两个,数量为32减去子网掩码中的位数减去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的位。由于这一位可以是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

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)不一致。这是一个可爱的例子,但却浪费了地址空间。通常,a / 30或a / 31(请参阅http://www.faqs.org/rfcs/rfc3021.html以获取有关/ 31的工作方式的详细信息 - 它们超出了本答案的范围)网络用于两个路由器之间严格点对点的链接。

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.