网络层的主要任务是
实现网络互连,进而实现数据包在各网络之间的传输

上图中的这些网络,他们只能在内部进行通信,他们只需要实现各自的物理层和数据链路层就可以了,如果需要将这些异构型网络互连起来,形成一个更大的互联网,那么就需要使用网络层互连设备路由器

对于互联网而言,仅实现物理层和数据链路层是不能实现数据包在互联网中各网络之间传输的,要实现该功能,就必须实现网络层
网络层需要解决的问题
-
网络层向运输层提供怎样的服务(“可靠传输”还是“不可靠传输”)
数据包在传输过程中可能会出现误码

也有可能由于路由器繁忙而被路由器丢弃

也有可能会出现按序发送的数据包不能按序到达接收方,如果网络层对上面的这些错误不采取措施,那么向上层提供的就是不可靠传输服务,如果网络层对上述这些错误采取措施,并使得接收方做到发送方发送什么,就接收什么,那么向上层提供的就是可靠传输服务,不同网络体系结构提供的服务是不同的
使用TCP/IP协议体系的网际层,提供的是无连接的,不可靠的数据服务,而ATM,帧中继和X.25de网络层,提供的都是面向连接的,可靠的虚电路服务
-
寻址问题

-
路由选择的问题
数据包从源站到目的站,可以有多种不能的路径

还有其他的路径可以到达,路由器收到数据包后,是依据数据包中的目的地址和路由器中的路由表

上图路由表中记录着路由器R1所知道的网络,以及数据包要到达这些网络,应该从自己的哪个接口转发,假设R1知道数据包要到达网络N7,下一跳应将其转发给路由器R4,则路由表中应该有这样的一条记录,而数据包要达到网络N6,下一跳应将其转发给路由器R2,则路由表中的信息如下

在实际中,这个路由表可以由用户或者网络管理员进行人工配置,但是这种方法只适合规模较小的网络,另外一种是实现各种路由选择协议,由路由器执行路由选择协议中所规定的路由选择算法,从而自动得出路由表中的路由记录,这种方法更适用于规模较大,且网络拓扑经常改变的大型互联网
因特网是目前全世界用户数量最多对的互联网,他使用
TCP/IP协议栈,由于TCP/IP协议栈的网络层使用国际协议IP,它是整个协议栈的核心协议,因此TCP/IP协议栈中网络层常称为网际层
面向连接的虚电路服务
面向连接的虚电路服务的核心是:可靠通信由网络来保证
当两台计算机进行通信时,应当首先建立网络成的连接,也就是建立一条虚电路,以保证通信双方所需的一切网络资源

然后双方就沿着已建立的虚电路发送分组,虚电路表示这是一条逻辑上的连接

分组都沿着这条逻辑连接按照存储转发方式传送,而不是真正建立了一条物理连接,而电路交换的电话通信,则是先建立一条真正的连接,因此分组交换的虚连接与电路交换的连接只是类似,但并不完全一样
分组的首部仅在连接建立阶段使用完整的目的主机地址,之后每个分组的首部只需携带一条虚电路编号即可,这种通信方式如果再使用可靠传输的协议,就可使所发送的分组最终正确到达接收方
通信结束和,需要释放之前所建立的虚电路

很多广域分组交换网都使用面向连接的虚电路服务,例如曾经的X.25和逐渐过时的帧中继FR,异步传输模式ATM等,然后因特网的先驱者并没有采用这种设计思路,而是采用无连接的数据报服务
无连接的数据报服务
无连接的数据报服务的核心思想是:
可靠通信应当由用户主机来保证
当两台计算机进行通信时,他们的网络层不需要先建立连接,每个分组可走不通的路径

但是必须要让分组的首部携带目的主机的完整地址,这种通信方式所传送的分组可能误码,丢失,重复和失序
由于网络本身不提供端到端的可靠传输服务,这就使网络中的路由器可以做到比较简单,而且价格低廉,因特网就采用了这种设计思想,将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心,采用这种设计思想的好处是,网络的造价大大降低,运行方式灵活,能够适应多种应用
IPv4地址
IPv4就是给因特网上的每一台主机(或路由器)的每一个接口分配一个在全时间范围内唯一的32比特的标识符
IP地址由因特网名字和数字分配机构ICANN进行分配,我国用户可向亚太网络信息中心APNIC申请IP地址,需要缴纳费用,2011年2月3日,互联网号码分配管理局IANA(由ICANN行使职能)宣布,IPv4地址已经分配完毕,我国在2014至2015年也逐步停止了向新用户和应用分配IPv4地址,同时全面开展商用部署IPv6
IPv4地址的编址方法经历了三个历史阶段
- 分类编址(1981)
- 划分子网(1985)
- 无分类编址(1993)
由于32比特的IPv4地址不方便阅读,记录以及输入等,因此IPv4地址采用点分十进制表示法以方便用户使用




