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个字符)。)