【计算机网络】网络层
文章目录
- 网络层概述
- 网络层提供的两种服务
- IPv4地址
- IPv4地址概述
- 分类编址的IPv4地址
- 划分子网的IPv4地址
- 无分类编址的IPv4地址
- IPv4地址的应用规划
- IP数据报的发送和转发过程
- 静态路由配置及其可能产生的路由环路问题
- 路由选择
- 路由选择协议概述
- 路由信息协议RIP的基本工作原理
- 开放最短路径优先OSPF的基本工作原理
- 边界网关协议BGP的基本工作原理
- IPv4数据报的首部格式
- 网际控制报文协议ICMP
- 虚拟专用网VPN与网络地址转换NAT
网络层概述
网络层的主要任务是实现网络互连,进而实现数据包在各网络之间的传输
如图所示,这些异构型网络,如果只是需要各自内部通信,他们只要实现各自的物理层和数据链入层即可,但是如果需要将这些异构型网络互连起来,形成一个更大的互联网,就需要使用网络层互联设备路由器。
需要说明的是为了简单起见,有时我们可以不用画出这些网络,而将他们看作是一条链路即可。
对于互联网而言,仅实现计算机网络体系结构中的物理层和数据链路层,是不能实现数据包在互联网中各网络之间传输的,要实现该功能,就要必须实现网络层,网络层需要解决以下主要问题:
- 向运输层提供怎么样的服务
- 寻址问题
- 路由选择问题
接下来我们一个个来看看。
首要问题是网络层应该向其上面的运输层提供怎样的服务,是可靠传输服务,还是不可靠传输服务?我们在之前的文章中曾介绍过,数据包在传输过程中可能会出现误码,也有可能由于路由器繁忙而被路由器丢弃,还有可能出现按序发送的数据包,不能按序到达接收方。
- 如果网络层对于上述传输错误不采取任何措施,则提供的是不可靠传输服务。
- 如果网络层对于上述传输错误采取措施,并使得接收方能正确接收发送方所发送的数据包,则提供的是可靠传输服务。
- 不同网络体系结构所提供的服务可能是不同的。例如因特网使用的tcpip协议体系的网际层,提供的是无连接的不可靠的数据报服务,而ATM,帧中继和X.25的网络层提供的都是面向连接的可靠的虚电路服务。
网络层需要解决的第二个主要问题是寻址问题,例如TCP/IP协议体系的网际层使用IP地址,我们来举例说明:
- 网络N1上两个路由器接口各自所分配的IP地址,它们的前三个数是相同的,可以看作是他们所在网络的网络编号,而第4个数各不相同,用于区分这两个不同的路由器接口,
- 网络N3上两个路由器接口各自所分配的IP地址,它们的前两个数是相同的,可以看作是他们所在网络的网络编号,而后两个数不完全相同,用于区分这两个不同的路由器接口,
- 网络N7上两个路由器接口各自所分配的IP地址,它们的第一个数是相同的,可以看作是他们所在网络的网络编号,而后三个数不完全相同,用于区分这两个不同的路由器接口。
网络层需要解决的第三个主要问题是路由选择问题。我们来举例说明,如图所示:
数据包从原站到达目的站,可以走上面那条路径,也可以走下面那条路径。对于本例还有其他路径可走,我们就要不一一演示了。
那么路由器收到数据包后,是依据什么来决定将数据包从自己的哪个接口转发出去的呢?
依据的是数据包中的目的地址和路由器中的路由表
- 例如这是路由器R1的路由表,里面记录着路由器、R1所知道的网络以及数据包要到达这些网络,应该从自己的哪个接口转发。
- 假设R1知道数据包要到达网络N7,下一跳,应将其转发给路由器R4,则路由表中应该有这样一条记录,
- 而数据包要到达网络N6,下一跳,应将其转发给路由器R2,则路由表装应该有这样一条记录。
请大家想想看,刚才是我们假设而已,知道这些路由记录,但在实践当中路由器是如何得出这样的路由记录呢?有两种方法,
- 一种是由用户或网络管理员进行人工配置,这种方法只适用于规模较小,且网络拓扑不改变的小型互联网。
- 另一种是实现各种路由选择协议,由路由器执行路由选择协议中所规定的路由选择算法,而自动得出路由表中的路由记录。这种方法更适用于规模较大,且网络拓扑经常改变的大型互联网。
因特网是目前全世界用户数量最多的互联网,它使用4层协议体系的TCPIP协议站,如图所示,由于TCPIP协议站的网络层需要网际协议IP,它是整个协议站的核心协议。因此在TCP IP协议战中,网络层常称为网际层。
内容小结:
网络层提供的两种服务
网络层提供的两种服务:
- 一种是面向连接的虚电路服务
- 另一种是无连接的数据报服务
虚电路服务;
数据报服务:
内容小结:
IPv4地址
IPv4地址概述
IPv4地址的基本概念:
- 在TCP/IP体系中,IP地址是一个最基本的概念,我们必须把它弄清楚。
IPv4地址
就是给因特网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32比特的标识符。- IP地址,由因特网名字和数字分配机构ICANN(The Internet Corporation for Assigned Names and Numbers))进行分配。
- 我国用户可向亚太网络信息中心(Asia-Pacific Network Information Center,APNIC)申请IP地址,这需要缴纳费用,一般并不接受个人申请。
- 2011年2月3日,因特网号码分配管理局宣布,IPv4地址已经分配完毕
- 我国在2014~2015年也逐步停止了向新用户和应用分配IPV4、地址,同时全面开展商用部署IPV6
IPV4地址的编制方法,经历了如下三个历史阶段,我们在后面会详细介绍:
由于32比特的IPV4地址不方便阅读记录以及输入等,因此IPV4地址采用点分十进制表示方法,以方便用户使用。
关于二进制的转换等计算在此不赘述
内容小结:
分类编址的IPv4地址
这里我们介绍IPv4地址编制方法的第一个历史阶段,也就是分类编制的IPv4地址
分类编制的IPv4地址分为ABCDE 5类:
- A类地址的网络号部分占8比特,主机号部分占24比特,网络号的最高位固定为零
- B类地址的网络号部分和主机号部分各占16比特,网络号的最高两位,固定为10
- C类地址的网络号部分占24个比特,主机号部分占8个比特,网络号的最高3位固定为110
- D类地址是多播地址,其最高4位固定为1110
- E类地址是保留地址,及最高4位固定为1111
- 需要注意的是只有A类,B类和C类地址可分配给网络中的主机或路由器的各接口。
- 主机号为全0的地址是网络地址,不能分配给主机或路由器的各接口
- 主机号为全1的地址是广播地址,不能分配给主机或路由器的各接口
-
8位网络号的最高位固定为0,第7位全部取0时,就是A类网络的最小网络号,其十进制值为0,该网络号被保留,不能指派。
-
因此A类网络第一个可指派的网络号为最高位固定为0,低7位为000 0001,其十进制值为1,将24位的主机号全部取0,就可以得到该网络的网络地址,且点分十进制为1.0.0.0,
-
当8位网络号的第7位全部取1时,就是A类网络的最大网络号,其十进制值为127,该网络号被用于本地软件环回测试,不能指派
-
将127开头的IPv4地址的主机号部分的最低位取1,其他位取0,就可得到最小的本地软件环回测试地址,且点分十进制为127.0.0.1,
-
将127开头的IPv4地址的主机号部分的最低位取0,其他位取1,就可得到最大的本地软件环回测试地址,且点分十进制为127.255.255.254
-
-
因此A类网络最后一个可指派的网络号为最高为固定为0,低7位为1111 110,10进制值为126,将24位的主机号全部取0,就可以得到该网络的网络地址,且点分10进制为126.0.0.0。
-
可指派的A类网络的数量是多少?我们可以写出这样的表达式,由于网络号占8位,并且其最高位固定为0,因此网络号有2的8减一次的组合,-2的原因需要去掉最小网络号0和最大网络号127,他们不能指派
-
每个A类网络中可分配的IP地址数量是多少呢?我们可以写出这样的表达式,由于主机号占24位,因此主机号有2~24次方个组合,-2的原因是要去掉主机号为全0的网络地址 和主机号为全1的广播地址。
-
也就是说,一个IP地址的第一个数如果是1~126,就是A类地址
再来看B类地址的细节,16位网络号的最高两位固定为10:
- 低14位全部取0时,就是B类网络的最小网络号,且点分时进制为128.0。该网络号是B类网第一个可指派的网络号,将16位的主机号全部取0,就可以得到该网络的网络地址,且点分十进制为128.0.0.0
- 16位网络号的最高两位固定为10,低14位全部取一时,就是B类网络的最大网络号,且点分时进制为191.255,该网络号是B类网最后一个可指派的网络号,将16位的主机号全部取0,就可以得到该网络的网络地址,且点分时进制为191.255.0.0。
- 可指派的B类网络的数量是多少,我们可以写出这样的表达式。由于网络号占16位,并且其最高两位固定为10,因此,网络号有2~16-2次个组合
- 每个B类网络中可分配的IP地址数量又是多少,我们可以写出这样的表达式。由于主机号占16位,因此主机号有2的16 次个组合,-2的原因是要去掉主机号为全0的网络地址,和主机号为全一的广播地址。
- 需要说明的是有些教材中指出128.0是保留网络号,B类第一个可指派的网络号为128.1,但根据2002年9月发表的RFC3330文档,128.0网络号已经可以分配了,有兴趣的同学可以自行查询,以128.0开头的IP地址,看看他们属于哪些国家。
- 也就是说,IP地址第一个开头的如果是128~191,就是B类地址
再来看C类地址的细节,24位网络号的最高三位固定为110:
- 低21位全部取0时,就是C类网络的最小网络号,且点分时进制为192.0.0,该网络号是C类网第一个可指派的网络号,将8位的主机号全部取0,就可以得到该网络的网络地址,且点分十进制为192.0.0.0
- 24位网络号的最高三位固定为110,低21位全部取1是,就是C类网络的最大网络号,写点分十进制为223.255.255,该网络号是C类网最后一个可指派的网络号,将8位的主机号全部取0,就可以得到该网络的网络地址,其点十时进制为223.255.255.0。
- 可指派的C类网络的数量是多少呢?我们可以写出这样的表达式,由于网络号占24位,并且其最高三位固定为110,因此网络号有2的24减3次个组合。
- 每个C类网络中可分配的IP地址数量是多少,我们可以写出这样的表达式。由于主机号占8位,因此主机号有2的8次方个组合,减2的原因是要去掉主机号为全名的网络地址和主机号为全1的广播地址。
- 需要注意的是有些教材中指出,192.0.0是保留网络号,C类第一个可指派的网络号为192.0.1,但根据2002年9月发表的RFC3330文档,192.0.0网络号已经可以分配了,只不过目前还没有分配出去。
- 也就是说,IP地址第一个开头的如果是192~223,就是C类地址
第一题:
第二题:
这里的源地址和目标地址表示的是:
- 在路由器通信中,IP数据包中一般有2个IP地址,一个是源IP,另外一个是目标IP地址;
- 源IP地址就是发出这个数据包的电脑的IP地址,它是数据的来源;
- 目标IP地址就是数据最终要到达的那台电脑的IP地址;
第三题:
步骤:
- 首先应该找出图中都有哪些网络(在图中已经标出,橙色区、蓝色区、粉色区、绿色区,注意两台路由器通过一段链路直连,他们的直连接口也属于同一个网络)
- 之后可以根据各网络中主机和路由器接口总数量,来决定给各网络分配哪个类别的网络号。橙色区网络的主机数量为65534加上一个路由器接口,需要可分配的IP地址数量为65535,只能给该网络分配一个A类网络号
- 蓝色区网络的主机数量为254,加上一个路由器接口,需要可分配的IP地址数量为255,可以给该网络分配一个A类或B类网络号。本着节约IP地址的原则,给该网络分配一个B类网络号
- 绿色区网络的主机数量为40,再加上一个路由器接口,需要可分配的IP地址数量为41,给该网络分配一个A类B类或C类网络号都可以,本着节约IP地址的原则,给该网络分配一个C类网络号
- 粉色区网络没有主机,只有两个路由器接口,需要可分配的IP地址数量为2,给该网络分配一个A类B类或C类网络号都可以。本着节约IP地址的原则,给该网络分配一个C类网络号
- 依据所确定的网络号类别,为每个网络挑选一个网络号,A类网络号的取值范围是1~126,可在该范围内挑选一个网络号,分配给网络,B类网络号的取值范围是128.0 ~191.255可在该范围内选一个网络号分配给网络,C类网络号的取值范围是192.0.0 ~223.255.255,可在该范围内挑选一个网络号分配给网络
- 不同网络的网络号不能相同
- 网络号分配完毕后,就可给各网络中的各主机和路由器的各接口,分配IP地址了
- 需要注意的是所分配的IP地址应该互不相同,并且其主机号部分不能出现全0,因为这是网络地址,也不能出现全1,因为这是广播地址,网络地址或广播地址都不能分配给主机或路由器的各接口,因为他们无法唯一标识一台主机或路由器的某个接口
内容小结:
划分子网的IPv4地址
这里我们介绍IPv4地址编制方法的第二个历史阶段,也就是划分子网的IPv4地址。
我们首先来举例说明,为什么会出现划分子网这样的需求,如图所示某单位有一个大型的局域网,需要连接到因特网,如果申请一个C类网络地址,其可分配的IP地址数量只有254个,不够使用。因此该单位申请了一个B类网络地址,其可分配的IP地址数量达到了65,534个,给每台计算机和路由器的接口,分配一个IP地址后,还有大量的IP地址剩余。
这些剩余的IP地址只能由该单位的同一个网络使用,而其他单位的网络不能使用。随着该单位计算机网络的发展和建设,该单位又新增了一些计算机,并且需要将原来的网络划分成三个独立的网络,我们称其为子网一、子网二和子网三。假设子网一仍然使用原先申请到的B类网络地址,那么就需要为子网二和子网三各自申请一个网络地址,但这样会存在一些弊端,申请新的网络地址,需要等待很长的时间,并且要花费更多的费用。
即便申请到了两个新的网络地址,这也会使其他路由器的路由表新增针对这两个新的网络的路由记录。另外这样还会浪费原有网络中剩余的大量IP地址。
如果可以从IP地址的主机号部分借用一些位作为子网号来区分不同的子网,就可以利用原有网络中剩余的大量IP地址,而不用申请新的网络地址。
例如对于本例,我们可以借用16位主机号中的8位作为子网号,假设我们给子网一分配的子网号为0,给子网二分配的子网号为1,给子网三分配的子网号为2,之后就可以给各子网中的主机和路由器接口分配IP地址了。
现在请大家思考这样一个问题,如果我们未在图中标记子网号部分,那么我们和计算机又是如何知道分类地址中主机号有多少位被用作了子网号?
这样我们就引出了一个划分子网的工具,他就是子网掩码,32比特的子网掩码,可以表明分类IP地址的主机号部分,被借用了几位作为子网号。
如图所示,这是32比特的分类IPv4地址,它有网络号和主机号两部分构成。
当我们从主机号部分借用一些位作为子网号时,IP地址从两级结构的分类IP地址变成了三级结构的划分子网的IP地址,我们用连续的比特1来对应网络号和子网号,用连续的比特0来对应主机号,这样就构成了划分子网的IP地址的32比特的子网掩码
将划分子网的IP地址与相应的子网掩码进行逻辑与运算,也就是逐比特相与,就可得到IP地址所在子网的网络地址,如图所示这样网络号和子网号被保留,而主机号被清零,结果为IP地址所在子网的网络地址。
接下来我们来举例说明划分子网的细节,已知某个网络的地址为218.75.230.0,使用子网掩码255.255.255.128,对其进行子网划分,给出划分细节:
注意:由于原来的8位主机号被借走一位作为子网号,因此主机号还剩7位,这就是表达式中8-1的原因,可有2的7次方个组合,但是我们还要去掉主机号为全0的网络地址和全1的广播地址,这就是表达式中-2的原因。
我们来看看题目所给的C类网地址,218.75.230.0的细节:
接下来我们引入子网再来看看细节;
最后我们介绍默认子网掩码的概念,默认子网掩码是指在未划分子网的情况下使用的子网掩码,概念较为简单:
内容小结:
无分类编址的IPv4地址
这里我们介绍IPv4地址编制方法的第三个历史阶段,也就是无分类编制的IPv4地址
:
我们来看一个例子:请给出CIDR地址块128.14.35.7/20的全部细节
注意:
- 这里是最小和最大地址,而不是最小和最大可分配地址。
- 聚合C类网数量就是地址数量除以C类网的主机数量
接下来我们介绍CIDR中有关路由聚合的概念,路由聚合也称为构造超网。我们来举例说明,如图所示路由器R1与5个网络以及路由器R2直接相连,路由器R1和R2互为相邻路由器,它们周期性的通告自己所知道的路由信息给对方。请大家思考一下,R1应该将怎样的路由信息通告给R2
如果R1将自己直连的这5个网络的路由记录都通告给R则R的路由表会增加5条路由记录,为了减少路由记录对路由表的占用,能否将这5条路由记录聚合成1条?
答案是肯定的,其方法是找共同前缀,也就是找出这5个目的网络地址的共同前缀,这5个目的网络地址的左起前2个字节都是相同的,从第三个字节开始不同,因此只需将第三个字节转换成二进制形式,这样就可以很容易找出这5个目的网络地址的共同前缀,共22个比特,我们将其记为斜线22,将共同前缀保持不变,而剩余的10个比特全部取0,然后写成点分10进制形式放在斜线22的前面,这就是聚合后的地址块,也可以称为超网。
通过本地我们还可以看出网络前缀越长,地址块越小,路由就越具体。需要说明的是若路由器查表转发分组时,发现有多条路由可选则选择网络前缀最长的那条,这称为最长前缀匹配,因为这样的路由更具体。
接下来我们看两个题:
内容小结如下;
IPv4地址的应用规划
这里我们介绍IPv4地址的应用规划,也就是给定一个IPv4地址块,如何将其划分成几个更小的地址块,并将这些地址块分配给互联网中的不同网络,进而可以给各网络中的主机和路由器接口分配IPv4地址,一般有以下两种方法:
- 一种是采用定长的子网掩码进行划分。就是使用同一个子网掩码来划分子网
- 采用定长的子网掩码来划分子网,每个子网所分配的IP地址数量相同,容易造成IP地址浪费
- 另一种是采用变长的子网掩码进行划分。就是使用不同的子网掩码来划分子网
- 采用变长的子网掩码来划分子网,每个子网所分配的IP地址数量可以不相同,尽可能减少了对IP地址的浪费。
接下来我们举例说明,采用定长的子网掩码划分子网的方法,假设我们申请到了一个C类网络,218.75.230.0,要使用定长的子网掩码,给图中所示的小型互联网中的各设备分配IP地址。
这是所申请到的C类网地址218.75.230.0,这是它的3字节网络号,这是它的1字节主机号,我们需要从主机号部分借用3个比特作为子网号,这样可划分出的子网数量为2的3次方个,也就是8个,可以满足我们对子网数量的要求,而每个子网上的地址数量为2的8-3次个,也就是32个,可以满足我们对子网上IP地址数量的要求。这样我们就可以得出划分子网所需的子网掩码,用3个10进制数255来对应网络号部分,也就是用24个连续的比特1来对应网络号,而最后8个比特为1110 0000,其中3个连续的比特1表示,从主机号部分借用三个比特作为子网号,将这8比特写成10进制数为224。
接下来我们来看划分子网的细节:
- 这是24比特网络号部分,这是从主机号部分借用的3比特作为子网号部分,这是剩余的5比特主机号部分,
- 这是子网1的网络地址,这是它的点分十进制形式,
- 将网络号和子网号保持不变,主机号从5个比特0增长到5个比特1,就可得到子网一的广播地址,这是它的点分十进制形式。
- 这是比子网1的网络地址大1的地址,它是子网1上个分配给主机或路由器接口的最小地址,这是他的点分时进制形式
- 这是比子网1的广播地址小1的地址,它是子网1上可分配给主机或路由器接口的最大地址,这是它的点分十进制形式,
- 这是比子网1的广播地址大1的地址,它是子网2的网络地址,这是它的点分10进制形式,
将网络号和子网号保持不变,主机号从5个比特0增长到5个比特1,就可得到子网2的广播地址,这是它的点分10进制形式, - 这是比子网2的网络地址大1的地址,它是子网2上可分配给主机或路由器接口的最小地址,这是它的点分十进制形式,
- 这是比子网2的广播地址小1的地址,它是子网2上可分配给主机或路由器接口的最大地址,这是它的点分十进制形式,
- 这是比子网2的广播地址大1的地址,它是子网3的网络地址,这是它的点分十进制形式,
- 以此类推,我们可以得到划分子网的全部细节
现在我们就可以从子网1~8中任选5个,分配给图中的网络N1到N5。通过本地可以看出采用定长的子网掩码进行子网划分,只能划分出二的N次方个子网,其中N是从主机号部分借用的用来作为子网号的比特数量,每个子网所分配的IP地址数量相同,容易造成IP地址的浪费。
例如图中的网络5只需要4个IP地址,但是我们只能给他分配32个IP地址,这样就造成了IP地址的严重浪费。
接下来我们举例说明,使用变长的子网掩码划分子网的方法,本例与之前的例子基本一样,只是划分子网的方法,改为采用变长的子网掩码。
既然网络N1需要9个地址,那么分配给网络N1的地址的主机号应为4个比特,因为2的4次方等于16,这样网络N1就可有16个地址。由于使用4个比特作为主机号,因此剩余28个比特可作为网络前缀。
既然网络N2需要28个地址,那么分配给网络N2的地址的主机号应该为5个比特,因为2的5次方等于32,这样网络N2就可有32个地址,由于使用5个比特作为主机号,因此剩余27个比特可作为网络前缀,
以此类推,我们将所得出的各网络所需地址块的大小标注在它们各自的旁边,这样我们就可得到本例的应用需求:
也就是从地址块218.75.230.0/24中,取出5个地址块,按需分配给图中所示的5个网络,218.75.230.0/24地址块所包含的全部地址如下所示,我们需要在该地址块中给图中所示的网络N1到N5分配子块,分配的原则是每个子块的起点位置不能随意选取,只能选取块大小整数倍的地址作为起点,建议大家先给大的子块进行分配。
分配结果如下:
通过本例可以看出采用变长的子网掩码进行子网划分,可以按需划分出相应数量的子网,每个子网所分配到的IP地址数量可以不相同,尽可能减少了对IP地址的浪费。例如图中的网络5只需要4个IP地址,我们也非常精确的给他分配了4个IP地址,没有造成IP地址的浪费。
内容小结:
IP数据报的发送和转发过程
IP数据报的发送和转发过程包含以下两部分:
- 一部分是主机发送IP数据报
- 另一部分是路由器转发IP数据报
需要说明的是为了将重点放在TCP协议站的网际层,发送和转发IP数据报的过程上,在接下来的举例中,我们将忽略使用ARP协议来获取目的主机或路由器接口的MAC地址的过程,以及以太网交换机自学习和转发帧的过程。下面我们就来举例说明,IP数据报的发送和转发过程。
在下图所示的小型互联网中,路由器的接口0直连了1个交换式以太网,接口1也直连了一个交换式以太网:
- 同一个网络中的主机之间可以直接通信,这属于
直接交付
- 不同网络中的主机之间的通信,需要通过路由器来中转,这属于
间接交付
那么源主机如何判断出目的主机是否与自己在同一个网络中?
我们来举例说明:
-
假设主机C要给主机F发送IP数据报,主机C将自己的IP地址和子网掩码相与,就可以得到主机C所在网络的网络地址。
-
既然主机C要给主机F发送IP数据报,主机C肯定知道主机F的IP地址,否则就没法发送了。主机C将主机F的IP地址与自己的子网掩码相遇,就可得到目的网络地址
-
该地址与主机C的网络地址不相等,因此主机C就知道了主机F与自己不在同一个网络,他们之间的通信属于间接交付,主机C需要将IP数据报传输给路由器,由路由器将IP数据报转发给主机F
那么主机C又是如何知道应该把IP数据报交给哪个路由器进行转发呢?
实际上用户为了让本网络中的主机能和其他网络中的主机进行通信,就要必须给其指定本网络中的一个路由器,由该路由器帮忙进行转发,所指定的路由器也被称为默认网关
。
对于本例我们可以将路由器接口0的IP地址指定给该接口所直连网络中的各个主机作为默认网关。同理可将路由器接口1的IP地址指定给该接口所直连网络中的各个主机作为默认网关,这样当本网络中的主机要和其他网络中的主机进行通信时,会将IP数据报传输给默认网关,由默认网关帮主机将IP数据报转发出去
假设本例中的主机A要给主机D发送IP数据报,这属于间接交付,主机A会将该IP数据报传输给自己的默认网关,也就是图中所示的路由器。
那么当路由器收到IP数据报后,又是如何转发的呢?
- 路由器首先会检查IP数据报的首部是否出错,若出错则丢弃该IP数据报,并通告源主机,若没有出错则进行转发。
- 然后路由器根据IP数据报首部中的目的地址,在自己的路由表中查找匹配的路由条目
- 若找到匹配的路由条目,则转发给路由条目中指示的下一跳
- 若找不到则丢弃该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数据报。
需要说明的是我们这里所介绍的路由器查表转发IP数据报的过程,只是为了让同学们理解其最基本的工作原理,在路由器的实际研发过程中,需要设计很好的数据结构,以便提高查找速度。
再来看这种情况,假设主机A给本网络上的各设备发送了一个广播IP数据报,在数据报首部中的目的地址字段,可以填写的目的地址为192.168.0.127,这是本网络的广播地址,也可以填写255.255.255.255,这是受限的广播地址。该网络中的各设备都会收到该广播IP数据报,但是路由器收到后并不会转发该数据报,也就是说路由器是隔离广播域的,这是很有必要的。
试想一下,如果因特网中数量巨大的路由器,收到广播IP数据报后都进行转发,则会造成巨大的广播风暴,严重浪费因特网资源。同理,主机A给另一个网络发送广播IP数据报,在数据报首部中的目的地址字段,填写的目的地址为192.168.0.255,这是网络192.168.0.128的广播地址。主机A将该广播IP数据报传输给路由器,希望由路由器帮其转发,但路由器判断出这是广播IP数据报,不会转发。
内容小结如下;
静态路由配置及其可能产生的路由环路问题
静态路由配置
是指用户或网络管理员使用路由器的相关命令,给路由器人工配置路由表,这种人工配置方式简单,开销小,但不能及时适应网络状态(流量、拓扑等)的变化,一般只在小规模网络中
使用静态路由配置,可能出现以下导致产生路由环路的错误:
- 配置错误
- 聚合了不存在的网络
- 网络故障
接下来我们首先举例说明静态路由配置
我们采用如图所示的网络拓扑和相应的IP地址配置。路由器R1通过自己的接口0所配置的IP地址和地址掩码,可以自动得出接口0所在的网络。由于接口0与该网络直连,则下一跳不是路由器地址,而是通过接口0转发IP数据报给该网络中的某个主机,这属于直接交付。这条自动得出的路由条目的类型属于直连路由。同理,R1还可自行得出接口1的直连网络路由条目。路由器R2同样如此
-
假设R1要转发1个IP数据报给该网络中的某个主机,从图中可以看出,R1应该将该IP数据报转发给路由器R2的接口0
-
但R1的路由表中并没有关于该目的网络的路由条目,换句话说,R1并不知道目的网络的存在。因此我们可以使用路由器的相关配置命令,给R1添加1条到达该目的网络的路由条目,下1跳为路由器R2的接口0的地址,该路由条目是我们人工配置的静态路由:
-
假设R2要转发1个IP数据报给该网络中的某个主机,从图中可以看出,R2应该将该IP数据报转发给路由器R1的接口1,但R2的路由表中并没有关于该目的网络的路由条目,因此我们可以给R2添加1条到达该目的网络的路由条目。下1跳为路由器R1的接口1的地址,类型为静态。以上就是我们举例说明的静态路由配置。
接下来我们举例说明默认路由的概念
假设路由器R的接口2连接到了因特网,假设R1要转发1个IP数据报给因特网中某个网络中的某个主机,从图中可以看出,R1应该将该IP数据报转发给路由器R的接口0。由于因特网中包含了众多的网络,如果我们给R1添加针对这些网络的每1条路由条目,则会给人工配置带来巨大的工作量,并且使R1的路由表变得非常大,降低了查表转发的速度。
实际上对于具有相同下一跳的不同目的网络的路由条目,我们可以用一条默认路由条目来替代。默认路由条目中的目的网络地址为0.0.0.0,地址掩码也为0.0.0.0,其CIDR形式为0.0.0.0/0。对于本例默认路由条目中的下一跳,是路由器R2的接口0的地址。
由于默认路由也是由我们人工配置的,因此其类型也是静态。在配置了默认路由条目后,我们甚至可以删除这条路由条目。
接下来我们举例说明特定主机路由
的概念
有时候我们可以给路由器添加针对某个主机的特定主机路由条目,一般用于网络管理人员对网络的管理和测试。另外在需要考虑某种安全问题时,也可以采用特定主机路由
假设192.168.2.1是该网络中的某台特定主机,我们可以在R1的路由表中添加1条到达该主机的特定主机路由条目。特定主机路由条目中的目的网络地址为该特定主机的IP地址,地址掩码为255.255.255.255,其CIDR形式为特定主机IP地址斜线32。对于本例特定主机路由条目中的下一跳,是路由器R2的接口0的地址。由于特定主机路由也是由我们人工配置的,因此其类型也是静态。
可以看出特定主机路由的目的网络前缀最长,路由最具体,默认路由的目的网络前缀最短,路由最模糊,当路由器查表转发IP数据报时,若有多条路由条目可选,则采用最长前缀匹配的原则,选用目的网络前缀最长的路由条目进行转发
接下来我们举例说明,静态路由配置错误可能导致的路由环路问题,如图所示,这是各路由器自动得出的直连网络,这是我们给各路由器人工配置的静态路由。
-
我们来看看路由器R2中的这条人工配置的静态路由条目,它表明 R2要转发IP数据报到该网络,下一跳,应转发给R1的接口1
-
假设我们将下一跳错误的配置成了该地址,也就是错误的指向了R3的接口0,则当R2要转发IP数据报到该网络时,下一跳会错误的转发给路由器R3的接口0,R3收到该IP数据报后进行查表转发,找到了匹配的路由条目,下一跳,应该转发给该地址,也就是转发给R的接口1
-
R2收到该IP数据报后进行查表转发,找到了匹配的路由条目,下一跳应该转发给该地址,也就是转发给R3的接口0。很显然由于我们静态路由配置错误,导致R2和R3之间产生了路由环路。
为了防止IP数据报在路由环路中永久兜圈,在IP数据报首部设有生存时间、TTL字段。IP数据报进入路由器后,TTL字段的值被路由器减1,若TTL字段的值减1号不等于0,则被路由器转发,否则被丢弃。
我们再来举例说明,聚合了不存在的网络可能导致的路由环路问题
如下是路由器R1的路由表
这是路由器R2的路由表:
我们给其人工配置了1条聚合路由,它是由图中两个网络地址聚合而来的,具体方法就是找这两个网络地址的共同前缀,然后将共同前缀保持不变,将剩余比特全部取0,写成点分10进制形式,在其后面写上斜线,斜线后面写上共同前缀的数量。
假设R2要转发IP数据报到该网络,进行查表转发,找到了匹配的路由条目,下一跳应该转发给该地址,也就是转发给R1的接口1。R1收到该IP数据报后进行查表转发,找到了匹配的路由条目,下一跳,是通过接口2直接交付。
我们再来看看这条聚合路由的细节,它实际上包含了以下4个网络,其中两个存在,两个不存在。
当R2要转发IP数据报到这个不存在的网络时,进行查表转发,找到了匹配的路由条目,下一跳应该转发给该地址,也就是转发给R1的接口1,但对于这个不存在的网络,路由器R2应该不予转发,却错把它转发给了路由器R1。
R1收到该IP数据报后进行查表转发,只能走默认路由,下一跳,应该转发给该地址,也就是转发给R的接口0。很显然R1和R2之间产生了路由环路。
针对这种情况,我们可以在R2的路由表中添加针对所聚合的不存在的网络的黑洞路由,黑洞路由的下一跳为null0,这是路由器内部的虚拟接口,可以把它形象的看成是1个黑洞,IP数据报进入它后就有去无回了,也就是路由器丢弃了该IP数据报,而不是转发该IP数据报。
现在假设R2要转发IP数据报到这个不存在的网络,进行查表转发,找到了两条可选的路由条目,根据最长前缀匹配的原则,将会选择这条到达该不存在网络的黑洞路由,下一跳为虚拟接口null0,因此该IP数据报会进入这个黑洞
接下来我们再来举例说明,网络故障可能导致的路由环路问题
-
假设路由器R1检测到其接口0所直连的网络出现了故障,而不可达,就会自动在其路由表中删除该直连网络的路由条目。
-
之后,R2要转发IP数据报到192.168.1.0/24网络,进行查表转发,找到匹配的路由条目,下一跳为R1的接口1。
-
R1收到该IP数据报后进行查表转发,找不到该IP数据报的目的,网络的相关路由条目,只能走默认路由,下一跳应该转发给该地址,也就是转发给R2的接口0,
-
这样就将该IP数据报错误的转发给了R2,很显然 R1和R之间产生了路由环路。
针对这种情况,我们可以在R1的路由表中添加针对该(故障)直连网络的黑洞路由,这样当R2要转发IP数据报到该网络时,进行查表转发,找到匹配的路由条目,下一跳转发给R1的接口1,R1收到该IP数据报后,进行查表转发,找到匹配的路由条目,这是1条黑洞路由,下一跳为虚拟接口null0,因此该IP数据报会进入这个黑洞。
假设一段时间后之前的故障消失了,则R1又自动的得出了其接口0的直连网络的路由条目,并将我们之前人工配置的针对该直连网络的黑洞路由条目设置为失效状态。
假设R1再次检测到其接口0所直连的网络出现了故障而不可达,则会自动在其路由表中删除该直连网络的路由条目,并将我们之前人工配置的针对该直连网络的黑洞路由条目设置为生效状态。
内容小结如下:
路由选择
路由选择协议概述
路由选择可分为以下两类:
- 静态路由选择
- 动态路由选择
因特网是全球最大的互联网络,它所采用的路由选择协议具有以下三个主要特点,分别是:
自适应
:因特网采用的是动态路由选择,能较好的适应网络状态的变化。分布式
:因特网中的各路由器,通过相互间的信息交互,共同完成路由信息的获取和更新分层次
:将整个因特网划分为许多较小的自治系统AS,例如一个较大的因特网服务提供商,就可划分为一个自治系统,在自治系统内部和自治系统外部,采用不同类别的路由选择协议,分别进行路由选择。
下面我们来举例说明,因特网采用的分层次路由选择协议,假设这是因特网中的很小的一部分,我们可以将这些网络和路由器划归到两个不同的自治系统:
- 自治之间的路由选择,简称为
域间路由选择
。自治系统内部的路由选择,简称为域内路由选择
。 - 域间路由选择使用外部网关协议EGP类别的路由选择协议,域内路由选择使用内部网关协议IGP这个类别的路由选择协议
需要说明的是外部网关协议EGP
和内部网关协议IGP
只是路由选择协议的分类名称,而不是具体的路由选择协议。另外名称中使用的是网关这个名词,是因为在因特网早期的RFC文档中没有使用路由器,而使用的是网关这一名词。现在新的RFC文档中又改用路由器这一名词,因此外部网关协议EGP可改称为外部路由协议ERP,内部网关协议IGP,可改称为内部路由协议IRP。
注意:
在一个自治系统内部使用的具体的内部网关协议,与因特网中其他自治系统中选用何种内部网关协议无关。
接下来我们给出常见的路由选择协议:
路由选择协议是在路由器上运行的,下面我们就来看看路由器的基本结构
路由器是一种具有多个输入端口和输出端口的专用计算机,其任务是转发分组。
整个路由器结构可划分为两大部分:
- 路由选择部分
- 路由选择部分的核心构件是路由选择处理机,它的任务是根据所使用的路由选择协议,周期性的与其他路由器进行路由信息的交互,来更新路由表。
- 分组转发部分
- 分组转发部分由三部分构成,分别是交换结构,一组输入端口,一组输出端口。
接下来我们来看看路由器的工作过程:
- 信号从某个输入端口进入路由器,物理层将信号转换成比特流,送交数据链路层处理,数据链入层从比特流中识别出帧去掉帧头和帧尾后,送交网络层处理。如果送交网络层的分组是普通代转发的数据分组,则根据分组首部中的目的地址进行查表转发,若找不到匹配的转发条目,则丢弃来分组,否则按照匹配条目中所指示的端口进行转发。
- 转发出去时,网络层更新数据分组首部中某些字段的值,例如将数据分组的生存时间减1,然后送交数据链路层进行封装,数据链路层将数据分组封装成帧,送交物理层处理,物理层将帧看作是比特流,将其变换成相应的电信号进行发送。
- 如果送交网络层的分组是路由器之间交换路由信息的路由报文,则把这种分组送交路由选择处理机,路由选择处理机根据分组的内容来更新自己的路由表。路由表一般仅包含从目的网络到下一跳的映射,路由表需要对网络拓扑变化的计算最优化,而转发表是从路由表得出的,转发表的结构应当是查找过程最优化
需要说明的是我们在前面的静态路由配置的相关内容中,并没有严格区分路由器中的路由表和转发表,这样有助于简化问题的分析。因此在后续有关路由选择协议的内容中,我们仍然不严格区分路由表和转发表,还是以路由表来表述问题。
注意:
-
路由选择处理机除了处理收到的路由报文外,还会周期性的给其他路由器发送自己所知道的路由信息。
-
路由器的各端口还应具有输入缓冲区和输出缓冲区
-
输入缓冲区用来暂存,新进入路由器,但还来不及处理的分组。
-
输出缓冲区用来暂存,已经处理完毕,但还来不及发送的分组。
需要说明的是路由器的端口一般都具有输入和输出的功能。我们图中分别给出输入端口和输出端口,目的在于更好的演示路由器的基本工作过程,使同学们更容易理解。
-
内容小结:
路由信息协议RIP的基本工作原理
需要说明的是有些厂商的路由器并没有严格按照RIP标准文档的规定来实现RIP,例如思科路由器中的RIP,将路由器到直连网络的距离定义为零,但这并不影响RIP的正常运行。
RIP认为好的路由就是距离短的路由,也就是所通过路由器数量最少的路由,如图所示,从R1到R5可以走上面这条路由,也可以走下面这条路由,RIP认为R1到R5的好路由是图中只经过一个路由器R4的这条路由。尽管这条路由上各段链路的带宽都非常小:
再来看这个例子,从R1到R6可以走上面这条路由,也可以走下面这条路由,而这两条路由是等价的,RIP该如何选择?
当到达同一目的网络,有多条距离相等的路由时,RIP可以进行等价负载均衡,也就是将通信量均衡的分布到多条等价的路由上
RIP包含以下三个要点,
- 第一个要点是和谁交换信息?答案是仅和相邻路由器交换信息。我们来举例说明相邻路由器的概念,下图中R1与R2故为相邻路由器,因为它们是直连的,中间没有其他路由器。同理,R2与R3也互为相邻路由器,但是R1与R3不是相邻路由器,因为它们之间还存在其他路由器。
- 第二个要点是交换什么信息?答案是路由器自己的路由表。
- 第三个要点是何时交换信息,答案是周期性交换,例如每30秒发送一次RIP更新报文
接下来我们举例说明RIP的基本工作过程:
- 路由器刚开始工作时,只知道自己到直连网络的距离是1。如图所示,这是各路由器刚开始工作时各自的路由表,其中包含的路由条目都是到达各自直连网络的信息,其距离都是1
- 之后每个路由器仅和相邻路由器周期性的交换,并更新路由信息。若干次交换和更新后,每个路由器都知道到达本自治系统内各网络的最短距离和下一跳地址,这称为
收敛
。
接下来我们举例说明RIP的路由条目更新规则,路由器C和D互为相邻路由器,它们之间周期性的交换并更新路由信息
路由器C的路由表,其中到达各目的网络的下一跳都记为问号。可以理解为路由器D并不需要关心路由器C的这些内容,
假设路由器C的RIP更新报文发送周期到了,则路由器C将自己路由表中的相关路由信息封装到RIP更新报文中,发送给路由器D。我们可以简单的理解为路由器C将自己的路由表发送给了路由器D。
路由器D收到后对其进行改造,将到达各目的网络的下一跳都改为C,距离都增加1,这样的操作很容易理解,因为路由器C告诉D,它可以到达这些目的网络,那么路由器D作为C的邻居路由器,当然也就可以通过C来到达这些目的网络,只是比C到达这些目的网络的距离大1,路由器D现在可以根据改造好的路由表来更新自己先前的路由表了
更新过程:
- 路由器D原来到达网络N2的距离是二,下一跳经过路由器C的转发。
现在路由器D知道了,到达网络N2仍然经过C的转发,距离变为了5,也就是说C与N2之间的网络拓扑发生了变化,于是将自己这条路由条目中的距离更新为5。
更新路由表的理由可总结为到达目的网络相同的下一跳,最新的消息应该更新。 - 路由器D原来不知道网络N3的存在,现在路由器D知道了,可通过路由器C到达网络N3,于是将该路由条目添加到自己的路由表中
更新路由表的理由可总结为发现了新的网络添加 - 路由器D原来到达网络N6的距离是8,下一跳,经过路由器F的转发,现在路由器D知道了,到达网络N6,如果通过C来转发,则距离可缩短为5,于是将自己这条路由条目中的距离修改为5,下一跳修改为C
更新路由表的理由可总结为到达目的网络不同的下一跳,新路由有优势,应该更新, - 路由器D原来到达网络N8的距离是4,下一跳,经过路由器E的转发,现在路由器D知道了,到达网络N8还可以通过C来转发,距离也为4,于是将该路由条目添加到自己的路由表中。更新路由表的理由可总结为到达目的网络不同的下一跳,但距离相等,进行等价负载均衡。
- 路由器D原来到达网络N9的距离14,下一跳经过路由器F的转发,现在路由器D知道了,到达网络N9,如果通过C来转发,则距离扩大为6,于是不使用这条路由条目来更新自己的路由表。不更新路由表的理由可总结为到达目的网络,不同的下一跳,新路由劣势,不应该更新。
下面我们介绍RIP协议存在的坏消息传的慢的问题,如图所示:
- 假设R1到达其直连网络N1的链路出现了故障,当R1检测出该故障后,会将到达N1的路由条目中的距离修改为16,表示N1不可达,并等待RIP更新周期到时后,发送该路由信息给R2。
- 而此时R2的路由表中,关于N1的路由条目仍然是先前通过RIP协议获取到的,也就是到达N1的距离为2,下一跳通过R1转发,
- 假设R2的RIP更新周期先到时,也就是R2的这条路由信息先到达R1,而R1的这条路由信息一段时间后才到达R2,
- 当R1收到R2的这条路由信息后就会被该谣言误导,认为可以通过R2到达N1距离为3,并在自己的RIP更新周期到时后,将这条路由信息发送给R2
- 当R2收到R1的这条路,由信息后被该谣言误导,认为可以通过R1到达N1,距离为4,并在自己的RIP更新周期到时后将这条路由信息发送给R1。
- 当R1收到R的这条路由信息后被该谣言误导,认为可以通过R2到达N1,距离为5,并在自己的RIP更新周期,到时后将这条路由信息发送给R2
- 很显然只有R1和R2的路由表中到达N1的路由条目中的距离都增加到16号,R1和R2才都知道N1不可达,也就是才收敛。
- 在该过程中,R1和R2之间会出现路由环路,时间长达数分钟,有关路由环路的问题,我们之前已经介绍过了,此处就不再赘述了。
造成这种反复误导的本质就是,接收方将RIP报文中的下一条改成了发送方,在上述例子中更新的时候,都是到达目的网络有着相同下一跳,采取的最新消息更新策略。
请注意使用上述措施后,也不能彻底避免路由环路问题,这是距离向量算法的本质所决定的。
内容小结:
开放最短路径优先OSPF的基本工作原理
我们来举例说明,在思科路由器中,OSPF计算代价的方法是用100兆比特每秒除以链路带宽,计算结果小于1的值仍记为1,大于1且有小数的舍去小数。我们可以很容易的得出下图中各路由器的链路状态:
OSPF相邻路由器之间通过交互问候分组来建立和维护邻居关系。
如图所示。问候分组需要封装在IP数据报中发送,发往组播地址224.0.0.5,IP数据报首部中的协议号字段的取值应为89,来表明IP数据报的数据载荷为OSPF分组,问候分组的发送周期为10秒,若40秒仍未收到来自邻居路由器的问候分组,则认为该邻居路由器不可达。
因此每个路由器都会建立一张邻居表,其中的每一个条目对应记录其各邻居路由器的相关信息,包括邻居ID,接口以及死亡倒计时。
例如R2是R1的一个邻居路由器,为简单起见,邻居ID就记为R2(实践中应填写相应的路由器ID),该邻居路由器与自己的接口1相连,将接口号记为1,死亡倒计时还剩36秒,若在死亡倒计时到达0之前,再次收到了来自R2的问候分组,则重新启动针对该邻居条目的40秒死亡倒计时,否则当死亡倒计时为0,则判定该邻居路由器不可达。
R4是R1的另一个邻居路由器,邻居ID记为R4,该邻居路由器与自己的接口0相连,将接口号记为0,死亡倒计时还剩余18秒
使用OSPF的每个路由器都会产生链路状态通告,其中包含以下两类内容:
- 一类是直连网络的链路状态信息
- 另一类是邻居路由器的链路状态信息。
假设N1是路由器R4的直连网络,则R4的链路状态通告应包含:
- 与其直连网络N1的链路状态信息
- 邻居路由器R1的链路状态信息
- 邻居路由器R3的链路状态信息
链路状态通告被封装在链路状态更新分组中,采用洪范法发送。收到链路状态更新分组的路由器,将从自己其他所有接口转发该分组,也就是进行洪范转发,如图所示。这样自制系统中每个路由器所发送的封装有链路状态通告的链路状态更新分组,会传递给系统中其他所有路由器。
使用OSPF的每个路由器都有一个链路状态数据库,用于存储链路状态通告,通过各路由器洪范发送封装有自己链路状态通告的链路状态更新分组,各路由器的链路状态数据库最终将达到一致。
例如这是路由器R2的链路状态数据库,其中记录有系统中各路由器的链路状态通告:
使用OSPF的各路由器,基于链路状态数据库进行最短路径优先计算,就可构建出各自到达其他各路由器的最短路径,也就是构建出各自的路由表。
例如有这样一个网络拓扑,各链路旁的数字表示代价。通过各路由器洪范发送封装有自己链路状态通告的链路状态更新分组,各路由器最终会得出相同的链路状态数据库,由链路状态数据库可以得出带权有向图,对该图进行基于迪杰斯特拉的最短路径优先算法,就可以得出以各路由器为根的最短路径,如图所示
对于这样一个比较简单的网络拓扑,即使大家不懂得最短路径优先算法,也可以很快找出每个路由器到达其他各路由器的最短路径。但是如果网络拓扑比较复杂,该项工作对人类而言就比较复杂了,因此可以按照迪杰斯特拉提出的最短路径优先算法,编制程序,让路由器执行该程序。
对于一般的网络工程师,即便不熟悉该算法,也不影响对OSPF协议的配置和使用。OSPF包含以下5种分组类型:
接下来我们来举例说明OSPF协议的基本工作过程:
-
相邻路由器之间周期性发送问候分组,以便建立和维护邻居关系,
-
建立邻居关系后,给邻居路由器发送数据库描述分组,也就是将自己的链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器。
- 例如 R1收到R2的数据库描述分组后,发现自己缺少其中的某些链路状态项目,于是就给R2发送链路状态请求分组。R2收到后,将R1所缺少的链路状态项目的详细信息,封装在链路状态更新分组中发送给R1。R1收到后,将这些所缺少的链路状态项目的详细信息添加到自己的链路状态数据库中,并给R2发送链路状态确认分组。需要说明的是R2也可以像R1请求自己所缺少的链路状态项目的详细信息。最终 R1和R2的链路状态数据库将达到一致,这也就是链路状态数据库达到同步。
- 例如 R1收到R2的数据库描述分组后,发现自己缺少其中的某些链路状态项目,于是就给R2发送链路状态请求分组。R2收到后,将R1所缺少的链路状态项目的详细信息,封装在链路状态更新分组中发送给R1。R1收到后,将这些所缺少的链路状态项目的详细信息添加到自己的链路状态数据库中,并给R2发送链路状态确认分组。需要说明的是R2也可以像R1请求自己所缺少的链路状态项目的详细信息。最终 R1和R2的链路状态数据库将达到一致,这也就是链路状态数据库达到同步。
-
每30分钟或链路状态发生变化时,路由器都会发送链路状态更新分组,收到该分组的其他路由器,将洪范转发该分组,并给该路由器发回链路状态确认分组,这又称为新情况下的链路状态数据库同步。
当OSPF路由器在多点接入网络中建立邻居关系时,如果不采用其他机制,将会产生大量的多播分组。例如这5台路由器连接在同一个多点接入网络中,他们周期性的发送问候分组,以建立和维护邻居关系。这些路由器中的任意两个路由器都互为邻居关系,如图所示,邻居关系的数量为N乘以N-1,然后再除以2,其中N是路由器的数量,这样每个路由器要向其他N减一个路由器发送问候分组和链路状态更新分组。
为了减少所发送分组的数量,OSPF采用选举指定路由器DR和备用的指定路由器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协议,OSPF将该自治系统再划分成4个更小的区域,每个区域都有一个32比特的区域标识符,可以用点分十进制表示,主干区域的标识符必须为0,也可表示成点分10进制形式的0.0.0.0,主干区域用于联通其他区域,其他区域的标识符不能为0,且互不相同。
每个区域的规模不应太大,一般所包含的路由器不应超过200个,划分区域的好处就是把利用洪范法交换链路状态信息的范围局限于每一个区域,而不是整个自治系统,这样就减少了整个网络上的通信量。
-
如果路由器的所有接口都在同一个区域内,则该路由器称为
区域内路由器
。 -
为了本区域可以和自治系统内的其他区域联通,每个区域都会有一个
区域边界路由器
,它的一个接口用于连接自身所在区域,另一个接口用于连接主干区域, -
主干区域内的路由器称为
主干路由器
。我们也可以把区域边界路由器看作是主干路由器。 -
在主干区域内还要有一个路由器,专门和本自制系统外的其他自治系统交换路由信息,这样的路由器成为
自治系统边界路由器
。
-
在本例中区域边界路由器R3向主干区域发送自己所在区域一的链路状态通告,向自己所在区域发送区域0,2,3的链路状态通告
-
区域边界路由器R4向主干区域发送自己所在区域二的链路状态通道,向自己所在区域发送区域0,1,3的链路状态通告,
-
区域边界路由器R7,向主干区域发送自己所在区域三的链路状态通告,向自己所在区域发送区域0,1,2的链路状态通道
采用分层次划分区域的方法,虽然使交换信息的种类增多了,同时也使OSPF协议更加复杂了,但这样做却能使每一个区域内部交换路由信息的通信量大大减小,因而使OSPF协议能够用于规模很大的自制系统中。
内容小结如下:
边界网关协议BGP的基本工作原理
因特网采用分层次的路由选择协议,内部网关协议这一类别的协议,用于自治系统内部的路由选择,典型的协议有路由信息协议RIP 和开放最短路径优先OSPF,他们都是设法使分组在一个自治系统内部,尽可能有效的从源网络传输到目的网络,无需考虑自治系统外部其他方面的策略。
外部网关协议这一类别的协议用于自治系统之间的路由选择。典型的协议是边界网关协议BGP。在不同自治系统内,度量路由的代价可能不同,因此对于自治系统之间的路由选择,使用代价作为度量来寻找最佳路由是不可行的。
我们来举例说明,各自治系统的连接关系如图所示:
其中自治系统AS1将时延作为度量,AS2将距离也就是跳数作为度量,AS3将链路带宽作为度量,那么AS4可以通过哪些路径到达AS5呢?图中已经标明了两种路线(当然还存在其他的可能性)
那么这些路径中哪一个是最佳路由呢?由于没有统一的路由度量,因此寻找最佳路由是无意义的。
自治系统之间的路由选择还必须考虑相关策略。例如我国国内的站点在互相传送数据报时,不应经过国外兜圈,特别是不要经过某些对我国的安全有威胁的国家,又例如自治系统AS4,要发送数据报给AS5,本来最好是依次经过S1S3,但是 AS3不愿意让这些数据报经过自己自治系统内的网络,因为这是那两个自治系统的事情,与我这个自治系统无关。而AS2愿意让某些相邻自治系统的数据报,通过自己的网络,只要支付相应的服务费用即可。由此可见,自治系统之间的路由选择协议,应当允许使用多种路由选择策略,这些策略包括政治、经济、安全等,他们都是由网络管理人员对每一个路由器进行设置的,但这些策略并不是自治系统之间的路由选择协议本身。
基于上述情况,边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由,也就是不能兜圈子,而并非要寻找一条最佳路由
我们来举例说明:
一般来说两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器
BGP发言人交换网络可达性的信息,也就是要到达某个网络所要经过的一系列自治系统。当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略,从收到的路由信息中,找出到达各自治系统的较好的路由,也就是构造出树形结构,不存在环路的自治系统连通图。如图所示,这是自治系统A的某个BP发言人,构造出的自治系统联通图:
边界网关协议BGP适用于多级结构的因特网。这里我们给出一个BGP发言人交换路径向量的例子:
- 自治系统AS2的BP发言人,通知主干网的BGP发言人,要到达网络N1、N2、N3和N4,可经过AS2。
- 主干网在收到这个通知后就发出通知,要到达网络N1、N2、N3和N4,可沿路径(AS1, AS2) ,这里的路径AS1、AS2称为路径向量。
- 自治系统AS3,收到这条路径向量信息后,如果AS3自身也包含在其中,则不能采用这条路径,否则会兜圈子
接下来我们介绍BGP版本4中规定的4种报文:
内容小结如下:
IPv4数据报的首部格式
这里我们介绍IPv4数据报的首部格式,为了简单起见,之后我们将IPv4数据报简称为IP数据报,而不指出、版本号。IP数据报的首部格式及其内容是实现IP协议主要功能的基础,因此我们有必要搞清楚这部分内容,如图所示
这是IP数据报的首部格式,它由20字节的固定部分和最大40字节的可变部分组成。所谓固定部分是指每个IP数据报首部都必须包含的部分,而某些IP数据报的首部除了包含20字节的固定部分外,还包含一些可选的字段来增加IP数据报的功能。IP数据报的首部常以32个比特为单位进行描述,图中的每一行都由32比特也就是4个字节构成,每个小格子称为字段或者域。每个字段或某些字段的组合,用来表达IP协议的相关功能。
版本字段
,该字段占4个比特,用来表示IP协议的版本,通信双方使用的IP协议的版本必须一致,目前广泛使用的IP协议的版本号为4,即IPv4,首部长度字段
,该字段占4个比特,用来表示IP数据报首部的长度,该字段的取值以四字节为单位。- 最小十进制取值为5,表示IP数据报首部只有20字节的固定部分;
- 最大十进制取值为15,表示IP数据报首部包含20字节的固定部分和最大40节的可变部分,
可选字段
,该字段的长度从1个字节到40个字节不等,用来支持排错、测量以及安全措施。可选字段增加了IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的,这就增加了每一个路由器,处理IP数据报的开销,实际上可选字段很少被使用,填充字段
,该字段用来确保首部长度为四字节的整数倍,使用全0进行填充。我们之前刚刚介绍过首部,长度字段是以四字节为单位的,换句话说,IP数据报的首部长度一定是四字节的整数倍。由于首部中的可选字段的长度,从1个字节到40个字节不等,那么当20字节的固定部分加上1~40个字节长度不等的可变部分,会造成首部长度不是四字节的整数倍时,就用取值为全零的填充字段,填充相应的字节,以确保IP数据报的首部长度是四字节的整数倍。区分服务字段
,该字段占8个比特,用来获得更好的服务。该字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年因特网工程任务组IEFT把这个字段改名为区分服务,利用该字段的不同数值,可提供不同等级的服务质量。只有在使用区分服务时,该字段才起作用,一般情况下都不使用该字段总长度字段
,该字段占16比特,用来表示IP数据报的总长度,也就是首部和数据载荷的长度总和,最大取值为十进制的65535,以字节为单位,需要注意的是在实际应用中很少传输这么长的IP数据报。- 接下来我们来举例说明,首部长度字段和总长度字段的区别与联系:
- 接下来我们来举例说明,首部长度字段和总长度字段的区别与联系:
标识
,标志
,片偏移
这三个字段,他们共同用于进行IP数据报分片,网际层封装出的IP数据报,它将在数据链路层封装成帧。每一种数据链路层协议都规定了帧的数据载荷的最大程度,称为最大传输单元MTU。例如以太网的数据链路层规定,MTU的值为1500个字节,如果某个IP数据报的总长度超过MTU时,将无法封装成帧,需要将源IP数据报分片为更小的IP数据报,再将各分片IP数据报封装成帧。
标识字段
,占16个比特,属于同一个数据报的各分片数据报,应该具有相同的标识,IP软件维持一个计数器,每产生一个IP数据报,计数器的值就要加1,并将此值赋给标识字段,标志字段
,占3个比特,各比特含义如下:- DF比特表示是否允许分片置1表示不允许分片,清0表示允许分片
- MF比特表示本分片后面是否还有分片,置1表示本分片后面还有分片,清0表示本分片就是最后一个分片
- 还有一个保留位,必须设置为0
片偏移字段
,占13个比特,指出分片数据报的数据载荷部分偏移,其在源数据报的位置有多远,片偏移以8个字节为单位
接下来我们举例说明IP数据报如何进行分片
假设有这样一个IP数据报,它由20字节的固定首部和3800字节的数据载荷两部分构成,也就是说该IP数据报的总长为3820个字节。假设使用以太网传送该IP数据报,以太网的最大传送单元MTU为1500个字节,也就是以太网的数据载荷部分,最大为1500个字节,无法封装3820字节长的IP数据报,因此需要把该IP数据报分片成几个更小的IP数据报,每个长度不能大于1500个字节,然后再将每个分片IP数据报封装成一个以太网的帧进行传输。
为了更好的描述后续的分片工作,我们将源IP数据报数据载荷部分的每一个字节都编上号,第一个字节编号为0,最后一个字节编号为3799,我们可将源IP数据报的数据载荷分成三个更小的分片,第一个分片从0号字节到1399号字节,共1400个字节。第二个分片,从1400号字节到2799号字节,共1400个字节。第三个分片,从2800号字节到3799号字节,共1000个字节。分片结束后,给每个分片重新添加一个首部,使之成为IP数据报。
请思考这样一个问题,给各分片添加的首部是否完全相同?
我们来一起填一下下面这张表格。源IP数据报首部中的总长度字段的十进制取值为3800+20,标识字段的10进制取值为12345,MF比特的取值为0,表示后面没有分片数据报,这就是最后一个分片数据报,DF比特的取值为0,表示该IP数据报允许被分片,由于这是未分片的源IP数据报,因此片偏移为0。
我们来填写分片一,IP数据报首部中相关字段的值,总长度字段的十进制取值为1400+20,其中1400字节是分片的长度,20字节是固定首部的长度,标识字段的十进制取值与源IP数据报的相同,由于该分片不是最后一个分片,因此 MF比特的取值为一,表示该分片后还有分片,该分片IP数据报允许被再次分片,因此DF比特的取值为0。该分片IP数据报数据载荷部分的第一个字节,就是源IP数据报数据载荷部分的第一个字节,因此片偏移字段的取值为0÷8。除以八的原因是片偏移字段,以八字节为单位。
后面的以此类推
现在假定分片二的IP数据报,经过某个网络时还需要再进行分片,其中一个分片长度为800字节,另一个分片长度为600字节,分片结束后给每个分片重新添加一个首部,使之成为IP数据报。
再来看生存时间字段
:
下来我们来举例说明,生存时间字段的作用。
假设采用如下图所示的网络拓扑,路由器R1R2R3,各自的路由表如图所示。为了简单起见,我们只给出了各路由器路由表中的由人工配置的静态路由条目,例如路由器R2中的这条静态路由条目,他指出了IP数据报要到达网络N2,下一跳,需要转发给路由器R3。
假设我们在人工配置这条静态路由条目时,错将下一跳,配置成了R1,这会导致将去往网络N2的IP数据报,错误的转发给路由器R1。我们来看看会出现什么问题。
假设某个IP数据报从网络N1发网络N2,该IP数据报到达R1号,R1进行查表转发,发现了匹配的路由条目,其下一跳指示转发给R2,于是R1将该IP数据报转发给了R2,R2收到该IP数据报后进行查表转发,发现了匹配的路由条目,其下一跳指示转发给R1,于是R将该IP数据报又转发回来R1。
很显然形成了路由环路。如果没有其他措施,IP数据报将在路由环路庄永久兜圈。现在相信大家能够更好的理解IP数据报首部中生存时间字段的作用了,那就是确保IP数据报不会在网络中永久兜圈。IP数据报每经过一个路由器其生存时间的值被减1,当减少到0时,IP数据报将被路由器丢弃。
再来看协议字段
:
首部检验和字段
内容小结:
网际控制报文协议ICMP
网际控制报文协议ICMP (Internet Control Message Protocol)
- 为了更有效的转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP。
- 主机或路由器使用ICMP协议来发送
差错报告报文
和询问报文
。 - ICMP报文被封装在IP数据报中发送。
ICMP差错报告报文共有以下5种,它们分别是:
- 终点不可达
- 源点抑制
- 时间超过
- 参数问题
- 改变路由(重定向)
我们首先来看终点不可达,当路由器或主机不能交付数据报时,就像源点发送终点不可达报文。具体可再根据ICMP的代码字段细分为目的网络不可达,目的主机不可达,目的协议不可达,目的端口不可达,目的网络未知,目的主机未知等13种错误。我们来举例说明,假设主机H1给H2发送IP数据报,H1会将IP数据报发送给路由器R1,由R1帮其转发,若R1的路由表中没有网络N3的路由记录,默认路由,以及主机H2的特定主机路由,则R1旧不知道如何转发该数据报,只能将其丢弃,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为终点不可达。
再来看源点抑制,当路由器或主机由于拥塞而丢弃数据报时,就像源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
例如H1给H2发送IP数据报,当该数据报传输到路由器R2时,由于R2拥塞也就是R2比较繁忙,R2根据自己的丢包策略,丢弃了该数据报,并向发送该数据报的源主机H1发送 ICMP差错报告报文,其类型为源点抑制,
又例如H1给H2发送IP数据报,当该数据报传输到H2时,由于H2拥塞就丢弃了该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为源点抑制
来看时间超过。当路由器收到一个目的IP地址不是自己的IP数据报时,会将其生存时间TTL字段的值减一,若结果不为0,则将数据报转发出去;若结果为0,除丢弃该数据报外,还要向源点发送时间超过报文。例如某个生存时间等于2的IP数据报传输到了路由器R1,R1将其生存时间减一后,结果是一,这表明该数据报的生存时间还没有结束,R1将其转发出去,当该数据报传输到路由器R2后,R2将其生存时间减一号结果是0,这表明该数据报的生存时间结束了,R2丢弃该数据报,并向发送该数据报的源主机H1发送ICMP差错报告报文,其类型为时间超过
另外当终点在预先规定的时间内,不能收到一个数据报的全部数据报片时,就把已收到的数据包片都丢弃,也会向源点发送时间超过报文
来看参数问题。当路由器或目的主机收到IP数据报后,根据其首部中的检验和字段,发现首部在传输过程中出现了误码,就丢弃该数据报,并向源点发送参数问题报文。例如这是H1发送给H2的IP数据报,假设该数据报在传输过程中受到了干扰,其首部出现了误码,当该数据报传输到路由器R1后,R1检测出该数据报的首部出错,于是丢弃该数据报,并向发送该数据报的源主机H1发送 IC MP差错报告报文,其类型为参数问题。
再来看改变路由,路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器,这样可以通过更好的路由。我们来举例说明。假设我们给主机H1指定的默认网关是路由器R1,则H1要发往网络N2的IP数据报,都会传输给R1,由其帮忙转发,当R1发现H1发往N2的数据报的最佳路由,不应当经过R1,而是应当经过R4时,就用改变路由报文,把这个情况告诉主机,于是H1就在自己的路由表中添加一个项目,到达N2应经过路由器R4,而不是默认网关R1。之后H1要发往N2的IP数据报,都会传输给R4由其帮忙转发。
需要注意的是以下情况不应发送ICMP差错报告报文:
- 对ICMP差错报告报文,不再发送ICMP差错报告报文。
- 对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文,
- 对具有多播地址的数据报,都不发送ICMP差错报告报文
- 对具有特殊地址,例如127.0.0.0或0.0.0.0的数据报,不发送ICMP差错报告报文。
接下来我们介绍常见的两种ICMP询问报文:
接下来我们介绍利用ICMP协议的两个典型应用:
- 一个是分组网间探测PING(Packet Internet Groper)
- 另一个是跟踪路由
首先来看分组网间探测,该应用用来测试主机或路由器之间的连通性,其应用层直接使用网际层的ICMP协议,而不通过运输层的TCP或UDP协议。所使用的ICMP报文类行为回送请求和回答,如下所示:
再来看跟踪路由,该应用用来测试IP数据报,从源主机到达目的主机要经过哪些路由器,在该应用的WINDOWS版本中,具体命令为tracert。其应用层直接使用网际层的ICMP协议,所使用的ICMP报文类型有回送请求和回答报文以及差错报告报文。在该应用的UNIX版本中,具体命令为traceroute、其在运输层使用UDP协议,在网际层使用的ICMP报文类型,只有差错报告报文。
请大家思考一下 tracert命令的实现源理是什么?
我们来举例说明:
-
假设主机H1想知道到达主机H2要经过哪些路由器,H1就给H2发送ICMP回送请求报文,该报文被封装在IP数据报中,IP数据报首部中生存时间字段TTL的值被设置为1,该IP数据报到达R1后,其生存时间减1,结果为0。R1丢弃该数据报,并向发送该数据报的源主机H1,发送ICMP差错报告报文,其类型为时间超过,这样 H1就知道了到达H2的路径中的第一个路由器
-
H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中生存时间字段TTL的值被设置为二,经过R1的转发后,该数据包的生存时间减少为一,该IP数据报到达R2后,其生存时间减1,结果为0,R2丢弃该数据报,并向发送该数据报的源主机H1,发送ICMP差错报告报文,其类型为时间超过这样 H1就知道了到达H2的路径中的第二个路由器
-
H1继续发送下一个封装有ICMP回送请求报文的IP数据报,其首部中生存时间字段TTL的值被设置为三,经过R1和R2的转发后,该数据报到达主机H2,其生存时间减少为一,H2解析该数据报,发现其内部封装的是ICMP回送请求报文,于是就给H1发送封装有ICMP回送请求回答报文的IP数据报,这样 H1就知道已经跟踪到路径中的最后一站,也就是目的主机H2
内容小结如下:
虚拟专用网VPN与网络地址转换NAT
这里我们介绍虚拟专用网VPN(Virtual Private Network)
和网络地址转换NAT
的基本工作原理。
首先介绍虚拟专用网VPN的基本工作原理,来看这个例子,假设这是某机构部门A的局域网,这是该机构部门B的局域网,部门A的局域网位于北京,部门B的局域网位于上海,那么如何才能让这两个专用网络可以通信?
一种方法是租用电信公司的通信线路,这种方法简单方便,但是租金很高。
另一种方法是利用公用的因特网作为本机构各专用网之间的通信载体,这样形成的专用网要称为虚拟专用网。
那么虚拟专用网中的各主机应该分配怎样的IP地址?由于IPv4地址的紧缺,一个机构能够申请到的IPv4地址数量往往远小于本机构所拥有的主机数量。因此虚拟专用网中的各主机所分配的地址应该是无需申请,就可由本机构自由分配的专用地址,而不是需要申请的在因特网上使用的公有地址
我们可以在因特网数字分配机构IA NA的官方网站,查看IPVC地址空间中特殊地址的分配方案,这三个地址块中的地址,就是无需申请的可自由分配的专用地址或称私有地址。
我们给部门A的专用网分配的私有地址的网络号为10.1.0.0,给部门B的专用网分配的私有地址的网络号为10.2.0.0。两个专用网装各主机所分配的私有地址如图所示,需要注意的是私有地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信。换句话说,私有地址只能用作本地地址,而不能用作全球地址。在因特网中的所有路由器,对目的地址是私有地址的IP数据报,一律不进行转发。很显然部门A和B各自至少需要一个路由器,具有合法的全球IP地址,这样他们各自的专用网才能利用公有的因特网进行通信。
假设部门A中的这台主机要给部门B中的另一台主机发送数据,它会将待发送数据封中成内部IP数据报,发送给路由器R1,其首部中源地址字段的值为部门A中该主机的IP地址,目的地址字段的值为部门B中另一台主机的IP地址。R1收到该数据报后,发现其目的网络必须通过因特网才能到达,就将该内部IP数据报进行加密,这样就确保了内部IP数据报的安全,然后重新添加上数据报的首部,封装成为在因特网上发送的外部数据报,且首部中源地址字段的值为路由器R1的全球地址,目的地址字段的值为路由器R2的全球地址。
路由器R2收到该外部IP数据报后,去掉其首部,将其数据部分进行解密,恢复出源来的内部IP数据报,这样就可以从其首部提取出源地址和目的地址,根据目的地址将该内部IP数据报发送给相应的主机。很显然两个专用网内的主机间发送的数据报是通过了公用的因特网,但在效果上好像是在本机构的专用网上传送一样
数据报在因特网中可能要经过多个网络和路由器,但从逻辑上看,R1和R2之间好像是一条直通的点对点链路,因此也被称为IP隧道技术。
- 本地属于同一机构内不同部门的内部网络所构成的虚拟专用网,这就称为内联网VPN。
- 有时一个机构的虚拟专用网需要某些外部机构参加进来,这样的虚拟专用网又称为外联网VPN。
- 在外地工作的员工需要访问公司内部的专用网络时,只要在任何地点接入到因特网,运行驻留在员工PC中的VPN软件,在员工的PC和公司的主机之间建立VPN隧道,即可访问专用网络中的资源,这种虚拟专用网又称为远程接入VPN。相信很多同学寒暑假在家中要远程访问校园网内的某些资源时,就要使用过远程接入VPN这种技术。
接下来我们介绍网络地址转换NATNetwork Address Translation)
的基本工作源理。
虽然因特网采用了无分类编制方式,来减缓IP地址空间耗尽的速度,但是由于因特网用户数目的激增,特别是大量小型办公室网络和家庭网络接入因特网的需求不断增加,IPv4地址空间即将面临耗尽的危险,仍然没有被解除。
1994年提出了一种网络地址转换的方法,再次缓解了IPv4地址空间即将耗尽的问题。NAT能使大量使用内部专用地址的专用网络用户,共享少量外部全球地址来访问因特网上的主机和资源。
我们来举例说明,图中的专用网络使用私有网络号192.168.0.0,该网络中各主机的私有地址如图所示,那么使用私有地址的主机如何才能与因特网上使用全球IP地址的主机进行通信呢?
这需要在专用网络连接到因特网的路由器上,安装NAT软件,装有NAT软件的路由器,叫做NAT路由器
,它至少有一个有效的外部全球IP地址,这样所有使用私有地址的主机在和外界通信时都要在NAT路由器上将其私有地址转换成全球IP地址。
我们来举例说明,假设使用私有地址的该主机要给因特网上使用全球IP地址的另一台主机发送IP数据报,该主机将数据报发送给NAT路由器,数据报首部中源地址字段的值为该主机的私有地址,目的地址字段的值为因特网上另一台主机的全球地址。NAT路由器从自己的全球IP地址池中为该主机分配一个临时的全球IP地址 172.38.1.5,并将IP数据报的源地址修改为该地址,然后将私有地址与全球地址的对应关系记录在NAT转换表中,之后就可以转发该IP数据报了。请注意此时该IP数据报中的源地址和目的地址都是全球IP地址,如图所示:
因特网上的这台主机给源主机发回数据报,数据报的源地址和目的地址都是全球IP地址,如图所示。NAT路由器收到该IP数据报后,在NAT转换表中进行查找,发现该数据报的目的地址所对应的私有地址为192.168.0.2,于是就将该数据报的目的地址修改为192.168.0.2,并将其发送给相应的主机。请注意此时该IP数据包中的源地址为因特网上那台主机的全球IP地址,而目的地址为专用网络中这台主机的私有地址如图所示。
当专用网中的这两台使用私有地址的主机,都要给因特网上使用全球地址的另一台主机发送数据报时,在NAT路由器的NAT转换表中就会产生两条记录,分别记录两个私有地址与两个全球地址的对应关系。
这种基本转换方法存在这样一个问题。如果NAT路由器具有N个全球IP地址,那么至多只能有N个内网主机,能够同时和因特网上的主机通信。
由于绝大多数的网络应用都是使用运输层协议TCP或UDP来传送数据,因此可以利用运输层的端口号和IP地址一起进行转换,这样用一个全球IP地址就可以使多个拥有本地地址的主机,同时和因特网上的主机进行通信,这种将端口号和IP地址一起进行转换的技术,叫做网络地址与端口号转换NAPT
如图所示,这是本例中的NAPT路由器,这是它的全球IP地址,这是它的NAPT转换表中的部分内容:
实际上现在很多家用路由器都是这种NAPT路由器
请大家思考这样一个问题:内网主机与外网主机间的通信是否能由外网主机首先发起?
答案是否定的,如果由外网主机首先发起,那么当NAPT路由器收到来自外网的IP数据报后,在NAPT转换表中找不到相应的记录,也就无法把数据报转发给内网中的主机,因此需要私有地址的主机不能直接充当因特网服务器。对于一些点对点网络应用,需要外网主机主动与内网主机进行通信,在通过NAT时也会遇到问题,需要网络应用自己使用一些特殊的NAT穿越技术来解决问题。
另外由于NAT对外网屏蔽了内网主机的网络地址,因此能为内网主机提供一定的安全防护。我们前面提到过的ICMP协议的典型应用Tracert,可以看到其中有两个路由器使用了相同的IP地址,这很可能是内网出外网的路由器使用了NAT,并且内网中还有一个使用私有IP地址的路由器:
内容小结:
相关文章:
【计算机网络】网络层
文章目录网络层概述网络层提供的两种服务IPv4地址IPv4地址概述分类编址的IPv4地址划分子网的IPv4地址无分类编址的IPv4地址IPv4地址的应用规划IP数据报的发送和转发过程静态路由配置及其可能产生的路由环路问题路由选择路由选择协议概述路由信息协议RIP的基本工作原理开放最短路…...
产品经理知识体系:1.什么是互联网思维?
互联网思维 思考 笔记 用户思维 是要注重用户体验,产品带给用户的价值是什么,是能帮助用户获取想要的商品、解决生活中的问题、获取想要的信息,还是产品能通过兜售参与感、满足感等来满足用户的心理需求。 贯穿产品的整个生命周期过程。 简…...
【数据结构】单链表的接口实现(附图解和源码)
单链表的接口实现(附图解和源码) 文章目录单链表的接口实现(附图解和源码)前言一、定义结构体二、接口实现(附图解源码)1.开辟新空间2.头插数据3.头删数据4.打印整个单链表5.尾删数据6.查找单链表中的数据7…...
TikTok话题量超30亿,这款承载美好记忆的剪贴簿引发讨论
回忆风剪贴簿在TikTok引起关注小超在浏览超店有数后台时发现,有一款平平无奇的剪贴簿的种草视频爆火,在24h内收获了9.9K点赞,播放量更是突破了100W,直接冲到了【种草视频飙升榜】第六名的位置,并且这个数字目前仍在继续…...
了解Dubbo
1.注册中心挂了,消费者还能不能调用生产者? 注册中心挂了, 消费者依然可以调用生产者。生产者和消费者都会在本地缓存注册中心的服务列表,当注册中心宕机时,消费者会读取本地的缓存数据,直接访问生产者&am…...
2023年前端面试知识点总结(JavaScript篇)
近期整理了一下高频的前端面试题,分享给大家一起来学习。如有问题,欢迎指正! 1. JavaScript有哪些数据类型 总共有8种数据类型,分别是Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt Null 代表的含义是空对象…...
jQuery
文章目录jQuery 介绍初体验核心函数jQuery 对象和 dom 对象区分什么是 jQuery 对象,什么是 dom 对象问题:jQuery 对象的本质是什么?jQuery 对象和 Dom 对象使用区别Dom 对象和 jQuery 对象互转(重点)jQuery 选择器&…...
强化学习基础概念
强化学习入门 入门学习第一周:基础概念 经验回放: 将sss,agent当前步的action环与境的交互rrr以及下一步的状态st1s_{t1}st1组成的四元组[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wxhVd0dn-1676710992983)(null)] 组…...
Redis学习【9】之Redis RDB持久化
文章目录一 AOF(Append Only File) 持久化二 AOF 基础配置2.1 AOF的开启2.2 文件名配置2.3 混合式持久化开启2.4 AOF 文件目录配置三 AOF 文件格式3.1 Redis 协议3.2 查看 AOF 文件3.3 清单文件3.4 Rewrite 机制3.4.1 rewrite简介3.4.2 rewrite 计算策略3.4.3 手动开启 rewrite…...
分析 vant4 源码,学会用 vue3 + ts 开发毫秒级渲染的倒计时组件,真是妙啊
2022年11月23日首发于掘金,现在同步到公众号。11. 前言大家好,我是若川。推荐点右上方蓝字若川视野把我的公众号设为星标。我倾力持续组织了一年多源码共读,感兴趣的可以加我微信 lxchuan12 参与。另外,想学源码,极力推…...
事件驱动型架构
事件驱动型架构是一种软件设计模式,其中微服务会对状态变化(称为“事件”)作出反应。事件可以携带状态(例如商品价格或收货地址),或者事件也可以是标识符(例如,订单送达或发货通知&a…...
20222023华为OD机试 - 不含 101 的数(Python)
不含 101 的数 题目 小明在学习二进制时,发现了一类不含 101 的数, 也就是将数字用二进制表示,不能出现 101 。 现在给定一个正整数区间 [l,r],请问这个区间内包含了多少个不含 101 的数? 输入 输入一行,包含两个正整数 l l l, r r r...
杭州电子科技大学2023年MBA招生考试成绩查询和复查申请的通知
根据往年的情况,2023杭州电子大学MBA考试初试成绩可能将于2月21日公布,最早于20号出来,为了广大考生可以及时查询到自己的分数,杭州达立易考教育为大家汇总了信息。根据教育部和浙江省教育考试院关于硕士研究生招生考试工作的统一…...
电子技术——CS和CE放大器的高频响应
电子技术——CS和CE放大器的高频响应 在绘制出MOS和BJT的高频响应模型之后,我们对MOS和BJT的高频响应有了进一步的认识。现在我们想知道的是在高频响应中 fHf_HfH 的关系。 高频响应分析对电容耦合还是直接耦合都是适用的,因为在电容耦合中高频模式下…...
2023年数学建模美赛D题(Prioritizing the UN Sustainability Goals):SDGs 优先事项的选择
正在写,不断更新,别着急。。。 4. SDGs 优先事项的选择 4.1 基于SDG密度分布图选择优先事项 虽然每个可持续发展目标的接近度矩阵和中心性度量的结果是通用的,并创建了基本的可持续发展目标网络,但由于各国在网络的不同部分取得…...
springboot实现项目启动前的一些操作
在服务启动时,做一些操作,比如加载配置,初始化数据,请求其他服务的接口等。 有三种方法: 第一种是实现CommandLineRunner接口 第二种是实现ApplicationRunner接口 第三种是使用注解:PostConstruct 三者使用…...
详解JavaScript的形参,实参以及传参
文章目录 前言一、参数是什么?二、形参和实参 1.形参 2.实参三、传参 1.参数传递的对应关系2.两个传参的例子 总结前言 编程初学者在接触JavaScript这门语言时,很难搞懂里面的逻辑,这就会导致入门慢,入门难。这种难度一般…...
Vue中的diff算法
diff算法介绍 diff算法是一种高效对比算法。diff算法在组件更新即响应式数据监控到数据的改变,重新生成虚拟DOM树的时候调用,然后通过diff算法计算出前后虚拟dom树的差异点,更新dom时只更新变化的部分。 直接比较和修改两个数的复杂度为什么…...
【面试题】前端春招第二面
不容错过的一些面试题小细节,话不多说,直接看题~大厂面试题分享 面试题库后端面试题库 (面试必备) 推荐:★★★★★地址:前端面试题库HTML/CSS/Javascript/ES篇(1)标准盒模型和怪异盒…...
Pytorch 基础之张量数据类型
学习之前:先了解 Tensor(张量) 官方文档的解释是: 张量如同数组和矩阵一样, 是一种特殊的数据结构。在PyTorch中, 神经网络的输入、输出以及网络的参数等数据, 都是使用张量来进行描述。 说白了就是一种数据结构 基本数据类型…...
Java 基础面试题——常见类
目录1.String 为什么是不可变的?2.字符串拼接用“” 和 StringBuilder 有什么区别?3.String、StringBuffer 和 StringBuilder 的区别是什么?4.String 中的 equals() 和 Object 中的 equals() 有何区别?5.Object 类有哪些常用的方法?6.如何获…...
Windows 系统从零配置 Python 环境,安装CUDA、CUDNN、PyTorch 详细教程
文章目录1 配置 python 环境1.1 安装 Anaconda1.2 检查环境安装成功1.3 创建虚拟环境1.4 进入/退出 刚刚创建的环境1.5 其它操作1.5.1 查看电脑上所有已创建的环境1.5.2 删除已创建的环境2 安装 CUDA 和 CUDNN2.1 查看自己电脑支持的 CUDA 版本2.2 安装 CUDA2.3 安装 CUDNN2.4 …...
[REDIS]redis的一些配置文件
修改配置文件 vim /etc/redis/redis.conf目录 protected-mode tcp-backlog timeout tcp-keepalive daemonize pidfile loglevel databases 设置密码 maxclients maxmemory maxmemory-policy maxmemory-samples 默认情况下 bind127.0.0.1 只能接受本机的访问请求。在不写的情况…...
Java反序列化漏洞——CommonsCollections4.0版本—CC2、CC4
一、概述4.0版本的CommonsCollections对之前的版本做了一定的更改,那么之前的CC链反序列化再4版本中是否可用呢。实际上是可用的,比如CC6的链,引入的时候因为⽼的Gadget中依赖的包名都是org.apache.commons.collections ,⽽新的包…...
下载网上压缩包(包含多行json)并将其转换为字典的解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。喜欢通过博客创作的方式对所学的知识进行总结与归纳,不仅形成深入且独到的理…...
【郭东白架构课 模块一:生存法则】11|法则五:架构师为什么要关注技术体系的外部适应性?
你好, 我是郭东白。 前四条法则分别讲了目标、资源、人性和技术周期,这些都与架构活动的外部环境有关。那么今天我们来讲讲在架构活动内部,也就是在架构师可控的范围内,应该遵守哪些法则。今天这节课,我们就先从技术体…...
Mindspore安装
本文用于记录搭建昇思MindSpore开发及使用环境的过程,并通过MindSpore的API快速实现了一个简单的深度学习模型。 什么是MindSpore? 昇思MindSpore是一个全场景深度学习框架,旨在实现易开发、高效执行、全场景覆盖三大目标。 安装步骤 鉴于笔者手头硬…...
C++010-C++嵌套循环
文章目录C010-C嵌套循环嵌套循环嵌套循环举例题目描述 输出1的个数题目描述 输出n行99乘法表题目描述 求s1!2!...10!作业在线练习:总结C010-C嵌套循环 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 嵌套循环 循环可以指挥计算机重复去…...
设计模式之迭代器模式与命令模式详解和应用
目录1 迭代器模式1.1 目标1.2 内容定位1.3 迭代器模式1.4 迭代器模式的应用场景1.5 手写字定义的送代器1.6 迭代器模式在源码中的体现1.7 迭代器模式的优缺点2 命令模式2.1 定义2.2 命令模式的应用场景2.3 命令模式在业务场景中的应用2.4 命令模式在源码中的体现2.5 命令模式的…...
【QA】[Vue/复选框全选] v-model绑定每一项的赋初值问题
发生场景:不只是复选框的状态改变,还有的功能要用到复选框的选中状态,比如:购物车计算总价,合计等等。 引入:复选框 checkbox 在使用时,需要用v-model绑定布尔值,来获取选中状态&…...
网站官网建设企业/全网推广代理
2019独角兽企业重金招聘Python工程师标准>>> 浏览器禁止js跨域取数据,可能在两个方面防止,一是ajax取数据的时候发现不是同源,阻止获取数据;另外一种是ajax获取了数据,但是浏览器禁止这些数据在当前域下显示…...
国外网站空间放置成人内容/软文如何推广
神经网络计算中不同精度的浮点数对计算速度和准确度的影响 神经网络计算是目前人工智能领域中最常见的任务之一,而浮点数是神经网络中最为常用的数据类型。在神经网络中,通常使用float32作为默认的浮点数精度。但是,随着神经网络的规模增加,计算需求也越来越高,使用更低精…...
wordpress 网页加载慢/惠州优化怎么做seo
很多朋友在把电脑换成windows 7系统后,想设置屏保时却发现win7的跟xp的屏保设置位置不一样,一时之间不知道在哪里设置了。现在,就让我来告诉你Windows 7屏保在哪里设置吧!1、右键点击桌面2、选择最下面的“个性化”3、在弹出窗口找…...
app大全/北京网站优化多少钱
好久都没搞这个了,都快忘了,我记得可以不用直接修改,可以直接查看的 1,下载一个pe 太多种类了,不一一介绍,随便搞一个,功能都一样...
网站建设管理与政府/超级优化大师下载
期待着,盼望着,五一劳动节终于要到来了!开心!让我们欢呼雀跃! 小编此时此刻的心情,无法形容,唯有吟诗一首: 啊!劳动节~~ 真高兴呀! 真高兴! 哎呀!…...
哈尔滨网站开发建设公司电话/搜索引擎营销方案例子
svn代码冲突,不能提交的解决方案参考文章: (1)svn代码冲突,不能提交的解决方案 (2)https://www.cnblogs.com/anzhao/p/3546541.html (3)https://www.codeprj.com/blog…...