分类编址
分类编址将网络分成5类,分别是ABCDE类

A类地址的网络号部分占8位,网络号部分的最高位固定为0
B类地址的网络号和主机号分别占16位,网络号部分的最高位固定为10
C类地址的网络号占24位,主机号占8位,网络号的最高位固定为110
D类地址是多播地址,其最高4位固定为1110
E类地址是保留地址,最高4位固定为1111
只有A类,B类和C类地址可分配给网络中的主机或路由器的各接口,主机号为全
0的地址是网络地址,不能分配给主机或路由器的各接口主机号为“全1”的地址是广播地址,不能分配给主机或路由器各接口
都是主机号全为1或者全为0的地址,都不能被分配
A类地址
8位网路号的最高位固定为0,低7位全部取0时,就是A类网络的最小网络号,即十进制值为0,该网络号被保留,不能指派,也就是0.x.x.x,因此A类网络第一个可指派的网络号为最高位固定为0,低7位为0000001,其十进制值为1,将24位的主机号全部取0,就可以得到该网络的网络地址(1.0.0.0),当8位网络号的低7位全部取1时,就是A类网络的最大网络号,其十进制值为127,该网络号被用于本地软件换回测试,不能指派,将127开头的IPv4地址的主机号部分的最低位取1时, 其他位取0,就可以得到最小的本地软件换回测试地址(127.0.0.1)

将127开头的IPv4地址的主机号部分的最低位取0,其他位取1,就可以得到最大的本地软件换回测试地址(因为主机号部分全为1是广播地址,不能指派),该地址为127.255.255.254
因此A类网络最后一个可指派的网络号为最高位固定为0,低7位为1111110,其十进制为126,将24位的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为126.0.0.0

- 可指派的网络数量(网络号)为
2^(8-1)-2=126,这里的8-1是因为A类地址网络号部分最高位为0,占用了以为,-2是因为有两个不能使用,0和127(0.x.x.x是保留地址,127.x.x.x是本地环回测试地址)- 每个网络中可分配的IP地址数量为2^24-2,-2的原因是需要去除一个主机号部分全是1的广播地址和全是0的
讨论的可指派的网络数量都是指的是网络号
非常特殊的几个IPv4地址
0.0.0.0是一个特殊的IPv4地址,只能作为源地址使用,表示“在本网络上的主机”,封装DHCP Discovery报文的IP分组的源地址使用0.0.0.0- 以127开头且后面三个字节非全0或全1的IP地址是一类特殊的IPv4地址,既可以作为源地址使用,也可以作为目的地址使用,用于本地软件环回测试,例如常用的环回测试地址
127.0.0.1 - 地址
255.255.255.255是一个特殊的IPv4地址,只能作为目的地址使用,表示“只在本网络上进行传播”,各路由器均不能转发

B类地址
B类地址的网络号和主机号都是占16位, 网络号部分最高固定为10,网络号的低14位取0时,就是B类地址的最小网络号,也就是100000000000000000,其点分十进制为128.0,该网络号是B类网第一个可指派的网络号,将16位主机号全部取0,就可以得到该网络的网络地址,其点分十进制为128.0.0.0,网络号的低14位全取1时,就是B类网络的最大网络号,点分十进制为191.255,这是B类网最后一个可指派的网络号,将16位的主机号全部取0,就可以得到该网络的网络地址,点分十进制为191.255.0.0

可指派的网络数量
2^(16-2)=16384每个网络中可分配的IP地址数量是2^16-2
有些教材中指出
128.0是保留网络号,B类第一个可指派的网络号为128.1,但是根据2002年9月发表的RFC3330文档,128.0网络号已经可以分配了
C类地址
网络号占24位,网络号的最高固定位为110,当网络号的低21位全部取0时,就是C类网络的最小网络号,其点分十进制为192.0.0,该网络号是C类网第一个可指派的网络号,将8位主机号全部取零,就可以得到该网络的网络地址,即192.0.0.0
C类地址的网络号最高位固定为110,当低21位全部取1时,就是C类网络的最大网络号,点分十进制为223.255.255,该网络号是C类网最后一个可指派的网络号,将8位的主机号全部取0,就可以得到该网络的网络地址,为223.255.255.0
可指派的C类网络数量为2^(24-3)=2097152
每个网络中可分配的IP地址数量为:2^8 -2=254




划分子网的IPv4地址
为何要划分子网?
如果一个公司目前的网络如下,该公司成功申请了一个B类网络,即145.13.0.0

如果该单位又新增了一些计算机,并且需要将原来的网络划分成三个独立的网络

如果子网1仍然使用原先申请到的B类网络地址,那么就需要为子网2和子网3各自申请一个网络地址

