林友贵机长照片:第七章 网络互连

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 22:52:05

网络互连

讨论网络互连问题,也就是讨论多个网络的各种问题。互联网的核心内容是网际协议IP,这是整个计算机网络的一个重要内容。只有较深入地掌握了IP的主要内容,才能理解因特网是怎样工作的。我们还要重点讨论因特网的路由选择协议,以及介绍因特网控制报文协议ICMP和因特网组管理协议IGMP。最后简要地讨论下一代的网际协议IPv6的主要内容。

    最重要的概念是:

(1)IP地址与物理地址的关系。

(2)传统的分类IP地址(包括子网掩码)和无分类域间路由选择CIDR。

(3)路由选择协议的工作原理。

请读者对上述概念务必弄清楚。

7.1 网络互连概述

7.1.1 路由器的作用和组成

在现实世界中,单一的网络无法满足各种用户的多种需求。因此,我们经常使用的计算机网络往往由许多种不同类型的网络互连而成。通常在谈到“互连”时,就已暗示这些通过各种网络互相连接的计算机不仅仅在物理上是连通的,更重要的是它们能进行通信。那么,这些网络是怎样连接起来的呢?是通过许许多多的路由器。路由器在网络互连中起着关键的作用。因此,我们要对路由器有更加深入一些的了解。下面先弄清两种不同的交付:直接交付和间接交付。

图7-1直接交付和间接交付

现在,主机A要把数据报发送给连接在另一个网络上的主机C。这时主机A应把数据报发送给本网络上的某个路由器(R1),由路由器R1按照转发表指出的路由把数据报转发给下一个路由顺(R2)。这就叫做间接交付。按照同样的方法,路由器R2又用间接交付的方法把数据报传送给另一个路由器R3。R3与目的主机C在同一个网络上,因此,最后一步就由路由器R3把数据报直接交付给目的主机C。

总之,A传送到B是直接交付,而A传送到C则要分几步走:A传送到R1,再传送到R2,然后传送到R3,这些都是间接交付,最后由R3传送到C才是直接交付。

 

 

下面讨论路由器的组成。

路由器是一种有多个输入端口和多个输出端口的专用计算机,其任务是转发组。也就是说,路由器某个输入端口收到分组后,按照分组要去的目的地(即目的网络),把该分组从某个合适的输出端口转发给下一跳路由器。下一跳路由器也按照这种方法处理分组,直到该分组到达目的地为止。路由器的转发分组正是网络层的主要工作。路由器框架如图7-2所示。

 

图7-2 典型的路由器结构

 

整个路由器结构可划分为两大部分,即路由选择部分和分组转发部分。

路由选择部分也叫做控制部分,其核心构件是路由选择处理机。路由选择处理机的任务是根据所选定的路由选择协议构建出路由表,同时经常地或定期地和相邻路由器交换路由信息,从而不断地更新和维护路由表。关于怎样根据路由选择协议构建和更新路由表,我们将在后面几节详细讨论。

分组转发部分是本节所要讨论的问题,它由3部分组成,即交换结构、一组输入端口和一组输出端口。下面分别讨论每一部分的组成。

交换结构又称为交换组织,它的作用就是根据转发表对分组进行处理,将某个输入端口进入的分组从一个合适的输出端口转发出去。交换结构本身就是一种网络,但这种网络完全包含在路由器之中,因此,交换结构可看成是“在路由器中的网络”。

在上一章已经提到过“转发”和“路由选择”的区别。在互联网中,“转发”就是路由器根据转发表将用户的IP数据报从合适的端口转发出去。但“路由选择”则是按照复杂的分布式算法,根据从各相邻路由器所得到的关于整个网络的拓扑变化情况,动态地改变所选择的路由。路由表是根据路由器选择算法得出的。因此,路由表一般仅饱含从目的网络到下一跳(以IP地址表示,下一节就讨论什么是IP)的映射。而转发表是从路由表得出的。转发表必须包含完成转发功能所必须的信息。这就是说,在转发表的每一行必须包含从要到达的目的的网络到输出端口和某些MAC地址信息(如下一跳的以太网地址)的映射。MAC地址需要通过ARP协议才能得出(这些内容将在7、2、3节介绍)。将转发表和路由表用不同的数据结构实现会带来一些好处,这是因为在转发分组时,转发表的结构应当使查找过程最优化,但路由表则需要对网络拓扑变化的计算最优化。路由表总是用软件实现的,但转发表甚至可用特殊的硬件来实现。请读者注意,在讨论路由选择的原理时,往往不去区分转发表和路由表的区别,而是笼统地使用路由表这一名词。

在路由器的输入和输出端口里面有3个方框,方框1、2、3分别代表物理层、数据链路层和网络层的处理模块。物理层进行比特的接收。数据链路层则按照链路层协议接收传送分组的帧。在将帧的首部和尾部剥去后,分组就被送入网络层的处理模块。若接收到的分组是路由器之间交换路由信息的分组(如RIP或OSPF分组等),则将这种分组送交路由器的路由选择部分中的路由选择处理机。若接收到的是数据分组,则按照分组首部中的目的地址查找转发表,根据得出的结果,分组就经过交换结构到达合适的输出端口。一个路由器的输入端口和输出端口就做在路由器的线路接口卡上。

输入端口中的查找和转发功能在路由器的交换功能中最重要。为了使交换功能分散化,往往将复制的转发表放在每一个输入端口中。路由选择处理机负责对各转发表的副本进行更新。

以上介绍的查找转发表和转发分组的概念虽然并不复杂,但在具体的实现中还是会遇到不少困难。问题就在于路由器必须以很高的速率转发分组。最理想的情况是输入端口的处理速率能够跟上线路将分组传送到路由器的速率。这种速率称为线速。可以粗略地估算一下。高线路是OC-48链路,即2.5Gbit/s。若分组长度为256字节,那么线速就应当达到每秒能够处理100万以上的分组。现在常用Mpps(百万分组每秒)为单位来说明一个路由器对收到的分组的处理速率有多高。在路由器的设计中,怎样提高查找转发表的速率已经成为一个十分重要的研究课题。

当一个分组正在查找转发表时,后面以紧跟着从这个输入端口收到另一个分组。这个后到的分组就必须在队列中排队等待,因而产生了一定的时延。如图7-3,给出了输入端口的队列中排队分组的示意图

图7-3 输入端口的对线路上收到的分组的处理

我们再来观察在输出端口上出现什么情况,如图7-3所示,输出端口从交换结构接收分组,然后把它们发送到路由器外面的线路上。在网络层的处理模块中设有一个缓存,实际上它就是一个队列。当交换结构传送过来的分组的速率超过输出链路的发送速率时,来不及发送的分组就必须暂时存放在这个队列中,数据链路层处理模块把分组加上链路层的首部和尾部,交给物理层发送到外部线路。

图7-3 输出端口的八交换结构传送过来的分组发送到线路上

 

从以上的讨论可以看出,分组在路由器的输入端口和输出端口都可能会在队列中排队等候处理。若分组处理的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组出于没有存储空间而只能被丢弃。以前我们提到分组丢失就是发生在路由器中的输入或输出队列产生溢出的时候。当然,设备或线路出故障也可能使分组丢失。

7.1.2 IP虚拟网

互连在一起的网络要进行通信,会遇到许多问题需要解决,如不同的寻址方案;不同的最大分组长度;不同的网络接入机制;不同的超时控制;不同的差错恢复方法;不同的状态报告方法;不同的路由选择技术;不同的用户接入控制;不同的服务(面向连接服务和无连接服务);不同的管理与控制方式等。

图7-5 互联网络的概念

为了解决上述的许多问题,因特网在IP层采用了标准化协议。图7-5(a)表示有许多计算机网络通过一些路由器进行互连。由于参加互连的计算机网络都使用相同的网际协议IP,因此,可以将互连以后的计算机网络看成一个虚拟互联网络(如图7-5(b))。所谓虚拟互联网络也就是逻辑互联网络,它的意思就是互连起来的各种物理网络的异构性本来就是客观存在的,但是我们利用IP就可以使这些性能各异的网络从用户看起来好像是一个统一的网络。这种使用IP的虚拟互联网络可简称为IP网。使用虚拟互联网络的好处是当互联网上的主机进行通信时,就好像在一个网络上通信一样,它们看不见互连的各个具体的网络的异构细节。本章讨论的所有问题都是在这样的虚拟网络上进行的。这种虚拟网络现在也称为互联网。

从下一节起开始讨论因特网的核心协议,即网际协议IP。

7.2 因特网的网际协议IP

网际协议IP是TCP/IP体系中两个最主要的协议之一,也是最重要的因特网标准协议。与IP配套使用的还有以下4个协议。

地址解析协议ARP

逆地址解析协议RARP

因特网控制报文协议ICMP

因特网组管理协议IGMP

 

如图7-6所示,画出了这4个协议和网际协议IP的关系。在这一层中,ARP和RARP画在最下面,因为IP经常要使用这两个协议。ICMP和IGMP画在这一层的上部,因为它们要使用IP。这4个协议将在后面陆续介绍。由于网际协议IP是用来使互连起来的许多计算机网络能够进行通信,因此,TCP/IP体系中的网络层常称为网际层(Internet layer),或IP层。

 

图7-6 网际网协议IP及其配套协议

7.2.1 分类IP地址

在TCP/IP体系中,IP地址是一个最基本的概念,一定要把它弄清楚。有关IP最重要的文档就是RFC 791,它很早就成为了因特网的正式标准。

  1. IP地址及其表示方法

我们把整个因特网看成一个单一的、抽象的网络。IP地址就是给每个连接在因特网上的主机分配一个在全世界范围是唯一的32位的标识符。IP地址的结构使我们可以在因特网上很方便地进行寻址。IP地址现在由因特网名字与号码指派公司进行分配。

IP地址的编址方法共经过了以下3个历史阶段。

(1)分类的IP地址.这是最基本的编址方法,在1981年就通过了相应的标准协议。

(2)子网的划分。这是对基本的编址方法的改进,其标准RFC950在1985年通过。

(3)构成超网。这是比较新的无分类编址方法。1993年提出后很快就得到推广和应用。

本节只讨论最基本的分类IP地址。后两种方法将在7、3节讨论。

所谓“分类的IP地址”就是将地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号,它标志主机所连接到的网络,而第二个字段是主机号,它标志该主机。或者说,这种两级的IP地址可以记为:

IP地址 ::={<网络号>,<主机号>}

“::=”表示“定义为”。如图7-7所示,给出IP地址的网络字段和主机号字段,其中A类、B类和C类是单播地址。

图7-7 IP地址中的网络号字段和主机号字段

从图7-7可以看出:

  1. A类、B类和C类地址的网络号字段分别为1字节、2字节和3字节长,而在网络号字段的最前面有1-3位的类别位,其数值分别规定为0,10,110。
  2. A类、B类和C类地址的主机号字段分别为3字节、2字节和1字节长。
  3. D类地址用于多播,主要留给因特网体系结构委员会IAB使用。而E类地址保留为以后用。

这里要指出,由于近年来已经广泛使用无分类IP地址进行路由选择,A类、B类和C类地址的区分已成为历史,但由于很多文献和资料都还使用传统的分类IP地址,因此我们在这里还要从分类的IP地址讲起。

路由器为转发分组而查找转发表时,很重要的一点就是查找路由表花费的时间要尽量短。在讨论广域网时已经讲过简化转发表的办法就是根据目的主机所连接的目的结点交换机的位置来寻找路由。当找到目的结点交换机后,就可直接交付给目的主机。在互联网中也是类似的。如果将到时达所有的目的主机的路由全都写入到转发表中,就会有很多路由是重复的,因此没有必要这样做。我们应将重复的路由合并。转发表只使用IP地址中的网络号来查找路由。只要IP数据报能够正确到达目的网络,就可在这个网络上直接交付给目的主机而不再需要经过其它路由器进行转发了。

因此,路由器转发分组有以下两个步骤。

(1)先按所要找的IP地址中的网络号把目的网络找到。虽然IP地址的网络号字段有3种不同的长度,但根据IP地址中最前面的类别位,就可以很容易地确定网络字段的准确字节数。然而以后我们会知道还有更加简便的方法。

(2)当分组到达目的网络后,再利用主机号将数据报直接交付给目的主机。

因此,按照整数字节划分网络号字段和主机号字段,就可以使用路由器在收到一个分组时能够更快地将地址中的网络号提取出来。

