网络层概述
分组转发和路由选择
网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两个重要的部分
不同的网络,如果只是需要各自内部进行通信,那它们只要实现各自的物理层和数据链路层即可
但如果需要将这些异构型网络互连起来,形成一个更大的互联网,就需要使用网络互连设备路由器
为了简单起见,有时可以不用画出这些网络,而将它们看作是一条链路即可
假设主机A给B发送分组,路由器R1收到后对其进行转发,路由器查询自己的转发表后就可以确定将该分组从哪个接口转发出去
路由器的转发表是根据路由器的路由表转换而来的,而路由器的路由表是路由器的路由选择处理机执行路由选择协议,并与其他相关路由器交换路由信息后得来的
如果网络拓扑比较简单,也可通过在路由器命令行中以输入命令的方式对路由表进行静态配置
路由表需要对网络拓扑变化的计算最优化,而转发表是从路由表得来的,转发表的结构应当使查找过程最优化
网络层向其上层提供的两种服务
网络层向其上层提供的两种服务是:
- 面向连接的虚电路服务
- 无连接的数据报服务
面向连接的虚电路服务
核心思想是:可靠通信应当由网络自身来保证
当两台主机进行通信时,首先必须建立网络层的连接 ------ 虚电路VC(Virtual Circuit),以保证通信双方所需的一切网络资源
之后通信双方沿着已建立的虚电路发送分组
虚电路表示这是一条逻辑上的连接(而非物理连接),分组都沿着这条逻辑连接按照存储转发方式传送
而采用电路交换的电话通信,则是先建立一条真正的物理连接。因此,分组交换的虚连接与电路交换的连接只是类似,但并不完全相同
分组的首部仅在连接建立阶段使用完整的目的主机地址,之后每个分组的首部只需要携带一条虚电路编号即可
通信结束后,通信双方需要释放之前所建立的虚电路
这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确(无差错、按序到达、不丢失、不重复)到达接收方
很多广域分组网都使用面向连接的虚电路服务。例如:曾经的X.25和逐渐过时的帧中继FR、异步传输模式ATM等
但因特网的先驱者并没有采用这种设计思想,而是采用了无连接的数据报服务
无连接的数据报服务
核心思想:可靠通信应当由用户主机来保证
当两台主机进行通信时,不需要建立网络层连接
每个分组可以走不同的路径,因此每个分组的首部必须携带目的主机的完整地址
通信结束后,通信双方没有需要释放的连接
这种通信方式所传送的分组可能出现误码、丢失、重复和失序
这种通信方式将复杂的网络处理功能置于因特网的边缘(即用户主机和其内部的运输层),而将相对简单的尽最大努力(即不可靠)的分组交付功能置于因特网核心
由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做到比较简单,降低了网络造价(与电信网交换机相比)
另外,这种设计思想的运行方式灵活、能够适应多种应用。因特网能够发展到今日的规模,充分证明了当初采用这种设计思想的正确性
而当今因特网所采用的TCP/IP体系结构,其网际层向其上层提供的就是简单灵活的、无连接的不可靠的数据报服务
虚电路服务与数据报服务的比较
对比方面 | 虚电路服务 | 数据报服务 |
---|---|---|
核心思想 | 可靠通信应当由网络来保证 | 可靠通信应当由用户主机来保证 |
连接的建立 | 必须建立网络层连接 | 不需要建立网络层连接 |
目的地址 | 仅在连接建立阶段使用,之后每个分组使用短的虚电路号 | 每个分组都必须携带完整的目的地址 |
分组转发 | 属于同一条虚电路的分组均按照同一路由进行转发 | 每个分组可走不同的路由 |
结点故障时 | 所有通过出故障的结点的虚电路均不能工作 | 出故障的结点可能会丢失分组,一些路由可能会发生变化 |
分组的顺序 | 总是按发送顺序达到目的主机 | 到达目的主机时不一定按发送顺序 |
服务质量 | 可以将通信资源提前分配给每一个虚电路,因此容易实现 | 很难实现 |
网际协议IP和异构网络互连
网际协议IP
网际协议(Internet Protocol, IP)是TCP/IP体系结构网际层中的核心协议
对于TCP/IP的四层网络体系结构,网络接口层支持各种网络接口
网际协议IP是TCP/IP体系结构网际层中的核心协议,网际协议IP可以互连各种不同的网络接口
TCP和UDP是运输层的两个重要协议,TCP为应用层中的某些协议提供可靠传输服务,UDP为应用层中的某些协议提供不可靠传输服务,TCP和UDP都使用网际协议IP提供的不可靠传输服务
由于网际协议IP是TCP/IP体系结构网络层中的核心协议,因此TCP/IP体系结构的网络层常被称为网际层或IP层,在网际层中与IP协议配套使用的还有四个协议,分别是网际控制报文协议ICMP、网际组管理协议IGMP、逆地址解析协议RARP、地址解析协议ARP
在网际层中,RARP和ARP画在IP的下面,这是因为IP协议经常要使用这两个协议
ICMP和IGMP画在IP的上面,因为它们要使用IP协议
异构网络互连
因特网是由全世界范围内数以百万计的网络通过路由器互连起来的,这些网络的拓扑、性能以及所使用的网络协议都不尽相同,这是由用户需求的多样性造成的,没有哪一种单一的网络能够适应所有用户的需求
要将众多的异构型网络都互连起来,并且能够互相通信,则会面临许多需要解决的问题:
- 不同的网络接入机制
- 不同的差错恢复方法
- 不同的路由选择技术
- 不同的寻址方案
- 不同的最大分组长度
- 不同的服务(面向连接服务和无连接服务)
如果这些异构网络的网络层都使用相同的网际层IP,从网络层角度看,它们好像是一个统一的网络,即IP网
当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节
IPv4地址概述
IPv4地址就是因特网上的每一台主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的32比特的标识符
由于32比特的IPv4地址不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用
IPv4地址的编址方法经历了三个阶段
- 1981年 ------ 分类编址的IP地址
- 1985年 ------ 划分子网的IP地址,是对分类编址的IP地址的改进
- 1993年 ------ 无分类编址的IP地址,消除分类编址和划分子网的概念
IPv4地址采用点分十进制表示方法表示
点分十进制表示法就是将32个比特划分为4个8比特的组,每个组再使用十进制数表示,组之间使用点连接
分类编址的IPv4地址
分类编址方法将32比特的IPv4地址分为网络号部分和主机号部分
网络号用来标志主机或路由器的接口所连接到的网络
而主机号用来标志主机(或路由器)的接口
同一个网络中,不同主机或路由器的接口的IPv4地址的网络号必须相同,表示它们属于同一个网络
同一个网络中,不同主机或路由器的接口的IPv4地址的主机号必须各不相同,以便区分各主机或路由器的接口
分类编址的IP地址将IP地址分为A、B、C、D、E五类
A类地址
A类地址的网络号部分占8个比特,主机号部分占24个比特
网络号的最高位固定为0,即0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
最小网络号
A类地址的8比特网络号的低7位全部取0时,就是A类网络的最小网络号,其10进制为0,该地址被保留不能指派
-
最小可指派的网络号
A类地址的最小可指派的网络号为1,网络地址为1.0.0.0,即
00000001 000000000000000000000000
-
本地环回测试地址
A类地址的网络号的低7位全部取1时,即为A类网络的最大网络号127,该网络号作为本地环回测试地址,不指派
将本地环回测试地址的主机号的最低位取1,其它位取0,即为最小的本地环回测试地址为127.0.0.1,即
01111111 000000000000000000000001
将本地环回测试地址的主机号的最低位取0,其它位取1,即为最大的本地环回测试地址为127.255.255.254,即
01111111 111111111111111111111110
本地软件环回测试地址用于本主机内的进程之间的通信,若主机发送了一个目的地址为环回地址的IP数据报,则本主机中的协议软件就处理数据报中的数据,而不会把数据报发送到任何网络
-
最大可指派网络号
A类地址的网络号的剩余7位的最低位取0,其他位全部取1时,即为A类网络的可指派的最大网络号为126,网络地址为126.0.0.0,即
01111110 000000000000000000000000
因此,可指派的A类网络的数量为2^(8-1)^ - 2 = 126(减2是为了除去最小网络号0和最大网络号127)
每个A类网络中可分配的IP地址数量为2^24^ - 2 = 16777214(减2是为了除去主机号为全0网络地址和主机号为全1的广播地址)
B类地址
B类地址的网络号和主机号部分各占16个比特
B类地址的网络号的最高两位固定为10,即10XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
最小网络号
当B类地址的16比特网络号的低14位全部取0时,即为B类地址的最小网络号
B类地址的最小网络号也是第一个可指派的网络号128.0,网络地址为128.0.0.0,即
1000000000000000 0000000000000000
-
最大网络号
当B类地址的16比特网络号的低14位全部取1时,即为B类地址的最大网络号
最大网络号也是最后一个可指派的网络号191.255,网络地址为191.255.0.0,即
1011111111111111 0000000000000000
一些教材会将这种网络号中除固定部分外都是0的网络地址也归为不可指派
因此,可指派的B类网络数量为2^(16-2)^ = 16384
每个网络中可分配的IP地址数量为2^16^ - 2 = 65534(减2是为了除去主机号为全0网络地址和主机号为全1的广播地址)
C类地址
A类地址的网络号部分占24个比特,主机号部分占8个比特
C类地址的网络号的最高三位固定为110,即110XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-
最小网络号
当C类地址的24比特网络号的低21位全部取0时,即为C类地址的最小网络号
C类地址的最小网络号也是第一个可指派的网络号192.0.0,网络地址为192.0.0.0,即
1100000000000000000000000 00000000
-
最大网络号
当C类地址的24比特网络号的低21位全部取1时,即为C类地址的最大网络号
最大网络的最大网络号也是最后一个可指派的网络号223.255.255,网络地址为223.255.255.0,即
110111111111111111111111 00000000
因此,可指派的网络地址数量为2^(24-3)^ = 2097152
每个网络中可分配的IP地址数量为2^8^ - 2 = 254(减2是为了除去主机号为全0网络地址和主机号为全1的广播地址)
D类地址
D类地址是多播地址
D类地址的最高四位为1110,即1110XXXXXXXXXXXXXXXXXXXXXXXXXXXX
E类地址
E类地址是保留地址
E类地址的最高四位为1111,即1111XXXXXXXXXXXXXXXXXXXXXXXXXXXX
注意事项
- A类、B类和C类地址都是单播地址,只有单播地址可以分配给网络中的主机或路由器的各接口
- 主机号为"全0"的地址是网络地址,不能分配给主机或路由器的各接口
- 主机号为"全1"的地址是广播地址,不能分配给主机或路由器的各接口
练习
分类的IP地址 | 类别 | 是否可以指派给主机 |
---|---|---|
0.1.2.3 | A | 不可以 |
1.2.3.4 | A | 可以 |
126.255.255.255 | A | 不可以 |
127.0.0.1 | A | 不可以 |
128.0.255.255 | B | 不可以 |
166.166.18.255 | B | 可以 |
172.18.255.255 | B | 不可以 |
191.255.255.252 | B | 可以 |
192.0.0.255 | C | 不可以 |
196.2.3.8 | C | 可以 |
218.75.230.30 | C | 可以 |
223.255.255.252 | C | 可以 |
提示:
根据地址左起第一个十进制数的值,可以判断出网络类别
- ≤127的为A类
- 128~191的为B类
- 192~223的为C类
根据网络类型,就可以找出地址中的网络号部分和主机号部分
- A类地址网络号为左起第一个字节
- B类地址网络号为左起前两个字节
- C类地址网络号为左起前三个字节
以下三种情况的地址不能指派给主机和路由器接口
- A类地址中网络号为0或127的地址
- 主机号为"全0"的地址,因为这是网络地址
- 主机号为"全1"的地址,因为这是广播地址
一般不使用的特殊IP地址
网络号 | 主机号 | 作为源地址 | 作为目的地址 | 代表的意思 |
---|---|---|---|---|
0 | 0 | 可以 | 不可以 | 在本网络上的本主机(DHCP协议) |
0 | host-id | 可以 | 不可以 | 在本网络上的某台主机host-id |
全1 | 全1 | 不可以 | 可以 | 只在本网络上进行传播(各路由器均不转发) |
net-id | 全1 | 不可以 | 可以 | 对net-id上的所有主机进行广播 |
127 | 非全0或非全1 | 可以 | 可以 | 用于本地软件环回测试 |
- 地址0.0.0.0 是一个特殊的IPv4地址,只能作为源地址使用,表示"在本网络上的本主机"
- 以127开头且后面三个字节非"全0"或"全1"的IP地址是一类特殊的IPv4地址,即可作为源地址使用,也可作为目的地址使用,用于本地软件环回测试
- 地址255.255.255.255 是一个特殊的IPv4地址,只能作为目的地址使用,表示"只在本网络上进行广播(各路由器均不转发)"
IPv4分类编址方法的最大缺点就是容易造成IPv4地址的大量浪费,为了解决该问题,因特网工程任务组IETF在分类编址方法的基础上进行了改进,提出了划分子网的编址方法
划分子网的IPv4地址
随着更多中小型网络加入因特网,IPv4分类编址方法不够灵活,容易造成大量IPv4地址资源浪费的缺点就暴露出来了
某单位有一个大型的局域网,需要连接到因特网
如果该单位为该局域网申请一个C类网络号,则其可分配的IPv4地址数量只有254个,不够满足单位需求
因此该单位申请了一个B类网络号145.13,其可分配的IPv4地址数量达到了65534个
给局域网中的每台计算机和路由器的接口分配一个IPv4地址后,还剩余大量地址。这些剩余的地址只能由该单位的该局域网使用,而该单位的其他网络以及其他单位的网络都无法使用
随着该单位计算机网络的发展和建设,该单位又新增了一些计算机,并且需要将原来的网络划分成3个独立的网络,即子网1、子网2和子网3
假设子网1仍然使用原来申请到的B类网络号145.13,那么就需要为子网2和子网3各自再申请一个网络号
但为新增网络申请新的网络号会带来以下弊端:
- 申请新的网络号需要等待时间,并且还需要花费更多的费用
- 即使申请到了两个新的网络号,其它路由器的路由表还需要新增针对这两个新的网络的路由条目
- 浪费原有网络中剩余的大量IP地址
如果可以从IPv4地址的主机号部分借用一些比特作为子网号来区分不同的子网,就可以利用原有网络中剩余的大量IPv4地址,而不同申请新的网络地址
例如可以借用该B类地址的主机号中的前8个比特作为子网号
假设给子网1分配的子网号为0,给子网2分配的子网号为1,子网3分配的子网号为2,之后就可以给各子网总的主机和路由器的接口分配IPv4地址了
子网掩码
子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号
与IPv4地址类似,子网掩码也是有32比特构成的
子网掩码使用左起的连续比特1对应网络号和子网号,使用剩下的连续比特0来对应主机号
将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址
未划分子网的IPv4地址只包含网络号和主机号
从主机号部分借用一些比特作为子网号,就使得IPv4地址从两级结构的分类IPv4地址变成了三级结构的划分子网的IPv4地址
用连续的比特1来对应网络号和子网号,用连续的比特0来对应剩余的主机号,就构成了该划分子网的IPv4地址的32比特的子网掩码
将划分子网的IPv4地址与相应的子网掩码进行逐比特的逻辑与运算,就可以得到该IPv4地址所在子网的网络地址
只要给定一个分类的IPv4地址及其相应的子网掩码,就可以得到子网划分的全部细节
例:已知某个网络的地址为218.75.230.0,使用子网掩码255.255.255.128对其进行子网划分,请给出划分细节
从该网络地址的左起第一个十进制数218可知,该网络地址是一个C类地址,因此网络号占三个字节(218.75.230),主机号占一个字节(.0)
子网掩码的前三个十进制数(255.255.255)部分对应IP地址的网络号部分,而(.128)对应IP地址的主机号部分,将128转为二进制形式(10000000),其中只有一个比特1,表示从主机号中借用一个比特作为子网号
因此,可划分的子网的数量为2^1^ = 2个,每个子网可分配的地址的数量为2^(8-1)^ - 2 = 126个
减2是要去掉(划分子网后的)主机号为"全0"的网络地址和"全1"的广播地址
默认子网掩码
默认的子网掩码是指在未划分子网的情况下使用的子网掩码
- A类地址的默认子网掩码为255.0.0.0
- B类地址的默认子网掩码为255.255.0.0
- C类地址的默认子网掩码为255.255.255.0
默认子网掩码的出现是为了满足既可以进行子网划分,也可以不进行子网划分的两种应用场景,软硬件以及用户界面上所做的统一处理
无分类编址的IPv4地址
划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的C类网因为其地址空间太小并没有得到充分使用,而因特网的IPv4地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁
为此,因特网工程任务组IETF又提出了采用无分类编址的方法来解决IP地址紧张的问题,同时还专门成立IPv6工作组负责研究新版本IP以彻底解决lP地址耗尽问题
1993年,IETF发布了无分类域间路由选择CIDR(Classless Inter-Domain Routing)的RFC文档:RFC 1517~1519和1520
CIDR消除了传统的A类、B类和C类地址,以及划分子网的概念
CIDR可以更加有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前允许因特网的规模继续增长
无分类编址的IPv4地址中并没有传统的A、B和C类地址以及划分子网的概念,因此我们不可以根据地址的第一个十进制数得出该网络是A、B或C类网络,也就不能得出其网络号部分和主机号部分各自的长度
IPv4地址编址方法所经历的三个阶段
在分类编址阶段(第一阶段),IPv4地址是两级结构,由网络号和主机号两部分构成
在划分子网编址阶段(第二阶段),IPv4地址从分类编址的两级结构变成了三级结构,由网络号、子网号以及主机号三部分构成,为了指明从主机号部分借用了多少比特作为子网号,需要使用子网掩码
在无分类编址阶段,IPv4地址从划分子网编址的三级结构又改回了与分类编址相似的两级结构,不同之处在于分类编址中的网络号,在CIDR中称为网络前缀,网络前缀是不定长的,仅从IPv4地址自身是无法确定其网络前缀和主机号的,需要配合使用32比特的地址掩码
无分类编址方法使用的地址掩码与划分子网使用的子网掩码类似,由32比特构成
地址掩码使用左起多个连续的比特1对应IPv4地址中的网络前缀,之后的多个连续的比特0对应IPv4地址中的主机号
例:无分类编址的IPv4地址128.14.35.7,地址掩码为255.255.240.0
得出该网络的网络前缀部分占20个比特,剩余12个比特为主机号部分
为了简单起见,可以不明确给出配套的地址掩码的点分十进制形式,而是在无分类编址的IPv4地址最后加上斜线"/",并在斜线之后写上网络前缀所占的比特数量(也就是地址掩码中左起连续比特1的数量),这种记法称为斜线记法
如128.14.35.7 / 20表示网络前缀占用的比特数量为20,主机编号占用的比特数量为
32 - 20 = 12
实际上,无分类域间路由选择CIDR是将网络前缀都相同的、连续的多个无分类IPv4地址,组成一个CIDR地址块,只要知道CIDR地址块中任何一块地址,就可以得出该地址块的全部细节:
-
地址块的最小地址
-
地址块的最大地址
-
地址块中的地址数量
-
地址块聚合某类网络(A类、B类或C类)的数量
聚合某类网络即转化为某类网络地址的数量有多少个
聚合A类网数量:地址块中地址的数量 / 2^24^
聚合B类网数量:地址块中地址的数量 / 2^16^
聚合C类网数量:地址块中地址的数量 / 2^8^
-
地址掩码
例:给定的无分类编址的IPv4地址为128.14.35.7/20,请给出该地址所在CIDR地址块的全部细节
128.14.35.7/20的网络前缀为
128.14.0010
所以该地址块的最小地址为
128.14.32.0
该地址块的最小地址为
128.14.47.255
该地址块的地址数量为2^(32-20)^
该地址块的聚合C类网的数量为2^(32-20)^ / 2^8^
该地址块的地址掩码为
255.255.240.0
使用CIDR的一个好处是,可以更加有效地分配IPv4的地址空间,即可以根据客户的需要分配适当大小的CIDR地址块
使用CIDR的另一个好处是路由聚合(也称为构造超网)
路由聚合(构造超网)
路由器R1与5个网络以及路由器R2直接相连,路由器R1与R2互为相邻路由器,它们周期性地通告自己所知道的路由信息给对方
若R1将自己直连的5个网络的路由记录全部通告给R2,那么R2的路由表就会增加5条路由记录
为了减少路由记录对路由表的占用以及路由通告信息对网络资源的占用,可以使用路由聚合将R1的多个路由表的记录聚合为一条记录
具体方法是:
- 找共同前缀(一般是找最长的共同前缀)
- 将共同前缀的数量记为n
- 将共同前缀保持不变,剩余的比特位全部取0,最后添加上"/n",就得到了聚合后的CIDR地址块(也称为超网)
之后R1就可以只发送这一条聚合后的路由记录给R2
网络前缀越长,地址块越小,路由越具体
若路由器查表转发分组发现多条路由可选,则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体
IPv4地址的应用规划
IPv4地址的应用规划是指将给定的IPv4地址块(或分类网络)划分成若干个更小的地址块(或子网),并将这些地址块(或子网)分配给互连网中的不同网络,进而可以给各网络中的主机和路由器的接口分配IPv4地址
划分的方法有两种:
- 定长的子网掩码FLSM(Fixed Length Subnet Mask)
- 变长的子网掩码VLSM(Variable Length Subnets Mask)
定长的子网掩码FLSM
所划分出的每一个子网都使用同一个子网掩码,因此每个子网所分配的IP地址数量相同,容易造成IP地址的浪费
使用定长的子网掩码进行子网划分,只能划分出2^n个子网,n是从主机号部分借用的用来作为子网号的比特数量,每个子网所分配到的IP地址数量相同,容易造成IP地址的浪费
例:假设申请到的C类网络为218.75.230.0,使用定长的子网掩码给下面所示的小型互联网中的各设备分配IPv4地址应用需求:网络1需要IP地址数量为9,网络2需要IP地址数量为28,网络3需要IP地址数量为15,网络4需要IP地址数量为13,网络5需要IP地址数量为4
已知该C类地址为218.75.230.0,其左起前三个十进制数为网络号部分
根据应用需求,需要使用主机号的三个比特位作为子网号,可以划分出 2^3^ = 8 个子网,满足应用需求
每个子网所包含的地址数量为2^(8-3)^ = 32,满足每个子网对IP地址数量的需求
得出划分子网的子网掩码为
255.255.255.224
使用子网掩码255.255.255.224对C类网络218.75.230.0进行子网划分的细节如下标所示:
子网 网络地址 广播地址 该子网上的可分配地址 1 218.75.230.0 218.75.230.31 218.75.230.1 ~ 218.75.230.30 2 218.75.230.32 218.75.230.63 218.75.230.33 ~ 218.75.230.62 3 218.75.230.64 218.75.230.95 218.75.230.65 ~ 218.75.230.94 4 218.75.230.96 218.75.230.127 218.75.230.97 ~ 218.75.230.126 5 218.75.230.128 218.75.230.159 218.75.230.129 ~ 218.75.230.158 6 218.75.230.160 218.75.230.191 218.75.230.161 ~ 218.75.230.190 7 218.75.230.192 218.75.230.223 218.75.230.193 ~ 218.75.230.222 8 218.75.230.224 218.75.230.255 218.75.230.225 ~ 218.75.230.254 这样就可以从这8个划分好的子网中任选5个分别分配给网络1 ~ 网络5
之后就可以为网络中的各主机以及路由器的各接口分配IPv4地址
采用定长的子网掩码进行子网划分,所划分的每个子网都使用同一个子网掩码,只能划分出2^n^个子网,其中n是从主机号部分借用的用来作为子网号的比特数量,每个子网所分配到的IP地址数量相同,容易造成资源的浪费
变长的子网掩码VLSM
所划分出的每一个子网可以使用不同的子网掩码,因此每个子网所分配的IP地址数量可以不同,就尽可能减少了对IPv4地址的浪费
注意:不能使短网络号是长网络号的前缀
建议先为较大的子块进行选取
例:假设申请到的CIDR地址块为218.75.230.0/24,使用变长的子网掩码给下面所示的小型互联网中的各设备分配IPv4地址应用需求:从地址块218.75.230.0/24中取出5个地址块:/30、/28、/28、/28、/27,按需分配给5个网络
218.75.230.0/24地址块所包含的全部地址为:218.75.230.0 ~ 218.75.230.255,具体的分配结果如下所示
如果先选取数量少的地址,则会出现下面情况:
采用变长的子网掩码进行子网划分,可以按需划分出相应数量的子网,每个子网所分配到的IPv4地址数量可以不相同,尽可能减少了对IPv4地址资源的浪费
IPv4地址与MAC地址
IPv4地址与MAC地址的封装位置
由于IP地址属于TCP/IP体系结构中网际层的范畴,因此,在IP首部中应该封装有源IP地址和目的IP地址
由于MAC地址属于TCP/IP体系结构中数据链路层的范畴,因此,在帧首部中应该封装有源MAC地址和目的MAC地址
数据包传送过程中IPv4地址与MAC地址的变化情况
如图,为三个局域网通过两个路由器互连起来的小型互联网
图中各主机和路由器接口的IP地址和MAC地址都用比较简单的标识符来表示
主机一般只有一个接口,因此需要1个IP地址和1个MAC地址
路由器最少有两个接口,而每个接口都需要1个IP地址和1个MAC地址
假设主机H1给H2发送一个分组,显然该分组需要依次经过路由器R1和R2的转发才能最终到达H2:
主机H1将数据包发送给路由器R1,在(主机H1的)网际层封装的IP数据报的首部中,源IP地址应填写主机H1的IP地址IP1,目的IP地址应填写主机H2的IP地址IP2,也就是从IP1发送给IP2
(主机H1的)数据链路层将IP数据报封装成帧,在帧首部中源MAC地址应填写主机H1的MAC地址MAC1,目的MAC地址应填写路由器R1的MAC地址MAC3,也就是从MAC1发送给MAC3
路由器R1将收到的数据包转发给路由器R2,在(路由器R1的)网际层封装的IP数据报的首部中,源IP地址字段和目的IP地址字段的内容仍然是IP1和IP2
而在(路由器R1的)数据链路层封装的帧首部中源MAC地址应填写R1的MAC地址MAC4,目的MAC地址应填写路由器R2的MAC地址MAC5,也就是从MAC4发送给MAC5
路由器R2将收到数据包转发给主机H2,在(路由器R2的)网际层封装的IP数据报的首部中源IP地址字段和目的IP地址字段的内容仍然是IP1和IP2,而在(路由器R2的)数据链路层封装的帧首部中的源MAC地址应填写路由器R2的MAC地址MAC6,目的MAC地址应填写主机H2的MAC地址MAC2,也就是从MAC6发送给MAC2
可以看出,在数据包的传送过程中,数据包的源IP地址和目的IP地址保持不变,但数据包的源MAC地址和目的MAC地址会逐链路(或逐网络)改变
在上述过程中:
- H1知道应该把数据包发送给R1,H1知道R1相应接口的IP地址为IP3,但不知道其对应的MAC地址是什么
- R1知道应该把数据包发送给R2,R1知道R2相应接口的IP地址为IP5,但不知道其对应的MAC地址是什么
- R2知道应该把数据包发送给H2,R2知道H2相应接口的IP地址为IP2,但不知道其对应的MAC地址是什么
即H1、R1和R2存在一个共同问题,就是知道IP地址但不知道其相应的MAC地址
这就需要通过地址解析协议ARP就可以通过IP地址找出相应的MAC地址
关系总结
为何要使用MAC地址搭配IP地址,而不能简单地使用MAC地址就可以了吗?
如果仅仅使用MAC地址进行通信,则会出现以下主要问题:
- 因特网中的每台路由器的路由表中就必须记录因特网上所有主机和路由器各接口的MAC地址
- 手工给各路由器配置路由表几乎是不可能完成的任务,即使使用路由协议让路由器通过相互交换路由信息来自动构建路由表,也会因为路由信息需要包含海量的MAC地址信息而严重占用通信资源
- 包含海量MAC地址的路由信息需要路由器具备极大的存储空间,并且会给分组的查表转发带来非常大的时延
因特网的网际层使用IP地址进行寻址,就可使因特网中各路由器的路由表中的路由记录的数量大大减少,因为只需记录部分网络的网络地址,而不是记录每个网络中各通信设备的各接口的MAC地址
路由器收到IP数据报后,根据其首部中的目的IP地址的网络号部分,基于自己的路由表进行查表转发
查表转发的结果可以指明IP数据报的下一跳路由器的IP地址,但无法指明该IP地址所对应的MAC地址
因此,在数据链路层封装该IP数据报成为帧时,帧首部中的目的MAC地址字段就无法填写,该问题需要使用网际层中的地址解析协议ARP来解决
地址解析协议ARP
已知某个主机或路由器接口的IP地址,但不知道其所对应的MAC地址,如何通过IP地址找到其所对应的MAC地址就是地址解析协议ARP所要完成的任务
如图,这是一个小型的交换式以太网
假设主机A要给主机B发送一个分组,主机A知道主机B的IP地址,但不知道主机B的MAC地址,因此主机A的数据链路层在封装以太网帧时无法填写目的MAC地址
实际上,每台主机都会维护一个ARP高速缓存表,ARP高速缓存表中记录有IP地址和MAC地址的对应关系
例如,这是主机A的ARP高速缓存表:
IP地址 | MAC地址 | 类型 |
---|---|---|
192.168.0.3 | 00-0C-CF-B8-4A-82 | 动态 |
192.168.0.4 | 00-01-C7-D3-B2-B5 | 静态 |
... | ... | ... |
表中的第一条记录是主机A之前获取到的主机C的IP地址与MAC地址的对应关系
当主机A要给主机B发送分组时,会首先在自己的ARP高速缓存表中查找主机B的IP地址所对应的MAC地址,但未找到,于是主机A发送ARP请求报文来获取主机B的MAC地址
ARP请求报文是广播报文,需要封装在以太网帧中发送。帧的目的MAC地址为广播地址,即48比特均为1,16进制为全F的地址
该ARP请求报文的大致内容是"我的IP地址是192.168.0.1,我的MAC地址为00-0C-85-72-AB-72,我想知道IP地址为192.168.0.2的主机的MAC地址"
交换机收到封装有该ARP请求报文的以太网广播帧后将其从自己的其他所有接口转发出去,因此主机B和C都可以接收到该广播帧
主机C的网卡收到该广播帧后将其所封装的ARP请求报文送交上层处理,上层的ARP进程解析该ARP请求报文,发现所询问的IP地址不是自己的地址,因此不予理会
主机B的网卡收到该广播帧后将其所封装的ARP请求报文送交上层处理,上层的ARP进程解析该ARP请求报文发现所询问的IP地址正是自己的IP地址,需要进行响应
主机B首先将ARP请求报文中所携带的主机A的IP地址与MAC地址记录到自己的ARP高速缓存表中,然后给主机A发送ARP响应报文,以告知A主机B自己的MAC地址
主机B给主机A发送ARP响应报文,ARP响应报文是单播报文,需要封装在以太网帧中发送,帧的目的MAC地址为主机A的MAC地址,该ARP响应报文的内容是"我的IP地址是192.168.0.2,我的MAC地址为00-E0-F9-A3-43-77"
交换机收到封装有该ARP响应报文的以太网单播帧后,将其明确转发给主机A,主机A的网卡收到该单播帧后发现其目的MAC地址就是自己的MAC地址,于是接受该单播帧,并将其所封装的ARP响应报文送交上层处理,上层的ARP进程解析该ARP响应报文,将其所包含的主机B的IP地址与MAC地址记录到自己的ARP高速缓存表中
现在主机A可以给主机B发送分组了
ARP高速缓存表中的每一条记录都有其类型,分为静态和动态两种
-
动态类型指ARP记录是由主机通过ARP协议自动获取到的,其生命周期默认为2分钟,当生命周期结束时,该记录将自动删除
ARP高速缓存表中的IP地址与MAC地址的对应关系并不是永久不变的,例如主机更换了一块新的网卡
-
静态类型是指ARP记录是由用户或网络维护人员手工配置的,在不同的操作系统中静态记录的生命周期不同,例如系统重启后不存在或系统重启后依然有效
ARP协议被用来解决同一个局域网上的主机或路由器的IP地址和MAC地址的映射问题,不能跨网络使用
但可以在逐个地在每哥网络内部使用ARP来达到跨网络的效果
注意事项:
- 由于ARP协议的主要用途是从网际层使用的IP地址解析出在数据链路层使用的MAC地址。因此,有的教材将ARP协议划归在网际层,而有的教材将ARP协议划归在数据链路层。这两种做法都是可以的
- 除ARP请求报文和响应报文外,ARP协议还有其他类型的报文,例如用于检查IP地址冲突的"无故ARP"(Gratuitous ARP)
- 由于ARP协议很早就指定出来了,当时并没有考虑网络安全问题,因此,ARP协议没有安全验证机制,存在ARP欺骗和攻击等问题
IP数据报的发送和转发过程
IP数据报的发送和转发包含以下两个过程:
- 主机发送IP数据报
- 路由器转发IP数据报
我们忽略使用ARP协议来获取目的主机或路由器接口的MAC地址的过程,以及以太网交换机自学习和转发帧的过程
路由器R的接口0连接了一个由交换机S1和三台主机互连而成的交换式以太网,记为以太网1
路由器R的接口1连接了一个由交换机S2和三台主机互连而成的交换式以太网,记为以太网2
假设以太网1分配到的CIDR地址块为192.168.0.0/25,以太网2分配到的CIDR地址块为192.168.0.128/25
具体过程
同一个网络中的各主机之间可以直接进行通信,这属于直接交付
不同网络中的各主机之间的通信需要通过路由器进行中转,这属于间接交付
源主机通过比较网络号来判断目的主机是否与自己处于同一个网络中
以主机C给主机F发送IP数据报为例,主机C知道主机F的IP地址,于是将主机F的IP地址的前25个比特取出,与自己的前25个比特网络前缀进行比较,比较后发现不同,得出两主机处于不同的网络
为了让本网络中的各主机能和其他网络中的主机进行通信,就必须给其指定本网络中的一个路由器,由该路由器进行转发(即让各主机知道应该将数据报发送给哪个路由器)。所指定的路由器,也被称为默认网关(默认路由器)
默认网关使用路由器的IP地址表示
此后,当本网络中的主机要和其他网络中的主机进行通信时,会将IP数据报传输给默认网关,由默认网关帮主机将IP数据报转发出去
假设,主机A要给主机B发送IP数据报,因此这属于间接交付
主机A会将该数据报发送给自己的默认网关(即路由器R)
路由器R在正确无误地接收到该IP数据报后,就基于IP数据报首部中的目的IP地址在自己的路由表中进行查找匹配的路由条目,若找到匹配的路由条目,则按照该条目的指示进行转发,否则丢弃该IP数据报,并向发送该IP数据报的源主机发送相应的ICMP差错报告
在给路由器的接口0配置IP地址和地址掩码后,路由器就可自行得出自己的接口0所直连网络的网络地址(即对于给定CIDR形式的IP地址192.168.0.126/25,可以找出其最小地址和最大地址,路由器就具备这样的能力)
同理,在给路由器的接口1配置IP地址和地址掩码后,路由器就可自行得出自己的接口1所直连网络的网络地址
具体结果如下所示:
目的网络 | 地址掩码1 | 下一跳 |
---|---|---|
192.168.0.0 | 255.255.255.128 | 接口0直连 |
192.168.0.128 | 255.255.255.128 | 接口1直连 |
... | ... | ... |
路由表中可能还会有其他路由条目,这可能是用户或网络管理员手工配置的静态路由条目,也可能是路由器通过路由选择协议自动获取到的动态路由条目
路由条目的匹配过程如下:
-
将IP数据报的目的地址192.168.0.129与路由表中的第一条条目中的地址掩码255.255.255.128进行逐比特逻辑与运算,于是得到网络地址192.168.0.128,该网络地址与条目中的目的网络地址192.168.0.0不匹配,因此第一条路由条目不匹配
-
将IP数据报的目的地址192.168.0.129与路由表中的第二条条目中的地址掩码255.255.255.128进行逐比特逻辑与运算,于是得到网络地址192.168.0.128,该网络地址与条目中的目的网络地址192.168.0.128匹配,因此第二条路由条目匹配
匹配成功后,路由器只需通过ARP协议获取到与自己的接口处于同一网络中的目的主机的MAC地址,并根据下一条的指示,就可将IP数据报封装成帧后发送目的主机
上述路由器查表转发IP数据报的过程是为了帮助我们理解其最基本的工作原理
在路由器的研发过程中,需要设计很好的数据结构(甚至是专用硬件)以便提高查找速度
对于任何形式的广播IP数据报,其数据报首部中的目的IP地址可以设置为本网络的广播地址(即主机号部分全为1的地址),也可是设置为受限的广播地址(即255.255.255.255)。路由器的接口在收到广播IP数据报后,不会对其进行转发,而是直接丢弃
IPv4数据报的首部格式
IPv4数据报的首部格式及其内容是实现IPv4协议各种功能的基础
在TCP/IP标准中,各种数据格式常常以32比特(即4字节)为单位来描述
如图为IP数据报(IPv4数据报的简称)的首部格式,它由20字节的固定部分和最大40字节的可变部分组成,固定部分是指每个IP数据报首部都必须包含的部分
而某些IP数据报的首部除了包含20字节的固定部分外,还包含一些可选的字段来增加IP数据报的功能
IP数据报的首部常以32个比特(4个字节)作为单位进行描述,图中的每一行都由32个比特(也就是4个字节)构成
每个小格子称为字段或者域
每个字段或某些字段的组合用来表达IP协议的相关功能
-
版本字段
占4个比特,表示IP协议的版本,通信双方使用的IP协议的版本必须一致
目前广泛使用的IP版本号为4(即IPv4)
-
首部长度字段
占4个比特,表示IP数据报首部的长度
该字段的取值以4字节为单位
其最小十进制取值为5,表示IP数据报首部只有20字节固定部分
最大十进制取值为15,表示IP数据报首部包含20字节固定部分和最大40字节可变部分
-
可选字段
长度从1字节到40个字节不等
用来支持排错、测量及安全措施等功能
可选字段增加了IP数据报的功能,但这也同时使得IP数据报的首部长度成为可变的
这就增加了因特网中每一个路由器处理IP数据报的开销
实际上可选字段很少被使用
-
填充字段
确保首部长度为4字节的整数倍,使用全0进行填充
-
区分服务字段
占8个比特,用来获得更好的服务,该字段在旧标准中叫做服务类型,但实际上一直没有被使用过
利用该字段的不同数值可提供不同等级的服务质量,但只有在使用区分服务时,该字段才起作用,一般情况下都不使用该字段
-
总长度字段
占16个比特,表示IP数据报的总长度(首部+数据载荷),取值以1字节为单位
最大取值为二进制的16个比特1,即十进制的65535
-
标识、标志、片偏移三个字段
它们共同用于IP数据报分片
网际层封装出的IP数据报,将在数据链路层封装成帧,每一条数据链路层协议都规定了**帧的数据载荷(即整个IP数据报)**的最大长度,称为最大传输单元MTU,如以太网规定MTU的取值为1500字节
如果IP数据报的总长度超过MTU时,将无法封装成帧,需要将原IP数据报分片为更小的IP数据报,再将各分片封装成帧
-
标识字段
占16个比特,属于同一个IPv4数据报的各分片数据报应该具有相同的标识
IP软件会维持一个计数器,每产生一个IPv4数据报,计数器值就加1,并将此值赋给标识字段
-
标志字段
占3个比特,各比特含义如下:
最低位为MF位(More Fragment, MF):表示本分片后面是否还有分片,1表示"后面还有分片",0表示"这是最后一个分片"
中间位为DF位(Don't Fragment, DF):表示是否允许分片,1表示不允许分片,0表示允许分片
最高位为保留位:必须设置为0
-
片偏移字段
占13个比特,该字段的取值以8个字节为单位,用来指出分片IPv4数据报的数据载荷部分偏移其在原IPv4数据报的位置有多远
除最后一个分片数据报外,其它每个分片数据报的数据载荷的长度,都必须是8字节的整数倍,否则,会造成其相邻后续分片数据报的片偏移不是整数
-
例:假设一IP数据报包含了20字节的固定首部和3800字节的数据载荷,根据数据链路层的需求,需要将该IPv4数据报分片为长度不超过1420字节的数据报片
由于该数据报的数据载荷超过了以太网的MTU,所以需要对该IP数据报分片成更小的IP数据报,每个长度不得大于1500字节
总长度 标识 MF DF 片偏移 原始数据报 3800+20 12345 0 0 0 分片数据报1 1400+20 12345 1 0 0/8 = 0 分片数据报2 1400+20 12345 1 0 1400/8 = 175 分片数据报3 1000+20 12345 0 0 2800/8 = 350 假定分片2的IP数据报经过某个网络时还需要再进行分片,其中一个分片长度为800字节,另一个分片长度为600字节
总长度 标识 MF DF 片偏移 原始数据报 3800+20 12345 0 0 0 分片数据报2-1 800+20 12345 1 0 1400/8 = 175 分片数据报2-2 600+20 12345 1 0 2200/8 = 275
-
生存时间字段TTL
占8个比特,最大取值为11111111,即十进制的255
该字段最初以秒为单位,因此,IPv4数据报的生存时间最初为255秒
路由器转发IP数据报时,将IP数据报首部中该字段的值减去IP数据报在本路由器上所耗费的时间,若结果不为0就转发,否则就丢弃
现在以跳数为单位,路由器收到待转发的IP数据报时,将IP数据报首部中该字段的值减1,若结果不为0就转发,否则就丢弃
生存时间字段TTL的作用 ------ 防止IP数据报在网络中永久兜圈
-
协议字段
占8个比特,用来指明IPv4数据报的数据部分是何种协议数据单元
常见的一些协议和相应的协议字段值如下:
协议名称 | ICMP | IGMP | TCP | UDP | IPv6 | OSPF |
---|---|---|---|---|---|---|
协议字段值 | 1 | 2 | 6 | 17 | 41 | 89 |
-
首部检验和字段
占16比特,用来检测IPv4数据报的首部在传输过程中是否出现差错,所采用的检错码比循环冗余校验码简单,称为因特网检验和
IP数据报每经过一个路由器,路由器都要重新计算首部检验和,因为首部中某些字段(生存时间、标志、片偏移等)的取值可能发生变化
由于IP层本身并不提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部检验和,从而更快转发IP数据报
首部检验和的计算方法:
发送端:把IP数据报首部划分为若干个16比特字的序列,并把其中的首部检验和字段的值置为全0,用反码算术运算把所有16比特字相加,将得到的和取反码就得到了16比特的检验和,将其写入首部检验和字段
发送方将IP数据报发送给接收方
接收端:将其首部的所有16比特字再使用反码算术运算相加一次,将得到的和取反码就可得出接收方检验和的结果。若在IP数据报传输过程中首部没有产生差错,则该计算结果应为0,保留该IPv4数据报,否则就认为出现了差错,丢弃该IPv4数据报
上述检验和的计算方法不仅用于IP协议,还用于运输层的用户数据报协议UDP和传输控制协议TCP,常被称为因特网检验和。这种检验和的检错性能虽然不如CRC,但更易用软件实现
首部检验和的计算:两个数进行二进制反码求和的运算规则是从低位到高位逐列进行计算:
- 0和0相加是0
- 0和1相加是1
- 1和1相加是0,但要产生一个进位1,加到下一列
- 若最高位相加后产生进位,则最后得到的结果要加1
从第一行开始,让第一行字与第二行字进行反码求和,之后将求和结果再与第三行进行反码求和,再将此求和结果与第四行进行反码求和...,直到将所有行字求和完成得到最终结果,最终结果取反码就是检验和字段要填入的值
1 0 0 1 1 0 0 1 0 0 0 1 0 0 1 1
与0 0 0 0 1 0 0 0 0 1 1 0 1 0 0 0
进行二进制反码求和的结果为1 0 1 0 0 0 0 1 0 1 1 1 1 0 1 1
1 0 1 0 0 0 0 1 0 1 1 1 1 0 1 1
与1 0 1 0 1 0 1 1 0 0 0 0 0 0 1 1
进行二进制反码求和的结果为0 1 0 0 1 1 0 0 0 1 1 1 1 1 1 0
,但由于最高位出现了进位,所以需要在此结果的基础上再加1得到0 1 0 0 1 1 0 0 0 1 1 1 1 1 1 1
计算出所有行的求和结果后,对其取反妈即为检验和字段的内容
由于网际层并不向其高层提供可靠传输的服务,并且计算首部检验和是一项耗时的操作,因此在IPv6中,路由器不再计算首部检验和,从而更快地转发IP数据报
-
源IP地址、目的IP地址字段
各占32比特,用来填写发送该IP数据报的源主机IP地址和接收该IP数据报的目的主机IP地址
静态路由配置
静态路由配置是指用户或网络运维人员使用路由器的相关命令给路由器人工配置路由表
人工配置方式简单、开销小,但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中使用
假设有如下网络拓扑,路由器R1和R2将三个网络互连起来,三个网络的网络地址和路由器各接口的IP地址已标注在图中
当给R1的接口0配置了IP地址和地址掩码后,R1就可以自行得出接口0所直连网络的网络地址
由于接口0与该网络是直连的,因此下一跳不是某个路由器的地址,而是通过接口0转发IP数据报给改网络中的某台主机,这条路由条目的路由属于直连路由
同理,给R1的接口1和R2的接口0和接口1都配置了IP地址和地址掩码后,它们也能自行得出接口所直连网络的网络地址
假设R1要向R2的接口1所直连的网络中转发一个IP数据报,因此R1应该将该数据报转发给路由器R2的接口0
但此时,R1的路由表中并没有关于该目的网络的路由条目
因此,可以使用路由器的相关配置命令,给R1手动添加一条到达该目的网络的路由条目
该条目的内容如下:
- 目的网络字段:192.168.1.0/24
- 下一跳字段:路由器R2的接口0的IP地址10.0.0.2
- 类型字段:值为"静态",因为该条目是人工配置的
同理,可以给R2手动添加一条到达R1的接口0所直连网络的路由条目
默认路由
若有如下网络拓扑,且R1的路由表如下所示:
假设R1要向因特网中的某个网络转发一个IP数据报,从图中可以看出,R1应该将该IP数据报转发给路由器R2的接口0,因此可以给R1手动添加一条去往该网络的静态路由
但因特网中包含大量的网络,如果针对因特网中的每一个网络给R1添加一条相应的路由条目,这就给人工配置带来了巨大的工作量,并且使R1的路由表变得非常大,降低了查表转发的速度
可以给R1添加一条默认路由条目,来替代去往因特网中众多网络的海量路由条目
该默认路由条目的配置如下:
- 目的网络字段:0.0.0.0/0
- 下一跳字段:路由器R2的接口0的IP地址10.0.0.2
- 类型字段:该条目为人工配置的,因此值为"静态"
该条目中的目的网络地址0.0.0.0/0,其中的0.0.0.0表示任意网络,而网络前缀"/0"(相应的地址掩码为0.0.0.0)是最短的网络前缀
路由器在查表转发IP数据报时,会遵循"最长前缀匹配"的原则,因此默认路由条目的匹配优先级最低
在本例中,路由器R1中凡是去往因特网中某个网络的IP数据报,都会按照R1路由表中的这条默认路由条目中的下一跳指示,将IP数据报从R1的接口1转发给路由器R2的接口0,由R2再转发给因特网中的下一个路由器
由此可见,在R1的路由表中用一条默认路由条目,替代了去往因特网中众多网络的海量路由条目,极大地减少了路由表所占用的存储空间和搜索路由表所耗费的时间
特定主机路由
出于某种安全问题的考虑,同时为了使网络运维人员更方便地控制网络和测试网络,特别是在对网络的连接或路由表进行排错时,指明到某一台主机的特定主机路由是十分有用的
假设有如下网络拓扑,R1的路由表如下所示:
网络192.168.2.0/24中有一台IP地址为192.168.2.1的特定主机
在路由器R1的路由表中针对该主机人工配置一条特定主机路由条目
该条目的内容如下:
- 目的网络字段:192.168.2.1/32
- 下一跳字段:路由器R2的接口0的IP地址10.0.0.2
- 类型字段:该条目为人工配置的,因此值为"静态"
特定主机路由条目中的目的网络192.168.2.1/32,其中192.168.2.1是特定主机的IP地址,而网络前缀"/32"(相应地址掩码为255.255.255.255)是最长的网络前缀
路由器在查表转发IP数据报时,会遵循"最长前缀匹配"的原则,因此特定主机路由条目的匹配优先级最高
在本例中,路由器R1在查表转发去往192.168.2.1这台特定主机的IP数据报时,图中所标注的两个路由条目都可以匹配
但为了遵循最长前缀匹配的原则,R1最终会匹配特定主机路由条目,并根据其中的下一跳指示将IP数据报转发给路由器R2的接口0
注意事项
在进行静态路由配置时需要认真考虑和谨慎操作,否则可能出现以下问题:
- 路由条目配置错误,甚至导致出现路由环路
- 聚合路由条目时可能引入不存在的网络
路由选择协议概述
路由选择分类
路由选择可分为静态路由选择和动态路由选择:
-
静态路由选择
由人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目
简单、开销小,但不能及时适应网络状态(流量、拓扑等)的变化
一般只在小规模网络使用
-
动态路由选择
路由器通过路由选择协议自动获取路由信息
比较复杂、开销比较大,但能较好地适应网络状态的变化
适用于大规模网络
因特网采用分层次的路由选择协议
因特网所采用的路由协议有以下三个主要特点:
-
自适应
因特网使用的是动态路由选择,能较好地适应网络状态的变化
-
分布式
因特网中的各路由器之间通过交换路由信息,共同完成路由信息的获取和更新
-
分层次
将整个因特网划分为许多较小的自治系统AS(Autonomous System)
在自治系统内部和外部,采用不同类别的路由选择协议,分别进行路由选择
将某个电信运营商所拥有的多个网络和路由器划分为自治系统AS1,而将另一个电信运营商所拥有的多个网络和路由器划为了自治系统AS2
自治系统之间的路由选择简称为域间路由选择
自治系统内部的路由选择简称为域内路由选择
域间路由选择使用外部网关协议EGP类别的路由选择
域内路由选择使用内部网关协议IGP类别的路由选择
在一个自治系统内部使用的具体的内部网关协议与因特网中其他自治系统中选用何种内部网关协议无关
EGP和IGP是路由选择协议的分类名称,而不是具体的路由选择协议
注意:
- 外部网关协议EGP和内部网关协议IGP只是路由选择协议的分类名称,而不是具体的路由选择协议
- 外部网关协议和内部网关协议名称中使用的是"网关"这个名词,是因为在因特网早期的RFC文档中,没有使用"路由器"而使用的是"网关"这一名词
路由信息协议RIP
路由信息协议RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议之一,其相关标准文档为RFC 1058
RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录。这是一组距离,称为"距离向量D-V(Distance-Vector)"
RIP使用跳数(Hop Count)作为度量(Metric)来衡量到达目的网络的距离
RIP将路由器到直连网络的距离定义为1,将路由器到非直连网络的距离定义为所经过的路由器数加1
RIP允许一条路径最多只能包含15个路由器,即"距离"为16时相当于不可达,因此,RIP只适用于小型互联网
"距离"最大值为16,无更大值
有些厂商的路由器并没有按照RIP标准文档的规定来实现RIP,如思科路由器的RIP将路由器到直连网络的距离定义为0,但这并不影响RIP的正常运行
RIP认为好的路由就是就是"距离"短的路由,也就是所经过路由器数量最少的路由
假设路由器R1到R5有两条路径
尽管路径R1 → R2 → R3 → R5中的各段链路都是高带宽链路,但RIP认为好的路由却是R1 → R4 → R5
当到达同一目的网络有多条"距离相等"的路由时,可以进行等价负载均衡,也就是将通信量均衡地分布到多条等价的路由上
假设路由器R1到R6有两条路径
RIP会同时利用这两条距离相等的链路,以实现等价负载均衡
RIP包含以下三个重要特点:
-
和谁交换信息
仅和相邻路由器交换信息
相邻路由器之间不存在其它路由器
-
交换什么信息
路由器自己的路由表,即本路由器到所在自治系统AS中各网络的最短RIP距离,以及到各网络应经过的下一跳路由器
-
何时交换信息
周期性交换
为了加快RIP的收敛速度,当网络拓扑发生变化时,路由器要及时向相邻路由器通告拓扑变化后的路由信息,这称为触发更新
RIP的基本工作过程
路由器刚开始工作时,只知道自己到直连网络的距离为1
每个路由器仅和相邻路由器周期性地交换并更新路由信息
对于本例:R1与R2互为相邻路由器、R1与R3互为相邻路由器、R2与R3互为相邻路由器、R2与R4互为相邻路由器、R3与R4互为相邻路由器
若干次交换和更新后,每个路由器都知道到达本AS内各网络的最短距离和下一跳地址,称为收敛
RIP的距离向量算法
- 发现了新的网络,添加
- 到达目的网络,不同下一跳,新路由优势,更新
- 到达目的网络,不同下一跳,等价负载均衡
- 到达目的网络,相同下一跳,最新消息,更新
- 到达目的网络,不同下一跳,新路由劣势,不更新
例:
如图,路由器C和D互为相邻路由器,它们各自的路由表如图所示
在路由器C的路由表中,将到达目的网络的下一跳都记为"?",可以理解为路由器D并不需要关心路由器C的这些内容
假设某个时刻路由器C将自己的路由表封装在RIP更新报文中发送给路由器D
路由器D收到路由器C发来的路由表后,对其进行修改:将到达目的网络的下一跳都改为C,并将RIP距离都+1
修改的原因:C告诉D,我可以到达这些网络,以及到达这些网络的RIP最短距离分别是...,D作为C的相邻路由器,当然也就可以通过C来到达这些网络,只是比C到达这些网络的RIP距离大1
路由器D基于修改后的路由信息来更新自己的路由表,D原来到达网络N2的RIP距离为2,下一跳经过C的转发,根据修改C的路由表信息知道了,现在到达N2仍要经过C的转发,但RIP距离变为了5(说明C到N2的网络拓扑发生了变化),于是D将到达N2的RIP距离更新为5
更新的理由可总结为:到达目的网络,相同的下一跳,最新消息,要更新
路由器D原来不知道网络N3的存在,D现在知道了可以通过C到达N3,于是D将到达N3的这条路由条目添加到自己的路由表中
更新的理由可总结为:发现新网络,添加
路由器D原来到达网络N6的RIP距离是8,下一跳经过F的转发,通过修改的路由表知道了到达N6如果通过C来转发则RIP距离可缩短为5,于是D将自己路由表中到达N6的路由条目中的下一跳修改为C,RIP距离修改为5
更新的理由可总结为:到达目的网络,不同的下一跳,新路由优势,要更新
路由器D原来到达网络N8的RIP距离为4,下一跳经过E的转发,D现在知道了到达N8还可以通过C来转发,RIP距离也为4,于是D将到达N8的这条新的路由条目添加到自己的路由表中(这样可以等价负载均衡)
更新的理由可总结为:到达目的网络,不同的下一跳,RIP距离相等,可以等价负载均衡,添加
路由器D原来到达网络N9的RIP距离为4,下一跳经过F的转发,D现在知道了到达N9如果通过C来转发,则RIP距离将增大到6,于是D不使用这条路由条目来更新自己的路由表
不更新路由表的理由可总结为:到达目的网络,不同的下一跳,新路由劣势,不更新
除上述RIP路由条目更新规则,在RIP的距离向量算法还包含以下一些时间参数:
- 路由器每隔大约30秒向其所有相邻路由器发送路由更新报文
- 若180秒(默认)没有收到某条路由条目更新报文,则把该路由条目标记为无效(即把RIP距离设置为16,表示不可达),若再过一段时间(如120秒),还没有收到该路由条目更新报文,则将该路由条目从路由表中删除
RIP存在"坏消息传播得慢"的问题
如图所示,假设路由器R1到达其直连网络N1的链路出现了故障,当R1检测出故障后会将到达N1的路由条目中的RIP距离设置为16,表示N1不可达
而此时路由器R2的路由表仍记录的是原来记录的到达N1的路由条目,其距离为2,下一跳为R1
假设R1的路由更新报文的发送周期还有将近30秒才到时,而此时R2的路由更新报文的发送周期到时了,于是R2给R1发送路由更新报文,其中到达N1的路由条目中的RIP距离为2,下一跳为R1(这是R2之前从R1获取到的)
当R1收到R2发来的路由更新报文后,就会被该谣言误导,误认为可以通过R2到达N1,RIP距离为3
当R1的路由更新报文的发送周期到时后,就将包含这条路由条目的路由更新报文发送个R2,当R2收到R1发来的路由更新报文后,就会被该谣言误导,误认为通过R1到达N2的RIP距离为4
当R2的路由更新报文的发送周期到时后,就将包含这条路由条目的路由更新报文发送给R1
当R1收到R2发来的路由更新报文后,就会被该谣言误导,误认为通过R2到达N1的RIP距离为5
当R1的路由更新报文的发送周期到时后,就将这条路由条目的路由更新报文发给R2...
上述更新会一直持续下去,直到R1和R2到N1的RIP距离都增大到16,R1和R2才知道原来N1是不可达的,也就是才收敛,这就是RIP的"坏消息传播得慢"的问题
在上述过程中,R1和R2之间会出现路由环路,时间长达数分钟,如果没有最大RIP距离的限制,则该过程会一直永久持续下去
"坏消息传播得慢"又称为路由环路或RIP距离无穷计数问题,这是距离向量算法的一个固有问题,可以采取多种措施减少出现该问题的概率或减少该问题带来的危害:
- 限制最大路径距离为15(16表示不可达)
- 当路由表发生变化时就立即发送更新报文,即"触发更新",而不仅是周期性发送
- 让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送,即"水平分割"
使用这些方法仍无法彻底解决问题,这是因为在距离向量算法中,每个路由器都缺少到达目的网络的整个路径的完整信息,也就无法判断所选的路由是否出现了环路
RIP版本和相关报文的封装
现在较新的版本是RIP2,与RIP1相比,RIP2可以支持变长子网掩码和CIDR
另外,RIP2还提供简单的鉴别过程并支持多播
RIP相关报文使用运输层的用户数据报协议UDP进行封装,使用的UDP端口号为520
- 从RIP报文封装的角度看,RIP属于TCP/IP体系结构的应用层
- 但RIP的核心功能是路由选择,这属于TCP/IP体系结构的网际层
RIP的优缺点
优点:
- 实现简单,路由器开销小
- 如果一个路由器发现了RIP距离更短的路由,那么这种更新信息就传播得很快,即"好消息传播得快"
缺点:
- RIP限制了最大RIP距离为15,这就限制了使用RIP的自治系统AS的规模
- 相邻路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也随之增大
- "坏消息传播得慢"使更新过程的收敛时间过长,因此对于规模较大的自治系统AS,应当使用OSPF协议
开放最短路径优先OSPF
开放最短路径优先OSPF(Open Shortest Path First)协议是为克服RIP的缺点在1989年开发出来的
"开放"表明OSPF协议不是受某一家厂商控制,而是公开发表的
"最短路径优先"是因为使用了Dijkstra提出的最短路径算法(Shortest Path First)SPF
OSPF是基于链路状态的,而不像RIP那样是基于距离向量的
OSPF基于链路状态并采用最短路径算法计算路由,从算法上保证了不会产生路由环路
OSPF不限制网络规模,更新效率高,收敛速度快
链路状态(Link State,LS)是指本路由器都和哪些路由器相邻,以及相应链路的"代价"(cost)
"代价"用来表示费用、距离、时延、带宽等等,这些都由网络管理人员来决定
在思科路由器中,OSPF协议计算代价的方法是:100Mb/s除以链路带宽,若计算结果小于1,则记为1,大于1且有小数的,舍去小数
OSPF路由器邻居关系的建立和维护
OSPF相邻路由器之间通过交互问候(Hello)分组来建立和维护邻居关系
Hello分组封装在IP数据报中,发往组播地址224.0.0.5
IP数据报首部的协议号字段的取值应为89,来表明IP数据报的数据载荷为OSPF分组
OSPF分组直接使用网际层的IP数据报进行封装,而不像RIP报文需要使用运输层用户数据报协议UDP封装
从数据包按网络体系结构逐层封装的角度看,OSPF属于网际层协议,而RIP属于应用层协议(但RIP的核心功能是路由选择,属于网际层)
Hello分组发送周期为10秒,若40秒未收到来自邻居路由器的Hello分组,则认为该邻居路由器不可达
每个路由器都会建立一张邻居表,表中记录了有关该邻居路由器的相关信息
例如,在如下的网络拓扑中,路由器R1的邻居表如下所示
邻居表中各字段的含义如下:
邻居ID
即邻近路由器的ID
接口
邻居路由器与自己的哪个接口直连
"判活"倒计时
若在"判活"倒计时减少到0之前再次收到了来自邻居路由器的Hello分组,则重新启动针对该邻居路由器条目的判活倒计时
否则,当判活倒计时减少为0时,则判定该邻近路由器不可达
链路状态通告
使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement)
LSA中包含以下两类链路状态信息:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
链路状态更新分组
LSA被封装在链路状态更新分组LSU中,采用可靠的洪泛法进行发送
洪泛法的要点是路由器向自己所有的邻居路由器发送链路状态更新分组,收到该分组的各路由器,又将该分组转发给自己的所有邻居路由器(除刚刚发送更新分组过来的路由器外)
可靠是指收到链路状态更新分组后要发送确认,收到重复的更新分组无需再次转发,但要发送一次确认
链路状态数据库
使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA
通过各路由器洪泛发送封装有自己LSA的LSU分组,各路由器的LSDB最终将达到一致(即最终各路由器的LSDB将会相同)
使用OSPF的各路由器,基于LSDB进行最短路径优先SPF计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表
假设有如下网络拓扑,各链路的代价如图所示:
通过各路由器洪泛发送封装有各自链路状态通告LSA的链路状态更新分组LSU,各路由器最终将会得到相同的链路状态数据库LSDB
由该LSDB可以得出带权有向图
对该带权有向图进行基于Dijkstra的最短路径优先算法,就可以得出以各路由器为源原点的最短路径
OSPF的五种分组类型
-
问候(Hello)分组
用来发现和维护邻居路由器的可达性
-
数据库描述(Database Description)分组
用来向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息
-
链路状态请求(Link State Request)分组
用来向邻居路由器请求发送某些链路状态项目的详细信息
-
链路状态更新(Link State Update)分组
路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对整个系统更新链路状态
-
链路状态确认(Link State Acknowledgement)分组
这是对链路状态更新分组的确认分组
OSPF的基本工作过程
如图所示,相邻路由器R1与R2之间每隔10秒要交换一次问候分组,以便建立和维护邻居关系
建立邻居关系后,会给邻居路由器发送数据库描述分组,也就是将自己的链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器
假设路由器R1收到R2的数据库描述分组后,发现自己缺少其中的某些链路状态项目,于是就给R2发送链路状态请求分组,R2收到R1发来的链路状态请求分组后将R1所缺少的链路状态项目的详细信息封装在链路状态更新分组中发送给R1,R1收到R2发来的链路状态更新分组后,将这些所缺少的链路状态项目的详细信息添加到自己的链路状态数据库中,并给R2发送链路状态确认分组
R2也可以向R1请求自己所缺少的链路状态项目的详细信息
R1和R2的链路状态数据最终将达到一致,即同步
两个同步的路由器称作完全邻接的路由器
每30分钟或链路状态发生变化时路由器都会洪泛发送链路状态更新分组,收到该分组的其他路由器会根据分组的内容更新自己的链路状态数据库,然后洪泛转发该分组,并给该路由器发回链路状态确认分组,这称为新情况下的链路状态数据库同步
多点接入网路中的OSPF路由器
如图所示,5台路由器连接在同一个多点接入网络中,它们每隔10秒发送一次问候分组,以建立和维护邻居关系
这些路由器中的任意两个路由器都互为邻居关系
邻居关系的数量为[n(n-1)] / 2,其中n是路由器的数量,因此每个路由器需要向其他(n - 1)个路由器发送问候分组和链路状态更新分组
为了减少所发送问候分组和链路状态更新分组的数量,OSPF采用以下措施:
-
选举指定路由器(Designated Router, DR)和备用的指定路由器(Backup Designated Router, BDR)
-
所有的非DR/BDR只与DR/BDR建立邻居关系
这样邻居关系的数量就减少为了2(n-2) + 1
-
非DR/BDR之间不能直接交换信息,只能通过DR/BDR交换信息,若DR出现问题,则由BDR顶替DR
实现DR/BDR的选举并不复杂,无非就会各路由器之间交换一些选举参数,例如路由器优先级、路由器ID以及接口IP地址等,然后根据选举规则选出DR和BDR
OSPF划分区域
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,叫做区域(Area)
如图所示,这是一个很大的网络。我们将其划分成一个自治系统
在该自治系统内所有路由器都使用OSPF协议
OSPF将该自治系统再划分成4个更小的区域,每个区域都有一个32比特的区域标识符,可以用点分十进制表示
例如主干区域的标识符必须为0,也可表示成点分十进制形式的0.0.0.0,主干区域用于连通其他区域,其他区域的标识符不能为0且互不相同,每个区域的规模不太大,一般所包含的路由器不应超过200个
划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个自治系统,这就减少了整个网络上的通信量
在主干区域内,还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息,这样的路由器称为自治系统边界路由器(AS Border Router, ASBR),如路由器R6
主干区域内的路由器称为主干路由器(Backbone Router, BBR),如路由器R3、R4、R5、R6和R7
如果路由器的所有接口都在同一区域内,则该路由器称为区域内路由器(Internal Router, IR):区域1内的R1和R2、区域2内的R8、区域3内的R9
为了本区域可以和自治系统内的其他区域连通,每个区域都会有一个区域边界路由器(Area Border Router, ABR),如R3、R4和R7
区域边界路由器的一个接口用于连接自身所在区域,另一个接口用于连接主干区域
在本例中,区域边界路由器R3向主干区域发送自己所在区域1的链路状态通告,并向自己所在区域发送区域0、2和3的链路状态通告;区域边界路由器R4向主干区域发送自己所在区域2的链路状态通告,并向自己所在区域发送区域0、1和3的链路状态通告;区域边界路由器R7向主干区域发送自己所在区域3的链路状态通告,并向自己所在区域发送区域0、1和2的链路状态通告
使用分层次的划分区域的方法,虽然使交换信息的种类增多了,同时也使OSPF更加复杂了,但却能使每个区域内部交换路由信息的通信量减少,因而使OSPF协议能够用于规模很大自治系统中
边界网关协议BGP
边界网关协议BGP(Border Gateway Protocol)属于外部网关协议EGP,是用于自治系统AS之间的路由选择协议
BGP报文被封装在TCP报文段中进行传输
由于在不同自治系统内,度量路由的"代价"(距离、费用、带宽等)可能不同,因此,对于自治系统之间的路由选择,使用"代价"作为度量来寻找最佳路由是不可行的
自治系统之间的路由选择还必须考虑相关策略(政治、经济、安全等)
BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非寻找一条最佳路由
在配置BGP时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的"BGP发言人"
一般来说,两个BGP发言人都是通过一个共享网络连接在一起的,而"BGP发言人"往往就是BGP边界路由器
不同自治系统的BGP发言人要交换路由信息,首先必须建立TCP连接,端口号为179
在此TCP连接上交换BGP报文以建立BGP会话
利用BGP会话交换路由信息(例如,增加新的路由,或撤销过时的路由,以及报告出错的情况等)
使用TCP连接交换路由信息的两个BGP发言人,彼此称为对方的邻站(neighbor)或对等站(peer)
BGP发言人除了运行BGP外,还必须运行自己所在自治系统所使用的内部网关协议IGP,例如OSPF或RIP
BGP发言人交换网络可达性的信息(即要到达某个网络所要经过的一系列自治系统的信息)
当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达自治系统的较好的路由,也就是构造树形结构、不存在回路的自治系统连通图
BGP适用于多级结构的因特网
AS2的BGP发言人通知主干网的BGP发言人"要到达N1,N2,N3和N4可经过AS2"
主干网的BGP发言人在收到该通知后,向AS3的BGP发言人发出通知"要到达网络N1,N2,N3和N4可沿路径 (AS1, AS2) ",这里的 (AS1, AS2) 称为路径向量
AS3的BGP发言人收到该路径相邻信息后,如果发现AS3自身也包含在其中,则不能采用这条路径,否则会兜圈子
BGP-4的四种报文
BGP-4是目前使用最多的版本,BGP-4有以下4种报文
-
OPEN(打开)报文
用来与相邻的另一个BGP发言人建立关系,使通信初始化
-
UPDATE(更新)报文
用来通告某一条路由的信息,以及列出要撤销的多条路由
-
KEEPALIVE(保活)报文
用来周期性地证实邻站的连通性
-
NOTIFIATION(通知)报文
用来发送检测到的差错
从实现功能(路由选择)的角度看,RIP、OSPF、BGP这三个路由选择协议都属于网络层,但从数据包按网络体系结构逐层封装的角度看,RIP和BGP属于应用层,OSPF属于网络层