但是这种方法明显是行不通的,如果可以从IP地址的主机号部分,借用一些位作为子网号来区分不同的子网,就可以利用原有网络中剩余的大量IP地址,而不同申请新的网络地址
比如上图中,我们可以借用145.13.0.0中的第三个字节作为子网号,也就是第三字节的8位,给子网1分配0,给子网2分配1,给子网3分配2,最终向下图

问题:如果未在图中标记子网号部分,那么我们和计算机又如何知道分类地址中主机号有多少比特被用作子网号了呢?
答:使用子网掩码
32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号
一个32比特的分类IPv4地址由网络号和主机号两部分组成

当我们从主机号部分借用一些位作为子网号时,IP地址从两级结构的分类IP地址变成了三级结构的划分子网的IP地址,我们用连续的比特1来对应网络号和子网号,用连续的比特0来对应主机号,这样就构成了划分子网的IP地址的32比特的子网掩码

将划分子网的IPv4地址与相应的子网掩码进行逻辑与运算,就可得到IPv4地址所在子网的网络地址

例子
例:已知某个网络的地址为218.75.230.0,使用子网掩码255.255.255.128对其进行子网划分,请给出划分细节
-
分析
218.75.230.0可知这是一个C类地址,网络号部分占3个字节,主机号部分占用一个字节,题目给定的子网掩码255.255.255.128中,255.255.255其二进制为24个连续的比特1,他们对应IP地址中的网络号部分
-
而该子网掩码中的十进制数128,用来表示从IP地址的主机号部分借用多少比特来作为子网号(
注意这里是借用多少比特,所以需要将128转换为8位比特形式),将此128转换为8个二进制比特,其中只有一个比特1,表明从主机号部分借用1个比特作为子网号
-
因此可划分出的子网数量为2的一次,也就是两个,子网可分配的地址数量为
2^(8-1)-2=126(因为主机号部分被借用了1位作为子网号,所以最后只剩下7给比特作为主机号,但是还 需要去掉主机号为全0和全1)
-
现在再来分析题目所给的
218.75.230.0
-
因为子网掩码
255.255.255.128会从主机号部分借用1个比特作为子网号,也就是将该C类网均分为两个子网,我们将主机号写成8比特的形式,从主机号借用1比特作为子网号,子网号只能是1或者0
第一个就是子网0的网络地址,写成点分十进制为
218.75.230.0
保持网络号和子网号不变,主机号从7个比特0增加到7个比特1,这就是子网0的广播地址,写成点分十进制为
218.75.230.127,子网0可分配给主机或路由器接口的最小地址为218.75.230.1,子网0可分配给主机或路由器接口的最大地址为218.75.230.126
现在来分配另一个,比子网0的广播地址大1的地址为
218.75.230.128,他的子网号部分为1个比特1,因为上面的子网号部分为0的已经全部分配完了,主机号部分为7个0, 所以子网已的网络地址为218.75.230.128,因为主机号部分全是0,保持子网号和网络号不变,主机号从7个0增加到7个1,主机号全为1的地址是子网1的广播地址,也就是218.75.230.255,比子网1的网络地址大1的地址为218.75.230.129,这是子网1可分配给主机和路由器接口的最小地址,比子网1的广播地址少1的地址为218.75.230.254,这是子网1可分配给主机和路由器接口的最大地址
-
综上所述,使用子网掩码
255.255.255.128可以将C类网218.75.230.0分成两个两个子网


默认的子网掩码是指在未划分子网的情况下,使用的子网掩码
对于A类地址,由8位网络号和24位主机号构成,根据子网掩码构成规则,使用8个连续的比特1对应IP地址中的8位网络号,用24个连续的比特0对应IP地址中的24位主机号,这样就构成了A类地址的默认子网掩码,其点分十进制为255.0.0.0
对于B类地址,由16位网络号和16位主机号构成,根据子网掩码构成规则,使用16个连续的比特1对应IP地址中的16位网络号,用16个连续的比特0对应IP地中的16位主机号,这样就构成了B类地址的默认子网掩码,其点分十进制为255.255.0.0
对于C类地址,其默认的子网掩码为255.255.255.0


无分类编址
划分子网在一定程度上缓解了因特网在发展中遇到的问题,但是数量巨大的C类网因为其地址空间太小并没有得到充分使用,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁
因此因特网工程任务组IEFE有提出了采用
无分类编址的方法来解决IP地址紧张的问题,同时还专门成立了IPv6工作组负责研究新版本IP以彻底解决IP地址耗尽问题
1993年,IEFE发布了无分类域间路由选择CIDR(Classless Inter-Domain Routing)的RFC文档
CIDR消除了传统的A类,B类和C类地址,以及划分子网的概念,可以更加有效地分配IPv4的地址空间,并在可以在新的IPv6使用之前允许因特网的规模继续增长
CIDR使用斜线记法,或称CIDR记法,即在IPv4地址后面加上斜线/,在斜线后面写上网络前缀所占用的比特数量
比如对于128.14.35.7/20表示该32位IPv4地址的前20个比特为网络前缀(也可以称为网络前缀占用的比特数量),剩余12个比特位主机号,CIDR实际上是将网络前缀都相同的连续的IP地址组成一个CIDR地址块