从IP地址的结构来看,IP地址并不仅仅是一个主机的号,而是指出了连接到某个网络上的某个主机。如果一个主机的地理位置保持不变,但现在只改变连接的线路,既连接到另一个网络,那么这个主机的IP地址就必须改变。

把IP地址划分为3个类别,当初是这样考虑的。各种网络的差异很大,有的网络拥有很多主机,而有的网络上的主机则很少。把IP地址划分为A类、B类和C类可更好地满足不同用户的要求。A类IP地址的网络号数不多。现在能够申请到的IP地址只有B类和C类两种。当某个单位申请到一个IP地址时,实际上是获得了具有同样网络号的一块地址。其中具体的各个主机号则由该单位自行分配,只要做到在该单位管辖的范围内无重复的主机号即可。

在主机或路由器中存放的IP地址都是32位的二进制代码。为了提高可读性,在写出给人看的IP地址时,往往每隔8位插入一个空格,但这样还是不方便。于是,我们常常将32位的IP地址中的每8位用其等效的十进制数字表示,并且在这些数字之间加上一个点。这就叫做点分十进制记法。例如图7-8所示。

图7-8 采用点分十进制记法能够提高可读性

  1. 常用的3种类别的IP地址

A类地址的网络号字段占一个字节,只有7位可供使用,但可提供使用的网络号是126个。减2的原因有两个。第一,IP地址中的全0表示“这个”。网络号字段为全0的IP地址是个保留地址,意思是“本网络”。第二,网络号字段为127保留作为本地软件环回测试本主机之用。A类地址的主机号字段为3个字节,因此,每一个A类网络中的最大主机数是2*24-2,即1677214。这里减2的原因是全0的主机号字段表示该IP地址是“本主机”所连接到的单个网络地址,而全1表示“所有的”,因此,全1的主机号字段表示该网络上的所有主机。

IP地址空间共有2*32(4294967296)个地址。整个A类地址空间共有2*31个地址,占有整个IP地址空间的50%。

B类地址的网络号字段有2字节,但前面两位已经固定了,只剩下14位可以进行分配。虽然这里不存在网络总数减2的问题,因为网络号字段最前面的两位子使得后面的14位无论怎样排列也不可能出现使整个2字节的网络号字段成为全0或全1。但实际上B类网络地址128.0.0.0是不指派的,而可以指派的B类最小网络地址是128.1.0.0。因此,B类地址的可用网络数为2*14-1,即16383。B类地址的每一个网络上最大主机数是2*16-2,即65534。这里减2是因为要扣除全0和全1的主机号。整个B类地址空间共约有2*30个地址,占整个IP空间的25%。

C类地址有3个字节的网络号字段,最前面的3位是110,还有21位可以进行分配。虽然这里也不存在网络总额减2的问题,但C类网络地址192.0.0.0也是不指派的,可以指派的C类最小网络地址是192.0.1.0,因此,C类地址的可用网络总数是2*21-1,即2097151。每一个C类地址的最大主机数是2*8-2,即254。整个C类地址空间共约有2*29个地址,占整个IP地址的12.5%。

这样一我们就可以得出表7-1所示的IP地址三十一范围。

IP地址具有以下一些重要特点。

(1)每一个IP地址都由网络号和主机号两部分组成。从这个意义上说,IP地址是一种分等级的地址结构。分两个等级的好处主要有以下两个方面。第一,IP地址管理机构在分配IP地址时只分配网络号,而剩下的主机号则由得到该网络号的单位自行分配。这样就方便了IP地址的管理。第二,路由器根据目的主机所连接的网络号来转发分组(而不考虑主机号),这样就可以使路由表中的项目大幅度减少,从而减小了路由表所占的存储空间。

(2)实际上IP地址是标志一个主机(或路由器)和一条链路的接口。当一个主机同时连接到两个网络上时,该主机就必须有两个相应的IP地址,其网络号必须是不同的。这种主机称为多归属主机。由于一个路由器至少应当连接到两个网络(这样它才能把IP数据报从一个网络转发到另一个网络),因此,一个路由器至少应当有两个不同的IP地址。

(3)按照因特网的观点,用转发器或网桥连接起来的若干个局域网仍为一个网络,因此,这些局域网都有同样的网络号。

(4)在IP地址中,所有分配到网络号的网络都是平等的。

7.2.2 IP地址与硬件地址

在学习IP地址时,很重要的一点就是要弄懂主机的IP地址和硬件地址的区别。

图7-10说明了这两种地址的区别。从层次的角度看,物理地址是数据链路层使用的地址,而IP地址是虚拟互联网络所使用的地址,即网络层和以上各层使用的地址。

 

图7-10 IP地址与硬件地址的区别

 

在发送数据时,数据从高层下到低层,然后才到通信链路上传输。使用IP地址的IP数据报一旦交给了数据链路层,就被封装成MAC帧了。MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧的首部中。

连接在通信链路上的设备在接收MAC帧时,其根据是MAC帧首部中的硬件地址。在数据链路层看不见隐藏在MAC帧的数据中的IP地址。只有在剥去MAC帧的首部和尾部,再将MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。

总之,IP地址放在IP数据报的首部,而硬件地址则放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层使用的是硬件地址。在图7-10中,当IP数据报放入数据链路层的MAC帧中以后,整个的IP数据报就成为MAC帧的数据,因而在数据链路层看不见数据报的IP地址。

如图7-11(a)所示,画的是3个局域网用两个路由器R1和R2互连起来。现在主机H1要和主机H2通信。这两个主机的IP地址分别是IP1和IP2,而它们硬件地址分别为HA1.和HA2(HA表示Hardware Address)。通信的路径是H1→经过R1转发→再经过R2转发→H2。路由器R1因同时连接到两个局域网上,所以,它有两个硬件地址,即HA3和HA4。同理,路由器R2也有两个矹件地址HA5和HA6。

图7-10 从不同层次上看IP地址和硬件地址

7.2.3 地址解析协议ARP和逆地址解析协议RARP

上面讲的IP地址是不能直接用来通信的。这是因为IP地址只是主机在抽象网络层中的地址。若要把网络层传送的数据报交给目的主机,还在传到链路层转变成MAC帧后才能发送到实际的网络上。因此,不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。

因为IP地址有32位,而局域网的硬件地址是48位,所以,它们之间不存在简单的映射关系。此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网卡也会使主机的硬件地址改变。可见,在主机中应存放一个从IP地址到硬件地址的映射表,并且这个映射表还必须能够经常动态更新。地址解析协议ARP很好地解决了这些问题。

每一个主机都有一个ARP高速缓存,里面有所在的局域网上的各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。那么主机怎样知道这些地址呢?我们可以通过下面的例子来说明。当主机A欲向本局域网上的某个主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。

也有可能查不到主机B的IP地址的项目。这可能是主机B才入网,也可能是主机A刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤找到主机B的硬件地址。

(1)ARP进程在本局域网上广播发送一个ARP请求分组。图7-11(a) 是ARP请求分组的主要内容是表明:“我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18。我想知道IP地址为209.0.0.6的主机的硬件地址。”

图7-11 地址解析协议ARP的工作原理

(2)在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。

(3)主机B在ARP请求分组中见到自己的IP地址,就向主机A发送ARP响应分组,并写入自己的硬件地址。其余的所有主机都不理睬这个ARP请求分组,ARP响应分组主要内容是表明:“我的IP地址是209.0.0.6,硬件地址是08-00-2B-00-EE-0A。”请读者注意,虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。

(4)主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射。

当主机A向主机B发送数据报时,很可能以后不久主机B还要向A发送数据报,因而主机B也可能要向A发送ARP请求分组。为了减少网络上的通信量,主机A发送其ARP请求分组时,就将自己的IP地址到硬件地址的映射写入ARP请求分组。当主机B收到A的ARP请求分组时,就将主机A的这一地址映射写入主机B自己的ARP高速缓存中。这对主机B以后向A发送数据报时就更方便了。

可见,ARP高速缓存非常有用。如果不使用ARP高速缓存,那么任何一个主机只要进行一次通信,就必须在网络上用广播方式发送ARP请求分组,这就使得网络上的通信量大大增加。ARP把已经得到的地址映射保存在高速缓存中,这样就使得该主机下次再和具有同样目的地址的主机通信时,可以直接从高速缓存中找到所需的硬件地址,而不必再用广播方式发送ARP请求分组。

ARP把保存在高速缓存中的每个映射地址项目都设置生存时间。凡超过生存时间的项目就从高速缓存中删除掉。设置这种地址映射项目的生存时间是很重要的。设想有一种情况,主机A和主机B通信。A的ARP高速缓存是保存有B的物理地址。但B的网卡突然坏了,B立即更换了一块,因此B的硬件地址就改变了。A还要和B继续通信。A在其ARP高速缓存中查找到B原先的硬件地址,并使用该硬件地址向B发送数据帧。但B原先的硬件地址已经失效了,因此A无法找到主机B。但是过了一段时间,A的ARP高速缓存中已经删除了B原先的硬件地址,于是A重新广播发送ARP请求分组,又找到了B。

这里需要指出,ARP是解决同一个局域网上的主机或路由器的IP地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,就不能直接找到主机的硬件地址。

这里我们还要指出,这种从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个已知IP地址的主机或路由器进行通信,ARP协议就会自动把这个IP地址解析为链路层所需要的硬件地址。

有的读者可能会产生这样的疑问,既然在网络链路上传送的帧最终是按照硬件地址找到目的主机的,那么为什么我们不直接使用硬件地址进行通信,而是要使用抽象的IP地址并调用ARP来寻找出相应的硬件地址呢?

这个问题必须弄清楚。

因为,全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,所以,要做到这些几乎是不可能的事。但统一的IP地址把这个复杂问题解决了。连接到因特网的主机都拥有统一的IP地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为调用ARP来寻找某个路由器或主机的硬件地址都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。

设想有两个主机可以直接使用硬件地址进行通信。再假定其两个主机的网卡都同时坏了,然后又都更换了一块,因此它们的硬件地址也都改变了。这时,这两个主机怎么能够知道对方的硬件地址呢?显然很难。但IP地址独立于主机或路由器的硬件地址的。硬件地址的改变不会影响使用IP的主机的通信。

因此,在虚拟的IP网络上用IP地址进行通信给广大的计算机用户带来方便。

在进行地址转换时,有时还要用到逆地址解析协议RARP使中知道自己硬件地址的主机能够知道其IP地址。这种主机往往是无盘工作站。这种无盘工作站一般只要运行其ROM中的文件传送代码,就可用下行装载方法从局域网上其他主机得到所需要的操作系统和TCP/IP通信软件,但这些软件中并没有IP地址。无盘工作站要运行ROM中的RARP来获得其IP地址。RARP的工作过程大致如下。

为了使RARP能工作,在局域网上至少有一个主机要充当RARP服务器,无盘工作站先向局域网发出RARP请求分组,并在此分组中给出自己的硬件地址。

RARP服务器有一个事先做好的从无盘工作站的硬件地址到IP地址的映射表,当收到RARP请求分组后,RARP服务器就从这映射表查出该无盘工作站的IP地址。然后写入RARP响应分组,发回给无盘工作站。无盘工作站用此方法获得自己的IP地址。

ARP和RARP都已经成为因特网标准协议,其RFC文档分别为RFC826和RFC903。

7.2.4 IP数据报格式

IP数据报的格式能够说明IP都有什么功能。在TCP/IP的标准中,各种数据格式常以32位为单位来描述。图7-12是IP数据报的完整格式。

图7-12 IP数据报的格式

 

如图7-12所示,一个IP数据报由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分后面是一些可选字段,其长度是可变的。下面介绍首部各字段的意义。

1、IP数据报首部的固定部分中的各字段

(1)版本 占4位,指IP的版本。通信双方使用的IP的版本必须一致。目前,广泛使用的IP版本号为4(即IPv4)。

(2)首部长度 占4位,可表示的最大数值是15个单位(一个单位为4字节),因此,IP的首部长度的最大值是60字节。当IP分组的首部长度不是4字节的整数时,必须利用最后的填充字段加以填充。因此,数据部分永远在4字节的整数倍时开始,这样在实现IP时较为方便。首部长度限制为60字节的缺点是有时(如源站路由选择)不够用。但这样做是希望用户尽量减少开销。最常用的首部长度就是20字节,即不使用任何选项。

(3)区分服务 占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务。只要当使用区分服务时,这个字段才起作用。在一般的情况下不使用这个字段[RFC2474]。

