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