我们只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的全部细节,这些细节包括
- 地址块的最小地址
- 地址块的最大地址
- 地址块中的地址数量
- 地址块聚合某类网络(A类,B类或C类)的数量
- 地址掩码(也可继续称为子网掩码)
无分类在讨论时,计算地址块的最小地址和最大地址时是不考虑网络地址和广播地址的,但是网络地址和广播地址,还是和上面一样,主机号全为0的为网络地址,主机号全为1的为广播地址
在计算可分配的最小地址和可分配的最大地址时,是需要将广播地址和网络地址排除的
例子
例:请给出CIDR地址块128.14.35.7/20的全部细节(最小地址,最大地址,地址数量,聚合C类网数量,地址掩码)
-
/20表明该IPv4地址的前20个比特位网络前缀,也就是说,所给地址左起第一个字节,第二字节和第三个字节的前4个比特,构成了20比特的网络前缀,剩余12个比特位主机号,因此我们需要将第三个字节,第四个字节转换成二进制形式

将20比特的网络前缀保持不变,12比特的主机号全部取0,就可以得到该地址块的最小地址,点分十进制为
128.14.32.0,将20比特的网络前缀保持不变,12比特的主机号全变成1,就可以得到该地址块的最大地址,点分十进制为128.14.47.255该地址块中的地址数量为
2^(32-20),对于CIDR,不需要-2,也就是主机号全为0和主机号全为1聚合C类网的数量为:
2^(32-12)/2^8,地址掩码为,20比特全为1,12比特全为0,也就是255.255.240.0

路由聚合

路由器R1和五个网络相连,路由器R1和路由器R2称为相邻路由器,他们周期性地通告自己所知道的路由信息给对方,那么R1应该将怎样的路由信息通告给R2?
如果R1将自己直连的这5个网络的路由记录都通告给R2,则R2的路由表会增加5条路由记录

为了减少路由记录对路由表的占用,可以将这5条路由记录聚合成1条,其方法是找“共同前缀”,也就是找出这5个目的网络地址共同前缀,这5个目的网络地址的左起前两个地址都是相同的,从第三个字节开始不同,因此,只需要将第三个字节转换成二进制形式,这样就可以很容易找出这5个目的网络地址的共同前缀,共22个比特

我们可以将其记为/22,将共同前缀保持不变,而剩余的10比特全部取0,然后写成点分十进制形式,放在/22的前面,这就是聚合后的地址块,也就是172.1.4.0/22,也可以称为“超网

通过上述还可以看出地址块越小,路由就越具体
若路由器查表转发分组时发现有多条路由可选,则会选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体



IPv4地址的应用规划
这部分就是给定一个IPv4地址块,如何将其划分成为几个更小的地址块,并将这些地址块分配给互联网中的不同网络,进而可以给各网络中的主机和路由器接口分配IPv4地址,划分的方法有两种
-
定长的子网掩码FLSM(Fixed Length Subnet Mask)
使用同一个子网掩码来划分子网
每个子网所分配的IP地址数量相同,造成IP地址的浪费
-
变成的子网掩码VLSM(Variable Length Subnet Mask)
使用不同的子网掩码来划分子网
每个子网所分配的IP地址数量可以不同,尽可能减少对IP地址的浪费
例子
定长的子网掩码

-
统计网络中所需要的IP地址的数量(不要忽略路由器接口也需要IP地址)

我们还可以将路由器之间的网络看成一个网络,只是没有主机

最终可以得出,将C类网络
218.75.230.0划分为5个子网,每个子网上可分配的IP地址数量不得少于各自的需求 -
讨论

我们需要从主机号部分借用3个比特作为子网号,这里借用3个比特的原因是
将一个网络划分根据一个子网掩码可以划分成多少个子网,可以根据
2^(借用位数)=划分的子网数得出,所以这里解得借用的位数为3,所以可借用3个比特,可划分出的子网数为8个,可以满足我们对子网数量的要求,而每个子网上的地址数量为2^(8-3)=32(C类地址主机号8个比特,借用了3个,不考虑广播地址和网络地址),可以满足我们对子网上IP地址数量的要求,所以我们就可以得出划分的子网掩码为255.255.255.224
-
划分细节


现在我们就可以从子网1
8中随便选5分给图中的网络N1N5
通过上述可以看出,通过定长的子网划分,只能划分出
2^n个子网(n为从主机号部分借用来作为子网号的比特数量),每个子网所分配的IP地址相同,容易造成IP地址浪费,例如图中网络5只需要4个IP地址,但是我们只能给它分配32个IP地址,这样就造成了IP地址的严重浪费
变长的子网掩码