(4)总长度 占16位,指首部和数据之和的长度,单位为字节。总长度字段为位,因此数据报的最大长度为65535字节(64KB)。

在IP层下面的每一种数据链路层都有其自己的帧格式,其中包括帧格式中的数据字段的最大长度,这称为最大传送单元MTU。当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层的MTU值。

虽然使用尽可能的数据报会使传输效率提高,但由于以太网的普遍应用,所以实际上使用的数据报长度很少有超过1500字节的,而有时数据报长度还被限制在576字节。当数据报长度超过网络所容许的最大传送单元MTU时,就必须将过长的数据报进行分片后才能在网络上传送。这时,数据报首部中的“总长度”字段不是指未分片前的数据报长度,而是批分片后每片的首部长度与数据长度的总和。

(5)标识 占16位,它是一个计数器,用来产生数据报的标识。但这里的“标识”并没有序号的意思,因为IP是无连接服务,数据报不存在按序接收的问题。当IP发送数据报时,它就把这个计数器的当前值复制到标识字段中。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

(6)标志 占3位。目前只有前两位有意义。

标志字段中的最低位记为MF。MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。

标志字段中间的一位记为DF,意思是“不能分片”。只有当DF=0时才允许分片。

(7)片偏移 占13位。片偏移指出,较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。

(8)生存时间 占8位,生存时间字段记为TTL,即数据报在网络中的寿命。设置这个字段是防止数据报无限期地在因特网中兜圈子,因而消耗大量网络资源。最初是设想在数据报每经过一个路由器时,就把生存时间TTL减少一个单位的时间。当TTL值减为零时,就丢弃这个数据报。

因为因特网中的各路由器并没有进行时钟同步,而数据报在路由器中排队的时间也越来越短,所以具体实现TTL还是比较困难。现在已经把TTL字段的功能改为“路数限制”,但名称仍然不变。路由器在每次转发数据报时,就把其TTL减1。若TTL值为零,就丢弃这个数据报。因此,现在TTL的意思就是规定了一个数据报在因特网中至多可以经过多少跳,这实际上就是规定了一个数据报在因特网中至多可以经过多少个路由器。如果把TTL值设置为1,就表示这个数据报只能在本局域网中传送,一传送到某个路由器就会被丢弃。

(9)协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个处理过程。

(10)首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。如把数据部分一起检验,计算的工作量就太大了。为了减小计算检验和的工作量,IP首部的检验和不采用复杂的CRC检验码,而采用下面的简单计算方法:在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算将所有16位字相加后,将得到的和的反码写入检验和字段。接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出错,并将此数据报丢弃。

(11)源地址 占4字节。

(12)目的地址 占4字节。

2、IP数据报首部的可变部分

IP首部的可变部分就是一个选项字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段长度可变,从1个字节到40个字节不等,取决于所选择的项目。某些选项项目只需要1个字节,它只包括1个字节的选项代码。但还有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。

增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。就的IP版本IPv6就把IP数据报首部长度做成固定的。因此,这里不再继续讨论这些选项的细节。有兴趣的读者可参阅RFC791。

7.2.5 IP层处理数据报的流程

在因特网中路由器的作用和第6章广域网中的结点交换机相似。但路由器和结点交换机还存在以下区别。

(1)路由器是用来连接不同的网络,而结点交换机只是在一个特定的网络中工作。

(2)路由器是专门用来转发分组的,而结点交换机还可接上许多个主机。

(3)路由器使用统一的IP,而结点交换机使用所在广域网的特定协议。

(4)路由器根据目的网络地址找出下一跳路由器,而结点交换机则根据目的站所接入的交换机号找出下一跳结点交换机。

图7-14(a)是一个路由表的简单例子。有4个A类网络通过3个路由器连接在一起。每一个网络上都可能有成千上万个主机。可以想像,若按查找目的主机号来制作路由表,则所得出的路由表就会过于庞大。但若按主机所在的网络地址来制作路由表,那么每一个路由器中的路由表就只饮食4个项目。以路由器R2的路由表为例。因为R2同时连接在网络2和网络3上,所以,只要目的站在这两个网络上,都可通过接口0或接口1由路由器R2直接交付(当然还要利用地址解析协议ARP才能找到这些主机相应的硬件地址)。若目的站在网络1中,则下一跳路由器应为的,其IP地址为20.0.0.7。因为路由器R2和R1同时连接在网络2上,所以从路由器R2把分组转发到路由器R1是很容易的。同理,若目的站在网络4中,则路由器R2应把分组转发给IP地址为30.0.0.1的路由器R3。

可以将整个的网络拓扑简化为如图7-14(b)所示的那样。在简化图中,网络变成了一条链路,但每一个路由器旁边都注明其IP地址。使用这样的简化图,可以使我们不用关心某个网络内部的拓扑以及连接在该网络上有多少台计算机,因为这些对于研究分组转发问题并没有什么关系。这样的简化图强调了在互联网上转发分组时,是从一个路由器转发到下一个路由器。

图 7-14 路由表举例

在路由表中,对每一条路由最主要的是以下两项:

(目的网络地址,下一跳地址)

于是,我们就根据目的网络地址来确定下一跳路由器,这样做得出了以下结果。

(1)IP数据报首先要设法找到目的主机所在目的网络上的路由器(间接交付)。

(2)只有到达最后一个路由器时,才试图向目的主机进行直接交付。

虽然因特网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即对特定的目的主机指明一个路由。这种路由叫做特定主机路由。采用特定主机路由可使网络管理人员能更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题是采用这种特定主机路由。在对网络的连接或路由表进行排错时,指明到某一个主机的特殊路由十分有用。

和结点交换机路由表的情况相似,路由器也可采用默认路由以减少路由表所占用的空间和搜索路由表所用的时间。

这里我们再强调指出,在IP数据报的首部中没有地方可以用来指明“下一跳路由器的IP地址”。在IP数据报的首部写上的IP地址是源IP地址,而没有中间经过的路由器的IP地址。既然IP数据报中没有下一跳路由器的IP地址,那么待转发的数据报又怎样能够找到下一跳路由器呢?

当路由器收到一个待转发的数据报,在从路由表得出下一跳路由器的IP地址后,不是将下一跳路由器的IP地址填入IP数据报,而是送交下层的网络接口软件。网络接口软件负责将下一跳路由器的IP地址转换成硬件地址(使用ARP),并将此硬件地址放在链路层MAC帧的首部,然后根据这个硬件地址找到下一跳路由器。由此可见,当发送一连串的数据报时,上述的这种查找路由表、计算硬件地址、写入MAC帧的首部等过程,将不断地重复进行,造成了一定的开销。

那么,能不能在路由表中不不使用IP地址而直接使用硬件地址呢 不行。我们一定要弄清楚,使用抽象的IP地址,本来就是为了隐蔽各种底层网络的复杂性而便于分析和研究问题,这样就不可避免地要付出代价,例如选择路由时多了一些上述的开销。但反过来,如果在路由表中直接使用硬件地址,那就会带来更多的麻烦。

上面所讨论的是IP层怎样根据路由表的内容进行分组转发,而没有涉及路由表一开始是如何建立的,以及路由表的内容应如何进行更新。但是,在进一步讨论路由选择之前,我们还要先介绍划分子网和构造超网这两个非常重要的概念。

7.3 划分子网和构造超网

7.3.1 子网的划分

1、从两级IP地址到三级IP地址

在今天看来,在ARPANET的早期,IP地址的设计确实不够合理。

第一,IP地址空间的利用率有时很低。

每一个A类地址网络可连接的主机数超过1千万,而每一个B类地址网络可连接的主机数也超过6万。然而有些网络对连接在网络上的计算机数目有限制,根本达不到这样大的数值。例如10BASE-T以太网规定其最大结点数只有1024。这样的以太网若使用一个B类地址就浪费6万多个IP地址,地址空间的利用率还不到2%,而其他单位的主机无法使用这些被浪费的地址。所统计,超过半数的B类地址网络所连接的主机还不到50台,而这些单位并不愿意申请一个足够使用的C类地址(理由是考虑至今后可能的发展)。IP地址的浪费,还会使IP地址空间的资源过早地被用完。

第二,给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。

每一个路由器都应当能够从路由表查出应怎样到达其他网络的下一跳路由器.。因此互联网中的网络数越多,路由器的路由表的项目数也就越多。这样,即使我们拥有足够多的IP地址资源可以给每一个物理网络分配一个网络号,也会导致路由器中的路由表中的项目数过多。这不仅增加了路由器的成本(需要更多的存储空间),而且使查找路由时耗费更多的时间,同时也使路由器之间定期交换的路由信息急剧增加,因而使路由器和整个因特网的性能都下降了。

第三,两级IP地址不够灵活。

有时情况紧急,一个单位需要在新的地点马上开通一个新的网络。但是在申请到一个新的IP地址之前,新增加的网络是不可能连接到因特网上工作的。我们希望有一种方法,使一个单位能随时灵活地增加本单位的网络,而不必事先到因特网管理机构去申请新的网络号。原来的两级IP地址无法做到这一点。

为解决上述问题,从1985年起在IP地址中又增加了一个“子网号字段”,使两级IP地址变成为三级IP地址,它能够较好地解决上述问题,并且使用起来也很灵活。这种做法叫做划分子网,或子网寻址或子网路由选择。划分子网已成为因特网的正式标准协议。

划分子网的基本思路如下。

(1)一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少个子网组成,因为这个单位对外仍然表现为一个没有划分子网的网络。

(2)划分子网的方法是从网络的主机号借用若干位作为子网号,而主机号也就相应减少了若干位。于是,两级IP地址在本单位内部就变为三级IP地址,即网络号、子网号和主机号,或者可以用以下记法来表示:

IP地址::={<网络号>,<子网号>,<主机号>}

(3)凡是从其他网络发送给本单位某个主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本单位网络上的路由器。但此路由器在收到IP数据报后,再按目的网络号和子网号找到目的子网,将IP数据报交付给目的主机。

下面用例子说明划分子网的概念。图7-15表示某单位拥有一个B类IP地址,网络地址是145.13.0.0(网络号是145.13)。凡目的地址为145.13.x .x的数据报都被送到这个网络上的路由器R1。

图7-15 一个B类网络145.13.0.0

现把图7-15的网络划分为3个子网,如图7-16所示。这里假定子网号占用8位,因此在增加了子网号后,主机号就只有8位。所划分的3个子网分别是:145.13.3,0 ,145.13.7.0和145.13.21.0。在划分子网后,整个网络对外部仍表现为一个网络,其网络地址仍为145.13.0.0。但网络145.13.0.0 上的路由器R1在收到数据报后,再根据数据报的目的地址将其转发到相应的子网。

图7-16 划分为三个子网

总之,当没有划分子网时,IP地址是两级结构,地址的网络号字段也就是IP地址的“因特网部分”,而主机号字段是IP地址的“本地部分”。

划分子网后IP地址就变成了三级结构。请注意,划分子网只是将IP地址的本地部分进行再划分,而不改变IP地址的因特网部分。

 

 

 

2、子网掩码

我们知道,从IP数据报的首部并不知道源主机或目的主机所连接的网络是否进行了子网划分。这是因为32位的IP地址本身以及数据报的首部都没有包含任何有关子网划分的信息。因此必须另外想办法,这就是使用子网掩码。

图7-17(a)是IP地址为145.13.3.10的主机本来的两级IP地址结构。图7-17(b)j是同一主机的三级IP地址的结构,也就是说,现在从原来16位的主机号中拿出8位作为子网号subnet-id,而主机号减少到8位。请读者注意,虽然IP地址变为了三级,但数据报的转发仍然是分两步走,即先按网络地址找网络,然后再找主机。现在网络地址是145.13.3.0(既不是原来的网络地址145.13.0.0,也不是子网号3)。为了方便地从数据报中的目的IP地址中提取出所要找的子网的网络地址,路由器R1就要使用子网掩码。图7-17(c)是子网掩码,它也是32位,由一串1和跟随的一串0组成。子网掩码中的1对应IP地址中的网络号(请注意,一定要包括subnet-id),而子网掩码中的0对应现在的主机号。虽然RFC文档中没有规定子网掩码中的一串1必须是连续的,但却极力推荐在子网掩码中选用连续的1,以免出现可能发生的差错。

图7-17(d)表示R1把子网掩码和IP地址145.13.3.10逐位相“与”(AND)(计算机进行这种逻辑AND运算是很容易的),得出了所要找的子网的网络地址145.13.3.0。

