这是一个典型问题关于 IPv4 子网。
有关的:
子网划分如何工作,以及如何进行子网划分用手或者在你的脑海里? 有人能从概念上和几个例子来解释一下吗?Server Fault 收到了很多子网划分家庭作业问题,因此我们可以使用答案来引导他们了解 Server Fault 本身。
- 如果我有一个网络,我该如何弄清楚如何分割它?
- 如果我得到了一个网络掩码,我怎么知道它的网络范围是多少?
- 有时斜线后面会跟着一个数字,这个数字是什么?
- 有时候会有子网掩码,也会有通配符掩码,看上去是同一个东西但是实际有区别吗?
- 有人提到过有关了解二进制的事情吗?
答案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”来自“数字”。位是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)。
从最左边的数字开始,在数字上方(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 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
路由器使用子网掩码来“屏蔽” 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 0s 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.00010010.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(建筑物编号),并使用路由器将子网相互连接(交叉路口)。路由器中指定的允许源地址和目标地址的规则可以进一步控制流量。防火墙可以充当执着的交通警察。
就此答案而言,构建子网是我们唯一主要关注的问题。与城市规划不同,我们采用十进制,而是采用二进制来描述每个子网的边界。
(是的......我们达到了答案的最大大小(30000 个字符)。)
答案2
续上文: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 部分全为一的地址。因此,对于任何给定的 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 如何工作的详细信息 - 它们肯定超出了本答案的范围)网络用于两个路由器之间严格点对点的链路。
答案3
子网划分
子网划分并不难,但可能会让人望而生畏。所以让我们从最简单的步骤开始。学习用二进制计数。
二进制
二进制是以 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) 作为地址的网络部分,使用第 4 个八位字节 (.1) 作为主机部分。
默认情况下,C 类地址的 IP 地址和子网掩码如下所示
IP 192.168.1.1
Subnet 255.255.255.0
像这样的二进制
IP 11000000.10101000.00000001.00000001
Subnet 11111111.11111111.11111111.00000000
再看一下二进制示例。注意到我说的前三个八位字节用于网络吗?注意到网络部分全是 1 吗?这就是子网划分的全部内容。让我们展开一下。
假设我的主机部分只有一个八位字节(在上面的例子中)。我只能有 256 个主机(256 是八位字节的最大值,从 0 开始计数)。但还有另一个小技巧:您需要从可用地址(当前为 256)中减去 2 个主机地址。范围中的第一个地址将用于网络(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(可变长度子网掩码)”,以了解更多高级主题。
我现在意识到我回复的时间太长了......叹
答案4
我将提出并回答一些相关问题:
255.255.255.0
为什么你经常见到?- 为什么
192.168.0.1
? - 为什么
127.0.0.1
?
为什么是这些奇怪的数字 — — 255、192、168、127?
8+8+8+8位点分十进制
互联网地址如下194.60.38.10使用点分十进制表示法将 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 位块,如 ■■■■■■■■、■□□□□□□□ 和 □■■■■■■■。因此,由于 8 位限制,您从未见过 256=2⁹,而 127=128−1=2⁸−1 是 2 的幂的位翻转——而 2 的幂10………00000
在二进制中是 '。
- 168 =
10101000
子网掩码:我的是我的 + 你的是你的
子网掩码然后将每个 32 位互联网地址拆分为网络 ID 和主机 ID。互联网地址可以有 1 和 0 的任意组合,而子网掩码仅以 1 开头,以 0 结尾。
■■□□□□■□|□□■■■■□□|□□■□□■■□|□□□□■□■□ IP
■■■■■■■■|■■■■■■■■|■■■■■■■■|□□□□□□□□ subnet
将前 8+8+8=24 位涂黑,将最后 8 位涂白,是将 IP ■■□□□□□■|□□■■■■■□|□□■□■■■□|□□□□■■■■ 分成两部分的一种方式:
■■□□□□■□|□□■■■■□□|□□■□□■■□ network
□□□□■□■□ host
如果子网所有者(比如奥姆尼集团) 想要更多的内部 IP,他们可以购买更多(比如说 8+8=16 位)网络右侧的 IP,如下所示:
■■□□□□■□|□□■■■■□□|□□■□□■■□|□□□□■□■□ 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,而是一个使用 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
例如使用。