因为网络N1一共需要9个网络地址,也就是需要从主机号那里分到9个地址,所以需要主机号的位数为4,不能为3的原因是
2^3=8,不能满足N1需要9个地址的要求
主机号部分需要4个比特,所以网络前缀位数为32-4=28


我们就可以得到需要从218.75.230.0/24中取出5个地址块,其中1个/27,3个/28,1个/30,按需分配上图中的5个网络
而218.75.230.0/24地址块所包含的全部地址如下

我们需要在该地址块中,给上图所示的网络N1~N5分配子块,分配的原则为“每个子块的起点位置不能随意选取,只能选取块大小整数倍的地址作为起点”
例如将218.75.230.0~218.75.230.31这32个地址作为一个地址块分配给网络N2,地址块中最小的地址就是网络N2的网络地址,最大的地址就是N2的广播地址,网络地址和广播地址之间的这些地址,可分配给N2中的主机或路由器接口

将218.75.230.32~218.75.230.47这16个地址作为一个地址块分配给网络N1,地址块中最小的地址就是N1的网络地址,最大的地址就是N1的广播地址,网络地址和广播地址之间的这些地址,可以分配给主机或者路由器接口,对于其他的几个网络,也是相同的操作

IP数据报的发送和转发过程
IP数据报的发送和转发过程包含以下两部分
- 主机发送IP数据报
- 路由器转发IP数据报
在以下的讨论中,忽略了使用ARP协议来获取目的主机或路由器接口的MAC地址的过程以及以太网交换机自学习和转发帧的过程

上图是一个小型互联网,路由器的接口0直连了一个交换式以太网,接口1同样直连了一个交换式以太网,分别给上面两个子网分配了对应的Ip地址和子网掩码
同一个网络中的主机可以直接通信,这属于直接交付,不同网络中的主机之间的通信,需要路由器来中转

源主机如何知道目的主机是否与自己在同一个网络中?假设主机C要给主机F发送数据报
-
主机C将自己的IP地址和子网掩码相与,就可以知道主机C所在网络的网络地址

-
既然主机C要给主机F发送IP数据报,那主机C肯定知道主机F的IP地址,主机C将主机F的IP地址与自己的子网掩码相与,就可以得到目的目的网络地址,该地址与主机C的网络地址不相等,因此主机C就知道了主机F与自己不在同一网络

与运算就是将IP地址和子网掩码都转换为32比特,然后将他们两个进行与运算,如果相同位都是1,则就是1,否则都是0
-
主机C需要将IP数据报传输给路由器,由路由器将IP数据报转发给主机F

问题:主机C如何知道应该把IP数据报交给哪个路由器进行转发?
答:实际上,用户为了让本网络中的主机能和其他网络中的主机进行通信,就必须给其指定本网络中的一个路由器,由该路由器帮忙进行转发,所指定的路由器,也被称为默认网关
在本例中,我们可以将路由器接口0的IP地址指定给该接口 直连网络中的各个主机作为默认网关,同理对路由器接口1也是同样的操作

这样当本网络中的主机要和其他网络中的主机进行通信时,会将IP数据报传输给默认网关,由默认网关帮主机将IP数据报转发出去
-
假设本例中的主机A要给主机D发送IP数据报,这属于间接交付,主机A会将IP数据报传输给自己的默认网关,也就是路由器

-
当路由器收到IP数据报后 问:路由器收到IP数据报后,如何转发?
答:
- 路由器首先会检查IP数据报首部是否出错,若出错,则直接丢弃该IP数据报并通知主机A,若没有出错,则进行转发
- 路由器根据IP数据报中的目的地址在路由表中查找匹配的路由条目,若找到匹配的路由条目,则转发路由条目中指示的下一跳,若找不到,则丢弃该IP数据报并通告源主机
-
路由器取出IP数据报首部各地址字段的值,源地址字段的值为主机A的IP地址,目的地址字段为主机D的IP地址

-
路由器就要对该IP数据报进行查表转发了,当我们给路由器的接口配置IP地址和子网掩码时,路由器就知道了自己的该端口与哪个网络是直连的,例如在本例中,接口0所直连的网络是
192.168.0.0,相应的地址掩码为255.255.255.128,不需要下一跳路由器(因为接口0与该网络是直连的),接口1所直连的网络是192.168.0.128,相应的地址掩码为255.255.255.128,不需要下一跳路由器,因为接口1与该网络是直连的
路由表中可能还会有其他路由条目,这可以是用户或网络管理员手工配置的静态路由,也可以是路由器使用路由协议自动获取到的动态路由
-
接下来路由器根据IP数据报的目的地址,在路由表中查找匹配的路由条目,逐条检查,然后将目的地址与路由条目中的地址掩码相与得到目的网络地址,该目的网络地址与路由条目中的目的网络地址不相同,则这条路由条目不匹配