图7-17 IP地址的各字段和子网掩码

使用子网掩码的好处就是不管网络有没有划分子网,只要把子网掩码和IP地址进行逐位的“与”运算,就立即得出网络地址来。这样在路由器处理到来的分组时就可采用同样的算法。

这里还要弄清一个问题,这就是在不划分子网时,既然没有子网,为什么还要使用子网掩码?这就是为了更方便地查找路由表。现在因特网的标准规定:所有的网络都必须有一个子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中的1的位置和IP地址中的网络号字段正好相对应。因此,若使用默认子网掩码和某个不划分子网的IP地址逐位相“与”(AND),就得出该IP地址的网络地址来。这样做可以不用查找该地址的类别位就能知道这是哪一类的IP地址。显然,

A类地址的默认子网掩码是255.0.0.0,或0XFF000000。

B类地址的默认子网掩码是255.255.0.0,或0XFFFF0000。

C类地址的默认子网掩码是255.255.255.0,或0XFFFFFF00。

子网掩码是一个网络或一个子网的重要属性。在RFC950成为因特网的正式标准后,路由器在和相邻路由器表中的信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。在路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。

请读者注意,虽然根据已成为因特网标准协议的RFC 950文档,子网号不能全为1或全为0,但随着无分类域间路由选择CIDR的广泛使用(在7.3.3节讨论),现在全1或全0的子网号也可以使用了,但一定要谨慎使用,要弄清路由器所用的路由选择软件是否支持全0或全1的子网号这种较新的用法。

我们可以看出,若使用较少位数的子网号,则每一个子网上可连接的主机数就较大。反之,若使用较多位数的子网号,则子网的数目较多但每个子网上可连接的主机数就较小。因此我们可根据网络的具体情况(一共需要分多少个子网,每个子网中最多有多少个主机)来选择合适的子网掩码。

7.3.2 使用子网时分组的转发

在划分子网的情况下,分组转发的算法必须做相应的改动。

我们应当注意到,使用子网划分后,路由表必须包含以下3项内容,即目的网络地址、子网掩码和下一跳地址。

在划分子网的情况下路由器转发分组的算法应当如下所示。

(1)从收到数据报的首部提取的IP地址D。

(2)先判断是否为直接交付。对路由器直接相连的网络逐个进行检查:用各网络的子网掩码和D逐位相“与”(AND操作),看结果是否和相应的网络地址匹配。若匹配,则把分组进行直接交付(当然还需要把D转换成物理地址,把数据报封装成帧发送出去),转发任务结束。否则就是间接交付,执行步骤(3)。

(3)若路由表中有目的地址为D的特定主机路口,则把数据报传送给路由表中所指明的下一路由器;否则,执行步骤(4)。

(4)对路由表中的每一行(目的网络地址、子网掩码、下一跳地址),用其中的子网掩码和D逐位相“与”(AND操作),其结果为N。若N与该行的目的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则,执行步骤(5)。

(5)若路由表中有一个默认路由,则把数据报传送给路由表中指明的默认路由器;否则,执行步骤(6)。

(6)报告转发分组出错。

7.3.3 无分类编址CIDR(构造超网)

1. 网络前缀

划分子网在一定程度上缓解了因特网在发展中遇到的困难。然而在1992年因特网仍然面临3个必须尽早解决的问题,这就是:

(1)B类地址在1992年已分配了近一半,眼看很快就将全部分配完毕!

(2)因特网主干网上的 路由表中的项目数急剧增长(从几千万增长到几万个)。

(3)整个IPv4的地址空间最终将全部耗尽。

当时预计前两个问题就在1994年变的非常严重。因此,IETE很快就研究出采用无分类编址的方法来解决前两个问题。IETE认为上面的3个问题属于更加长远的问题,因此,专门成立IPv6工作组负责研究解决新版本IP的问题。

其实早在1987年,RFC1009就指明了在一个划分子网的网络中可同时使用不同的子网掩码。使用变长子网掩码VLSM可进一步提高IP地址资源的利用率。在VLSM的基础上有进一步研究出无分类编址的方法,它的正式名字是无分类域间路由选择CIDR。在1993年形成了CIDR的RFC文档:RFC1517~1519和RFC1520。现在CIDR已成为因特网建议标准协议。

CIDR最主要的特点有两个。

(1)CIDR消除了传统的A类、B类和C类地址以及划分子网的概念,因而,可以更加有效地分配IPv4的地址空间,并且可以在新的IPv6使用之前容许因特网的规模继续增长。CIDR使用各种长度的“网络前缀”来代替分类地址中的网络号和子网号,而不是像分类地址中只能使用1字节、2字节和3字节长的网络号。CIDR不再使用“子网”的概念而使用网络前缀,使IP地址从三级编址(使用子网掩码)又回到了两级编址,但这已是无分类的两级编址。它的记法是:

IP地址 ::={〈网络前缀〉,〈主机号〉}

CIDR还使用“斜线记法”,或CIDR记法,即在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数(对应子网掩码中的1的个数)。

(2)CIDR把网络前缀都相同的连续的IP地址组成“CIDR地址块”。一个CIDR地址块是由地址块的起始地址(即地址中地址数值最小的一个)和地址块中的地址数来定义的。CIDR地址块也可用斜线记法来表示。

当我们见到斜线记法表示的地址时,一定要根据上下文弄清它是指一个单个的IP地址,还是指一个地址块。

由于一个CIDR地址块可以表示很多地址,所以在路由表中就利用CIDR地址块来查找目的网络。这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示原来传统分类地址的很多个路由。路由聚合也称为构成超网。如果没有采用CIDR,在1994年和1995年,因特网的一个路由表中就会超过7万个项目,而使用了CIDR后,在1996年的一个路由表的项目数才只有3万多个。路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个因特网的性能。

为了更方便的进行路由选择,CIDR使用32位的地址掩码。地址掩码是有一串1和一串0组成,而1的个数就是网络前缀的长度。虽然CIDR不使用子网了,但是目前仍有一些网络使用子网划分和子网掩码,因此,CIDR所使用的地址掩码也可以继续叫做子网掩码。对于/20地址块,其地址掩码是:11111111 11111111 11110000 00000000(20个连续的1)。斜线记法中的数字就是地址掩码中1的个数。

请读者注意,在配置基于CIDR的网络时,可能有一些主机本来是使用分类的IP地址。它们可能不允许把网络前缀设置为比原来分类地址的子网掩码的1的长度更短。例如,把网络配置成2000.25.16.0/20时就可能不行,因为这原来是一个C类地址,其子网掩码的长度至少是24位。只有在主机的软件支持CIDR时,网络前缀才能比原来的掩码长度短。但是,若把200.25.16.0/20配置成16个/24地址块就不会有问题,因为不支持CIDR的主机会把本地的/24解释成C类网络。

2.最长前缀匹配

在使用CIDR时,由于采用了网络前缀这种记法,IP地址由网络前缀和主机号这两个部分组成,因此在路由表中的项目也要有相应的改变.这时,每个项目由“网络前缀”和“下一跳地址”组成。但是在查找路由表时可能会得到不止一个匹配结果。这样就带来一个问题:我们应当从这些匹配结果中选择哪一条路由呢?

正确的答案是:应当从匹配结果中选择最长网络前缀的路由。这叫做最长前缀匹配,这是因为网络前缀越长,其地址块就越小,因而路由就越具体。最长前缀匹配又称为最长匹配或最佳匹配。

7.4 因特网控制报文协议ICMP

为了提高IP数据报交付成功的机会,在国际层使用了因特网控制报文协议ICMP。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP是因特网的标准协议。但ICMP不是高层协议,而是IP层的协议。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。ICMP报文如图7-21所示。

ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。

ICMP报文的前4个字节是统一的格式,共有3个字段,即类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型。

ICMP报文的代码字段是为了进一步区分某种类型中的几种不同的情况。检验和字段用来检验整个ICMP报文。读者应当还记得,IP数据报首部的检验和并不检验IP数据报的内容,因此不能保证经过传输ICMP报文不产生差错。

图7-21 ICMP报文

 

ICMP差错报告报文共有以下5种。

(1)终点不可达 当路由器或主机不能交付数据报时就向源站发送终点不可达报文。

(2) 源站抑制 当路由器或主机由于拥塞而丢弃该数据报时,就向源站发送源站抑制报文,使源站知道应当将数据报的发送速率放慢。

(3)时间超过 当路由器收到生存时间为零的数据报时,除丢弃数据报外,还要向源站发送时间超过报文。当目的站在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据片都丢弃,并向源站发送时间超过报文。

(4)参数问题 当路由器或目的主机收到的数据报的首部中,有的字段的值不正确时,就丢弃该数据报,并向源站发送参数问题报文。

(5)改变路由(重定向) 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

下面对改变路由报文进行简短的解释。我们知道,在因特网的主机中也要有一个路由表。当主机要发送数据报时,首先是查找主机自己的路由表,看应当从哪一个接口把数据报发送出去。在因特网中主机的数量远大于路由器的数量,出于效率的考虑,这些主机的路由表一般都采用人工配置,并且主机不和连接在网络上的路由器定期交换路由信息。在主机刚开始工作时,一般都在路由表中设置一个默认路由器的IP地址。不管数据报要发送到哪个目的地址,都一律先将数据报传送给网络上的这个默认路由器,而这个默认路由器知道每一个目的网络上的最佳路由(通过和其他路由器交换路由信息)。如果默认路由器发现主机发往某个目的地址的数据报的最佳路由不应当经过默认路由器,而是应当经过网络上的另一个路由器R时,就用改变路由报文把这情况告诉主机。于是,该主机就在其路由表中增加一个项目:到某某目的地址应经过路由器R(而不是默认路由器)。

所有的ICMP差错报告报文中的数据字段都有同样的格式,如图7-22所示。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。提取收到的数据报的数据字段的前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。这些信息对源站通知高层协议是有用的(端口的作用将在8、2、2节介绍)。整个ICMP报文作为IP数据报的数据字段发送给源站。

图 7-22 ICMP差错报告报文的数据字段的内容

 

下面是不应发送ICMP差错报告报文的几种情况。

对ICMP差错报告报文不再发送ICMP差错报告报文。

对第一个分片的数据报片的所有后续数据报片都不发送ICMP差错报告报文。

对具有多播地址的数据报都不发送ICMP差错报告报文。

对具有特殊地址(如127.0.0.1或0.0.0.0)的数据报不发送ICMP差错报告报文。

ICMP询问报文有4种,即回送请求和回答、时间戳请求和回答、掩码地址请求和回答,以及路由器询问和通告。

ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的机器必须给源主机发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。在应用层有一个很常用的服务叫做PING,用来测试两个主机之间的连通性。PING使用了ICMP回送请求与回送回答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP。

ICMP时间戳请求报文是请某个主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1990年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用来进行时钟同步和测量时间。

主机使用ICMP地址掩码请求报文可向子网掩码服务器得到某个接口的地址掩码。

主机使用ICMP路由器询问和通告报文可了解连接在本网络上的路由器是否正常工作。主机将路由器询问报文广播(或多播)。收到询问报文的一个或几个路由器就使用路由器通告报文广播其路由选择信息。

7.5 因特网的路由选择协议

本节将讨论几种常用的路由选择协议,也就是要讨论路由表中的路由是怎样得出的。

7.5.1 有关路由选择协议的几个基本概念

1、理想的路由算法

路由选择协议的核心就是路由算法,即需要何种算法获得路由表中的各项目。一个理想的路由算法应具有如下一些特点。

(1)算法必须是正确的和完整的。这里,“正确”的含义是:沿着各路由表所指引的路由,分组一定能够最终到达目的网络和目的主机。

(2)算法在计算上就简单。进行路由选择的计算必然要增加分组的时延。因此,路由选择的计算不应使网络通信量增加太多的额外开销。若为了计算合适的路由必须使用网络其他路由器发来的大量状态信息时,开销就会过大。

(3)算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。当网络中的通信量发生变化时,算法能自适应地改变路由以均衡各链路的负载。当某个或某个结点、链路发生故障不能工作,或者修理好了再投入运行时,算法也能及时地改变路由。有时称这种自适应性为“稳健性”。

(4)算法应具有稳定性。在网络通信量和网络拓扑相对稳定的情况下,路由算法应收敛于一个可以接受的解,而不应使得出的路由不停的变化。

(5)算法应是公平的。这就是说,算法应对所有用户(除对少数优先级高的用户)都是平等的。例如,若使某一对用户的端到端时延为最小,但却不考虑其他的广大用户,这就明显不符合公平性原则的要求。

