网络层的主要任务是实现网络互联,进而实现数据包在各网络之间的传输。
如图所示,这些异构型网络如果只是需要各自内部通信,那他们只要实现各自的物理层和数据链路层即可。但是如果想要讲这些异构型网络互联起来形成一个更大的互联网,就需要使用网络层互联设备路由器。
对于互联网而言,仅实现计算机网络体系结构中的物理层和数据链路层是不能实现数据包在互联网中各网络之间传输的,要实现该功能就必须实现网络层。
要实现网络层任务,需要解决以下主要问题:
(1)网络层像运输层提供怎样的服务(可靠传输还是不可靠传输);
数据包在传送过程中出现的误码、丢失、乱序等情况,网络层对于这些错误不采取任何措施就是不可靠传输服务;若网络层对于这些错误采取措施并使得接收方能够正确接收发送方所发送的数据包就是可靠传输服务。
不同网络体系结构所提供的服务可能是不同的。如因特网使用的TCP/IP协议体系的网际层提供的是无连接的、不可靠的数据报服务。而ATM、帧中继和X.25的网络层提供的都是面向连接的、可靠的虚电路服务。
(2)网络层寻址问题;
如TCP/IP协议体系的网际层使用IP地址:
如图所示,网络N1上两个路由器接口各自所分配的IP地址的前三个数是相同的,可以看作是他们所在的网络的网络编号。而第四个数各不相同,用于区分这两个不同的路由器接口。
网络N3上两个路由器接口各自所分配的IP地址的前两个数是相同的,可以看作是网络N3的编号,而后两个数不完全相同,用于区分这两个不同的路由器接口。
网络N7上两个路由器接口各自所分配的IP地址的第一个数是相同的,可以看作是网络N7的编号,而后三个数不完全相同,用于区分这两个不同的路由器接口。
(3)路由选择问题
数据包从源站到达目的站有多条路径可走,那么路由器收到数据包后是依据什么来决定将数据包从自己的哪个接口转发出去的?这个依据就是数据包中的目的地址和路由器中的路由表。
如图所示,路由器R1的路由表中记录着R1所知道的网络,以及数据包要到达这些网络应该从自己的哪个接口转发。假设R1知道数据包要到达网络N7,下一跳应将其转发给路由器R4,那么其路由表中应该有对应的记录;假设数据包要到达网络N6,下一跳应将其转发给路由器R2,那么其路由表中也应该有对应的记录;
路由器得出这样的路由记录的方法有两种:
(1)由用户或网络管理员进行人工配置。这种方法只适用于规模较小且网络拓扑不改变的小型互联网;
(2)实现各种路由选择协议,由路由器执行路由选择协议中所规定的路由选择算法而自动得出路由表中的路由记录。这种方法更适用于规模较大且网络拓扑经常改变的大型互联网。
因特网(Internet)是目前全世界用户数量最多的互联网,它使用四层协议体系的TCP/IP协议栈。
由于TCP/IP协议栈的网络层使用国际协议IP,它是整个协议栈的核心协议,因此在TCP/IP协议栈中网络层常称为网际层。
TCP/IP协议栈的网际层中除网际协议IP外,还包含地址解析协议ARP、网际控制报文协议ICMP和网际组管理协议IGMP等。
面向连接的虚电路服务
虚电路的核心思想是:可靠通信由网络来保证。
两台计算机进行通信时,必须首先建立网络层的连接——虚电路VC(Virtual Circuit)以保证通信双方所需的一切网络资源;
然后通信双方沿着已建立的虚电路发送分组。需要说明的是,虚电路表示这是一条逻辑上的连接,分组都沿着这条逻辑连接按照存储转发方式传送,而不是真正建立了一条物理连接。而采用电路交换的电话通信则是先建立一条真正的连接。因此分组交换的虚连接与电路交换的连接只是类似,但并不完全一样;
分组的首部仅在连接建立阶段使用完整的目的主机地址,之后每个分组的首部只需携带一条虚电路的编号(构成虚电路的每一段链路都有一个虚电路编号);
这种通信方式如果再使用可靠传输的网络协议,就可使所发送的分组最终正确到达接收方(无差错按序到达、不丢失、不重复);
通信结束后,需要释放之前所建立的虚电路;
很多广域分组交换网都使用面向连接的虚电路服务。例如曾经的X.25和逐渐过时的帧中继FR、异步传输模式ATM等。
无连接的数据报服务
数据报服务的核心思想是:可靠通信应当由用户主机来保证。
当两台计算机通信时,他们的网络层不需要先建立网络层连接,每个分组可走不同的路径;
因此每个分组的首部必须携带目的主机的完整地址;
这种通信方式所传送的分组可能误码、丢失、重复和失序;
由于网络本身不提供端到端的可靠传输服务,这就是网络中的路由器可以做的比较简单,而且价格低廉(与电信网的交换机相比较);
因特网就采用了这种设计思想,也就是将复杂的网络处理功能置于因特网的边缘(用户主机和其内部的运输层),而将相对简单的尽最大努力的分组交付功能置于因特网核心。
采用这种设计思想的好处是网络的造价大大降低,运行方式灵活,能够适应多种应用。
对比一下两个设计思想:
由于TCP/IP体系结构的因特网的网际层提供的是简单灵活、无连接的、尽最大努力交付的数据报服务,因此本章主要围绕网际层如何传送IP数据报这个主题进行讨论。
IPv4地址就是给因特网上的每一台主机或路由器的每一个接口分配一个在全世界范围内唯一的32比特的标识符。
IP地址由因特网名字和数字分配机构ICANN(Internet Corporation for Assigned Names and Numbers)进行分配。
我国用户可向亚太网络信息中心APNIC(Asia Pacific Network Information Center)申请IP地址,需要缴费;
2011年2月3日,互联网号码分配管理局IANA(由ICANN行使职能)宣布,IPv4地址已经分配完毕;
我国在2014年至2015年也逐步停止了向新用户和应用分配IPv4地址。同时全面展开商用部署IPv6.
IPv4地址的编址方法经历了分类编址(1981)、划分子网(1985)、无分类编址(1993)三个历史阶段。
由于32比特的IPv4地址不方便阅读、记录以及输入等,因此IPv4地址采用点分十进制表示方法以方便用户使用。
分类编址的IPv4地址分为A、B、C、D、E五类地址。其中只有A类、B类和C类地址可分配给网络中的主机或路由器的各接口;主机号为全0的地址是网络地址,不能分配给主机或路由器的各接口;主机号为全1的地址是广播地址,不能分配给主机或路由器的各接口。
A类地址的8位网络号最高位固定为0:
低7位全部取0时,就是A类网络的最小网络号,其十进制为0,该网络号被保留,不能指派。
因此,A类地址第一个可指派的网络号为00000001,其十进制值为1。将24位的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为1.0.0.0;
当低7位全部取1时,就是A类网络的最大网络号,其十进制为127,该网络号被用于本地软件环回测试,不能指派。将127开头的IPv4地址的主机号部分的最低位取1,其他位取0就可以得到最小的本地软件环回测试地址,其点分十进制为127.0.0.1;将127开头的IPv4地址的主机号部分的最低位取0,其他位取1就可以得到最大的本地软件环回测试地址,其点分十进制为127.255.255.254。
因此,A类网络最后一个可指派的网络号为01111110,其十进制值为126。将24位的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为126.0.0.0;
可以看出,A类地址可指派的网络数量为 2 8 − 1 − 2 = 126 2^{8-1} - 2 = 126 28−1−2=126个;每个网络中可分配的IP地址数量为 2 24 − 2 = 16777214 2^{24} - 2 = 16777214 224−2=16777214个(有两个不能分配的地址:主机号全0的网络地址和主机号全1的广播地址)
B类地址的16位网络号最高两位固定为10:
低14位全部取0时,就是B类网络的最小网络号,其点分十进制为128.0,该网络号是B类网第一个可指派的网络号。将16位的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为128.0.0.0;
当低14位全部取1时,就是B类网络的最大网络号,其点分十进制为191.255,该网络号是B类网络最后一个可指派的网络号。将16位的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为191.255.0.0;
可以看出,A类地址可指派的网络数量为 2 16 − 2 = 16384 2^{16-2} = 16384 216−2=16384个;每个网络中可分配的IP地址数量为 2 16 − 2 = 65534 2^{16} - 2 = 65534 216−2=65534个(有两个不能分配的地址:主机号全0的网络地址和主机号全1的广播地址)。
注意:根据2002年9月发表的RFC 3330文档,128.0网络号已经可以分配。在此之前该网络号不可以分配,B类第一个可指派的网络号为128.1。
C类地址的24位网络号最高三位固定为110:
低21位全部取0时,就是C类网络的最小网络号,其点分十进制为192.0.0,该网络号是C类网第一个可指派的网络号。将8位的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为192.0.0.0;
当低24位全部取1时,就是C类网络的最大网络号,其点分十进制为223.255.255,该网络号是C类网络最后一个可指派的网络号。将8位的主机号全部取0,就可以得到该网络的网络地址,其点分十进制为223.255.255.0;
可以看出,C类地址可指派的网络数量为 2 24 − 3 = 2097152 2^{24-3} = 2097152 224−3=2097152个;每个网络中可分配的IP地址数量为 2 8 − 2 = 254 2^8 - 2 = 254 28−2=254个(有两个不能分配的地址:主机号全0的网络地址和主机号全1的广播地址)。
注意:根据2002年9月发表的RFC 3330文档,192.0.0网络号已经可以分配。在此之前该网络号不可以分配,C类第一个可指派的网络号为192.0.1。
如图所示,某单位有一个大型的局域网需要连接到因特网。如果分配一个C类地址,其可分配的IP地址数量只有254个,不够使用。因此该单位申请了一个B类网络地址,其可分配的IP地址数量达到了65534个,给每台计算机和路由器的接口分配一个IP地址后还有大量的IP地址剩余。这些剩余的IP地址只能由该单位的同一个网络使用而其他单位的网络不能使用。
随着该单位计算机网络的发展和建设,该单位又新增了一些计算机,并且需要将原来的网络划分成三个独立的网络,我们称其为子网1、子网2和子网3。
假设子网1仍然使用之前申请到的B类网络地址,那就需要为子网2和子网3各自申请一个网络地址,但这样会存在一些弊端:
(1)申请一个新的网络地址需要等待很长的时间,花费更多的费用;
(2)使其他路由器的路由表新增针对这两个新的网络的路由记录;
(3)浪费原网络中剩余的大量IP地址。
如果可以从IP地址的主机号部分借用一些位作为子网号来区分不同的子网,就可以利用原有网络中剩余的大量IP地址,而不用申请新的网络地址。
如本例中可以借用16位主机号的8位作为子网号。假设我们给子网1分配的子网号为0,给子网2分配的子网号为1,给子网3分配的子网号为2。然后就可以给个子网中的主机和路由器接口分配IP地址了。
若图中未标记子网号部分,那我们和计算机就不知道分类地址中主机号有多少比特被用作子网号。为了解决这个问题,可以使用一个划分子网的工具:子网掩码。
子网掩码
32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号:
子网掩码使用连续的比特1来对应网络号和子网号;
子网掩码使用连续的比特0来对应主机号;
将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址。
举例说明:已知某个网络的地址为218.75.230.0,使用子网掩码255.255.255.128对其进行子网划分,请给出划分细节。
由于使用一个比特作为子网号,因此可划分出的子网数量为 2 1 = 2 2^1 = 2 21=2个;
每个子网可分配的地址数量为 2 8 − 1 − 2 = 126 2^{8-1} - 2 = 126 28−1−2=126个(有两个不能分配的地址:主机号全0的网络地址和主机号全1的广播地址)。
使用子网掩码255.255.255.128可将C类网218.75.230.0均分为两个子网:
默认子网掩码:默认子网掩码是指在未划分子网的情况下使用的子网掩码。
划分子网在一定程度上缓解了因特网在发展中遇到的困难,但是数量巨大的C类网因为其地址空间太小并没有得到充分使用,而因特网的IP地址仍在加速消耗,整个IPv4地址空间面临全部耗尽的威胁。为此,因特网工程组IETF又提出了采用无分类编址的方法来解决IP地址紧张的问题,同时还专门成立了IPv6工作组负责研究新版本IP以彻底解决IP地址耗尽问题。
1993年,IETF发布了无分类域间路由选择CIDR(Classless Inter-Domain Routing)的RFC文档:RFC 1517~1519和1520.
CIDR消除了传统的A类、B类和C类地址以及划分子网的概念;
CIDR可以更加有效的分配IPv4的地址空间,并且可以在新的IPv6使用之前允许因特网的规模继续增长。
CIDR使用“斜线记法”,或称CIDR记法。即在IPv4地址后面加上斜线“/”,在斜线后面写上网络前缀所占的比特数量。
CIDR实际上是将网络前缀都相同的连续的IP地址组成一个“地址块”。
我们只要知道CIDR地址块中的任何一个地址,就可以知道该地址块的全部细节:
地址块的最小地址;
地址块的最大地址;
地址块中的地址数量;
地址块聚合某类网络(A类、B类或C类)的数量;
地址掩码(也可继续称为子网掩码)。
举例说明:请给出CIDR地址块128.14.35.7/20的全部细节(最小地址、最大地址、地址数量、聚合C类网数量、地址掩码)。
路由聚合(构造超网)
如图所示,路由器R1和路由器R2户为相邻路由器,他们周期性的通告自己所知道的路由信息给对方。若R1将5条路由记录都通告给R2,则R2的路由表会增加5条路由记录。为了减少路由记录对路由表的占用,应该想办法将这5条记录聚合成一条,这个方式是“找目的网络地址的共同前缀”。
本例中共同前缀共22个比特,将其记为“/22”。将共同前缀保持不变,剩余的10个比特全部取0,然后写成点分十进制形式放在“/22”前,这就是聚合后的地址块,也可以称为超网。
网络前缀越长,地址块越小,路由越具体;
若路由器查表转发分组时发现有多条路由可选,则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体。
IPv4地址的应用规划就是给定一个IPv4地址块,如何将其划分成几个更小的地址块,并将这些地址块分配给互联网中的不同网络,进而可以给各网络中的主机和路由器接口分配IPv4地址。
一般有两种方法:定长的子网掩码FLSM(Fixed Length Subnet Mask)和变长的子网掩码VLSM(Variable Length Subnet Mask)。
定长的子网掩码FLSM
使用同一个子网掩码来划分子网,每个子网所分配的IP地址数量相同,会造成IP地址的浪费。
假设申请到的C类网络218.75.230.0,使用定长的子网掩码给下图所示的小型互联网中的各设备分配IP地址。
可以看出本题的应用需求:将C类网络218.75.230.0划分成5个子网,每个子网上可分配的IP地址数量不得少于各自的需求。
划分好以后,从该8个子网中任选5个分配给N1~N5即可。
通过本例可以看出:
采用定长的子网掩码进行子网划分,只能划分出2n个子网,其中n是从主机号部分借用来作为子网号的比特数量。
每个子网可分配的IP地址数量相同,容易造成IP地址的浪费。如图中的N5只需要4个IP地址,但是却只能给它分配32个IP地址,这样就造成了IP地址的严重浪费。
变长的子网掩码FLSM
使用不同的子网掩码来划分子网,每个子网所分配的IP地址数量可以不同,会尽可能减少对IP地址的浪费。
假设申请到的地址块为218.75.230.0/24,使用变长的子网掩码给下图所示的小型互联网中的各设备分配IP地址。
可以看出本题的应用需求:从地址块218.75.230.0/24中取出5个地址块(1个“/27”地址块,3个“/28”地址块,1个“/30”地址块),按需分配给这5个网络。
分配结果如下:
通过本例可以看出:
采用变长的子网掩码进行子网划分,可以按需划分出相应数量的子网,每个子网所分配到的IP地址数量可以不同,尽可能减少了对IP地址的浪费。
练习:假设地址块为192.168.252.0/24,请分别使用定长的子网掩码和变长的子网掩码给下图所示的小型互联网中的各设备分配IP地址。
定长的子网掩码:
N1需要的IP地址数量:60(主机)+1(路由器)+2(自己的网络地址和广播地址)=63;
N2需要的IP地址数量:20(主机)+1(路由器)+2(自己的网络地址和广播地址)=23;
N3需要的IP地址数量:10(主机)+1(路由器)+2(自己的网络地址和广播地址)=13;
N4需要的IP地址数量:0(主机)+2(路由器)+2(自己的网络地址和广播地址)=4;
共4个网络需要分配,因此向主机号借2个比特位,这样22=4正好可以分成4个网络;
主机号剩余6个比特位,共可以分配给26=64个主机或路由器,满足最大的需求N1所需要的63个。
因此将该网络的主机号的前两位写为1,表示子网号:192.168.252.11000000,其子网掩码为255.255.255.192/26
分配方式并不唯一,不进一步讨论了。
变长的子网掩码:
N1所需要的主机号位数:6(26=64>63),网络前缀位数:24+8-6=26
N2所需要的主机号位数:5(25=32>23),网络前缀位数:24+8-5=27
N3所需要的主机号位数:4(24=16>13),网络前缀位数:24+8-4=28
N4所需要的主机号位数:2(22=4=4),网络前缀位数:24+8-2=30
然后按照大小一次给网络分配子块即可,分配方式并不唯一。
IP数据报的发送和转发过程包含以下两部分:
(1)主机发送IP数据报
(2)路由器转发IP数据报
为了将重点放在TCP/IP协议栈的网际层发送和转发IP数据报的过程上,在之后的举例中,我们忽略使用ARP协议来获取目的主机或路由器接口的MAC地址的过程以及以太网交换机自学习和转发帧的过程。
举例说明IP数据报的发送和转发过程:
如图所示,路由器的接口0和接口1分别直连了一个交换式以太网。这两个网络的的地址和子网掩码以及每个网络中主机和接口的信息如下:
同一个网络中的主机之间可以直接通信,这属于直接交付;不同网络中的主机需要通过路由器的转发才能通信,这属于间接交付。
那么源主机如何知道目的主机是否和自己在同一个网络中呢?
假设主机C要给主机F发送IP数据报,主机C将自己的IP地址和子网掩码相与,这样就得到了主机C所在网络的网络地址。既然主机C要给主机F发送IP数据报,那主机C一定知道主机F的IP地址。主机C将主机F的IP地址与自己的子网掩码相与就可以得到目的网络地址,该地址与主机C的网络地址不相等,因此主机C就知道了主机F与自己不在同一个网络,他们之间的通信属于间接交付。于是主机C需要将IP数据报发送给路由器,由路由器转发给主机F。
那么主机C如何知道应该把IP数据报交给哪个路由器进行转发呢?
实际上,用户为了让本网络中的主机能和其他网络中的主机进行通信,就必须给其指定本网络中的一个路由器,由该路由器帮忙进行转发。所指定的路由器也被称为默认网关。本例中可以将路由器接口0的IP地址指定给该接口所直连网络中的各个主机作为默认网关;将路由器接口1的IP地址指定给该接口所直连网络中的各个主机作为默认网关。这样,当本网络中的主机要和其他网络中的主机进行通信时,会将IP数据报传输给默认网关,由默认网关帮主机将IP数据包转发出去。
假设主机A要给主机D发送IP数据报,这属于间接交付。主机A先将IP数据报发送给他的默认网关,也就是路由器接口0,然后由路由器进行转发。
那么路由器收到IP数据报之后,又是如何转发的呢?
(1)路由器首先检查IP数据报首部是否出错:
若出错,则直接丢弃该IP数据报并通告源主机;
若没有出粗,则进行转发。
(2)根据IP数据报的目的地址在路由表中查找匹配的条目:
若找到匹配的条目,则转发给条目中指示的下一跳;
若找不到,则丢弃该IP数据报并通告源主机。
简单起见,假设本例中的IP数据报首部没有出现差错。路由器取出IP数据报首部各地址字段的值。源地址字段的值为主机A的IP地址,目的地址字段的值为主机D的地址。然后路由器对该IP数据包进行查表转发,路由器根据IP数据报的目的地址在自己的路由表中逐条查找匹配的路由条目,将目的地址与路由条目中的地址掩码相与得到目的网络地址,若目的网络地址与路由条目中的目的网络地址不相同,说明这条路由条目不匹配,再检查下一条路由条目。
当我们给路由器的接口配置IP地址和子网掩码时,路由器就知道了自己的该接口与哪个网络是直连的。
找到匹配的条目后,按照它的下一跳指示,也就是从接口1转发该IP数据报。这样,主机D就接收到了路由器转发来的该IP数据报。
如图所示,主机A发送了一个广播IP数据报,该网络中的各设备都会收到该广播IP数据报。但是路由器收到后并不会转发该数据报。也就是说,路由器是隔离广播域的,这是很有必要的。
主机A给另一个网络发送广播数据报也不会被路由器转发
静态路由配置是指用户或网络管理员使用路由器的相关命令给路由器给路由器人工配置路由表。
这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化;
一般只在小规模网络中采用。
使用静态路由配置可能出现以下导致产生路由环路的错误:
配置错误;
聚合了不存在的网络;
网络故障。
采用如图所示的网络拓扑和相应的IP地址配置举例说明静态路由配置:
假设R1要转发一个IP数据报给192.168.2.0/24网络,因此R1应该将IP数据报转发给R2的接口0,但是R1的路由表中没有关于该目的网络的路由条目。也就是说,R1并不知道目的网络的存在。因此,我们可以使用路由器的相关配置命令给R1添加一条到达该目的网络的路由条目。同理,也可以配置R2的路由表。这就是静态路由配置。
R1要转发一个数据报给因特网中的某个主机。由于因特网中包含了众多网络,如果给R1添加针对这些网络的每一条路由条目,则会给人工配置带来巨大的工作量并且使R1的路由表变得非常大,降低了查表转发的速度。实际上,对于具有相同下一跳的目的网络的路由条目,可以用一条默认路由条目来替代。默认路由条目中的目的地址为0.0.0.0,地址掩码也为0.0.0.0,其CIDR形式为0.0.0.0/0。
本例中默认路由条目的下一跳是R2接口0的地址,由于默认路由也是人工配置的,因此类型也是静态。在配置了默认路由条目后,甚至可以删除图中所示的条目:
有时候,我们可以给路由器添加针对某个主机的特定主机路由条目。一般用于网络管理人员对网络的管理和测试。另外,在需要考虑某种安全问题时也可以采用特定主机路由。
如图所示有一台192.168.2.0/20网络中的特定主机,我们可以在R1的路由表中添加一跳到达该主机的特定主机路由条目。特定主机路由条目为该目的主机的IP地址,地址掩码为255.255.255.255,其CIDR形式为特定主机IP地址/32.对于本例,特定主机的下一跳为R2接口0的地址,类型为静态。可以看出:
特定主机路由的目的网络前缀最长,路由最具体;
默认路由的目的网络前缀最短,路由最模糊。
当路由器查表转发IP数据报时,若有多条路由条目可选,则采用“最长前缀匹配”原则,选用目的网络前缀最长的条目进行转发。
如图所示,各路由器的路由表如下:
假设我们错误配置了R2路由表中的第三条记录,就会使数据报反复在R2和R3之间传递,从而产生路由环路:
为了防止IP数据报在路由环路中永久兜圈,在IP数据报首部设有生存时间TTL字段。IP数据报进入路由器后,TTL字段的值减1。若TTL的值不等于0,则被路由器转发,否则被丢弃。
假设路由器R2要转发数据报给192.168.2.0/24网络,查表后转发给R1的接口1。R1收到该数据报后查表,找到了匹配的路由条目,按照其下一跳地址从接口2直接交付。这是一次正确的转发。
但是聚合地址192.168.0.0/22实际上包含了4个网络,其中两个存在两个不存在。若R2要给不存在的网络转发数据报,则会将其转发给R1的接口1,而R1找不到该目的网络的路由条目,只能走默认路由,便又返回给了R2,于是在R1和R2之间便产生了路由环路。
对于这种情况,可以在R2的路由表中添加针对所聚合的、不存在网络的黑洞路由。黑洞路由的下一跳为NULL0,这是路由器内部的虚拟接口,会丢弃进入该接口的IP数据报。
有了黑洞路由之后,R2要给不存在的网络转发时,首先要查表。查表示发现了两个路由条目,便根据“最长网络前缀”原则选择黑洞路由,于是改IP数据报会进入这个黑洞被丢弃。
路由器R1检测到其接口0所直连的网络出现了故障而不可达,便会自动删除其对应的路由条目。现在R2要转发数据报到该网络,查表后转发给R1的接口1。R1收到数据报后查表,没有发现匹配的条目,只能走默认路由,又将该数据报发给了R2的接口0,于是R1和R2之间便产生了路由环路。
对于这种情况,也可以使用为故障网络添加黑洞路由的方式解决。
假设一段时间后之前的故障消失了,R1会再次自动得出其接口0直连网络的路由条目,并将之前人工配置的针对该直连网络的黑洞路由条目设置为失效状态,这样做的目的是当R1再次检测到了该网络有故障时,方便将这个黑洞路由设置为生效状态并删除路由表中错误的条目。