-
再检查下一条路由条目,将目的地址与下一条路由条目中的地址掩码相与,得到目的网络地址,该目的网络地址与路由条目中的目的网络地址相同,则这条路由条目就是匹配的路由条目,按照他的下一条指示,也就是从接口1转发该IP数据报

这样主机D就可以收到路由器转发来的该IP数据报了

-
假设主机A给本网络上的各设备发送了一个广播IP数据报,在数据报首部的目的地址字段可以填写的目的地址为
192.168.0.127(这是本网络的广播地址),也可以填写255.255.255.255,这是受限的广播地址
该网络中的各设备都会收到该广播IP数据报

但是路由器收到后,并不会转发该广播数据报,也就是说,路由器是隔离广播域的

-
同理如果主机A给另一个网络发送广播数据报,在数据报首部中的目的地址字段填写的目的地址为
192.168.0.255,这是网络192.168.0.128的广播地址,主机A将该广播IP数据报传输给路由器,希望由路由器帮其转发,但是路由器判断出这是一个广播IP数据报,不会转发


静态路由配置及其可能产生的路由环路问题
静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器人工配置路由表,这种人工配置方式简单,开销小,但不能即使适应网络状态(流量,拓扑等)的变化,所以一般只在小规模网络中采用
使用静态路由配置可能出现以下导致产生路由环路的错误
- 配置错误
- 聚合了不存在的网络
- 网络故障
路由器的下一跳是指
数据包可以通过的下一个最近/最佳的路由器(地址),如果没有哪个路由器和该路由器的某个接口相连,那么他的下一跳就是直连
静态路由配置

路由器R1通过自己的接口0所配置的IP地址和地址掩码,可以自动得出接口0所在的网络,由于接口0与该网络直连,则下一跳不是路由器地址,而是通过接口0转发IP数据报给该网络中的某个主机,同理R1可得出接口1的直连网络路由条目
假设R1要转发一个IP数据报给该网络中的某个主机

从图中可以看出,R1应该将IP数据报转发给路由器R2的接口0,但是R1的路由表中并没有关于该目的网络的路由条目

也即使R1并不知道目的网络的存在,因此我们可以使用路由器的相关命令配置,给R1添加一条到达该网络的路由条目

R1的路由表中新添加的这条路由记录,目的网络地址不能写成可分配的IP地址,必须要写成网络地址,但是下一跳(如果存在相邻路由器)就是需要写路由器对应接口的IP地址(已经分配的)
假设R2要转发一个IP数据报给该网络中的某个主机

从上图可以看出,路由器R2应该将IP数据报转发给路由器R1的接口1,但是R2的路由表中并没有该目的网络的路由条目,所以我们可以通过路由器的命令添加一条到达目的网络的路由条目

默认路由

例如上图中,假设路由器R2的接口2连接到了因特网
假设R1要转发一个数据报给因特网中某个网络中的某个主机,从下图可以看出,R1应该将该IP数据报转发给R2的接口0

由于因特网中包含了众多网络,如果我们给R1添加针对这些网络的每一条路由条目,那么需要很大的工作量,并且会使得R1的路由表变的非常大,降低了查表转发的速度
对于具有相同下一跳的不同目的网络的路由条目,我们可以使用一条默认路由条目来替代,默认路由条目中的目的网络地址为0.0.0.0,地址掩码也是0.0.0.0,其CIDR形式为0.0.0.0/0,在上图中,默认路由条目的下一跳是路由器R2的接口0的地址(默认路由也是由人工配置的)

在配置了默认路由条目后,我们甚至可以删除R1中的192.168.2.0/24这条路由条目,因为已经配置了默认路由条目,他们的下一跳都是指向10.0.0.2这个地址

我们可以给路由器添加针对某个主机的特定主机路由条目,一般用于网络管理人员对网络的管理和测试,另外在需要考虑某种安全问题时,也可以采用特定主机路由, 假设该网络中,存在某太特定主机,如下图

我们可以再R1的路由表中,添加一条到达该主机的特定主机路由条目, 特定主机路由条目中的目的网络为该主机的IP地址,地址掩码为255.255.255.255,其CIDR形式为特定主机IP地址/32,在本例中,特定主机路由条目的下一跳是R2的接口0的地址

这里写成
/32,那么前32个比特都是网络号和子网号,而主机号的个数为32-32=0,所以也就只能有这一个IP地址
通过上面R1的路由条目可以看出,特定主机路由的目的网络的网络前缀最长,路由最具体,默认路由的目的网络网络前缀最短,路由最模糊(对于没有配置的待转发的目的网络,会匹配到该条路由条目进行转发)