(6)算法应是最佳的。这里的“最佳”是指以最低的代价来实现路由算法。这里特别需要注意的是,在研究路由选择时,需要给每一条链路指明一定的代价,而这里“代价”并不是指“钱”,而是一个或几个因素综合决定的一种度量,如链路长度、数据传输速率、链路容量、是否要保密、传播时延等,甚至还可以是一天中某一个小时内的通信量、结点的缓存被占用的程度、链路差错率等。可以根据用户的具体情况来设置每一条链路的“代价”。由此可见,不存在一种绝对的最佳路由算法。所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已。

一个实际的路由选择算法,应尽可能接近理想的算法。在不同的应用条件下,对以上提出的6个方面也可有不同的侧重。

应当指出,路由选择是个非常复杂的问题,因为它是网络中的所有结点共同协调工作的结果。其次,路由选择的环境往往是不断变化的,而这种变化有时无法事先知道,例如,网络中出了某些故障。此外当网络发生拥塞时,就特别需要有能缓解这种拥塞的路由选择策略,但恰好在这种条件下,很难从网络中的各结点获得所需的路由选择信息。

倘若从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则只有两大类,即静态路由选择选择策略与动态路由选择策略,。静态路由选择也叫做非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。动态路由选择也叫做自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。

2、分层次的路由选择协议

因特网采用的路由选择协议主要是自适应的(即动态的)、分布式路由选择协议。由于以下两个原因,因特网采用分层次的路由选择协议。

(1)因特网的规模非常大,现在就已经有几百万个路由器互连在一起。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太费时间。而所有这些路由器之间交换路由信息所需的带宽就会使因特网的通信链路饱和。

(2)许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时希望连接到因特网上。

为此,因特网将互联网划分为许多较小的自治系统,一般简称为AS。一个自治系统是一组互连起来的IP前缀(一个或多个前缀),由一个或多个网络管理员负责其运行,但更重要的特点就是每一个自治系统有一个单一的和明确定义的路由选择策略。[RFC1930]。这样,因特网就把路由选择协议划分为以下两大类。

(1)内部网关协议IGP,即在一个自治系统内部使用的路由选择协议,而这与在互联网中的其他自治系统选用什么路由选择协议无关。目前,这类路由选择协议使用最多,如RIP和OSP协议。

(2)外部网关协议EGP,若源点和终点处在不同的自治系统中(这两个自治系统使用不同的内部网关协议),当数据报传到另一个自治系统中。这样的协议就是外部网关协议EGP。目前,在外部网关协议中使用最多的是BGP-4。

自治系统之间的路由选择也叫做域间路由选择,而在自治系统内部的路由选择叫做域内路由选择。

如图7-23所示,为3个自治系统互连在一起的示意图,在自治系统内各路由器之间的网络就省略了,而用一条链路表示路由器之间的网络。每个自治系统运行本自治系统的内部路由选择协议IGP,但每个自治系统都有一个或多个路由器,除运行本系统的内部路由选择协议外,还运行自治系统间的路由选择协议EGP。在图7-23中,能运行自治系统间的路由选择协议的有R1,R2和R3 3个路由器。在图中将这类路由器画得稍大些以示区别。假定图中自治系统A的主机H1要向自治系统B的主机H2发送数据报,那么在各自治系统内使用的是各自的内部网关协议IGP(例如,分别使用RIP和OSPF),而在路由器R1和R2之间则必须使用外部网关协议EGP(例如,使用BGP-4)。

图7-23 自治系统和内部网关协议、外部网关协议

这里我们要指出两点。

(1)因特网的早期RFC文档中未使用“路由器”,而是使用“网关”这一名词。但是,在新的RFC文档中又使用了“路由器”这一名词,因此有的书把IGP和EGP分别改为IRP和ERP。为了方便读者查阅RFC文档,本书仍使用RFC原先使用的名字。

(2)RFC采用的这两个名词IGP和EGP是协议类别的名称。但RFC在使用EGP这个名词时出现了一点混乱,因为最早的一个外部网关协议的协议名字正好也是EGP。后来发现该RFC提出的EGP有不少缺点,就设计了一种更好的外部网关协议,叫做边界网关协议BGP,用来取代旧的RFC827外部网关协议EGP。实际上,旧的协议EGP和新的协议BGP都属于外部网关协议EGP这一类别。因此,在遇到名词EGP时,应弄清它是指旧的RFC827协议EGP,还是指外部网关协议EGP这个类别。

总之,使用分层次的路由选择方法,可将因特网的路由选择协议划分为:

内部网关协议IGP:具体的协议有多种,如RIP和OSPF等。

外部网关协议EGP:目前使用的协议就是BGP-4。

 

对于比较大的自治系统,还可将所有的网络再进行一次划分。例如,可以构筑一个链路速率较高的主干网和许多速率较低的区域网。每个区域网通过路由器连接到主干网。在一个区域内找不到目的站时,就通过路由器经过主干网到达另一个区域网,或者通过外部路由器到别的自治系统中去查找。下面对这两类协议分别进行介绍。

7.5.2 内部网关协议RIP

路由信息协议RIP是内部网关协议IGP中最先得到广泛使用的协议。RIP是一种分布式的基于距离向量的路由选择协议,是因特网的标准协议,其最大优点就是简单。

RIP要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。RIP将“距离”定义如下。

从一路由器到直接连连的网络的距离定义为1。从一路由器到直接连接的网络的距离定义为所经过的路由器数加1。“加1”是因为到达目的网络后就进行直接交付,而到直接连接的网络的距离已经定义为1。

RIP的距离也称为“跳数”,因为每经过一个路由器,跳数就加1。RIP认为一个好的路由就是它通过的路由器的数目少,即“距离短”。RIP允许一条路径最多只能包含15个路由器。因此,“距离”的最大值为16时即相当于不可达。可见,RIP只适用于小型互联网。

需要注意的是,到直接连接的网络的距离也可定义为0(采用这种定义的理由是:路由器在和直接连接在该网络上的主机通信时不需要经过另外的路由器,。既然每经过一个路由器要将距离加1,那么不再经过路由器的距离就应当为零)。本书的其他版本也曾使用过这种定义。但两种不同的定义对实现RIP并无影响,因为重要的是要找出最短距离,把所有的距离都加1或都江堰市减1,对选择最佳路由都是一样的。

RIP不能在两个网络之间同时使用多条路由。RIP选择一条具有最少路由器的路由,哪怕还存在另一条高速但路由器较多的路由。

本节讨论的RIP和下一节要讨论的OSPF协议都是分布式路由选择协议。它们的共同特点就是每一个路由器都要不断地和其他一些路由器交换路由信息。读者一定要弄清以下3个要点,即和哪些路由器交换信息?交换什么信息?在什么时候交换信息?

(1)仅和相邻路由器交换信息。两个路由器是相邻的,如果它们之间的通信不需要经过另一个路由器。换言之,两个相邻路由器在同一个网络上都有自己的接口。RIP规定,不相邻的路由器不交换信息。

(2)交换的信息是当前本路由器所知道的全部信息,即自己的路由表。因此,交换的信息就是:“到本自治系统中所有网络的最短距离,以及到每个网络应经过的下一跳路由器”。至于本路由怎样获得这些信息以及路由表是否完整,都是不重要的。

(3)按固定的时间间隔交换路由信息,例如,每隔30秒。然后路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。

这里要强调一点:路由器在刚刚开始工作时,只知道到直接连接的网络的距离。以后,每一个路由器也中和数目非常有限的相邻路由器交换并更新路由信息。但经过若干次更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。看起来RIP有些奇怪,因为“我的路由表中的信息要依赖于你的,现时你的信息又依赖于我的。”然而事实证明,RIP的收敛过程较快,。所谓收敛就是在自治系统中所有的结点都得到正确的路由选择信息的过程。

路由表中最主要的信息就是:到某个网络的距离(即最短距离),以及应经过的下一跳地址。路由表更新的原则是找出到每个目的网络的最短距离。这种更新算法又称为距离向量算法 。下面就是RIP使用的距离向量算法。

2、距离向量算法

收到相邻路由器(其地址为X)的一个RIP报文:

(1)先修改RIP报文中的所有项目:把“下一跳”字段中的地址都改为X,并把所有的“距离”字段的值加1。

(2)对修改后的RIP报文中的每一个项目,重复以下步骤:

若项目中的目的网络不在路由表中,则把该项目添加到路由表中。否则,若下一跳字段给出的路由器地址是同样的,则把收到的项目替换原路由表中的项目。否则,若收到的项目中的距离小于路由表中的距离,则进行更新,否则什么也不做。

(3)若3分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器,即将距离设置为16。

(4)返回。

上面给出的距离向量算法的基础就是Bellman-ford算法。这种算法的要点是这样的:高X结点A到B的最短路径上的一个结点。若将路径A到B拆成两段路径A到X和X到B,则每一段路径A到X和X到B也都分别是结点A到X和结点X到B的最短路径。

下面是对上述距离向量算法的4点解释。

解释1:这样做是为了便于进行本路由表的更新。设从位于地址X的相邻路由器发来的RIP报文的某一个项目是:“NET2,3,Y”,意思是“我到网络NET2的距离是3,要经过的下一跳路由器的地址是Y”,那么本路由器就可推断出:“若我将下一跳路由器先为在地址X的路由器,则我到网络NET2的距离应为3+1=4”。于是,本路由器就将收到的RIP报文的这一个项目修改为“NET2,4,X”,以便下一步进行比较时使用。读者可能已经注意到,收到的项目中的Y对本路由器是没有用的,因为Y不是本路由器的路由的下一跳路由器地址。

解释2:表明这是新的目的网络,应当加入到路由表中,例如 ,本路由表中没有到目的网络NET2的路由,那么在路由表中就要加入新的项目“NET2,4,X”。

解释3:为什么要替换呢?因为这是最新的消息,要以最新的消息为准。到目的网络的距离有可能增大或减小,但也可能没有变。例如 ,不管原来路由表中的项目是“NET2,3,X”还是“NET2,5,X”,都要更新为现在的“NET2,4,X”。

解释4:例如,若路由表中已有项目“NET2,5,P”,就要更新为“NET2,4,X”。因为更新后到网络NET2的距离更短了(从5减到4)。

RIP让互联网中的所有路由器都和自己的相邻路由器不断交换信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由都是最短的。这里读者还应注意,虽然所有的路由器最终都拥有了整个自治系统的全局路由信息,但由于每一个路由器的位置不同,它们的路由表当然也应当是不同的。

RIP使用运输层的用户数据报UDP进行传送。因此,RIP的位置应当在应用层。但转发IP数据报的过程是在网络层完成的。这里请读者注意,当路由器转发在主机之间传送的数据报时,它的协议只有三层,而没有运输层和应用层。但路由器之间在交换路由信息时,两个路由器又相当于两个主机在通信,因此这时的路由器可以有运输层的应用层。因此,我们不能笼统地认为,路由器不定一定没有运输层和应用层。

现在较新的RIP版本是1998年11月公布的RIP2[RFC2453],新版本协议本身并无多大变化,但性能上有些改进。RIP2可以支持变长子网掩码和CIDR。此外,RIP2还提供简单的鉴别过程支持多播。

RIP存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。

总之,RIP最大的优点就是实现简单,开销较小。但RIP 缺点也较多。首先,RIP限制了网络的规模,它能使用的最大距离为15。其次,路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。最后,“坏消息传播的慢”,使更新过程的收敛时间过长。因此,对于规模较大的网络就应当使用下一节所述的OSPF协议。然而,目前在规模较小的网络中,使用RIP的仍占多数。

7.5.3 内部网关协议OSPF

1、OSPF协议的基本特点

这个协议的名字是开放最短路径优先OSPF。它是为克服RIP的缺点在1989年开发出来的。OSPF的原理很简单,但实现起来却较复杂。“开放”表明OSPF协议不是爱某一家厂商控制,而是公开发表的。“最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。OSPF的第二个版本OSPF2已成为因特网标准协议。

请读者注意,OSPF只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。实际上,所有的在自治系统内部使用的路由选择协议都是要寻找一条最短的路径。

OSPF是主要的特征就是使用分布式的链路状态协议,而不是像RIP那样的距离向量协议。和RIP相比,OSPF的3个要点和RIP的都不样。

