在 ARPANET 的早期,IP 地址的设计不够合理:
为解决上述问题,IP 地址中增加了一个“子网号字段”,使两级 IP 地址变成三级 IP 地址。这种做法叫做划分子网 (subnetting),或子网寻址或子网路由选择。
划分子网的基本思路:
从 IP 数据报的首部无法看出源主机或目的主机所连接的网络是否进行了子网的划分。这需要使用子网掩码 (subnet mask)。
子网掩码中的连续的 1 对应于 IP 地址中网络号和子网号,子网掩码中的 0 对应于主机号。
使用子网掩码的好处:不管网络有没有划分子网,只要把子网掩码和 IP 地址进行逐位的“与”运算 (AND),就立即得出网络地址来。
现在互联网的标准规定:所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中 1 的位置和 IP 地址中的网络号字段 net-id 正好相对应。
子网掩码是一个网络或一个子网的重要属性。路由器在和相邻路由器交换路由信息时,必须把自己所在网络 (或子网) 的子网掩码告诉相邻路由器。
划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。
无分类编址方法的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing,CIDR 的读音是“sider”)。
CIDR 最主要的特点有两个:
为了更方便地进行路由选择,CIDR 使用 32 位的地址掩码 (address mask)。地址掩码由一串 1 和一串 0 组成,1 的个数就是网络前缀的长度。
CIDR 使用的地址掩码也可继续称为子网掩码。
斜线记法中,斜线后面的数字就是地址掩码中 1 的个数。
分配到一个 CIDR 地址块的单位,仍然可以在本单位内根据需要划分出一些子网。这些子网都只有一个网络前缀和一台主机号字段,但子网的网络前缀比整个单位的网络前缀要长些。
由于一个 CIDR 地址块中有很多地址,所以在路由表中就利用 CIDR 地址块来查找目的网络。这种地址的聚合常称为路由聚合 (route aggregation),它使得路由表中的一个项目可以表示原来传统分类地址的很多个路由。路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。
路由聚合也称为构成超网 (supernetting)。
CIDR 记法有多种形式。
例如,地址块 10.0.0.0/10 可简写为 10/10,也就是把点分十进制中低位连续的 0 省略。
另一种简化表示方法是在网络前缀的后面加一个星号,如:00001010 00*。意思是在星号 * 之前是网络前缀,而星号 * 表示 IP 地址中的主机号,可以说任意值。
在使用 CIDR 时,每个项目由网络前缀和下一跳地址组成。但是在查找路由表时可能会得到不止一个匹配结果。那么应当从这些匹配结果中选择哪一条路由呢?
为了更有效地转发 IP 数据报和提高交付成功的机会,在网际层使用了网际控制报文协议 ICMP。ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。
ICMP 是 IP 层的协议,不是高层协议 (看起来好像是,因为 ICMP 报文是装在 IP 数据报中的)。
ICMP 报文的种类有两种,即 ICMP 差错报告报文和 ICMP 询问报文。
ICMP 差错报告报文类型
类型的值 | ICMP报文的类型 | 说明 |
---|---|---|
3 | 终点不可达 | 当路由器或主机不能交付数据报时就向源点发送终点不可达报文。 |
11 | 时间超过 | 当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。 当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文。 |
12 | 参数问题 | 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。 |
5 | 改变路由 (重定向,Redirect) | 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器 (可通过更好的路由器)。 |
不应发送 ICMP 差错报告报文的情况:
ICMP 询问报文类型
类型的值 | ICMP报文的类型 | 说明 |
---|---|---|
8 或 0 | 回送(Echo)请求或回答 | ICMP 回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。 收到此报文的主机必须给源主机或路由器发送 ICMP 回送回答报文。 这种询问报文用来测试目的站是否可达以及了解其有关状态。 |
13 或 14 | 时间戳(Timestamp)请求或回答 | ICMP 时间戳请求报文是请某台主机或路由器回答当前的日期和时间。 在 ICMP 时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。 时间戳请求与回答可用于时钟同步和时间测量。 |
ICMP 应用:
4-23 分两种情况 (使用子网掩码和使用 CIDR) 写出互联网的 IP 层查找路由的算法。
★ \bigstar ★ 在划分子网的情况下,路由器转发分组的算法:
使用 CIDR 后,由于要寻找最长前缀匹配,使路由表的查找过程变得更复杂了。为了进行更加有效的查找,通常是把无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索 (binary trie),它是一种特殊结构的树。
为了简化二叉线索的结构,可以先找出对应于每一个 IP 地址的唯一前缀 (unique prefix)。唯一前缀是在表中所有的 IP 地址中,该前缀是唯一的。
二叉线索提供了一种可以快速在路由表中找到匹配的叶节点的机制。
要将二叉搜索用于路由表中,还必须使二叉线索中的每一个叶节点包含所对应的网络前缀和子网掩码。
当搜索到一个叶节点时,必须将寻找匹配的目的地址和该叶节点的子网掩码进行逐位“与”运算,看结果是否与对应的网络前缀相匹配。
4-24 试找出可产生以下数目的 A 类子网的子网掩码 (采用连续掩码):
(1) 2;(2) 6;(3) 30;(4) 62;(5) 122;(6) 250。
解:(1) 255.192.0.0。因为 2 2 − 2 ≥ 2 2^2-2 \ge 2 22−2≥2。
(2) 255.224.0.0。因为 2 3 − 2 ≥ 6 2^3-2 \ge 6 23−2≥6。
(3) 255.248.0.0。因为 2 5 − 2 ≥ 30 2^5-2 \ge 30 25−2≥30。
(4) 255.252.0.0。因为 2 6 − 2 ≥ 62 2^6-2 \ge 62 26−2≥62。
(5) 255.254.0.0。因为 2 7 − 2 ≥ 122 2^7-2 \ge 122 27−2≥122。
(6) 255.255.0.0。因为 2 8 − 2 ≥ 250 2^8-2 \ge 250 28−2≥250。
4-25 以下有 4 个子网掩码,哪些是不推荐使用的?为什么?
(1) 176.0.0.0;(2)96.0.0.0;(3)127.192.0.0;(4)255.128.0.0。
解:将子网掩码转换为二进制。
(1) 10110000 00000000 00000000 00000000
(2) 01100000 00000000 00000000 00000000
(3) 01111111 11000000 00000000 00000000
(4) 11111111 10000000 00000000 00000000
只有 (4) 推荐使用,其余不推荐。
虽然 RFC 文档中没有规定子网掩码中的一串 1 必须是连续的,但却极力推荐在子网掩码中选用连续的 1,以免出现可能发生的差错。
4-26 有如下的 4 个 /24 地址块,试进行最大可能的聚合。
212.56.132.0/24
212.56.133.0/24
212.56.134.0/24
212.56.135.0/24
解:将地址块转换为二进制。
132: 1000 0100
133: 1000 0101
134: 1000 0110
135: 1000 0111
——————————————
1000 01 # 共同位
共同网络前缀是 22 位。
聚合的 CIDR 地址块是:212.56.132.0/22
4-27 有两个 CIDR 地址块 208.128/11 和 208.130.28/22。是否有哪一个地址块包含了另一个地址?如果有,请指出,并说明理由。
11010000 10000000 00000000 00000000 # 208.128/11
11010000 10000010 00011100 00000000 # 208.130.28/22
前一个地址块包含了后一个。因为后一个地址块的二进制表示的前 11 位与前一个地址块的二进制表示的前 11 位相同。
4-28 已知路由器 R 1 R_1 R1 的路由表如表 4-13 所示。
表4-13 习题 4-28 中路由器 R 1 R_1 R1 的路由表
地址掩码 | 目的网络地址 | 下一跳地址 | 路由器接口 |
---|---|---|---|
/26 | 140.5.12.64 | 180.15.2.5 | m2 |
/24 | 130.5.8.0 | 190.16.6.2 | m1 |
/16 | 110.71.0.0 | ---- | m0 |
/16 | 180.15.0.0 | ---- | m2 |
/16 | 190.16.0.0 | ---- | m1 |
默认 | 默认 | 110.71.4.5 | m0 |
试画出各网络和必要的路由器的连接拓扑,标注出必要的 IP 地址和接口。对不能确定的情况应当指明。
4-29 一个自治系统有 5 个局域网,其连接图如图 4-66 所示。LAN2 至 LAN5 上的主机数分别为:91,150,3 和 15。该自治系统分配到的 IP 地址块为 30.138.118/23。试给出每一个局域网的地址块 (包括前缀)。
解:分配网络前缀时应先分配地址数较多的前缀。题目没有说 LAN1 上有几台主机,但至少需要三个地址给三个路由器用。本题的解答有很多种,下面给出一种答案。
局域网 | 地址块 |
---|---|
LAN1 | 30.138.118.192/27 |
LAN2 | 30.138.118.0/25 |
LAN3 | 30.138.119.0/24 |
LAN4 | 30.138.118.224/27 |
LAN5 | 30.138.118.128/27 |
上述答案可用下图表示。图中注明有 LAN 的三角形表示在三角形顶点下面所有的 IP 地址都包含在此局域网的网络前缀中。
4-30 一个大公司有一个总部和三个下属部门。公司分配到的网络前缀是 192.77.33/24。公司的网络布局如图 4-67 所示。总部共有 5 个局域网,其中的 LAN1 ~ LAN4 都连接到路由器 R1 上,R1 再通过 LAN5 与路由器 R2 相连。R2 和远地的三个部门的局域网 LAN6 ~ LAN8 通过广域网相连。每一个局域网旁边标明的数字是局域网上的主机数。试给每一个局域网分配一个合适的网络前缀。
解:本题的解答有很多种,下面给出其中一种答案:
LAN1:192.77.33.0/26。
LAN3:192.77.33.64/27;LAN6:192.77.33.96/27;LAN7:192.77.33.128/27;LAN8:192.77.33.160/27。
LAN2:192.77.33.192/28;LAN4:192.77.33.208/28。
LAN5:192.77.33.224/29。
WAN1:192.77.33.232/30;WAN2:192.77.33.236/30;WAN3:192.77.33.240/30。
4-31 以下地址中的哪一个和 86.32/12 匹配?请说明理由。
(1) 86.33.224.123;(2) 86.79.65.216;(3) 86.58.119.74;(4) 86.68.206.154。
解:将地址用二进制表示,只需比较它们的前 12 位是否与所给的地址块前 12 位相同。
01010110 0010 # 86.32/12
01010110 0010 # (1) 匹配
01010110 0100 # (2) 不匹配
01010110 0011 # (3) 匹配
01010110 0100 # (4) 不匹配
4-32 以下的地址前缀中的哪一个地址与 2.52.90.140 匹配?请说明理由。
(1) 0/4;(2) 32/4;(3) 4/6;(4) 80/4。
00000010 00110100 01011010 10001100 # 2.52.90.140
0000 # (1)匹配
0010 # (2)不匹配
000001 # (3)不匹配
0101 # (4)不匹配
4-33 下面的前缀中的哪一个和地址 152.7.77.159 及 152.31.47.252 都匹配?请说明理由。
(1) 152.40/13;(2) 153.40/9;(3) 152.64/12;(4) 152.0/11。
10011000 00000111 01001101 10011111 # 152.7.77.159
10011000 00011111 00101111 11111100 # 152.31.47.252
10011000 00101 # (1)都不匹配
10011001 0 # (2)都不匹配
10011000 0100 # (3)都不匹配
10011000 000 # (4)都匹配
4-34 与下列掩码相对应的网络前缀各有多少位?
(1) 192.0.0.0;(2) 240.0.0.0;(3) 255.224.0.0;(4) 255.255.255.252。
11000000 00000000 00000000 00000000 # (1) /2
11110000 00000000 00000000 00000000 # (2) /4
11111111 11100000 00000000 00000000 # (3) /11
11111111 11111111 11111111 11111100 # (4) /30
4-35 已知地址块中的一个地址是 140.120.84.24/20。试求这个地址块中的最小地址和最大地址。地址掩码是什么?地址块中共有多少个地址?相当于多少个 C 类地址?
10001100 01111000 01010100 00011000 # 140.120.84.24/20
11111111 11111111 11110000 00000000 # 255.255.240.0 地址掩码
10001100 01111000 01010000 00000000 # 140.120.80.0/20 最小地址
10001100 01111000 01011111 11111111 # 140.120.95.255/20 最大地址
地址块中共有 2 12 = 4096 2^{12} = 4096 212=4096 个地址。
相当于 2 12 − 8 = 16 2^{12-8} = 16 212−8=16 个 C 类地址。
4-36 已知地址块中的一个地址是 190.87.140.202/29。重新计算上题。
10111110 01010111 10001100 11001010 # 190.87.140.202/29
11111111 11111111 11111111 11111000 # 255.255.255.248 地址掩码
10111110 01010111 10001100 11001000 # 190.87.140.200/29 最小地址
10111110 01010111 10001100 11001111 # 190.87.140.207/29 最大地址
地址个数是 2 3 = 8 2^3 = 8 23=8。相当于 2 3 − 8 = 1 / 32 2^{3-8} = 1/32 23−8=1/32 个 C 类地址。
4-37 某单位分配到一个地址块 136.23.12.64/26。现在需要进一步划分为 4 个一样大的子网。试问:
(1) 每个子网的网络前缀有多长?
(2) 每一个子网中有多少个地址?
(3) 每一个子网的地址块是什么?
(4) 每一个子网可分配给主机使用的最小地址和最大地址是什么?
解:每个子网的网络前缀 28 位。每一个子网中有 2 4 = 16 2^4 = 16 24=16 个地址。
地址块 | 可分配给主机使用的最小地址 | 可分配给主机使用的最大地址 |
---|---|---|
136.23.12.64/28 | 136.23.12.01000001 = 136.23.12.65/28 | 136.23.12.01001110 = 136.23.12.78/28 |
136.23.12.80/28 | 136.23.12.01010001 = 136.23.12.81/28 | 136.23.12.01011110 = 136.23.12.94/28 |
136.23.12.96/28 | 136.23.12.01100001 = 136.23.12.97/28 | 136.23.12.01101110 = 136.23.12.110/28 |
136.23.12.112/28 | 136.23.12.01110001 = 136.23.12.113/28 | 136.23.12.01111110 = 136.23.12.126/28 |
4-51 给出某地址块中的一个地址为 73.22.17.25。求该地址块的地址数及其首地址和末地址。
解:这个地址是一个 A 类地址。
地址数是 2 24 = 16777216 2^{24} = 16777216 224=16777216 个。
首地址是 73.0.0.0/8,末地址是 73.255.255.255/8。
4-52 已知某网络有一个地址是 167.199.170.82/27,问这个网络的网络掩码、网络前缀长度和网络后缀长度是多少?
解:网络掩码是 255.255.255.224。网络前缀长度是 27,网络后缀长度是 5。
4-53 已知地址块中的一个地址是 167.199.170.82/27,求这个地址块的地址数、首地址以及末地址各是多少?
解:地址数是 2 5 = 32 2^5 = 32 25=32 个。
首地址是 167.199.170.64/27,末地址是 167.199.170.95/27。
4-54 某单位分配到一个起始地址为 14.24.74.0/24 的地址块。该单位需要用到三个子网,它们的三个子地址块的具体要求是:子网 N1 需要 120 个地址,子网 N2 需要 60 个地址,子网 N3 需要 10 个地址。请给出地址块的分配方案。
解:分配给子网 N1 的首地址是 14.24.74.0/25,末地址是 14.24.74.127/25。
分配给子网 N2 的首地址是 14.24.74.128/26,末地址是 14.24.74.191/26。
分配给子网 N3 的首地址是 14.24.74.192/28,末地址是 14.24.74.207/28。
4-55 如图 4-68 所示,网络 145.13.0.0/16 划分为四个子网 N1,N2,N3 和 N4。这四个子网与路由器 R 连接的接口分别是 m0,m1,m2 和 m3。路由器 R 的第五个接口 m4 连接到互联网。
(1) 试给出路由器 R 的路由表。
(2) 路由器 R 收到一个分组,其目的地址是 145.13.160.78。试给出这个分组是怎样被转发的。
解:(1) 路由器 R 的路由表
目的网络地址 | 目的网络的子网掩码 | 下一跳 |
---|---|---|
145.13.0.0 | 255.255.192.0 | 直接交付,接口 m0 |
145.13.64.0 | 255.255.192.0 | 直接交付,接口 m1 |
145.13.128.0 | 255.255.192.0 | 直接交付,接口 m2 |
145.13.192.0 | 255.255.192.0 | 直接交付,接口 m3 |
其他 | M | 默认路由器,接口 m4 |
(2) 160 AND 192 = 128
收到的分组从路由器的接口 m2 转发。
4-56 收到一个分组,其目的地址 D = 11.1.2.5。要查找的路由表中有这样三项:
路由1 到达网络 11.0.0.0/8
路由2 到达网络 11.1.0.0/16
路由3 到达网络 11.1.2.0/24
试问在转发这个分组时应当选择哪一个路由?
解:根据最长前缀匹配准则,应当选择路由 3。
4-57 同上题。假定路由 1 的目的网络 11.0.0.0/8 中有一台主机 H,其 IP 地址是 11.1.2.3。当我们发送一个分组给主机 H 时,根据最长前缀匹配准则,上面的这个路由表却把这个分组转发到路由 3 的目的网络 11.1.2.0/24。是最长前缀匹配准则有时会出错吗?
解:最长前缀匹配准则是没有问题的,问题出在主机 H 的 IP 地址。
网络 11.0.0.0/8 在分配本网络的主机号时,就不允许重复使用地址块 11.1.0.0/16 中的任何一台主机号。因此,网络 11.0.0.0/8 给它的一台主机分配像上面给出的地址 11.1.2.3 是不能允许的。这样做就会和网络 11.1.0.0/16 中的 host-id = 2.3 的 IP 地址重复,因而引起了地址上的混乱。
4-58 已知一 CIDR 地址块为 200.56.168.0/21。
(1) 试用二进制表示这个地址块。
(2) 这个 CIDR 地址块包括有多少个 C 类地址块?
解:(1) 200.56.168.0/21 = 11001000 00111000 10101000 00000000
前 21 位表示网络号。
(2) 包含 2 11 − 8 = 8 2^{11-8} = 8 211−8=8 个 C 类地址块。
【计算机网络 (谢希仁) 习题题解】目录