当路由器查表转发IP数据报时,若有多条路由条目可选,则采用“最长前缀匹配”的原则,选用目的网络前缀最长的那个路由条目进行转发

静态路由配置错误引发的问题

上图是路由器自动得出的直连网络,例如上图中R2的192.168.1.0/24这条路由条目,表示R2要转发IP数据报到该网络,下一跳应转发给R1的接口1,如下图

如果我们将下一跳错误的配置成了10.0.1.2,也即使指向了R3的接口0

则当R2要转发IP数据报到该网络时,下一跳会错误的转发给路由器R3的接口0,如下图

R3收到该IP数据报后,进行查表转发,找到了匹配的路由条目,下一跳应该转发给10.0.1.1(R2的接口1)

R2收到该IP数据报后,进行查表转发,找到了匹配的路由条目,也就是转发给R3的接口0


由于静态路由的配置错误,导致R2和R3之间产生了路由环路,为了防止IP数据报在路由环路中永久兜圈,在IP数据报首部设有生存时间的TTL字段
IP数据报进入路由器后,TTL的值被路由器减1,若TTL字段的值减1后不等于0,则被路由器转发,否则被丢弃
聚合了不存在的网络而导致路由环路

上图R2的192.168.0.0/22是下图两个网络聚合的

假设R2要转发IP数据报到192.168.2.0/24网络

在R2的路由表中进行查表转发,找到了匹配的路由条目,下一跳应该转发给192.168.0.0/22(R1的接口1)

R1收到该IP数据报后,查表转发,找到了192.168.2.0/24这个地址,进行直接交付
192.168.0.0/24实际上包含了四个网络地址

但是只有192.168.2.0/24和192.168.1.0/24存在与和R1直连的两个网络中,但是192.168.0.0/24和192.168.3.0/24不存在,当R2要转发IP数据报到这个不存在的网络时,首先进查表转发,转发给R1的接口1

但对于这个不存在的网络,路由器R2应该不予转发,却错把他转发给了路由器R1,R1收到该IP数据报后,进行查表转发,没有找到具体的,只能走默认路由,R1将此IP数据报转发给R2的接口0,然后R2又转发给R1,一直这样循环,这样就导致了R1和R2之间产生了路由环路

针对这种情况,我们可以在R2的路由表中,添加针对所聚合的,不存在的网络的黑洞路由

黑洞路由的下一跳为
null0,这是路由器内部的虚拟接口,可以把它形象的看成是一个黑洞,IP数据报进入它后就有去无回,也就是路由器丢弃了该IP数据报,而不是转发该IP数据报
现在如果R2要转发该不存在的IP数据报,找到了两条可选的路由条目

根据最长前缀匹配规则,将会选择192.168.3.0/24这条到达该不存在网络的黑洞路由,因此该IP数据报进入了这个黑洞

网络故障而导致的路由环路
假设路由器R1检测到其他接口0所直连的网络出现了故障不可达,就会自动在其路由表中删除该直连网络的路由条目

就会自动在其路由表中删除该直连网络的路由条目

之后R2要转发IP数据报到该网络,进行查表转发

进行查表转发后,转发给R1的接口1

R1收到该IP数据报后,进行查表转发,找不到该IP数据报的目的网络的相关路由条目,只能走默认路由,下一跳将该IP数据报转发给R2的接口0,这样该IP数据报错误的转发给了R2

这样,R1和R2之间又产生了路由环路,针对这种情况,我们可以在R1的路由表中,添加针对192.168.1.0/24的黑洞路由

这样,当R2要转发IP数据报到该网络时,进行查表转发,转发给R1的接口1,R1进行查表转发,找到匹配的路由条目,也就是黑洞路由

假设之后一段时间后,之前的故障消失了,R1又自动地得出了其接口0的直连网络的路由条目,并将我们之前人工配置的针对该直连网络的黑洞路由条目设置为失效状态

假设又出现了故障,则路由器会自动删除自动获取的路由条目,并将之前设置为失效状态的黑洞路由设置为生效状态

路由选择协议
路由选择协议可以分为静态路由选择和动态路由选择
-
静态路由选择
由人工配置的网络路由,默认路由,特定主机路由,黑洞路由等都属于静态路由,这种配置方式简单,开销小,但是不能及时适应网络状态(流量,拓扑等)的变化,一般只在小规模网络中采用
-
动态路由选择
路由器通过路由选择协议自动获取路由信息,比较复杂,开销比较大,能较好的适应网络状态的变化,适用于大规模网络
因特网所采用的路由选择协议的主要特点:自适应,分布式,分层次