(1)向本自治系统中所有路由器发送消息。这里使用的方法是洪泛法,这就是路由器通过所有输出端口向所有相邻的路由器发送信息。而每一个相邻路由器又再把这个信息发往其所有的相邻路由器。这样,最终整个区域中所有的路由器都得到了这个信息的一个副本。更具体的做法在后面还要讨论。

(2)发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”。OSPF将这个“度量”用来表示费用、距离、时延、带宽等。这些都由网络管理人员来决定,因此较为灵活。有时为了方便就称这个度量为“代价”。

(3)只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息(而RIP不管网络拓扑有无发生变化,路由器之间都要定期交换路由表的信息)。

从上述的3个方面可以看出,OSPF和RIP的工作原理相差较大。

因为各路由器之间频繁地交换链路状态信息,所以,所有的路由器最终都能建立一个链路状态数据库,这个数据库实际上就是全网的拓扑结构图。这个拓扑结构图在全网范围内是一致的(这称为链路状态数据库的同步)。因此,每一个路由器使用链路状态数据库中的数据,构造出自己的路由表,因而能查出到每一个目的网络应当走哪条路径。但RIP的每一个路由器虽然知道所有的网络的距离以及下一跳路由器,但却不知道全网的拓扑结构。而是只有到了下一跳路由器,才能知道再下一跳应当怎样走。

OSPF的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。OSPF的更新过程收敛得快是其主要优点。

为了使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫做区域。

为了使得OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫做区域。图7-24就表示一个自治系统划分为4个区域。每一个区域都有一个32位的区域标识符(用点分十进制表示)。当然,一个区域也不能太大,在一个区域内的路由器最好不超过200个。

图7-24 OSPF划分为两种不同的区域

 

 

划分区域的好处就是将利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。

为了使每一个区域能够和本区域进行通信,OSPF使用层次结构的区域划分。在上层的区域叫做主干区域。主干区域的标识符规定为0.0.0.0。主干区域的作用是来连通其他在下层的区域。从其他区域来的信息都由区域边界路由器进行概括。

采用分层次划分区域不仅使交换信息的种类增多了,而且也使OSPF协议更加复杂了。但这样做却能使每一个区域内部交换路由信息的通信量大大减小,因而使OSPF协议能够用于规模很大的自治系统中。这里我们再一次看到划分层次在网络设计中的重要性。

OSPF不用UDP而是直接用IP数据报传送,可见,OSPF的位置在网络层。OSPF构成的数据报很短。这样做可减少路由信息的通信量。数据报很短的另一个好处是可以不必将长的数据报分片传送。分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。

除了以上几个基本特点外,OSPF还具有下列一些特点。

(1)OSPF对不同的链路可根据IP分组的不同服务类型TOS而设置成不同的代价。例如,高带宽的卫星链路对于非实时的业务可设置为较低的代价,但对于时延敏感的业务就可设置为非常高的代价。因此,OSPF对于不同类型的业务可计算出不同的路由。链路的代价可以是1~65535中的任何一个无量纲的数,因此十分灵活。商用的OSPF实现通常是根据链路带宽来计算链路的代价。这种灵活性是RIP所没有的。

(2)如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这叫做多路径间的负载平衡(load balancing)。在代价相同的多条路径上分配通信量是通信量工程中的简单形式。RIP只能找出到某个网络的一条路径。

(3)所有的OSPF路由器之间交换的分组(例如,链路状态更新分组)都具有鉴别的功能,因而保证了仅在可信赖的路由器之间交换链路状态信息。

(4)OSPF支持可变长度的子网划分和无分类的编址CIDR。

(5)因为网络中的链路状态可能经常发生变化,所以,OSPF让每一个链路状态都带上一个32位的序号,序号越大状态就越新。OSPF规定,链路状态序号增长的速率不得超过每5秒钟1次。这样,全部序号空间在600年内不会产生重复号。

2.OSPF的5种分组类型。

(1)类型1,问候(Hello)分组,用来发现和维持邻站的达性。

(2)类型2,数据库描述(Database Description)分组,向邻站给出自己的链路状态数据库中的所有状态项目的摘要信息。

(3)类型3,链路状态请求(Link State Request)分组,向对方请求发送某些链路状态项目的详细信息。

(4)类型4,链路状态更新(Link State Update)分组,用洪泛法对全网更新链路状态。这种分组是最复杂的,也是OSPF协议最核心的部分。路由器使用这种分组将其链路状态通知给邻站。链路状态更新分组共有5种不同的链路状态,这里从略。

(5)类型5,链路状态确认(Link State Acknowledgment)分组,对链路更新分组的确认。

OSPF规定,每两个相邻路由器每隔10秒钟要交换一次问候分组,这样就能确信知道哪些邻站可达的。对相邻路由器来说,“可达”是最基本的要求,因为只有可达邻站的链路状态信息才存入链路状态数据库(路由表就是根据链路状态数据库计算出来的)。在正常情况下,网络中传送的绝大多数OSPF分组都是问候分组。若有40秒钟没有收到某个相邻路由器发来的问候分组,则可认为该相邻路由器是不可达的,应立即修改链路状态数据库,并重新计算路由表。

其他的4种分组都是用来进行链路状态数据库的同步。所谓同步,就是指不同路由器的链路状态数据库的内容是一样的。两个同步的路由器叫做“完全邻接的”路由器。不是完全邻接的路由器表明它们虽然在物理上是相邻的,但其链路状态数据库并没有达到一致。

当一个路由器刚开始工作时,它只能通过问候分组得知它有哪些相邻的路由器在工作,以及将数据发往相邻路由器所需的“代价”。如果所有的路由器都把自己的本地链路状态信息(以及其序号)已经写入了数据库。经过与相邻路由器交换数据库描述分组后,路由器就使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。通过一系列的这种分组交换,全网同步的链路数据库就建立了。

在网络运行的过程中,只要一个路由器的链路状态发生变化,该路由器就要使用链路状态更新分组,用洪泛法向全网更新链路新状态。OSPF使用的是可靠的洪泛法。其要点如图7-25所示。设路由器R用洪泛法发出链路状态更新分组。图中用一些小的箭头表示更新分组。第一次先发给相邻的三个路由器。这三个路由器将收到的分组在进行转发时,要将其上游路由器除外。可靠的洪泛法是在收到更新分组后要发送确认。确认的发送故意迟延一些 时间,为的是希望可以少发送几个确认分组。图中的空心箭头表示确认分组。

 

图7-25 用可靠泛洪法发送更新分组

为了确保链路状态数据库与全网的状态保持一致,还规定每隔一段时间,如30分钟,要刷新一次数据库中的链路状态。

由于一个路由器的链路状态只涉及与相邻路由器的连通状态,因而与整个互联网的规模并无直接关系。因此当互连网规模很大时,OSPF协议要比距离向量协议RIP好得多。由于OSPF没有“坏消息传播得慢”的问题,据统计,其响应网络变化的时间小于100ms。

若N个路由器连接在一个以太网上,则每个路由器要向其他(N—1)个路由器发送链路状态信息,因而共有N(N—1)个链路状态要在这个以太网上传送。OSPF协议对这种多点接入的局域网采用了指定的路由器的方法,使广播的信息量大大减少。指定的路由器代表该局域网上所有的链路向连接在该网络上的各路由器发送状态信息。

通过各路由器之间的交换链路状态信息,每一个路由器都可得出该互联网的链路状态数据库。每个路由器中的路由表可从这个链路状态数据库导出。每个路由器可算出以自己为根的最短路径树。再根据最短路径树就很容易地得出路由表来。

目前,大多数路由器厂商都支持OSPF,并开始在一些网络中取代旧的RIP。

7.5.4 外部网关协议BGP

1989年,公布了新的外部网关协议——边界网关协议BGP。BGP是不同自治系统的路由器之间交换路由信息的协议。BGP的较新版本是2006年发表的BGP-4,它已成为因特网草案标准协议。本书后面都将BGP-4简写BGP。

我们首先应当弄清,在不同自治系统之间的路由选择为什么不使用前面讨论的内部网关协议,如RIP或OSPF。

我们知道,内部网关协议(如RIP或OSPF)主要是设法使数据报在一个自治系统中尽可能有效地从源站传送到目的站。在一个自治系统内部并不需要考虑其他方面的策略。然而BGP使用的环境却不同。这主要是因为以下三个原因。

每一,因特网的规模太大,使得自治系统之间路由选择非常困难。连接在因特网主干网上的路由器,必须对任何有效的IP地址都能在路由表中找到匹配的目的网络。目前,主干网路由器中的路由表的项目数早已超过了5万个网络前缀。这些网络的性能相差很大。如果用最短距离找出来的路径,可能并不是应当选用的路径。例如,有的路径的使用代价很高或很不安全。如果使用链路状态协议,则每一个路由器必须维持一个很大的链路状态数据库。对于这样大的主干网用Dijkstra算法计算最短路径时花费的时间也太长。

二,对于自治系统之间的路由选择,要建筑最佳路由是很不现实的。因为各自治系统是运行自己选定的内部路由选择协议,使用本自治系统指明的路径度量,所以,当一条路径通过几个不同的自治系统时,要想对这样的路径计算出在意义的代价是不可能的。例如,对某个自治系统来说,代价为1000可能表示一条比较长的路由。但对另一个自治系统代价为1000,却可能表示不可接受的坏路由。因此,自治系统之间的路由选择只可能交换“可达性”信息(即“可到达”或“不可到达”)。例如,告诉相邻路由器:“到达目的网络N可经过自治系统A”。

第三,自治系统之间的路由选择必须考虑有关策略。例如,自治系统A要发送数据报到自治系统B,本来最好是经过自治系统C。但自治系统C不愿意让这些数据报通过本系统的网络,因为“这是他们的事情,和我们没有关系。”但另一方面,自治系统C愿意让某些相邻的自治系统的数据报通过自己的网络,特别是对那些付了服务费的某些自治系统更是如此。因此,自治系统之间的路由选择协议应当允许使用多种路由选择策略。这些策略包括政治、安全或经济方面的考虑。例如:我国国内的站点在互相传送数据报时不应经过国外兜圈子,特别是不要经过某些对我国的安全有威胁的国家。这些策略都是由网络管理人员对每一个路由器进行设置的,但这些策略并不是自治系统之间的路由选择协议本身。还可举出一些策略的例子,如:“仅在到达下列这些地址时才经过自治系统A”,“自治系统A和自治系统B相比时,应优先通过自治系统A”等。显然,使用这些策略是为了找出较好的路径而不是最佳路径。

由于上述情况,边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由,而并非要寻找一条最佳路由。BGP采用了路径向量路由选择协议,它与距离向量协议和链路状态协议都有很大的区别。

在配置BGP时,每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人”。一般说来,两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器,但也可以不是BGP边界路由器。

一个BGP发言人与其他自治系统中的BGP发言人要交换路由信息,就要先建立TCP连接,然后在此连接上交换BGP报文以建立BGP会话,利用BGP会话交换路由信息,如增加了新的路由,或撤销过时的路由,以及报告出差错的情况等。使用TCP连接能提供可靠的服务,也简化了路由选择协议。使用TCP连接交换路由信息的两个BGP发言人,彼此成为对方的邻站或对等站。

图7-26表示BGP发言人和自治系统AS的关系的示意图。在图中画出了3个自治系统中的5个BGP发言人。每一个BGP发言人除了必须运行BGP协议外,还必须运行该自治系统所使用的内部网关协议,如OSPF或RIP。

图7-26 BGP发言人和自治系统AS的关系

BGP所交换的网络可达性信息就是要到达某个网络(用网络前缀表示)所要经过的一系列的自治系统。当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各自治系统的比较好的路由。图7-27表示一个BGP发言人构造成的自治系统连通图,它是树形结构,不存在回路。

 

图7-27 自治系统的连通图

 

BGP协议交换路由信息的结点数量级是自治系统数的量级,这要比这些自治系统中的网络数少很多。要在许多自治系统之间寻找一条较好的路径,就是要寻找正确的BGP发言人(或边界路由器),的数目是很少的。这样就使得自治系统之间的路由选择不会过分的复杂。

BGP支持CIDR,因此BGP的路由表也就应当包括目的网络前缀、下一跳路由器,以及到达该目的网络所要经过的各个自治系统序列。由于使用了路径向量的信息,就可以很容易地避免产生兜圈子的路由。如果一个BGP发言人收到了其他BGP发言人发来的路径通知,它就要检查一下本自治系统是否在此通知的路径中。如果在这条路径中,就不能采用这条路径。

在BGP刚刚运行时,BGP的邻站要交换整个的BGP路由表。但以后只需要在发生变化时更新有变化的部分。这样做对节省网络带宽和减少路由器的处理开销方面都有好处。

BGP-4共使用以下4种报文。

(1)打开报文,用来与相邻的另一个BGP发言人建立关系。

(2)更新报文,用来发送某一路由信息,以及列出要撤销的多条路由。

(3)保活报文,用来确认打开报文和周期性地证实邻站关系。

(4)通知报文,用来发送检测到的差错。

若两个邻站属于两个不同的自治系统,而其中一个邻站打算和另一个邻站定期地交换路由信息,这就应当有一个商谈的过程(因为很可能对方路由器的负荷已经很重了,因而不愿意再加重负担)。因引,一开始向邻站进行商谈时就必须发送打开报文。如果邻站接受这种邻站关系,就用从中渔利报文响应。这样,两个BGP发言人的邻站关系建立了。

一旦邻站关系建立了,就要继续维持这种关系。双方中的每方都需要确信对方是存在的,且一直在保持这种邻站关系。为此,这两个BGP发言人彼此要周期性的交换保活报文(一般每隔30秒)。保活报文只有19字节长(只用BGP报文的通用首部),因此不会造成网络上太大的开销。

更新报文是BGP协议的核心内容。BGP发言人可以用更新报文撤销它以前曾经通知过的路由,也可以宣布增加新的路由。撤销路由可以一次撤销许多条,但增加新路由时,每个更新报文只能增加一条。

BGP可以很容易解决距离向量路由选择算法中的“坏消息传播得慢”这一问题。当某个路由器或链路出故障时,因为BGP发言人可以从不止一个邻站获得路由信息,所以,很容易选择出新的路由。距离向量算法往往不能给出正确的选择,是因为这些算法不能指出哪些邻站到目的站的路由是独立的。

7.6 因特网组中的多播

7.6.1 IP多播的基本概念

1988年Steve Deering首次在其博士学位论文中提出IP多播的概念。1992年3月IETF在因特网范围首次试验IETF会议声音的多播,当时有20个网点可同时听到会议的声音。现在IP多播(multicast)已成为因特网的一个热门课题。这是由于有许多的应用需要由一个源点通过一次发送操作,把同样的分组副本发送到许多个终点,即一对多的通信。例如,实时信息的交付(如新闻、股市行情等),软件更新,交互式会议等。随着因特网的用户数目的急剧增加,以及多媒体通信的开展,有更多的业务需要多播来支持。关于IP多播可参考[W-MCASY]。

与单播相比,在一对多的通信中,多播可大大节约网络资源。

当多播组的主机数很大时(如成千上万个),采用多播方式就可明显地减轻网络中各种资源的消耗。在因特网范围的多播要靠路由器来实现,这些路由器必须增加一些能够识别多播分组的软件。能够运行多播协议的路由器成为多播路由器(multicast router)。多播路由器可以是一个单独的路由器,也可以是运行多播软件的普通路由器。

为了适应交互式音频和视频信息的多播,从1992年起,在因特网开始试验虚拟的多播主干网MBONE。MBONE可以将分组传播给不在一起,但属于一个组的许多个主机。现在多播主干网的规模已经很大,有几千个多播路由器。

然而在因特网上实现多播要比单播复杂得多,因为必须解决以下的一些问题。

(1)多播组的地址(或简称为组地址)

D类IP地址就是多播组地址。D类IP地址去掉类别位(1110)后,剩下的28bit共有2*28种组合(超过2亿5千万个)。因此,可以使用的多播组地址的范围是从224.0.0.0到239.255.255.255。显然,多播地址只能用做目的地址,而不能用做源地址。

有一些D类IP地址是不能任意使用的,因为因特网号码指派管理局IANA已经指派了一些永久组地址。下面是永久组地址的几个例子。

224.0.0.0 基地址(保留)

224.0.0.1 在本子网上的所有参加多播的主机和路由器

224.0.0.2 在本子网上的所有参加多播的路由器

224.0.0.3 未指派

224.0.0.4 DVMRP路由器

……

224.0.0.19 至 224.0.0.225 未指派

239.192.0.0 至 239.251.255.255 限制在一个组织的范围

239.252.0.0 至 239.255.255.255 限制在一个地点的范围

顺便指出,多播组成员中的每一个主机另外还有一个单播的IP地址。

(2)多播最短路径支撑树

参加多播的源点主机和所有参加多播的路由器都必须能够把多播IP地址转化为包含有多播组成员的网络的清单,然后根据这个网络清单构造出到所有包含多播组成员的网络的多播最短路径支撑树。

如果不使用最短路径支撑树,那么就会在某些链路上出现重复的通信量因而造成浪费。假定在路由器R2和R3之间还有一条连接的链路(请读者注意,图中并没有画出这条链路,而里的链路就是网络),那么路由器R2必须知道,不应当向R3发送多播分组的副本,因为这是多余的。

图7-29 D 类 IP 地址与以太网多播地址的映射关系

(3)IP多播地址到局域网上的路由器时,还必须把32位的IP多播地址转换为局域网的48位多播地址。这样才能在局域网进行多播。

因特网号码指派管理局IANA拥有的以太网地址块的高24位为00-00-5E,也就是说,IANA拥有的以太网MAC地址的范围是从00-00-5E-00-00-00到00-00-5E-FF-FF-FF。在5、3、1节已讲过,以太网MAC地址字段中第一字节的最低位1时即为多播地址。IANA用其中的一半作为多播地址,因此只剩下23位可自由使用了。这样,以太网多播地址中的范围就是从01-00-5E-00-00-00到01-00-5E-7F-FF-FF。但D类IP地址可供分配的有28位,可见,在这28位中的前5位不能映射到以太网的多播地址中。例如,IP多播地址224.128.64.32和另一个IP多播地址224.0.64.32转换成以太网的多播地址都是01-00-5E-00-40-20。因为多播IP地址与以太网多播地址的映射关系不是唯一的,所以,主机中的IP模块还需要利用软件进行过虑,把不是本主机要接收的数据报丢弃。

(4)组成员的动态关系

严格说来,组成员应当是主机中的进程。一个主机中的多个进程可以分别加入不同的多播组.然而多播组中的成员关系是动态变化的.临时组地址则是在每一次使用前都必须创建多播组.一个进程可请求参加某个特定的多播组,或在任意时间退出该组。因此,应当使用一种机制使得单个的主机能够把自己的组成员关系及时通告给本网络上的路由器。因特网组管理协议IGMP就是用来支持这种机制的。

(5)多播路由器需要交换的信息

转发多播分组的路由器需要彼此交换两种信息。首先,这些路由器要知道哪些网络包含给定多播组的成员。其次,这些路由器需要有足够的信息来计算到达每一个包含多播组成员的网络的最短路径,这就需要有多播路由选择协议和计算最短路径的算法。

7.6.2 因特网组管理协议IGMP

IGMP已经有了3个版本.19889年公布的RFC1112(IGMPv1)早已成了因特网的标准协议。1997年公布的RFC(IGMPv2)对IGMPv1进行了更新,但IGMPv2只是个建议标准。2002年10月公布了RFC3376(IGMPv3,目前是建议标准),宣布了RFC2236(IGMPv2)是陈旧的。

和ICMP相似,IGMP使用IP数据报传递其报文(即IGMP报文加上IP首部构成IP数据报)。但IGMP也向IP提供服务。从原理上讲,IGMP包括以下两种操作。

(1)主机向多播路由器发送报文,要求加入或退出某给定地址的多播组。本地的多播路由器收到IGMP报文后,把组成员关系转发给因特网上的其他多播路由器。

(2)多播路由器要周期性地检验哪些多播组感兴趣。前两个版本的IGMP都具有以下的操作模型。

接受方必须申请加入某个多播组。

发送方不需要加入到任何多播组。

任何主机都可以向任何多播组发送多播分组。

但前两个版本具有下面的缺点。

(1)多播组很容易泛滥成灾,消耗大量网络资源。

(2)在不知道发送方的位置的情况下,有时无法建立多播树。

(3)不同的多播组可能使用相同的多播地址,因此全球多播地址不是唯一的。

IGMPv3采用以下措施来解决上述问题。

(1)允许主机指明“我愿意从哪些主机接收多播分组”,而从其他主机发送来的多播分组可以被阻拦掉。

(2)允许主机阻拦自己所不愿意要的多播分组。

IGMP定义了两种报文:成员关系询问报文和成员关系报告报文。主机要加入或退出多播组,都要发送成员关系报告报文。连接在局域网上的所有多播路由器都能收到这样的报告报文。多播路由器周期性地发送成员关系询问报文以维持当前有效的、活跃的组地址。愿意继续参加多播组的主机必须响应以报告报文。

7.7 虚拟专用网VPN和网络地址转换NAT

7.7.1 虚拟专用网VPN

由于IP地址的紧缺,一个机构能够申请到的IP地址数往往远小于本机构所拥有的主机数。实际上,出于安全等原因,一个机构内的很多主机并不需要接入到外部的因特网,它们主要是和内部的其他主机进行通信。假定在一个机构内部的计算机通信也是采用TCP/IP,那么从原则上讲,对于这些仅在机构内部使用的计算机就可以由本机构自行分配其IP地址。这就是说,让这些计算机使用仅在本机构有效的IP地址(这种地址称为本地地址),而不需要向因特网的管理机构申请全球唯一的IP地址(这种地址称为全球地址)。这样就可以大大节约宝贵的全球IP地址资源。

但是,如果任意选择一些IP地址作为本地地址,那么在某种情况下可能会引起一些麻烦。例如,一个不连接因特网的主机A分配到一个本地地址150.1.2.3。这个地址不需要在因特网地址管理机构登记,但在本机构内必须是唯一的。然而正巧因特网上有一个主机,其IP地址就是150.1.2.3,而且这个主机要和本机构的某个具有全球地址的主机通信。这样就会出现地址的二义性问题。

为了解决这一问题,RFC1918指明了一些专用地址。这些地址只能用于一个机构的内部通信,而不能用于和因特网上的主机通信。换言之,专用地址只能做本地地址而不能用做全球地址。在因特网中的所有路由器对目的地址是专用地址的数据报一律不进行转发。RFC1918指明的专用地址是:

(1)10.0.0.0到10.255.255.255 (或记为10/8,共有2*24个地址)

(2)172.16.0.0到172.31.255.255 (或记为172.16/12,共有2*20个地址)

(3)192.168.0.0到192.168.255.255 (或记为192.168/16,共有2*16个地址)

上面的3个地址块分别相当于一个A类网络、16个连续的B类网络和256个连续的C类网络。A类地址本来早已用完了,而上面的地址10.0.0.0本来是分配给ARPANET的。因为ARPANET已经关闭停止运行了,所以这个地址就用做专用地址。

采用这样的专门IP地址的互联网络称为专用网络或本地互联网,更简单些说,就叫做专用网。显然,全世界可能有很多的专用互联网络具有相同的专用IP地址,但这并不会引起麻烦,因为这些专用地址仅在本机构内部使用。专用IP地址也叫做可重用地址。

有时一个很大的机构有很多部门分布在相距很远的一些地点,而在每一个地点都有自己的专用网。假定这些分布在不同地点的专用网需要经常进行通信。这时,可以有两种方法。第一种方法是租用电信公司的路线为本机构专用。这种方法的好处是简单方便,但线路的租金太高。第二种方法是利用因特网(即公用互联网)来实现本机构的专用网,因此,这样的专用网又称为虚拟专用网VPN。“虚拟”即“好象是”,但实际上不是,因为现在是因特网(而并没有用专线)来连接分散在各地的本地网络。VPN只是在效果上和真正的专用网一样。

假定某个机构在两个相隔较远的部门A和部门B建立了专用网,其网络地址分别为专用地址10.1.0.0和10.2.0.0。现在这两个部门需要通过因特网进行通信。

显然,每一个部门至少要有一个路由器具有合法的全球IP地址,如图7-31(a)所示的路由器R1和R2。这两个路由器和因特网的接口地址必须是合法的全球IP地址。路由器R1和R2在与专用网内部网络的接口地址则是专用网的本地地址。

现在设部门A的主机X要向部门B的主机Y发送数据报,源地址是10.1.0.1,而目的地址是10.2.0.3。这个数据报作为本机构的内部数据报从X发送到与外界连接的路由器R1。路由器R1收到内部数据后把整个的内部数据报进行加密,然后重新添加上数据报的首部封装成为在因特网上发送的外部数据报,其源地址是路由器R1的全球地址125.1.2.3,而目的地址是路由器R2的全球地址194,4.5.6。路由器R2收到数据报后将其数据部分取出进行解密,恢复出原来的内部数据报,并转发给主机Y。