- 自适应:动态路由选择,能较好的适应网络状态的变化
- 分布式:路由之间交换路由信息
- 分层次:将整个因特网划分为许多较小的自治系统AS(Autonomous System)
一个较大的ISP,就可以划为一个自治系统,在自治系统内部和自治系统外部,采用不同类别的路由选择协议,分别进行路由选择

加入存在上图网络,我们可以将这些网络和路由器划归到不同的自治系统

自治系统之间的路由选择简称为域间路由选择,自治系统内部的路由选择简称为域内路由选择

域间路由选择使用外部网关协议EGP这个类别的路由选择协议,域内路由选择使用内部网关IGP这个类别的路由选择协议

外部网关协议EGP和内部网关协议IGP,只是路由选择协议的分类名称,而不是具体的路由选择协议
上图名称中使用“
网关”这个词,是因为在因特网早期的RFC文档中,没有使用“路由器”而使用“网关”这个名词,现在新的RFC又改用“路由器”这个名词因此外部网关协议EGP又可以称为外部路由协议ERP,内部网关协议IGP可改称为内部路由协议IRP
在一个自治系统内部使用的具体的内部网关协议,与因特网中其他自治系统中选用何种内部网关协议无关
在上图网络中,使用的内部网关协议为路由信息协议RIP,而在另一个自治系统内部使用的内部网关协议为开放式最短路径优先OSPF协议,自治系统之间使用的外部网关协议为边界网关协议BGP

常见的路由选择协议
- 内部网关协议IGP
- 外部网关协议EGP

路由选择协议是在路由器上运行的
路由器基本结构

路由选择部分的核心构件是路由选择处理机,它的任务是根据所使用的路由选择协议,周期性的与其他路由交换机进行路由信息的交互来更新路由表
分组转发部分由三部分构成,分别是交换结构,一组输入端口和一组输出端口
信道从某个输入端口进入路由器,物理层将信号转换成比特流,送交数据链路层处理,数据链路层从比特流中识别出帧,去掉帧头和帧尾后,送交网路层处理,如果送交网络层的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发

若找不到匹配的转发条目,则丢弃该分组,否则按照匹配条目中所指示的端口进行转发

网络层更新数据分组首部中某些字段的值,比如将数据分组的生存时间减1,然后送交数据链路层进行封装,数据链路层将数据分组封装成帧,送交物理层处理,物理层将帧看做是比特流,将其变换成相应的电信号进行发送

如果送交网络层的分组是路由器之间交换路由信息的路由报文,则把这种分组送交路由选择处理机,


路由选择处理机根据分组的内容来更新自己的路由表,路由表一般情况仅包含从目的网络的下一跳的映射,路由表需要对网络拓扑变化的计算最优化,而转发表是从路由表得出的

转发表的结构应当使查找过程最优化
路由选择处理机除了处理收到的路由报文外,还会周期性的给其他路由器发送自己所知道的路由信息。
路由器的各端口还应具有输入缓冲区和输出缓冲区,输入缓冲区用来暂存新进入路由器但还来不及处理的分组,输出缓冲区用来暂存已经处理完毕但还来不及发送的分组
路由器的端口一般都具有输入和输出的功能

路由信息协议RIP的工作原理
路由信息协议RIP(Routing Infomation Protocol)是内部网关协议IGP中最先得到广泛使用的协议之一,其相关标准文档为RFC 1058
RIP要求自治系统AS内的每一个路由器都要维护从它自己到AS内其他每一个网络的距离记录,这是一组距离,称为“
距离向量D-V”。RIP使用
跳数(Hop Count)作为度量来衡量到达目的网络的距离
RIP定义的内容有
- 路由器到直连网络的距离为1
- 路由器到非直连网络的距离定义为所经过的路由器加1
- 允许一条路径最多只能包含15个路由器,“距离”等于16时相当于不可达,因此,RIP只适用于小型互联网

RIP认为好的路由就是“距离短”的路由,也就是所通过路由器数量最少的路由

上图中尽管r1->r4->r5这条路由的带宽都非常小

例如上图中两条路由是等价的
当到达统一目的网络有多条“距离相等”的路由时,可以进行
等价负载均衡,也就是将通信量均衡地分布到多条等价的路由上
RIP包含的三个要点
-
和谁交换信息:仅和相邻路由器交换信息

-
交换什么信息:自己的路由表
-
何时交换信息:周期性交换(例如每隔30秒)
工作过程

上图中,路由器刚开机时,他们各自的路由表如图所示,他们只知道自己到直连网络的距离为1,之后每个路由器仅和相邻路由器周期性地交换并更新路由信息

这样若干次交换和更新后,每个路由器都知道到达本AS内各网络的最短距离和下一跳地址,称为收敛

路由条目的更新规则
上图中C的路由表到达个目的网络的下一跳都记为问号,可以理解为路由器D并不需要关心路由器C的这些内容
IP数据报的首部格式
由20字节的固定部分和最大4字节的可变部分组成,