图7-31 用隧道技术实现虚拟专用网

7.7.2 网络地址转换NAT

下面讨论另一种情况,就是在专用网内部的一些主机本来已经分配到了本地IP地址,但现在又想和因特网上的主机通信(并不需要加密),那么应当采取什么措施呢?

最简单的办法就是设法再申请一些全球IP地址。但这在很多情况下是不容易做到了,因为全球IP地址已所剩不多了。目前使用的最多的方法是采用网络地址转换。

网络地址转换NAT方法是在1994年提出的。这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT路由器,它至少有一个有效的外部全球地址IPG。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成IPG才能和因特网连接。

例如,当内部主机X用其本地地址IPX和因特网上的主机Y通信时,,它所发送的数据报必须经过的NAT路由器。NAT路由器将数据报的源地址IPX转换成自己的全球地址IPG,但目的地址IPY保持不变,然后发送到因特网。当NAT路由器从因特网收到主机Y发回的数据报时,知道数据报中的源地址是IPY,而目的地址是IPG。根据原来的记录(这个记录叫做NAT转换表),NAT路由器知道这个数据报是要发送给主机X的,因此,NAT路由器将目的地址IPG转换为IPX,转发给最终的内部主机X。

如果NAT路由器具有多个全球IP地址,那么就可以同时将多个本地地址转换为全球IP地址,因而可以是多个拥有本地地址的主机能够和因特网的主机进行通信。

还有一种NAT转换表将运输层的端口号也利用上,这样就可以用一个全球IP地址是多个拥有本地地址的主机同时和因特网上的不同主机进行通信。

7.8 下一代的网际协议IPV6

7.8.1 解决IP地址耗尽的措施

IP是因特网的核心协议。现在使用的IP是在20世纪70年代末期设计的,无论从计算机本身发展还是从因特网规模和网络传输速率来看,现在IPV4已很不适用了。这里最主要的问题就是32位的IP地址不够用。

要解决IP地址耗尽的问题,可以采用以下3个措施。

(1)采用无类别编址CIDR,使IP地址的分配更加合理。

(2)采用网络地址转换NAT方法,可节省许多全球IP地址。

(3)采用具有更大地址空间的新版本的IP,即IPV6。

尽管上述前两项措施的采用使得IP地址耗尽的日期推后了不少,但却不能从根本上解决IP地址即将耗尽的问题。因此,治本的方法应当是上述的第3种方法。

IETE早在1992年6月就提出要制定下一代的IP,即Ipng。Ipng现正式称为IPV6。1998年12月发表的RFC2460~2463已成为因特网草案标准协议。应当指出,换一个新版的IP并非易事。世界上许多团体都从因特网的发展中看到了机遇,因此,在新标准的制定过程中出于自身的经济利益而产生了激烈的争论。到目前为止,IPV6还只是草案标准阶段。

及早开始过渡到IPV6的好处是:有更多的时间来规划平滑过渡;有更多的时间培养IPV6的专门人才;及早提供IPV6服务比较便宜。因此,现在有些ISP已经开始进行IPV6的过渡。

下面是IPv6的简介。

7.8.2 IPv6的基本首部格式

IPv6仍支持无连接的传送,但将协议数据单元PDU称分组,而不是IPv4的数据报。为方便起见,本书仍采用数据报这一名词([COME06]和[TANE03]也是这样做的)。

IPv6所引进的主要变化如下。

(1)更大的地址空间。IPv6将地址从IPv4的32位增大到了128位,使地址空间增大了2*96倍。这样大的地址空间在可预见的将来是不会用完的。

(2)扩展的地址层次结构。IPv6由于地址空间很大,因此可以划分为更多的层次。

(3)灵活的首部格式,。IPv6数据报的首部和IPv4的并不兼容。IPv6定义了许多可选的扩展首部,不仅可提供比IPv4更多的功能,而且还可提高路由器的处理效率,这是因为路由器对扩展首部不进行处理(除逐跳扩展首部外)。

(4)改进的选项。IPv6允许数据包含有选项的控制信息,因而可以包含一些新的选项。我们知道,IPv4所规定的选项是固定不变的。

(5)允许协议纠结扩充。这一点很重要因为技术总是在不断地发展(如网络硬件的更新)而新的应用也还会出现。但我们知道,IPv4的功能是固定不变的。

(6)支持即插即用(即自动配置)。

(7)支持资源的预分配。IPv6支持实时视像等要求保证一定的带宽和时延的应用。

IPv6将首部长度变为固定的40字节,称为基本首部。将不必要的功能取消了,首部的字段数减少到只有8个(虽然首部长度增大了一倍)。此外,还取消了首部的检验和字段(考虑到数据链路层和运输层都有差错检验功能)。这样就加快了路由器处理数据报的速度。

IPv6数据报在基本首部的后面允许有零个或多个扩展首部,再后面是数据,如图7-32所示。但请读者注意,所有的扩展的首部都不属于数据报的首部。所有的扩展首部和数据合起来叫做数据报的有效载荷或净负荷。

图 7-32是具有多个可选扩展首部的IPv6数据报的一般形式

 

图7-33是IPv6数据包的基本首部。在基本首部后面是有效载荷,它包括运输层的数据和可能选用的扩展首部。下面解释IPv6基本首部中的各字段的作用。

图7-33 IPv6的基本首部格式

(1)版本占4位。它指明了协议的版本,对IPv6该字段总是6。

(2)通信量类占8位。这是为了区分不同的IPv6数据报的类别或优先级。目前正在进行不同的通信量类性能的实验。

(3)流标号占20位。IPv6的一个新的机制是支持资源预分配,并且允许路由器将每一个数据报与一个给定的资源分配相联系。IPv6提出流的抽象概念。所谓“流”就是互联网网络上从特定源点到特定终点(单播或多播)的一系列数据报(如实时音频或视频传输),而在这个“流”所经过路径上的路由器都保证指明的服务质量。所有属于同一个流的数据报都具有同样的流标号。

(4)有效载荷长度占16位。它指明IPv6数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内)。这个字段的最大值是64KB。

(5)下一个首部占8位,。它相当于IPv4的协议字段或可选字段。

当IPv6数据报没有扩展首部时,下一个首部字段的作用和IPv4的协议字段一样,它的值指出了基本首部后面的数据应交付给IP上面的哪一个高层协议(例如,6或17分别表示应付给TCP或UDP)。

当出现扩展首部时,下一个首部字段的值就标识后面第一个扩展首部的类型。

(6)跳数限制占8位。用来防止数据报在网络中无限期地存在。源站在每个数据报发出时即设定某个跳数限制。每个路由器在转发数据报时,要先在跳数限制字段中的值减1。当跳数限制的值为零时,就要将此数据报丢弃。

(7)源地址 占128位。是数据报的发送站的IP地址。

(8)目的地址 占128位。是数据报的接收站的IP地址。

IPv6为什么要使用扩展首部呢?大家知道,IPv4的数据报如果在其首部中使用了选项,那么沿数据报传送的路径上的每路由器都必须对这些选项进行一一检查,这就降低了路由器处理数据报的速度。然而实际上,在一条路径途中的路由器上很多选项是不需要检查的。IPv6把原来IPv4首部中选项的功能都放在扩展首部中,并将扩展首部留给路径两端的源站和目的站的主机来处理,而数据报途中经过的路由器都不处理这些扩展首部(只有一个首部例外,即逐跳选项扩展首部),这样就大提高了路由器的处理效率。

在RFC2460中定义了以下6种扩展首部:1.逐跳选项;2.路由选择;3.分片;4.鉴别;5.封装安全有效载荷;6.目的站选项。

每一个扩展首部都由若干个字段组成,他们的长度也各不同。但所有扩展首部的第一个字段都是8位的“下一个首部”字段。次字段的值指出了在该扩展首部后面的字段是什么。当使用多个扩展首部时,,应按以上的先后顺序出现。高层首部总是放在最后面。

7.8.3 IPV6的编址

一般来讲,,一个IPV6数据报的目的地址可以是以下3种基本类型地址之一。

(1)单播 单播就是传统的点对点通信。

(2)多播 多播是一点对多点的通信,数据报交付到一组计算机中的每一个。IPV6没有采用广播的术语,而是将广播看作多播的一个特例。

(3)任播 这是IPV6增加的一种类型。任播的目的站是一组计算机,但来自用户的数据报在交付时只交付给这组计算机中的任何一个,通常是距离最近的一个。

IPV6将实现IPV6的主机和路由器均称为结点,并将IPV6地址分配给结点上面的接口。一个接口可以有多个单播地址。一个结点接口的单播地址可用来唯一地标志该结点。

在IPV6中,每个地址占128位,地址空间大于3.4*10*38。如果整个地球表面都覆盖计算机,那么IPV6允许每平方米拥有7*10*23个IP地址。如果地址分配速率是每微秒分配100万个地址,则需要10*19年的时间才能将所有可能的地址分配完毕。可见,在想象得到的将来,IPV6的地址空间是不可能用完的。

巨大的地址范围还必须是维护互联网的人易于阅读和操作这些地址。IPV6所用的点分十进制记法现在也不够方便了。例如,一个用点分十进制的128位的地址:

104.230.140.100.255.255.255.255.0.0.17.128.150.10.255.255

为了使地址再简洁些,IPV6使用冒号十六进制记法,它把每个16位的值用十六进制表示,各值之间用冒号分隔。例如,如果前面所给的点分十进制记法的值改为冒号十六进制记法,就变成了:

68E6:8C64: FFFF: FFFF: 0:1180:960A: FFFF

在十六进制记法中允许省去冒号之间的数中最前面的一串0,如000F可缩写为F。

冒号十六进制记法还包括两个技术使它尤其有用。首先,冒号十六进制记法可以允许零压缩,即一连串连续的零可以为一对冒号所取代,例如:

FF05:0:0:0:0:0:0:B3

可以写成:FF05::B3

为了保证零压缩有一个不含混的解释,规定在任意一个地址中只能使用一次零压缩。该技术对已建议的分配策略特别有用,因为会有很多地址包含连续的零串。

其次,冒号十六进制记法可结合有点分十进制记法的后缀。,我们下面会看到这种结合在IPV4向IPV6的转换阶段特别有用。例如,下面的串是一个合法的冒号十六进制记法:

0:0:0:0:0:0:128.10.2.1

请读者注意,在这种记法中,虽然为冒号所分隔的每一个值是一个16位值,但每个点分十进制部分的值则指明一个字节(8位)的值。再使用零压缩即可得出:

::128.10.2.1

IPV6和IPV4最重要的变化之一就是单播地址所使用的划分策略,以及由此产生的多级地址体系.我们知道,采用CIDR后,IPV4的地址是两级结构,它的地址被划分为一个前缀和一个后缀。IPV6扩展了地址的分级概念,它使用以下的3个等级。(1)等一级(顶级),指明全球知道的公共拓扑。(2)第二级(地点级),指明单个的地点。(3)第三级,指明单个的网络接口。IPV6的地址体系采用多级体系是充分考虑到怎样使路由器可更快地查找路由。

7.8.4 ICMPV6

和IPV4一样,IPV6也需要使用ICMP。但旧版本的、适合于IPV4的ICMP并不能满足IPV6全部的要求。因此,叫做ICMPV6的新版本在1998年底也问世了[RFC2463],它目前还只是草案标准协议。

ICMPV6的报文格式和IPV4使用的ICMP的相似,即前4个字节的字段名称都是一样的,但ICMPV6把第5个字节起的后面部分作为报文主体。ICMPV6把报文种类划分为两大类,即差错报文和提供信息的报文,并取消了使用得很少的ICMP报文。差错报文的类型字段的最高位是0,因此,其类型字段的值是0到127。提供信息的报文的类型字段的最高位是1,其值是128到255。但在RFC2463中只定义了6种类型的ICMPV6报文。

ICMPV6报文的前面是IPV6首部和零个或更多的IPV6扩展首部。在ICMPV6前面的一个首部中的“下一个首部字段”的值应当置为58。请读者注意,这和IPV4中标志ICMP的值不同,在IPV4中标志ICMP的值是1。

顺便指出,与IPV6配套使用的没有IGMPV6,因为ICMPV6已经包含了所有ICMPV4和IGMP的功能。