计算机网络——网络层
本章讨论网络互连问题。在介绍网络层提供的两种不同服务后,就进入本章的核心内容一一网际协议IP,这是本书的一个重点内容。只有深入地掌握了 IP协议的主要内容,才能理解互联网是怎样工作的。
本章还要讨论网际控制报文协议ICMP,几种常用的路由选择协议,IPv6的主要特点,IP多播的概念。在讨论虚拟专用网VPN和网络地址转换NAT后,最后简单介绍多协议标记交换MPLS。本章最重要的内容是:
- 虚拟互连网络的概念。
- IP地址与物理地址的关系。
- 传统的分类的IP地址(包括子网掩码)和无分类域间路由选择CIDR。
- 路由选择协议的工作原理。
网络层提供的两种服务
在计算机网络领域,网络层应该向运输层提供怎样的服务(“面向连接”还是“无连接")曾引起了长期的争论。争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?
互联网的先驱者却提出一种崭新的网络设计思路。他们认为,电信网提供的端到端可靠传输的服务对电话业务无疑是很合适的,因为电信网的终端(电话机)非常简单,没有智能,也没有差错处理能力。因此电信网必须负责把用户电话机产生的话音信号可靠地传送到对方的电话机,使还原后的话音质量符合技术规范的要求。但计算机网络的端系统是有智能的计算机。计算机有很强的差错处理能力(这点和传统的电话机有本质上的差别)。
因此,互联网在设计上就釆用了和电信网完全不同的思路。互联网釆用的设计思路是这样的:网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。这里的“数报"(datagram)是互联网的设计者最初使用的名词,其实数据报(或IP数据报)就是我们经常使用的“分组”。在本书中,数据报和分组是同义词,可以混用。
网络在发送分组时不需要先建立连接。每一个分组(也就是IP数据报)独立发送,与其前后的分组无关(不进行编号)。网络层不提供服务质量的承诺。也就是说,所传送的分组可能出错、丢失、重复和失序(即不按序到达终点),当然也不保证分组交付的时限。由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器比较简单,且价格低廉(与电信网的交换机相比较)。如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络的主机中的运输层负责(包括差错处理、流量控制等)。
釆用这种设计思路的好处是:网络造价大大降低,运行方式灵活,能够适应多种应用。互联网能够发展到今日的规模,充分证明了当初釆用这种设计思路的正确性。
图4-1(b)给出了网络提供数据报服务的示意图。主机H1向H2发送的分组各自独立地选择路由,并且在传送的过程中还可能丢失。
OSI体系的支持者曾极力主张在网络层使用可靠传输的虚电路服务,也曾推出过网络层虚电路服务的著名标准——ITU-T的X.25建议书。但现在X.25早已成为历史了。
网际协议IP
网际协议IP是TCP/IP体系中两个最主要的协议之一,也是最重要的互联网标准协议之一。严格来说,这里所讲的IP其实是IP的第4个版本,应记为IPv4。但在讲述IP协议的各种原理时,往往不在IP后面加上版本号。在后面的4.6节我们再介绍较新的版本IPv6 (版本1 ~3和版本5都未曾使用过)。
与IP协议配套使用的还有三个协议:
- 地址解析协议 ARP(Address Resolution Protocol)
- 网际控制报文协议 ICMP (Internet Control Message Protocol)
- 网际组管理协议 IGMP (Internet Group Management Protocol)
图4-2画出了这三个协议和网际协议IP的关系。在这一层中,ARP画在最下面,因为IP经常要使用这个协议。ICMP和IGMP画在这一层的上部,因为它们要使用IP协议。这三个协议将在后面陆续介绍。
由于网际协议IP是用来使互连起来的许多计算机网络能够进行通信的,因此TCP/IP体系中的网络层常常被称为网际层(internet layer),或DP层。使用“网际层”这个名词的好处是强调这是由很多网络构成的互连网络。
在讨论网际协议IP之前,必须了解什么是虚拟互连网络。
虚拟互联网络
能不能让大家都使用相同的网络,这样可使网络互连变得比较简单。答案是不行的。因为用户的需求是多种多样的,没有一种单一的网络能够适应所有用户的需求。另外,网络技术是不断发展的,网络的制造厂家也要经常推出新的网络,在竞争中求生存。因此在市场上总是有很多种不同性能、不同网络协议的网络,供不同的用户选用。
从一般的概念来讲,将网络互相连接起来要使用一些中间设备。根据中间设备所在的层次,可以有以下四种不同的中间设备:
- 物理层使用的中间设备叫做转发器(repeater)。
- 数据链路层使用的中间设备叫做网桥或桥接器(bridge)。
- 网络层使用的中间设备叫做路由器(router)①。
- 在网络层以上使用的中间设备叫做网关(gateway)。用网关连接两个不兼容的系统需要在高层进行协议的转换。
当中间设备是转发器或网桥时,这仅仅是把一个网络扩大了,而从网络层的角度看,这仍然是一个网络,一般并不称之为网络互连。
网关由于比较复杂,目前使用得较少。因此现在我们讨论网络互连时,都是指用路由器进行网络互连和路由选择。
路由器其实就是一台专用计算机,用来在互联网中进行路由选择。由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关。
图4-3(a)表示有许多计算机网络通过一些路由器进行互连。由于参加互连的计算机网络都使用相同的网际协议IP (Internet Protocol),因此可以把互连以后的计算机网络看成如图4-3(b)所示的一个虚拟互连网络(internet)。
所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用IP协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。这种使用IP协议的虚拟互连网络可简称为IP网(IP网是虚拟的,但平常不必每次都强调“虚拟"二字)。
使用IP网的好处是:当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们看不见互连的各网络的具体异构细节(如具体的编址方案、路由选择协议,等等)。如果在这种覆盖全球的IP网的上层使用TCP协议,那么就是现在的互联网(Internet)。
当很多异构网络通过路由器互连起来时,如果所有的网络都使用相同的IP协议,那么在网络层讨论问题就显得很方便。现在用一个例子来说明。
在图4-4所示的互联网中的源主机H1要把一个IP数据报发送给目的主机H2。根据第1章中讲过的分组交换的存储转发概念,主机H1先要查找自己的路由表,看目的主机是否就在本网络上。如是,则不需要经过任何路由器而是直接交付,任务就完成了。如不是,则必须把IP数据报发送给某个路由器(图中的R1)。R1在查找了自己的路由表后,知道应当把数据报转发给R2进行间接交付。这样一直转发下去,最后由路由器R5知道自己是和H2连接在同一个网络上,不需要再使用别的路由器转发了,于是就把数据报直接交付目的主机H2。
图中画出了源主机、目的主机以及各路由器的协议栈。我们注意到,主机的协议栈共有五层,但路由器的协议栈只有下三层。图中还画出了数据在各协议栈中流动的方向(用黑色粗线表示)。我们还可注意到,在R4和R5之间使用了卫星链路,而R5所连接的是个无线局域网。在R1到R4之间的三个网络则可以是任意类型的网络。总之,这里强调的是:互联网可以由多种异构网络互连组成。
如果我们只从网络层考虑问题,那么IP数据报就可以想象是在网络层中传送,其传送路径是:H1-> R1-> R2->R3->R3->R5->H2这样就不必画出许多完整的协议栈,使问题的描述更加简单。有了虚拟互连网络的概念后,我们再讨论在这样的虚拟网络上如何寻址。
分类的IP地址
在TCP/IP体系中,IP地址是一个最基本的概念,一定要把它弄清楚。有关IP最重要的文档就是互联网的正式标准。
IP地址及其表示方法
整个的互联网就是一个单一的、抽象的网络。IP地址就是给互联网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32位的标识符。IP地址的结构使我们可以在互联网上很方便地进行寻址。IP地址现在由互联网名字和数字分配机构ICANN (Internet Corporation for Assigned Names and Numbers)进行分配。IP地址的编址方法共经过了三个历史阶段。
- 分类的IP地址。这是最基本的编址方法,在1981年就通过了相应的标准协议。
- 子网的划分。这是对最基本的编址方法的改进,其标准RFC 950在1985年通过。
- 构成超网。这是比较新的无分类编址方法。1993年提出后很快就得到推广应用。
本节只讨论最基本的分类的IP地址。所谓“分类的IP地址"就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机号(host-id),它标志该主机(或路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP地址在整个互联网范围内是唯一的。
这种两级的IP地址可以记为:
从图4-5可以看出:
- A类、B类和C类地址的网络号字段(在图中这个字段是灰色的)分别为1个、2个和3个字节长,而在网络号字段的最前面有1-3位的类别位,其数值分别规定为0, 10 和 110。
- A类、B类和C类地址的主机号字段分别为3个、2个和1个字节长。
- D类地址(前4位是1110)用于多播(一对多通信)。我们将在4.6节讨论IP多播。
- E类地址(前4位是1111)保留为以后用。
这里要指出,由于近年来已经广泛使用无分类IP地址进行路由选择,A类、B类和C类地址的区分己成为历史。
从IP地址的结构来看,IP地址并不仅仅指明一台主机,而是还指明了主机所连接到的网络。
IP地址具有以下一些重要特点。
每一个IP地址都由网络号和主机号两部分组成。从这个意义上说,IP地址是一种分等级的地址结构。分两个等级的好处是:
第一,IP地址管理机构在分配IP地址时只分配网络号(第一级),而剩下的主机号(第二级)则由得到该网络号的单位自行分配。这样就方便了 IP地址的管理;
第二,路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间以及查找路由表的时间。
实际上IP地址是标志一台主机(或路由器)和一条链路的接口。当一台主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号必须是不同的。这种主机称为多归属主机(multihomed host)。由于一个路由器至少应当连接到两个网络,因此一个路由器至少应当有两个不同的IP地址。
按照互联网的观点,一个网络是指具有相同网络号net-id的主机的集合,因此,用转发器或网桥连接起来的若干个局域网仍为一个网络,因为这些局域网都具有同样的网络号。具有不同网络号的局域网必须使用路由器进行互连。
在IP地址中,所有分配到网络号的网络(不管是范围很小的局域网,还是可能覆盖很大地理范围的广域网)都是平等的。所谓平等,是指互联网同等对待每一个IP地址。图4-7画出了三个局域网(LAN1,LAN2和LAN3)通过三个路由器(R1,R2和R3)互连起来所构成的一个互联网(此互联网用虚线圆角方框表示)。其中局域网LAN2是由两个网段通过网桥B互连的。图中的小圆圈表示需要有一个IP地址。
我们应当注意到:
- 在同一个局域网上的主机或路由器的IP地址中的网络号必须是一样的。图中所示的网络号就是IP地址中的网络号字段的值,这也是文献中常见的一种表示方法。另一种表示方法是用主机号为全0的网络IP地址。
- 用网桥(它只在链路层工作)互连的网段仍然是一个局域网,只能有一个网络号。
- 路由器总是具有两个或两个以上的IP地址。即路由器的每一个接口都有一个不同网络号的IP地址。
- 当两个路由器直接相连时(例如通过一条租用线路),在连线两端的接口处,可以分配也可以不分配IP地址。如分配了 IP地址,则这一段连线就构成了一种只包含一段线路的特殊“网络”(如图中的N1, N2和N3)。之所以叫做“网络”是因为它有IP地址。但为了节省IP地址资源,对于这种仅由一段连线构成的特殊“网络”,现在也常常不分配IP地址。通常把这样的特殊网络叫做无编号网络(unnumbered network)或无名网络(anonymous network)[COME06]。
IP地址与硬件地址
在学习IP地址时,很重要的一点就是要弄懂主机的IP地址与硬件地址(硬件地址已经固化在网卡的ROM上)的区别。
图4-8说明了这两种地址的区别。从层次的角度看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址为逻辑地址是因为IP地址是用软件实现的)。
在发送数据时,数据从高层下到低层,然后才到通信链路上传输。
使用IP地址的IP数据报一旦交给了数据链路层,就被封装成MAC帧了。MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个硬件地址都写在MAC帧的首部中。
连接在通信链路上的设备(主机或路由器)在收到MAC帧时,根据MAC帧首部中的硬件地址决定收下或丢弃。只有在剥去MAC帧的首部和尾部后把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。
总之,IP地址放在IP数据报的首部,而硬件地址则放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是硬件地址。在图4-8中,当IP数据报放入数据链路层的MAC帧中以后,整个的IP数据报就成为MAC帧的数据,因而在数据链路层看不见数据报的IP地址。
图4-9(a)画的是三个局域网用两个路由器R1和R2互连起来。现在主机H1要和主机H2通信。这两台主机的IP地址分别是IP1和IP2,而它们的硬件地址分别为HA1和HA2(HA表示Hardware Address)。通信的路径是:H1-> 经过R1转发-> 再经过R2转发->H2。
路由器R1因同时连接到两个局域网上,因此它有两个硬件地址,即HA3和HA4,同理,路由器R2也有两个硬件地址HA5和HA6。
图4-9(b)特别强调了 IP地址与硬件地址的区别。表4-4归纳了这种区别。
这里要强调指出以下几点:
- 在IP层抽象的互联网上只能看到IP数据报。虽然IP数据报要经过路由器R1和R2的两次转发,但在它的首部中的源地址和目的地址始终分别是IP1和IP2。图中的数据报上写的“从IP1到IP2”就表示前者是源地址而后者是目的地址。数据报中间经过的两个路由器的IP地址并不出现在IP数据报的首部中。
- 虽然在IP数据报首部有源站IP地址,但路由器只根据目的站的IP地址的网络号进行路由选择。
- 在局域网的链路层,只能看见MAC帧。IP数据报被封装在MAC帧中。MAC帧在不同网络上传送时,其MAC帧首部中的源地址和目的地址要发生变化,见图4-9(b)。开始在H1到R1间传送时,MAC帧首部中写的是从硬件地址HA1发送到硬件地址HA3,路由器R1收到此MAC帧后,在数据链路层,要丢弃原来的MAC帧的首部和尾部。在转发时,在数据链路层,要重新添加上MAC帧的首部和尾部。这时首部中的源地址和目的地址分别便成为HA4和HA5。路由器R2收到此帧后,再次更换MAC帧的首部和尾部,首部中的源地址和目的地址分别变成为HA6和HA2。MAC帧的首部的这种变化,在上面的IP层上是看不见的。
- 尽管互连在一起的网络的硬件地址体系各不相同,但IP层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的IP地址研究主机和主机或路由器之间的通信。上述的这种"屏蔽"概念是一个很有用、很普遍的基本概念。
地址解析协议ARP
在实际应用中,我们经常会遇到这样的问题:己经知道了一个机器(主机或路由器)的IP地址,需要找出其相应的硬件地址。地址解析协议ARP就是用来解决这样的问题的。
图4-10说明了 ARP协议的作用。
由于是IP协议使用了 ARP协议,因此通常就把ARP协议划归网络层。但ARP协议的用途是为了从网络层使用的IP地址,解析出在数据链路层使用的硬件地址。因此,有的教科书就按照协议的所用,把ARP协议划归在数据链路层。这样做当然也是可以的。
下面就介绍ARP协议的要点。
我们知道,网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系(例如,IP地址有32位,而局域网的硬件地址是48位)。此外,在一个网络上可能经常会有新的主机加入进来,或撤走一些主机。更换网络适配器也会使主机的硬件地址改变。
地址解析协议ARP解决这个问题的方法是在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。每一台主机都设有一个ARP高速缓存(ARP cache),里面有本局域网上的各主机和路由器的IP地址到硬件地址的映射表,这些都是该主机目前知道的一些地址。那么主机怎样知道这些地址呢?我们可以通过下面的例子来说明。
当主机A要向本局域网上的某台主机B发送IP数据报时,就先在其ARP高速缓存中査看有无主机B的IP地址。如有,就在ARP高速缓存中査出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。也有可能查不到主机B的IP地址的项目。这可能是主机B才入网,也可能是主机A刚刚加电,其高速缓存还是空的。在这种情况下,主机A就自动运行ARP,然后按以下步骤找出主机B的硬件地址:
- ARP进程在本局域网上广播发送一个ARP请求分组。图4-11(a)是主机A广播发送ARP请求分组的示意图。ARP请求分组的主要内容是:“我的IP地址是209.0.0.5,硬件地址是00-00-C0-15-AD-18。我想知道IP地址为209.0.0.6的主机的硬件地址。”
- 在本局域网上的所有主机上运行的ARP进程都收到此ARP请求分组。
- 主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组,同时在这个ARP响应分组中写入自己的硬件地址。由于其余的所有主机的IP地址都与ARP请求分组中要査询的IP地址不一致,因此都不理睬这个ARP请求分组,见图4-11(b)。ARP响应分组的主要内容是:“我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。“请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。
- 主机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对保存在高速缓存中的每一个映射地址项目都设置生存时间(例如,10 ~ 20分钟)。凡超过生存时间的项目就从高速缓存中删除掉。设置这种地址映射项目的生存时间是很重要的。设想有一种情况。主机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地址和硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,例如,在前面的图4-9中,主机H1就无法解析出另一个局域网上主机H2的硬件地址(实际上主机H1也不需要知道远程主机H2的硬件地址)。
主机H1发送给H2的IP数据报首先需要通过与主机H1连接在同一个局域网上的路由器R1来转发。因此主机H1这时需要把路由器R1的IP地址IP3解析为硬件地址HA3,以便能够把IP数据报传送到路由器R1。以后,R1从转发表找出了下一跳路由器R2,同时使用ARP解析出R2的硬件地址HA5。于是IP数据报按照硬件地址HA5转发到路由器R2。路由器R2在转发这个IP数据报时用类似方法解析出目的主机H2的硬件地址HA2,使IP数据报最终交付主机H2。
从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的。只要主机或路由器要和本网络上的另一个己知IP地址的主机或路由器进行通信,ARP协议就会自动地把这个IP地址解析为链路层所需要的硬件地址。
下面我们归纳出使用ARP的四种典型情况(图4-12)。
- 发送方是主机(如H1),要把IP数据报发送到同一个网络上的另一台主机(如H2)。这时H1发送ARP请求分组(在网1上广播),找到目的主机改的硬件地址。
- 发送方是主机(如H1),要把IP数据报发送到另一个网络上的一台主机(如H3或H4)。这时H1发送ARP请求分组(在网1上广播),找到网1上的一个路由器R1的硬件地址。剩下的工作由路由器R1来完成。R1要做的事情是下面的(3)或(4)。
- 发送方是路由器(如R1),要把IP数据报转发到与R1连接在同一个网络(网2)上的主机(如H3)。这时R1发送ARP请求分组(在网2上广播),找到目的主机H3的硬件地址。
- 发送方是路由器(如R1),要把IP数据报转发到网3上的一台主机(如H4)。H4与R1不是连接在同一个网络上。这时R1发送ARP请求分组(在网2上广播),找到连接在网2上的一个路由器R2的硬件地址。剩下的工作由这个路由器R2来完成。
在许多情况下需要多次使用ARP。但这只是以上几种情况的反复使用而已。
有的读者可能会产生这样的问题:既然在网络链路上传送的帧最终是按照硬件地址找到目的主机的,那么为什么我们还要使用抽象的IP地址,而不直接使用硬件地址进行通信?这样似乎可以免除使用ARP。
这个问题必须弄清楚。由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此由用户或用户主机来完成这项工作几乎是不可能的事。但IP编址把这个复杂问题解决了。连接到互联网的主机只需各自拥有一个唯一的IP地址,它们之间的通信就像连接在同一个网络上那样简单方便,因为上述的调用ARP的复杂过程都是由计算机软件自动进行的,对用户来说是看不见这种调用过程的。因此,在虚拟的IP网络上用IP地址进行通信给广大的计算机用户带来很大的方便。
IP数据报格式
IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(即4字节)为单位来描述。图4-13是IP数据报的完整格式。
从图4-13可看出,一个IP数据报由首部和数据两部分组成。首部的前一部分是固定长度,共20字节,是所有IP数据报必须具有的。在首部的固定部分的后面是一些可选字段,其长度是可变的。下面介绍首部各字段的意义。
IP数据报首部的固定部分中的各字段
版本 占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4 (即IPv4)。关于以后要使用的IPv6 (即版本6的IP协议)。
首部长度 占4位,可表示的最大十进制数值是15。请注意,首部长度字段所表示数的单位是32位字(1个32位字长是4字节)。因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5 (即二进制表示的首部长度是0101)。而当首部长度为最大值1111时(即十进制数的15),就表明首部长度达到最大值15个32位字长,即60字节。当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因此IP数据报的数据部分永远在4字节的整数倍时开始,这样在实现IP协议时较为方便。首部长度限制为60字节的缺点是有时可能不够用。但这样做是希望用户尽量减少开销。最常用的首部长度是20字节(即首部长度为0101),这时不使用任何选项。
区分服务 占8位,用来获得更好的服务。这个字段在旧标准中叫做服务类型,但实际上一直没有被使用过。1998年IETF把这个字段改名为区分服务DS 。只有在使用区分服务时,这个字段才起作用。
总长度 总长度指首部和数据之和的长度,单位为字节。总长度字段为16位,因此数据报的最大长度为216 - 1 = 65535字节。然而实际上传送这样长的数据报在现实中是极少遇到的。我们知道,在IP层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度,这称为最大传送单元MTU (Maximum Transfer Unit)。当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层所规定的MTU值。例如,最常用的以太网就规定其MTU值是1500字节。若所传送的数据报长度超过数据链路层的MTU值,就必须把过长的数据报进行分片处理。
虽然使用尽可能长的IP数据报会使传输效率得到提高(因为每一个IP数据报中首部长度占数据报总长度的比例就会小些),但数据报短些也有好处。每一个IP数据报越短,路由器转发的速度就越快。为此,IP协议规定,在互联网中所有的主机和路由器,必须能够接受长度不超过576字节的数据报。这是假定上层交下来的数据长度有512字节(合理的长度),加上最长的IP首部60字节,再加上4字节的富余量,就得到576字节。当主机需要发送长度超过576字节的数据报时,应当先了解一下,目的主机能否接受所要发送的数据报长度。否则,就要进行分片。在进行分片时(见后面的“片偏移”字段),数据报首部中的“总长度”字段是指分片后的毎一个分片的首部长度与该分片的数据长度的总和。
标识(identification) 占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识"并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有話数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。
标志(flag) 占3位,但目前只有两位有意义。
- 标志字段中的最低位记为MF (More Fragment)。MF = 1即表示后面“还有分片"的数据报。MF = 0表示这己是若干数据报片中的最后一个。
- 标志字段中间的一位记为DF (Don't Fragment),意思是“不能分片”。只有当DF = 0时才允许分片。
片偏移 占13位。片偏移指出:较长的分组在分片后,某片在原分组中的相对位置。也就是说,相对于用户数据字段的起点,该片从何处开始。片偏移以8个字节为偏移单位。这就是说,每个分片的长度一定是8字节(64位)的整数倍。
生存时间 占8位,英文缩写是TTL (Time To Live),表明这是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在互联网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为TTL值的单位。每经过一个路由器时,就把TTL减去数据报在路由器所消耗掉的一段时间。若数据报在路由器消耗的时间小于1秒,就把TTL值减1。当TTL值减为零时,就丢弃这个数据报。
然而随着技术的进步,路由器处理数据报所需的时间不断在缩短,一般都远远小于1秒,后来就把TTL字段的功能改为“跳数限制”(但名称不变)。路由器在每次转发数据报之前就把TTL值减1。若TTL值减小到零,就丢弃这个数据报,不再转发。因此,现在TTL的单位不再是秒,而是跳数。TTL的意义是指明数据报在互联网中至多可经过多少个路由器。显然,数据报能在互联网中经过的路由器的最大数值是255。若把TTL的初始值设置为1,就表示这个数据报只能在本局域网中传送。因为这个数据报一传送到局域网上的某个路由器,在被转发之前TTL值就减小到零,因而就会被这个路由器丢弃。
协议 占8位,协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的IP层知道应将数据部分上交给哪个协议进行处理。
- 首部检验和 占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。为了进一步减小计算检验和的工作量,IP首部的检验和不釆用复杂的CRC检验码而采用下面的简单计算方法:在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。图445说明了 IP数据报首部检验和的计算过程。
- 源地址 占32位。
- 目的地址 占32位。
IP数据报首部的可变部分
IP数据报首部的可变部分就是一个选项字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。此字段的长度可变,从1个字节到40个字节不等,取决于所选择的项目。某些选项项目只需要1个字节,它只包括1个字节的选项代码。而有些选项需要多个字节,这些选项一个个拼接起来,中间不需要有分隔符,最后用全0的填充字段补齐成为4字节的整数倍。
增加首部的可变部分是为了增加IP数据报的功能,但这同时也使得IP数据报的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被使用。很多路由器都不考虑IP首部的选项字段,因此新的IP版本IPv6就把IP数据报的首部长度做成固定的。这里就不讨论这些选项的细节了。有兴趣的读者可参阅RFC 79U。
IP层转发分组的流程
下面我们先用一个简单例子来说明路由器是怎样转发分组的。
图4-16(a)是一个路由表的简单例子。有四个A类网络通过三个路由器连接在一起。每一个网络上都可能有成千上万台主机(图中没有画出这些主机)。可以想象,若路由表指出到每一台主机应怎样转发,则所得出的路由表就会过于庞大(如果每一个网络有1万台主机,四个网络就有4万台主机,因而每一个路由表就有4万个项目,即4万行。每一行对应于一台主机)。
但若路由表指出到某个网络应如何转发,则每个路由器中的路由表就只包含4个项目(即只有4行,每一行对应于一个网络)。以路由器R2的路由表为例。由于R2同时连接在网络2和网络3上,因此只要目的主机在网络2或网络3上,都可通过接口 0或1由路由器R2直接交付(当然还要利用地址解析协议ARP才能找到这些主机相应的硬件地址)。若目的主机在网络1中,则下一跳路由器应为R1其IP地址为20.0.0.7。路由器R2和R1由于同时连接在网络2上,因此从路由器R2把分组转发到路由器R1是很容易的。
同理,若目的主机在网络4中,则路由器R2应把分组转发给IP地址为30.0.0.1的路由器R3。我们应当注意到,图中的每一个路由器都有两个不同的IP地址。可以把整个的网络拓扑简化为图4-16(b)所示的那样。在简化图中,网络变成了一条链路,但每一个路由器旁边都注明其IP地址。使用这样的简化图,可以使我们不必关心某个网络内部的具体拓扑以及连接在该网络上有多少台主机,因为这些对于研究分组转发问题并没有什么关系。这样的简化图强调了在互联网上转发分组时,是从一个路由器转发到下一个路由器。
总之,在路由表中,对每一条路由最主要的是以下两个信息:(目的网络地址,下一跳地址)
于是,我们就根据目的网络地址来确定下一跳路由器,这样做可得出以下的结果。
- IP数据报最终一定可以找到目的主机所在目的网络上的路由器(可能要通过多次的间接交付)。
- 只有到达最后一个路由器时,才试图向目的主机进行直接交付。
虽然互联网所有的分组转发都是基于目的主机所在的网络,但在大多数情况下都允许有这样的特例,即对特定的目的主机指明一个路由。这种路由叫做特定主机路由。
采用特定主机路由可使网络管理人员更方便地控制网络和测试网络,同时也可在需要考虑某种安全问题时釆用这种特定主机路由。在对网络的连接或路由表进行排错时,指明到某一台主机的特殊路由就十分有用。
路由器还可采用默认路由(default route)以减小路由表所占用的空间和搜索路由表所用的时间。这种转发方式在一个网络只有很少的对外连接时是很有用的。
实际上,默认路由在主机发送IP数据报时往往更能显示出它的好处。我们在前面的4.2.1节己经讲过,主机在发送每一个IP数据报时都要査找自己的路由表。如果一台主机连接在一个小网络上,而这个网络只用一个路由器和互联网连接,那么在这种情况下使用默认路由是非常合适的。
例如,在图4-17的互联网中,连接在网络N1上的任何一台主机中的路由表只需要三个项目即可。第一个项目就是到本网络主机的路由,其目的网络就是本网络N1,因而不需要路由器转发,而是直接交付。第二个项目是到网络N2的路由,对应的下一跳路由器是R2。第三个项目就是默认路由。只要目的网络是其他网络(不是N]或N2),就一律选择默认路由,把数据报先间接交付路由器R1“,让R1再转发给互联网中的下一个路由器,一直转发到目的网络上的路由器,最后进行直接交付。在实际上的路由器中,像图4-17路由表中所示的“直接"和“其他”的几个字符并没有出现在路由表中,而是被记0.0.0.0。
这里我们应当强调指出,在IP数据报的首部中没有地方可以用来指明“下一跳路由器的IP地址”。在IP数据报的首部写上的IP地址是源IP地址和目的IP地址,而没有中间经过的路由器的IP地址。既然IP数据报中没有下一跳路由器的IP地址,那么待转发的数据报又怎样能够找到下一跳路由器呢?
当路由器收到一个待转发的数据报,在从路由表得出下一跳路由器的IP地址后,不是把这个地址填入IP数据报,而是送交数据链路层的网络接口软件。网络接口软件负责把下一跳路由器的IP地址转换成硬件地址(必须使用ARP),并将此硬件地址放在链路层的MAC帧的首部,然后根据这个硬件地址找到下一跳路由器。由此可见,当发送一连串的数据报时,上述的这种査找路由表、用ARP得到硬件地址、把硬件地址写入MAC帧的首部等过程,将不断地重复进行,造成了一定的开销。
那么,能不能在路由表中不使用IP地址而直接使用硬件地址呢?不行。我们一定要弄清楚,使用抽象的IP地址,本来就是为了隐蔽各种底层网络的复杂性而便于分析和研究问题,这样就不可避免地要付出些代价,例如在选择路由时多了一些开销。但反过来,如果在路由表中直接使用硬件地址,那就会带来更多的麻烦。
根据以上所述,可归纳出分组转发算法如下:
- 从数据报的首部提取目的主机的IP地址D,得出目的网络地址为N。
- 若N就是与此路由器直接相连的某个网络地址,则进行直接交付,不需要再经过其他的路由器,直接把数据报交付目的主机**(这里包括把目的主机地址D转换为具体的硬件地址,把数据报封装为MAC帧,再发送此帧)**;否则就是间接交付,执行(3)。
- 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
- 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(5)。
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
- 报告转发分组出错。
这里我们要再强调一下,路由表并没有给分组指明到某个网络的完整路径(即先经过哪一个路由器,然后再经过哪一个路由器,等等)。路由表指出,到某个网络应当先到某个路由器(即下一跳路由器),在到达下一跳路由器后,再继续查找其路由表,知道再下一步应当到哪一个路由器。这样一步一步地査找下去,直到最后到达目的网络。
划分子网和构造超网
划分子网
从两级IP地址到三级IP地址
在今天看来,在ARPANET的早期,IP地址的设计确实不够合理。
第一,IP地址空间的利用率有时很低。
每一个A类地址网络可连接的主机数超过1000万,而每一个B类地址网络可连接的主机数也超过6万。有的单位申请到了一个B类地址网络,但所连接的主机数并不多,可是又不愿意申请一个足够使用的C类地址,理由是考虑到今后可能的发展。IP地址的浪费,还会使IP地址空间的资源过早地被用完。
第二,给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。
每一个路由器都应当能够从路由表查出应怎样到达其他网络的下一跳路由器。因此,互联网中的网络数越多,路由器的路由表的项目数也就越多。这样,即使我们拥有足够多的IP地址资源可以给每一个物理网络分配一个网络号,也会导致路由器的路由表中的项目数过多。这不仅增加了路由器的成本(需要更多的存储空间),而且使査找路由时耗费更多的时间,同时也使路由器之间定期交换的路由信息急剧增加,因而使路由器和整个互联网的性能都下降了。
第三,两级IP地址不够灵活。
有时情况紧急,一个单位需要在新的地点马上开通一个新的网络。但是在申请到一个新的IP地址之前,新增加的网络是不可能连接到互联网上工作的。我们希望有一种方法,使一个单位能随时灵活地增加本单位的网络,而不必事先到互联网管理机构去申请新的网络号。原来的两级IP地址无法做到这一点。
为解决上述问题,从1985年起在IP地址中又增加了一个“子网号字段”,使两级IP地址变成为三级IP地址,它能够较好地解决上述问题,并且使用起来也很灵活。这种做法叫做划分子网(subnetting) [RFC 950],或子网寻址或子网路由选择。划分子网己成为互联网的正式标准协议。
划分子网的基本思路如下:
- 一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网(subnet)。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少个子网组成,因为这个单位对外仍然表现为一个网络。
- 划分子网的方法是从网络的主机号借用若干位作为子网号(subnet-id),当然主机号也就相应减少了同样的位数。于是两级IP地址在本单位内部就变为三级IP地址:网络号、子网号和主机号。也可以用以下记法来表示:IP地址::={<网络号>,〈子网号>,〈主机号〉}
- 凡是从其他网络发送给本单位某台主机的IP数据报,仍然是根据IP数据报的目的网络号找到连接在本单位网络上的路由器。但此路由器在收到IP数据报后,再按目的网络号和子网号找到目的子网,把IP数据报交付目的主机。
下面用例子说明划分子网的概念。图4-18表示某单位拥有一个B类IP地址,网络地址是145.13.0.0 (网络号是145.13)。凡目的地址为145.13.X.X的数据报都被送到这个网络上的路由器R1。
现把图4-18的网络划分为三个子网(图4-19)。这里假定子网号占用8位,因此在增加了子网号后,主机号就只有8位。所划分的三个子网分别是:145.13.3.0, 145.13.7.0和145.13.21.0。在划分子网后,整个网络对外部仍表现为一个网络,其网络地址仍为145.13.0.0。但网络145.13.0.0 上的路由器R1在收到外来的数据报后,再根据数据报的目的地址把它转发到相应的子网。
总之,当没有划分子网时,IP地址是两级结构。划分子网后IP地址变成了三级结构。划分子网只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号。
子网掩码
现在剩下的问题就是:假定有一个数据报(其目的地址是145.13.3.10)已经到达了路由器R1。那么这个路由器如何把它转发到子网145.13.3.0呢?
我们知道,从IP数据报的首部无法看出源主机或目的主机所连接的网络是否进行了子网的划分。这是因为32位的IP地址本身以及数据报的首部都没有包含任何有关子网划分的信息。因此必须另外想办法,这就是使用子网掩码(subnet mask)(见图4-20)。
图4-20(a)是IP地址为145.13.3.10的主机本来的两级IP地址结构。
图4-20(b)是这个两级IP地址的子网掩码。
图4-20(c)是同一地址的三级IP地址结构,也就是说,现在从原来16位的主机号中拿出8位作为子网号,而主机号由16位减少到8位。请注意,现在子网号为3的网络的网络地址是145.13.3.0 (既不是原来两级IP地址的网络地址145.13.0.0,也不是简单的子网号3)。为了使路由器R1能够很方便地从数据报中的目的IP地址中提取出所要找的子网的网络地址,路由器R1就要使用三级IP地址的子网掩码。
图4~20(d)是三级IP地址的子网掩码,它也是32位,由一串24个1和跟随的一串8个0组成。子网掩码中的1对应于IP地址中原来二级地址中的16位网络号加上新增加的8位子网号,而子网掩码中的0对应于现在的8位主机号。虽然RFC文档中没有规定子网掩码中的一串1必须是连续的,但却极力推荐在子网掩码中选用连续的1,以免出现可能发生的差错。
图4-20(e)表示R1把三级IP地址的子网掩码和收到的数据报的目的IP地址145.13.3.10逐位相“与"(AND)(计算机进行这种逻辑AND运算是很容易的),得出了所要找的子网的网络地址145.13.3.0。使用子网掩码的好处就是:不管网络有没有划分子网,只要把子网掩码和IP地址进行逐位的“与”运算(AND),就立即得出网络地址来。这样在路由器处理到来的分组时就可釆用同样的算法。
归纳一下上述的要点。从网络145.13.0.0。外面看,这就是一个普通的B类网络,其子网掩码为16个连1后面跟上16个连0,但进入到这个网络后(即到了路由器R1),就看到了还有许多网络(即划分了子网后的许多网络),其网络地址是145.13.X.0 (这里x可以表示不同的数值),而这些网络的子网掩码都是24个连1后面跟上8个连0。总之,在这个B类网络的外面和里面,看到的网络是不一样的。
这里还要弄清一个问题,这就是:在不划分子网时,既然没有子网,为什么还要使用子网掩码?这就是为了更便于査找路由表。现在互联网的标准规定:所有的网络都必须使用子网掩码,同时在路由器的路由表中也必须有子网掩码这一栏。
如果一个网络不划分子网,那么该网络的子网掩码就使用默认子网掩码。默认子网掩码中1的位置和IP地址中的网络号字段net-id正好相对应。因此,若用默认子网掩码和某个不划分子网的IP地址逐位相“与”(AND),就应当能够得出该IP地址的网络地址来。这样做可以不用查找该地址的类别位就能知道这是哪一类的IP地址。显然,
A类地址的默认子网掩码是255.0.0.0,或OxFF000000。
B类地址的默认子网掩码是255.255.0.0,或OxFFFF0000。
C类地址的默认子网掩码是255.255.255.0,或OxFFFFFF00。
图4-21是这三类IP地址的网络地址和相应的默认子网掩码。
子网掩码是一个网络或一个子网的重要属性。在RFC 950成为互联网的正式标准后,路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。在路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。
我们以一个B类地址为例,说明可以有多少种子网划分的方法。在釆用固定长度子网时,所划分的所有子网的子网掩码都是相同的(见表4-6)。
在表4-6中,子网数是根据子网号(subnet-id)计算出来的。若subnet-id有n位,则共有2n种可能的排列。除去全0和全1这两种情况,就得出表中的子网数。
表中的“子网号的位数"中没有0,1,15和16这四种情况,因为这没有意义。
请读者注意,虽然根据已成为互联网标准协议的RFC 950文档,子网号不能为全1或全0,但随着无分类域间路由选择CIDR的广泛使用(在4.3.3节讨论),现在全1和全0的子网号也可以使用了,但一定要谨慎使用,要弄清你的路由器所用的路由选择软件是否支持全0或全1的子网号这种较新的用法。
我们可以看岀,若使用较少位数的子网号,则每一个子网上可连接的主机数就较多。反之,若使用较多位数的子网号,则子网的数目较多但每个子网上可连接的主机数就较少。因此我们可根据网络的具体情况(一共需要划分多少个子网,每个子网中最多有多少台主机)来选择合适的子网掩码。
通过简单的计算,读者不难得到这样的结论:划分子网増加了灵活性,但却减少了能够连接在网络上的主机总数。例如,本来一个B类地址最多可连接65534台主机,但表4-6中任意一行的最后两项的乘积一定小于65534。
这个例子说明,同样的IP地址和不同的子网掩码可以得出相同的网络地址。但是,不同的掩码的效果是不同的。在例4-2中,子网号是2位,主机号是14位。在例4-3中,子网号是3位,主机号是13位。因此这两个例子中可划分的子网数和每一个子网中的最大主机数都是不一样的。
使用子网时的分组转发
在划分子网的情况下,分组转发的算法必须做相应的改动。
我们应当注意到,使用子网划分后,路由表必须包含以下三项内容:目的网络地址、子网掩码和下一跳地址。
在划分子网的情况下,路由器转发分组的算法如下:
- 从收到的数据报的首部提取目的IP地址。
- 先判断是否为直接交付。对路由器直接相连的网络逐个进行检査:用各网络的子网掩码和D逐位相“与”(AND操作),看结果是否和相应的网络地址匹配。若匹配,则把分组进行直接交付(当然还需要把。转换成物理地址,把数据报封装成帧发送出去),转发任务结束。否则就是间接交付,执行(3)。
- 若路由表中有目的地址为D的特定主机路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(4)。
- 对路由表中的每一行(目的网络地址,子网掩码,下一跳地址),用其中的子网掩码和D逐位相''与”(AND操作),其结果为N。若N与该行的目的网络地址匹配,则把数据报传送给该行指明的下一跳路由器;否则,执行(5)。
- 若路由表中有一个默认路由,则把数据报传送给路由表中所指明的默认路由器;否则,执行(6)。
- 报告转发分组岀错。
【例4~4】图4-24有三个子网,两个路由器,以及路由器R1中的部分路由表。现在源主机H1向目的主机H2发送分组。试讨论R1收到H1向H2发送的分组后查找路由表的过程。
【解】源主机H1向目的主机H2发送的分组的目的地址是电的IP地址128.30.33.138。
源主机H1首先要进行的操作是要判断:发送的这个分组,是在本子网上进行直接交付还是要通过本子网上的路由器进行间接交付?
源主机H1把本子网的“子网掩码255.255.255.128”与目的主机H2的“IP地址128.30.33.138”逐相“与”(即逐位进行AND操作),得出128.30.33.128,它不等于H1的网络地址(128.30.33.0)。这说明H2与H1不在同一个子网上。因此H1不能把分组直接交付H2,而必须交给子网上的默认路由器R1,由R1来转发。
路由器R1在收到一个分组后,就在其路由表中逐行寻找有无匹配的网络地址。
先看R1路由表中的第一行。用这一行的“子网掩码255.255.255.128”和收到的分组的“目的地址128.30.33.138”逐位相“与”(即逐位进行AND操作),得出128.30.33.128。然后和这一行给出的目的网络地址128.30.33.0进行比较。但比较的结果不一致(即不匹配)。
用同样方法继续往下找第二行。用第二行的“子网掩码255.255.255.128”和该分组的'‘目的地址128.30.33.138 ”逐位相“与”(即逐位进行AND操作),结果也是128.30.33.128。这个结果和第二行的目的网络地址128.30.33.128相匹配,说明这个网络(子网2)就是收到的分组所要寻找的目的网络。于是不需要再继续査找下去。R1把分组从接口1直接交付主机H2 (它们都在一个子网上)。
无分类编址CIDR(构造超网)
网络前缀
划分子网在一定程度上缓解了互联网在发展中遇到的困难。然而在1992年互联网仍然面临三个必须尽早解决的问题,这就是:
- B类地址在1992年已分配了近一半,眼看很快就将全部分配完毕!
- 互联网主干网上的路由表中的项目数急剧增长(从几千个增长到几万个)。
- 整个IPv4的地址空间最终将全部耗尽。在2011年2月3日,IANA宣布IPv4地址己经耗尽了。
当时预计前两个问题将在1994年变得非常严重。因此DETF很快就研究出釆用无分类编址的方法来解决前两个问题。IETF认为上面的第三个问题属于更加长远的问题,因此专门成立IPv6工作组负责研究解决新版本IP协议的问题。
其实早在1987年,RFC 1009就指明了在一个划分子网的网络中可同时使用几个不同的子网掩码。使用变长子网掩码VLSM (Variable Length Subnet Mask)可进一步提高IP地址资源的利用率。在VLSM的基础上又进一步研究出无分类编址方法,它的正式名字是==无分类域间路由选择 CIDR== (Classless Inter-Domain Routing,,CIDR 的读音是“sider")。CIDR最主要的特点有两个:
CIDR消除了传统的A类、B类和C类地址以及划分子网的概念,因而能更加有效地分配IPv4的地址空间,并且在新的IPv6使用之前容许互联网的规模继续增长。CIDR把32位的IP地址划分为前后两个部分。前面部分是“网络前缀” (network-prefix)(或简称为“前缀"),用来指明网络,后面部分则用来指明主机。因此CIDR使IP地址从三级编址(使用子网掩码)又回到了两级编址,但这已是无分类的两级编址。其记法是: IP地址::={〈网络前缀>,<主机号〉}
CIDR还使用“斜线记法"(slash notation),或称为CIDR记法,即在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数。
CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。我们只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的起始地址(即最小地址)和最大地址,以及地址块中的地址数。例如,已知IP地址128.14.35.7/20是某CIDR地址块中的一个地址,现在把它写成二进制表示,其中的前20位是网络前缀(用粗体和下划线表示出),而前缀后面的12位是主机号:
当然,以上这两个特殊地址的主机号是全0和全1的地址,一般并不使用。通常只使用在这两个特殊地址之间的地址。不难看出,这个地址块共有212个地址。我们可以用地址块中的最小地址和网络前缀的位数指明这个地址块。例如,上面的地址块可记为128.14.32.0/20。在不需要指出地址块的起始地址时,也可把这样的地址块简称为“/20地址块”。
为了更方便地进行路由选择,CIDR使用32位的地址掩码(address mask)。地址掩码由一串1和一串0组成,而1的个数就是网络前缀的长度。虽然CIDR不使用子网了,但由于目前仍有一些网络还使用子网划分和子网掩码,因此CIDR使用的地址掩码也可继续称为子网掩码。例如,/20地址块的地址掩码是:11111111 11111111 11110000 00000000 ( 20个连续的1)。斜线记法中,斜线后面的数字就是地址掩码中1的个数。
请读者注意,“CIDR不使用子网”是指CIDR并没有在32位地址中指明若干位作为子网字段。但分配到一个CIDR地址块的单位,仍然可以在本单位内根据需要划分出一些子网。这些子网也都只有一个网络前缀和一台主机号字段,但子网的网络前缀比整个单位的网络前缀要长些。例如,某单位分配到地址块/20,就可以再继续划分为8个子网(即需要从主机号中借用3位来划分子网)。这时每一个子网的网络前缀就变成23位(原来的20位加上从主机号借来的3位),比该单位的网络前缀多了 3位。
斜线记法还有一个好处就是它除了表示一个IP地址外,还提供了其他一些重要信息。我们举例说明如下。
例如,地址192.199.170.82/27不仅表示IP地址是192.199.170.82,而且还表示这个地址块的网络的前缀有27位(剩下的5位是主机号),因此这个地址块包含32个IP地址(2^5 = 32)。通过简单的计算还可得岀,这个地址块的最小地址是192.199.170.64,最大地址是192.199.170.95。
具体的计算方法是这样的。找出地址掩码中1和0的交界处发生在地址中的哪一个字节。现在是在第四个字节。因此只要把这一个字节的十进制82用二进制表示即可。十进制82的二进制是01010010,取其前3位(这3位加上前3个字节的24位等于前缀的27位),再把后面5位都写成0,即01000000,等于十进制的64。这就找出了地址块的最小地址192.199.170.64。再把地址的第四字节的最后5位都置1,即01011111,等于十进制的95,这就找出了地址块中的最大地址192.199.170.95。
由于一个CIDR地址块中有很多地址,所以在路由表中就利用CIDR地址块来查找目的网络。这种地址的聚合常称为路由聚合(route aggregation)。它使得路由表中的一个项目可以表示原来传统分类地址的很多个(例如上千个)路由。路由聚合也称为构成超网(supemetting)。如果没有釆用CIDR,则在1994年和1995年,互联网的一个路由表就会超过7万个项目,而使用了 CIDR后,在1996年一个路由表的项目数才只有3万多个。路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。
CIDR记法有多种形式,例如,地址块10.0.0.0/10可简写为10/10,也就是把点分十进制中低位连续的0省略。另一种简化表示方法是在网络前缀的后面加一个星号 * ,如:00001010 00 * 意思是:在星号 * 之前是网络前缀,而星号 * 表示IP地址中的主机号,可以是任意值。
前缀位数不是8的整数倍时,需要进行简单的计算才能得到一些地址信息。
表4-7给出了最常用的CIDR地址块。表中的K表示2^10即1024。网络前缀小于13或大于27都较少使用。在“包含的地址数”中没有把全1和全0的主机号除外。
从表4-7可看出,每一个CIDR地址块中的地址数一定是2的整数次幕。除最后几行外,CIDR地址块都包含了多个C类地址(是一个C类地址的2"倍,n是整数),这就是“构成超网”这一名词的来源。
使用CIDR的一个好处就是可以更加有效地分配IPv4的地址空间,可根据客户的需要分配适当大小的CIDR地址块。然而在分类地址的环境中,向一个部门分配IP地址,就只能以/8, /16或/24为单位来分配。这就很不灵活。
图4-25给出的是CIDR地址块分配的例子。假定某ISP己拥有地址块206.0.64.0/18 (相当于有64个C类网络)。现在某大学需要800个IP地址。ISP可以给该大学分配一个地址块206.0.68.0/22,它包括1024 (即2”)个IP地址,相当于4个连续的C类/24地址块,占该ISP拥有的地址空间的l/16。这个大学然后可自由地对本校的各系分配地址块,而各系还可再划分本系的地址块。CIDR的地址块分配有时不易看清,这是因为网络前缀和主机号的界限不是恰好出现在整数字节处。只要写出地址的二进制表示(从图中的地址块的二进制表示中可看出,实际上只需要将其中的一个关键字节转换为二进制的表示即可),弄清网络前缀的位数,就不会把地址块的范围弄错。
从图4-25可以清楚地看出地址聚合的概念。这个ISP共拥有64个C类网络。如果不采用CIDR技术,则在与该ISP的路由器交换路由信息的每一个路由器的路由表中,就需要有64个项目。但釆用地址聚合后,就只需用路由聚合后的一个项目206.0.64.0/18就能找到该ISP6同理,这个大学共有4个系。在ISP内的路由器的路由表中,也需使用206.0.68.0/22这个项目。
从图4-25下面表格中的二进制地址可看出,把四个系的路由聚合为大学的一个路由(即构成超网),是将网络前缀缩短。网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的IP地址中,划分子网是使网络前缀变长。
最长前缀匹配
在使用CIDR时,由于釆用了网络前缀这种记法,IP地址由网络前缀和主机号这两个部分组成,因此在路由表中的项目也要有相应的改变。这时,每个项目由“网络前缀"和“下一跳地址”组成。但是在査找路由表时可能会得到不止一个匹配结果。这样就带来一个问题:我们应当从这些匹配结果中选择哪一条路由呢?
正确的答案是:应当从匹配结果中选择具有最长网络前缀的路由。这叫做最长前缀匹配(longest-prefix matching),这是因为网络前缀越长,其地址块就越小,因而路由就越具体(more specific)。最长前缀匹配又称为最长匹配或最佳匹配。为了说明最长前缀匹配的概念,我们仍以前面的例子来讨论。
假定大学下属的四系希望ISP把转发给四系的数据报直接发到四系而不要经过大学的路由器,但又不愿意改变自己使用的IP地址块。因此,在ISP的路由器的路由表中,至少要有以下两个项目,即206.0.68.0/22 (大学)和206.0.71.128/25 (四系)。现在假定ISP收到一个数据报,其目的IP地址为D = 206.0.71.130。把。分别和路由表中这两个项目的掩码逐位相“与"(AND操作)。将所得的逐位AND操作的结果按顺序写在下面。
D 和 111111111111111111111100 00000000 逐位相“与"=206.0.68.0/22 匹配
D 和 11111111111111111111111110000000 逐位相“与“ =206.0.71.128/25 匹配
不难看出,现在同一个IP地址。可以在路由表中找到两个目的网络(大学和四系)和该地址相匹配。根据最长前缀匹配的原理,应当选择后者,把收到的数据报转发到后一个目的网络(四系),即选择两个匹配的地址中更具体的一个。
使用二叉线索查找路由表
使用CIDR后,由于要寻找最长前缀匹配,使路由表的査找过程变得更加复杂了。当路由表的项目数很大时,怎样设法减小路由表的査找时间就成为一个非常重要的问题。例如,连接路由器的线路的速率为10 Gbit/s,而分组的平均长度为2000 bit,那么路由器就应当平均每秒钟能够处理500万个分组(常记为5Mpps)。或者说,路由器处理一个分组的平均时间只有200 ns (1 ns= 10^秒)。因此,查找每一个路由所需的时间是非常短的。可见在路由表中必须使用很好的数据结构和使用先进的快速査找算法,这一直是人们积极研究的热门课题。
为了进行更加有效的査找,通常是把无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行査找。这里最常用的就是二叉线索(binaiy trie),它是一种特殊结构的树。IP地址中从左到右的比特值决定了从根节点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。
图4-26用一个例子来说明二叉线索的结构。图中给出了 5个IP地址。为了简化二叉线索的结构,可以先找出对应于每一个IP地址的睢一前缀(unique prefix)。所谓唯一前缀就是在表中所有的IP地址中,该前缀是唯一的。这样就可以用这些唯一前缀来构造二叉线索。在进行査找时,只要能够和唯一前缀相匹配就行了。
从二叉线索的根节点自顶向下的深度最多有32层,每一层对应于IP地址中的一位。一个IP地址存入二叉线索的规则很简单。先检查IP地址左边的第一位,如为0,则第一层的节点就在根节点的左下方;如为1,则在右下方。然后再检查地址的第二位,构造出第二层的节点。依此类推,直到唯一前缀的最后一位。
由于唯一前缀一般都小于32位,因此用唯一前缀构造的二叉线索的深度往往不到32层。图中较粗的折线就是前缀0101在这个二叉线索中的路径。二叉线索中的小圆圈是中间节点,而在路径终点的小方框是叶节点(也叫做外部节点)。每个叶节点代表一个唯一前缀。节点之间的连线旁边的数字表示这条边在唯一前缀中对应的比特是。或1。
假定有一个IP地址是10011011 01111010 00000000 00000000,需要查找该地址是否在此二叉线索中。我们从最左边查起。很容易发现,査到第三个字符(即前缀10后面的0)时,在二叉线索中就找不到匹配的,说明这个地址不在这个二叉线索中。以上只是给出了二叉线索这种数据结构的用法,而并没有说明“与唯一前缀匹配"和“与网络前缀匹配"的关系。显然,要将二叉线索用于路由表中,还必须使二叉线索中的每一个叶节点包含所对应的网络前缀和子网掩码。当搜索到一个叶节点时,就必须将寻找匹配的目的地址和该叶节点的子网掩码进行逐位“与”运算,看结果是否与对应的网络前缀相匹配。若匹配,就按下一跳的接口转发该分组。否则,就丢弃该分组。
总之,二叉线索只是提供了一种可以快速在路由表中找到匹配的叶节点的机制。但这是否和网络前缀匹配,还要和子网掩码进行一次逻辑与的运算。为了提高二叉线索的査找速度,广泛使用了各种压缩技术。例如,在图4-26中的最后两个地址,其最前面的4位都是1011。因此,只要一个地址的前4位是1011,就可以跳过前面4位(即压缩了 4个层次)而直接从第5位开始比较。这样就可以减少査找的时间。当然,制作经过压缩的二叉线索需要更多的计算,但由于每一次査找路由表时都可以提高查找
速度,因此这样做还是值得的。
网际控制报文协议ICMP
为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协设 ICMP (Internet Control Message Protocol) 。 ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP是互联网的标准协议。但ICMP不是高层协议(看起来好像是高层协议,因为ICMP报文是装在IP数据报中,作为其中的数据部分),而是IP层的协议。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。ICMP报文格式如图4-27所示。
ICMP报文的种类
ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。
ICMP报文的前4个字节是统一的格式,共有三个字段:类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型。
表4-8给出了几种常用的ICMP报文类型。
ICMP报文的代码字段是为了进一步区分某种类型中的几种不同情况。检验和字段用来检验整个ICMP报文。我们应当还记得,IP数据报首部的检验和并不检验IP数据报的内容,因此不能保证经过传输的ICMP报文不产生差错。
表4-8给出的ICMP差错报告报文共有四种,即:
- 终点不可达 当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
- 时间超过 当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把己收到的数据报片都丢弃,并向源点发送时间超过报文。
- 参数问题 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
- 改变路由(重定向) 路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
所有的ICMP差错报吿报文中的数据字段都具有同样的格式(图4-28)。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了 ICMP差错报告报文。
提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的(端口的作用将在下一章的5.1.3节中介绍)。整个ICMP报文作为IP数据报的数据字段发送给源点。
下面是不应发送ICMP差错报告报文的几种情况。
- 对ICMP差错报告报文,不再发送ICMP差错报告报文。
- 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文。
- 对具有多播地址的数据报,都不发送ICMP差错报告报文。
- 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报,不发送ICMP差错报告报文。
常用的ICMP询问报文有两种,即:
- 回送请求和回答 ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
- 时间戳请求和回答 ICMP时间戳请求报文是请某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共有多少秒。时间戳请求与回答可用于时钟同步和时间测量。
互联网的路由选择协议
有关路由选择协议的几个基本概念
理想的路由选择算法
路由选择协议的核心就是路由算法,即需要何种算法来获得路由表中的各项目。一个理想的路由算法应具有如下的一些特点:
- 算法必须是正确的和完整的。这里,“正确"的含义是:沿着各路由表所指引的路由,分组一定能够最终到达目的网络和目的主机。
- 算法在计算上应简单。路由选择的计算不应使网络通信量增加太多的额外开销。
- 算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。当网络中的通信量发生变化时,算法能自适应地改变路由以均衡各链路的负载。当某个或某些结点、链路发生故障不能工作,或者修理好了再投入运行时,算法也能及时地改变路由。有时称这种自适应性为“稳健性” (robustness)o①
- 算法应具有稳定性。在网络通信量和网络拓扑相对稳定的情况下,路由算法应收敛于一个可以接受的解,而不应使得出的路由不停地变化。
- 算法应是公平的。路由选择算法应对所有用户(除对少数优先级高的用户)都是平等的。例如,若仅仅使某一对用户的端到端时延为最小,但却不考虑其他的广大用户,这就明显地不符合公平性的要求。
- 算法应是最佳的。路由选择算法应当能够找出最好的路由,使得分组平均时延最小而网络的吞吐量最大。虽然我们希望得到“最佳"的算法,但这并不总是最重要的。对于某些网络,网络的可靠性有时要比最小的分组平均时延或最大吞吐量更加重要。因此,所谓**“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已**。
一个实际的路由选择算法,应尽可能接近于理想的算法。在不同的应用条件下,对以上提出的六个方面也可有不同的侧重。
应当指出,路由选择是个非常复杂的问题,因为它是网络中的所有结点共同协调工作的结果。其次,路由选择的环境往往是不断变化的,而这种变化有时无法事先知道,例如,网络中出了某些故障。此外,当网络发生拥塞时,就特别需要有能缓解这种拥塞的路由选择策略,但恰好在这种条件下,很难从网络中的各结点获得所需的路由选择信息。
倘若从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则只有两大类,即静态路由选择策略与动态路由选择策略。
静态路由选择也叫做非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。对于很简单的小网络,完全可以采用静态路由选择,用人工配置每一条路由。
动态路由选择也叫做自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。因此,动态路由选择适用于较复杂的大网络。
分层次的路由选择协议
互联网釆用的路由选择协议主要是自适应的(即动态的)、分布式路由选择协议。由于以下两个原因,互联网采用分层次的路由选择协议:
- 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。
- 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。
为此,可以把整个互联网划分为许多较小的自治系统(autonomous system),一般都记为AS。自治系统AS是在单一技术管理下的一组路由器,而这些路由器使用一种自治系统内部的路由选择协议和共同的度量。一个AS对其他AS表现出的是一个单一的和一致的路由选择策略。
在目前的互联网中,一个大的ISP就是一个自治系统。这样,互联网就把路由选择协议划分为两大类,即:
- 内部网关协议IGP(Interior Gateway Protocol) 即在一个自治系统内部使用的路由选择协议,而这与在互联网中的其他自治系统选用什么路由选择协议无关。目前这类路由选择协议使用得最多,如RIP和OSPF协议。
- 外部网关协议EGP (External Gateway Protocol) 若源主机和目的主机处在不同的自治系统中(这两个自治系统可能使用不同的内部网关协议),当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议EGP。目前使用最多的外部网关协议是BGP的版本4 (BGP-4)。
自治系统之间的路由选择也叫做域间路由选择(interdomain routing),而在自治系统内部的路由选择叫做域内路由选择(intradomain routing) 。
图4-31是两个自治系统互连在一起的示意图。每个自治系统自己决定在本自治系统内部运行哪一个内部路由选择协议(例如,可以是RIP,也可以是OSPF)。但每个自治系统都有一个或多个路由器(图中的路由器R1和R2)除运行本系统的内部路由选择协议外,还要运行自治系统间的路由选择协议(BGPY)。
内部网关协议RIP
工作原理
RIP (Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议,它的中文名称叫做路由信息协议,但很少被使用。RIP是一种分布式的基于距离向量的路由选择协议,是互联网的标准协议,其最大优点就是简单。
RIP协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录(因此,这是一组距离,即“距离向量”)。
RIP协议将“距离”定义如下:从一路由器到直接连接的网络的距离定义为1。从一路由器到非直接连接的网络的距离定义为所经过的路由器数加1。“加1”是因为到达目的网络后就进行直接交付,而到直接连接的网络的距离己经定义为1,例如在前面讲过的图4-16中,路由器田到网1或网2的距离都是1 (直接连接),而到网3的距离是2,到网4的距离是3。
RIP协议的“距离”也称为“跳数” (hop count),因为每经过一个路由器,跳数就加1。RIP认为好的路由就是它通过的路由器的数目少,即“距离短"。RIP允许一条路径最多只能包含15个路由器。因此“距离”等于16时即相当于不可达。可见RIP只适用于小型互联网。
RIP不能在两个网络之间同时使用多条路由。RIP选择一条具有最少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。
本节讨论的RIP协议和下一节要讨论的OSPF协议,都是分布式路由选择协议。它们的共同特点就是每一个路由器都要不断地和其他一些路由器交换路由信息。我们一定要弄清以下三个要点,即和哪些路由器交换信息?交换什么信息?在什么时候交换信息?
RIP协议的特点是:
- 仅和相邻路由器交换信息。如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的。RIP协议规定,不相邻的路由器不交换信息。
- 路由器交换的信息是当前本路由器所知道的全部信息,即自己现在的路由表。也就是说,交换的信息是:“我到本自治系统中所有网络的(最短)距离,以及到每个网络应经过的下一跳路由器"。
- 按固定的时间间隔交换路由信息,例如,每隔30秒。然后路由器根据收到的路由信息更新路由表。当网络拓扑发生变化时,路由器也及时向相邻路由器通告拓扑变化后的路由信息。
这里要强调一点:路由器在刚刚开始工作时,它的路由表是空的。然后路由器就得出到直接相连的几个网络的距离(这些距离定义为1)。接着,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。但经过若干次的更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。
看起来RIP协议有些奇怪,因为'‘我的路由表中的信息要依赖于你的,而你的信息又依赖于我的。'‘然而事实证明,通过这样的方式——“我告诉别人一些信息,而别人又告诉我一些信息。我再把我知道的更新后的信息吿诉别人,别人也这样把更新后的信息再告诉我”,最后在自治系统中所有的结点都得到了正确的路由选择信息。在一般情况下,RIP协议可以收敛,并且过程也较快。“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程。
路由表中最主要的信息就是:到某个网络的距离(即最短距离),以及应经过的下一跳地址。路由表更新的原则是找出到每个目的网络的最短距离。这种更新算法又称为距离向量算法。下面就是RIP协议使用的距离向量算法。
距离向量算法
对每一个相邻路由器发送过来的RIP报文,进行以下步骤:
- 对地址为X的相邻路由器发来的RIP报文,先修改此报文中的所有项目:把“下一跳"字段中的地址都改为X,并把所有的“距离"字段的值加1 (见后面的解释1)。每一个项目都有三个关键数据,即:到目的网络N,距离是d,下一跳路由器是X。
- 对修改后的RIP报文中的每一个项目,进行以下步骤:若原来的路由表中没有目的网络N,则把该项目添加到路由表中(见解释2)。否则(即在路由表中有目的网络N,这时就再査看下一跳路由器地址)若下一跳路由器地址是X,则把收到的项目替换原路由表中的项目(见解释3)。否则(即这个项目是:到目的网络N,但下一跳路由器不是X)若收到的项目中的距离d小于路由表中的距离,则进行更新(见解释4),否则什么也不做。(见解释5)
- 若3分钟还没有收到相邻路由器的更新路由表,则把此相邻路由器记为不可达的路由器,即把距离置为16 (距离为16表示不可达)。
- 返回。
上面给出的距离向量算法的基础就是Bellman-Ford算法(或Ford-Fulkerson算法)。这种算法的要点是这样的:
设X是结点A到B的最短路径上的一个结点。若把路径A->B拆成两段路径A->X和X->B,则每一段路径A->X和X->B也都分别是结点A到X和结点X到B的最短路径。
下面是对上述距离向量算法的五点解释。
解释1:这样做是为了便于进行本路由表的更新。假设从位于地址X的相邻路由器发来的RIP报文的某一个项目是:“Net2,3,Y”,意思是“我经过路由器Y到网络Net2的距离是3”,那么本路由器就可推断出:“我经过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,更短了。
解释5:若距离更大了,显然不应更新。若距离不变,更新后得不到好处,因此也不更新。
【例4-5】己知路由器R6有表4-9(a)所示的路由表。现在收到相邻路由器R4发来的路由更新信息,如表4-9(b)所示。试更新路由器R6的路由表。
【解】如同路由器一样,我们不需要知道该网络的拓扑。先把表4-9(b)中的距离都加1,并把下一跳路由器都改为R4。得出表4-9(c)。
把这个表的每一行和表4-9(a)进行比较。
第一行在表4-9(a)中没有,因此要把这一行添加到表4-9(a)中。
第二行的Net2在表4-9(a)中有,且下一跳路由器也是因此要更新(距离增大了)。
第三行的Net3在表4-9(a)中有,但下一跳路由器不同。于是就要比较距离。新的路由信息的距离是2,小于原来表中的4,因此要更新。
这样,得出更新后的瑙的路由表如表4-9(d)所示。
RIP协议让一个自治系统中的所有路由器都和自己的相邻路由器定期交换路由信息,并不断更新其路由表,使得从每一个路由器到每一个目的网络的路由都是最短的(即跳数最少)。这里还应注意:虽然所有的路由器最终都拥有了整个自治系统的全局路由信息,但由于每一个路由器的位置不同,它们的路由表当然也应当是不同的。
RIP协议的报文格式
图4-32是RIP2的报文格式,它和RIP1的首部相同,但后面的路由部分不一样。从图4-32还可看出,RIP协议使用运输层的用户数据报UDP进行传送(使用UDP的端口 520)。
RIP报文由首部和路由部分组成。
RIP的首部占4个字节,其中的命令字段指出报文的意义。例如,1表示请求路由信息,2表示对请求路由信息的响应或未被请求而发出的路由更新报文。首部后面的“必为0”是为了 4字节字的对齐。
RIP2报文中的路由部分由若干个路由信息组成。每个路由信息需要用20个字节。地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。如釆用IP地址就令这个字段的值为2 (原来考虑RIP也可用于其他非TCP/IP协议的情况)。路由标记填入自治系统号ASN(Autonomous System Number),这是考虑使RIP有可能收到本自治系统以外的路由选择信息。再后面指出某个网络地址、该网络的子网掩码、下一跳路由器地址以及到此网络的距离。一个RIP报文最多可包括25个路由,因而RIP报文的最大长度是4 + 20 x 25 = 504字节。如超过,必须再用一个RIP报文来传送。
RIP2还具有简单的鉴别功能。若使用鉴别功能,则将原来写入第一个路由信息(20字节)的位置用作鉴别。这时应将地址族标识符置为全1 (即OxFFFF),而路由标记写入鉴别类型,剩下的16字节为鉴别数据。在鉴别数据之后才写入路由信息,但这时最多只能再放入24个路由信息。
RIP存在的一个问题是当网络出现故障时,要经过比较长的时间才能将此信息传送到所有的路由器。我们可以用图4-33的简单例子来说明。
设三个网络通过两个路由器互连起来,并且都己建立了各自的路由表。图中路由器交换的信息只给出了我们感兴趣的一行内容。路由器R1中的“1, 1,直接”表示“到网1的距离是1,直接交付”。路由器R2中的“1,2,Ri”表示“到网1的距离是2,下一跳经过R1”。
现在假定路由器R2到网1的链路出了故障,R1无法到达网1。于是路由器R1把到网1的距离改为16 (表示到网1不可达),因而在R1的路由表中的相应项目变为“1, 16,直接"。但是,很可能要经过30秒钟后R1才把更新信息发送给R2。然而R2可能已经先把自己的路由表发送给了 R1,其中有“1,2,R1”这一项。
R1收到R2的更新报文后,误认为可经过R2到达网1,于是把收到的路由信息“1, 2,R1"修改为:"1, 3, R2”,表明“我到网1的距离是3,下一跳经过R2”,并把更新后的信息发送给R2。
同理,R2接着又更新自己的路由表为“1, 4, R1“,以为“我到网1距离是4,下一跳经过R1”。
这样的更新一直继续下去,直到R1和R2到网1的距离都增大到16时,R1和R2才知道原来网1是不可达的。RIP协议的这一特点叫做:好消息传播得快,而坏消息传播得慢。网络出故障的传播时间往往需要较长的时间(例如数分钟)。这是RIP的一个主要缺点。
但如果一个路由器发现了更短的路由,那么这种更新信息就传播得很快。为了使坏消息传播得更快些,可以采取多种措施。例如,让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送。总之,RIP协议最大的优点就是实现简单,开销较小。
但RIP协议的缺点也较多。首先,RIP限制了网络的规模,它能使用的最大距离为15 (16表示不可达)。其次,路由器之间交换的路由信息是路由器中的完整路由表,因而随着网络规模的扩大,开销也就增加。最后,“坏消息传播得慢”,使更新过程的收敛时间过长。因此,对于规模较大的网络就应使
用下一节所述的OSPF协议。然而目前在规模较小的网络中,使用RIP协议的仍占多数。
内部网关协议OSPF
OSFP的基本特点
这个协议的名字是开放最短路径优先OSPF (Open Shortest Path First)。它是为克服RIP的缺点在1989年开发出来的。OSPF的原理很简单,但实现起来却较复杂。"开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的。“最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。
请注意:OSPF只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先。实际上,所有的在自治系统内部使用的路由选择协议(包括RIP协议)都是要寻找一条最短的路径。
OSPF最主要的特征就是使用分布式的链路状态协议(link state protocol),而不是像RIP那样的距离向量协议。和RIP协议相比,OSPF的三个要点和RIP的都不一样:
- 向本自治系统中所有路由器发送信息。这里使用的方法是洪泛法(flooding),这就是路由器通过所有输出端口向所有相邻的路由器发送信息。而每一个相邻路由器又再将此信息发往其所有的相邻路由器(但不再发送给刚刚发来信息的那个路由器)。这样,最终整个区域中所有的路由器都得到了这个信息的一个副本。更具体的做法后面还要讨论。我们应注意,RIP协议是仅仅向自己相邻的几个路由器发送信息。
- 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量” (metric)。 OSPF将这个“度量”用来表示费用、距离、时延、带宽,等等。这些都由网络管理人员来决定,因此较为灵活。有时为了方便就称这个度量为“代价”。我们应注意,对于RIP协议,发送的信息是:“到所有网络的距离和下一跳路由器”。
- 只有当链路状态发生变化时,路由器才向所有路由器用洪泛法发送此信息。而不像RIP那样,不管网络拓扑有无发生变化,路由器之间都要定期交换路由表的信息。
从上述的三个方面可以看出,OSPF和RIP的工作原理相差较大。
由于各路由器之间频繁地交换链路状态信息,因此所有的路由器最终都能建立一个链路状态数据库(link-state database),这个数据库实际上就是全网的拓扑结构图。这个拓扑结构图在全网范围内是一致的(这称为链路状态数据库的同步)。因此,每一个路由器都知道全网共有多少个路由器,以及哪些路由器是相连的,其代价是多少,等等。
每一个路由器使用链路状态数据库中的数据,构造出自己的路由表(例如,使用Dijkstra的最短路径路由算法)。我们注意到,RIP协议的每一个路由器虽然知道到所有的网络的距离以及下一跳路由器,但却不知道全网的拓扑结构(只有到了下一跳路由器,才能知道再下一跳应当怎样走)。
OSPF的链路状态数据库能较快地进行更新,使各个路由器能及时更新其路由表。OSPF的更新过程收敛得快是其重要优点。
为了使OSPF能够用于规模很大的网络,OSPF将一个自治系统再划分为若干个更小的范围,叫做区域(area)。图4-34就表示一个自治系统划分为四个区域。每一个区域都有一个32位的区域标识符(用点分十进制表示)。当然,一个区域也不能太大,在一个区域内的路由器最好不超过200个。
划分区域的好处就是把利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个的自治系统,这就减少了整个网络上的通信量。在一个区域内部的路由器只知道本区域的完整网络拓扑,而不知道其他区域的网络拓扑的情况。
为了使每一个区域能够和本区域以外的区域进行通信,OSPF使用层次结构的区域划分。在上层的区域叫做主干区域(backbonearea)。主干区域的标识符规定为0.0.0.0。主干区域的作用是用来连通其他在下层的区域。从其他区域来的信息都由区域边界路由器(area border router)进行概括。
在图4-34中,路由器R3, R4和R7都是区域边界路由器,而显然,每一个区域至少应当有一个区域边界路由器。在主干区域内的路由器叫做主干路由器(backbone router),如R3,R4,R5,R6 和R7。一个主干路由器可以同时是区域边界路由器,如R3,R4和R7。在主干区域内还要有一个路由器专门和本自治系统外的其他自治系统交换路由信息。这样的路由器叫做自治系统边界路由器(如图中的R6)。
采用分层次划分区域的方法虽然使交换信息的种类增多了,同时也使OSPF协议更加复杂了。但这样做却能使每一个区域内部交换路由信息的通信量大大减小,因而使OSPF协议能够用于规模很大的自治系统中。这里,我们再一次地看到划分层次在网络设计中的重要性。
OSPF不用UDP而是直接用IP数据报传送(其IP数据报首部的协议字段值为89)。OSPF构成的数据报很短。这样做可减少路由信息的通信量。数据报很短的另一好处是可以不必将长的数据报分片传送。分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。
OSPF分组使用24字节的固定长度首部(见图4-35),分组的数据部分可以是五种类型分组中的一种。下面简单介绍OSPF首部各字段的意义。
- 版本 当前的版本号是2。
- 类型 可以是五种类型分组中的一种。
- 分组长度 包括OSPF首部在内的分组长度,以字节为单位。
- 路由器标识符 标志发送该分组的路由器的接口的IP地址。
- 区域标识符 分组属于的区域的标识符。
- 检验和 用来检测分组中的差错。
- 鉴别类型 目前只有两种,0 (不用)和1 (口令)。
- 鉴别 鉴别类型为0时就填入0,鉴别类型为1则填入8个字符的口令。
除了以上的几个基本特点外,OSPF还具有下列的一些特点:
- OSPF允许管理员给每条路由指派不同的代价。例如,高带宽的卫星链路对于非实时的业务可设置为较低的代价,但对于时延敏感的业务就可设置为非常高的代价。因此,OSPF对于不同类型的业务可计算出不同的路由。链路的代价可以是1至65535中的任何一个无量纲的数,因此十分灵活。商用的网络在使用OSPF时,通常根据链路带宽来计算链路的代价。这种灵活性是RIP所没有的。
- 如果到同一个目的网络有多条相同代价的路径,那么可以将通信量分配给这几条路径。这叫做多路径间的负载平衡(load balancing)。在代价相同的多条路径上分配通信量是通信量工程中的简单形式。RIP只能找出到某个网络的一条路径。
- 所有在OSPF路由器之间交换的分组(例如,链路状态更新分组)都具有鉴别的功能,因而保证了仅在可信赖的路由器之间交换链路状态信息。
- OSPF支持可变长度的子网划分和无分类的编址CIDR。
- 由于网络中的链路状态可能经常发生变化,因此OSPF让每一个链路状态都带上一个32位的序号,序号越大状态就越新。OSPF规定,链路状态序号增长的速率不得超过每5秒钟1次。这样,全部序号空间在600年内不会产生重复号。
OSPF的五种分组类型
OSPF共有以下五种分组类型:
- 类型1,问候(Hello)分组,用来发现和维持邻站的可达性。
- 类型2,数据库描述(Database Description)分组,向邻站给出自己的链路状态数据库中的所有链路状态项目的摘要信息。
- 类型3,链路状态请求(Link Stat® Request)分组,向对方请求发送某些链路状态项目的详细信息。
- 类型4,链路状态更新(Link State Update)分组,用洪泛法对全网更新链路状态。这种分组是最复杂的,也是OSPF协议最核心的部分。路由器使用这种分组将其链路状态通知给邻站。链路状态更新分组共有五种不同的链路状态[RFC2328],这里从略。
- 类型5,链路状态确认(Link State Acknowledgment)分组,对链路更新分组的确认。
OSPF规定,每两个相邻路由器每隔10秒钟要交换一次问候分组。这样就能确知哪些邻站是可达的。对邻路由器来说,“可达”是最基本的要求,因为只有可达邻站的链路状态信息才存入链路状态数据库(路由表就是根据链路状态数据库计算出来的)。在正常情况下,网络中传送的绝大多数OSPF分组都是问候分组。若有40秒钟没有收到某个相邻路由器发来的问候分组,则可认为该相邻路由器是不可达的,应立即修改链路状态数据库,并重新计算路由表。
其他的四种分组都是用来进行链路状态数据库的同步。所谓同步就是指不同路由器的链路状态数据库的内容是一样的。两个同步的路由器叫做“完全邻接的"(fully adjacent)路由器。不是完全邻接的路由器表明它们虽然在物理上是相邻的,但其链路状态数据库并没有达到一致。
当一个路由器刚开始工作时,它只能通过问候分组得知它有哪些相邻的路由器在工作,以及将数据发往相邻路由器所需的“代价”。如果所有的路由器都把自己的本地链路状态信息对全网进行广播,那么各路由器只要将这些链路状态信息综合起来就可得出链路状态数据库。但这样做开销太大,因此OSPF釆用下面的办法。
OSPF让每一个路由器用数据库描述分组和相邻路由器交换本数据库中已有的链路状态摘要信息。摘要信息主要就是指出有哪些路由器的链路状态信息(以及其序号)己经写入了数据库。经过与相邻路由器交换数据库描述分组后,路由器就使用链路状态请求分组,向对方请求发送自己所缺少的某些链路状态项目的详细信息。
通过一系列的这种分组交换,全网同步的链路数据库就建立了。
图4-36给出了 OSPF的基本操作,说明了两个路由器需要交换各种类型的分组。
==在网络运行的过程中,只要一个路由器的链路状态发生变化,该路由器就要使用链路状态更新分组,用洪泛法向全网更新链路状态。==OSPF使用的是可靠的洪泛法,其要点见图4-37所示。设路由器R用洪泛法发出链路状态更新分组。图中用一些小的箭头表示更新分组。第一次先发给相邻的三个路由器。这三个路由器将收到的分组再进行转发时,要将其上游路由器除外。可靠的洪泛法是在收到更新分组后要发送确认(收到重复的更新分组只需要发送一次确认)。图中的空心箭头表示确认分组。
为了确保链路状态数据库与全网的状态保持一致,OSPF还规定每隔一段时间,如30分钟,要刷新一次数据库中的链路状态。
由于一个路由器的链路状态只涉及到与相邻路由器的连通状态,因而与整个互联网的规模并无直接系。因此当互联网规模很大时,OSPF协议要比距离向量协议RIP好得多。由于OSPF没有“坏消息传播得慢”的问题,据统计,其响应网络变化的时间小于100 ms。
若N个路由器连接在一个以太网上,则每个路由器要向其他(N - 1)个路由器发送链路状态信息,因而共有MN-1)个链路状态要在这个以太网上传送。OSPF协议对这种多点接入的局域网釆用了指定的路由器(designated router)的方法,使广播的信息量大大减少。指定的路由器代表该局域网上所有的链路向连接到该网络上的各路由器发送状态信息。
外部网关协议BGP
1989年,公布了新的外部网关协议——边界网关协议BGP。
我们首先应当弄清,在不同自治系统AS之间的路由选择为什么不能使用前面讨论过的内部网关协议,如RIP或OSPF?
我们知道,内部网关协议 (如RIP或OSPF)主要是设法使数据报在一个AS中尽可能有效地从源站传送到目的站。在一个AS内部也不需要考虑其他方面的策略。然而BGP使用的环境却不同。这主要是因为以下的两个原因:
第一,互联网的规模太大,使得自治系统AS之间路由选择非常困难。
另外,由于自治系统AS各自运行自己选定的内部路由选择协议,并使用本AS指明的路径度量,因此,当一条路径通过几个不同AS时,要想对亨样的路径计算出有意义的代价是不太可能的。
例如,对某AS来说,代价为1000可能表示一条比较长的路由。但对另一 AS代价为1000却可能表示不可接受的坏路由。因此,对于自治系统AS之间的路由选择,要用“代价”作为度量来寻找最佳路由也是
很不现实的。
比较合理的做法是在自治系统之间交换“可达性”信息(即“可到达”或“不可到达")。
第二,自治系统AS之间的路由选择必须考虑有关策略。由于相互连接的网络的性能相差很大,根据最短距离(即最少跳数)找出来的路径,可能并不合适。也有的路径的使用代价很高或很不安全。
由于上述情况,边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。BGP采用了路径向量(path vector)路由选择协议,它与距离向量协议(如RIP)和链路状态协议(如OSPF)都有很大的区别。
在配置BGP时,每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人"。一般说来,两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器,但也可以不是BGP边界路由器。
一个BGP发言人与其他AS的BGP发言人要交换路由信息,就要先建立TCP连接(端口号为179),然后在此连接上交换BGP报文以建立BGP会话(session),利用BGP会话交换路由信息,如增加了新的路由,或撤销过时的路由,以及报告出差错的情况等等。使用TCP连接能提供可靠的服务,也简化了路由选择协议。使用TCP连接交换路由信息的两个BGP发言人,彼此成为对方的邻站(neighbor)或对等站(peer)。
图4-38表示BGP发言人和自治系统AS的关系的示意图。在图中画出了三个自治系统中的5个BGP发言人。每一个BGP发言人除了必须运行BGP协议外,还必须运行该自治系统所使用的内部网关协议,如OSPF或RIP。
边界网关协议BGP所交换的网络可达性的信息就是要到达某个网络(用网络前缀表示)所要经过的一系列自治系统。当BGP发言人互相交换了网络可达性的信息后,各BGP发言人就根据所釆用的策略从收到的路由信息中找出到达各自治系统的较好路由。图4-39表示从图4-38的AS1上的一个BGP发言人构造出的自治系统连通图,它是树形结构,不存在回路。
在第1章的1.2.2节我们已经介绍了当前互联网的多级结构特点(图1-4)。这种多级结构的网络拓扑决定了 BGP路由选择协议的特点。
图4-40给出了一个BGP发言人交换路径向量的例子。自治系统AS2的BGP发言人通知主干网的BGP发言人:“要到达网络N1, N2, N3和N4可经过AS2。”主干网在收到这个通知后,就发出通知:“要到达网络N1, N2, N3和N4可沿路径(AS1,AS2).同理,主干网还可可发出通知:“要到达网络N5、N6和N7可沿路径(AS1,AS3)。"
从上面的讨论可看出,BGP协议交换路由信息的结点数量级是自治系统个数的量级,这要比这些自治系统中的网络数少很多。要在许多自治系统之间寻找一条较好的路径,就是要寻找正确的BGP发言人(或边界路由器),而在每一个自治系统中BGP发言人(或边界路由器)的数目是很少的。这样就使得自治系统之间的路由选择不致过分复杂。
BGP支持无分类域间路由选择CIDR,因此BGP的路由表也就应当包括目的网络前缀、下一跳路由器,以及到达该目的网络所要经过的自治系统序列。由于使用了路径向量的信息,就可以很容易地避免产生兜圈子的路由。如果一个BGP发言人收到了其他BGP发言人发来的路径通知,它就要检査一下本自治系统是否在此通知的路径中。如果在这条路径中,就不能采用这条路径(因为会兜圈子)。在BGP刚刚运行时,BGP的邻站是交换整个的BGP路由表。但以后只需要在发生变化时更新有变化的部分。这样做对节省网络带宽和减少路由器的处理开销方面都有好处。
在RFC4271中规定了 BGP1的四种报文:
- OPEN (打开)报文,用来与相邻的另一个BGP发言人建立关系,使通信初始化。
- UPDATE (更新)报文,用来通告某一路由的信息,以及列出要撤销的多条路由。
- KEEPALIVE (保活)报文,用来周期性地证实邻站的连通性。
- NOTIFICATION (通知)报文,用来发送检测到的差错。
若两个邻站属于两个不同AS,而其中一个邻站打算和另一个邻站定期地交换路由信息,这就应当有一个商谈的过程(因为很可能对方路由器的负荷已很重因而不愿意再加重负担)。因此,一开始向邻站进行商谈时就必须发送OPEN报文。如果邻站接受这种邻站关系,就用KEEPALIVE报文响应。这样,两个BGP发言人的邻站关系就建立了。
一旦邻站关系建立了,就要继续维持这种关系。双方中的每一方都需要确信对方是存在的,且一直在保持这种邻站关系。为此,这两个BGP发言人彼此要周期性地交换KEEPALIVE报文(一般每隔30秒)。
KEEPALIVE报文只有19字节长(只用BGP报文的通用首部),因此不会造成网络上太大的开销。
UPDATE报文是BGP协议的核心内容。BGP发言人可以用UPDATE报文撤销它以前曾经通知过的路由,也可以宣布增加新的路由。撤销路由可以一次撤销许多条,但增加新路由时,每个更新报文只能增加一条。
BGP可以很容易地解决距离向量路由选择算法中的“坏消息传播得慢”这一问题。当某个路由器或链路出故障时,由于BGP发言人可以从不止一个邻站获得路由信息,因此很容易选择出新的路由。距离向量算法往往不能给出正确的选择,是因为这些算法不能指出哪些邻站到目的站的路由是独立的。
图4-41给出了 BGP报文的格式。四种类型的BGP报文具有同样的通用首部,其长度为19字节。通用首部分为三个字段。标记(marker)字段为16字节长,用来鉴别收到的BGP报文(这是假定将来有人会发明出合理的鉴别方案)。当不使用鉴别时,标记字段要置为全1。长度字段指出包括通用首部在内的整个BGP报文以字节为单位的长度,最小值是19,最大值是4096。类型字段的值为1到4,分别对应于上述四种BGP报文中的一种。
OPEN报文共有6个字段,即版本(1字节,现在的值是4)、本自治系统号(2字节,使用全球唯一的16位自治系统号,由ICANN地区登记机构分配)、保持时间(2字节,以秒计算的保持为邻站关系的时间)、BGP标识符(4字节,通常就是该路由器的IP地址)、可选参数长度(1字节)和可选参数。
UPDATE报文共有5个字段,即不可行路由长度(2字节,指明下一个字段的长度)、撤销的路由(列出所有要撤销的路由)、路径属性总长度(2字节,指明下一个字段的长度)、路径属性(定义在这个报文中增加的路径的属性)和网络层可达性信息NLRI(Network Layer Reachability Information)。最后这个字段定义发出此报文的网络,包括网络前缀的位数、IP地址前缀。
KEEPALIVE报文只有BGP的19字节长的通用首部。
NOTIFICATION报文有3个字段,即差错代码(1字节)、差错子代码(1字节)和差错数据(给出有关差错的诊断信息)。
路由器的构成
路由器的结构
路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。
从路由器某个输入端口收到的分组,按照分组要去的目的地(即目的网络),把该分组从路由器的某个合适的输出端口转发给下一跳路由器。下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止。
路由器的转发分组正是网络层的主要工作。
图4-42给出了一种典型的路由器的构成框图。
从图4-42可以看出,整个的路由器结构可划分为两大部分:路由选择部分和分组转发部分。
路由选择部分也叫做控制部分,其核心构件是路由选择处理机。路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。
分组转发部分是本节所要讨论的问题,它由三部分组成:交换结构、一组输入端口和一组输出端口(请注意:这里的端口就是硬件接口)。下面分别讨论每一部分的组成。
交换结构(switching fabric)又称为交换组织,它的作用就是根据转发表(fbrwarding table)对分组进行处理,将某个输入端口进入的分组从一个合适的输出端口转发出去。
交换结构本身就是一种网络,但这种网络完全包含在路由器之中,因此交换结构可看成是“在路由器中的网络"。
请注意“转发”和“路由选择”是有区别的。
在互联网中,“转发”就是路由器根据转发表把收到的IP数据报从路由器合适的端口转发出去。“转发”仅仅涉及到一个路由器。但“路由选择"则涉及到很多路由器,路由表则是许多路由器协同工作的结果。这些路由器按照复杂的路由算法,得出整个网络的拓扑变化情况,因而能够动态地改变所选择的路由,并由此构造出整个的路由表。
路由表一般仅包含从目的网络到下一跳(用IP地址表示)的映射,而转发表是从路由表得出的。转发表必须包含完成转发功能所必需的信息。
在讨论路选择的原理时,往往不去区分转发表和路由表的区别,而可以笼统地都使用路由表这一名词。
在图4-42中,路由器的输入和输出端口里面都各有三个方框,用方框中的1, 2和3分别代表物理层、数据链路层和网络层的处理模块。
物理层进行比特的接收。
数据链路层则按照链路层协议接收传送分组的帧。在把帧的首部和尾部剥去后,分组就被送入网络层的处理模块。若接收到的分组是路由器之间交换路由信息的分组(如RIP或OSPF分组等),则把这种分组送交路由器的路由选择部分中的路由选择处理机。若接收到的是数据分组,则按照分组首部中的目的地址查找转发表,根据得出的结果,分组就经过交换结构到达合适的输出端口。
一个路由器的输入端口和输出端口就做在路由器的线路接口卡上。
输入端口中的查找和转发功能在路由器的交换功能中是最重要的。为了使交换功能分散化,往往把复制的转发表放在每一个输入端口中(如图4V2中的虚线箭头所示)。路由选择处理机负责对各转发表的副本进行更新。这些副本常称为“影子副本”(shadow copy)。分散化交换可以避免在路由器中的某一点上出现瓶颈。
以上介绍的查找转发表和转发分组的概念虽然并不复杂,但在具体的实现中还是会遇到不少困难。
问题就在于路由器必须以很高的速率转发分组。最理想的情况是输入端口的处理速率能够跟上线路把分组传送到路由器的速率。这种速率称为线速(line speed或wirespeed)。
可以粗略地估算一下。设线路是OC-48链路,即2.5 Gbit/s。若分组长度为256字节,那么线速就应当达到每秒能够处理100万以上的分组。现在常用Mpps (百万分组每秒)为单位来说明一个路由器对收到的分组的处理速率有多高。
当一个分组正在査找转发表时,后面又紧跟着从这个输入端口收到另一个分组。这个后到的分组就必须在队列中排队等待,因而产生了一定的时延。图4-43给出了在输入端口的队列中排队的分组的示意图。
我们再来观察在输出端口上的情况(图4-44)。输出端口从交换结构接收分组,然后把它们发送到路由器外面的线路上。在网络层的处理模块中设有一个缓冲区,实际上它就是一个队列。当交换结构传送过来的分组的速率超过输出链路的发送速率时,来不及发送的分组就必须暂时存放在这个队列中。
数据链路层处理模块把分组加上链路层的首部和尾部,交给物理层后发送到外部线路。
从以上的讨论可以看出,分组在路由器的输入端口和输出端口都可能会在队列中排队等候处理。若分组处理的速率赶不上分组进入队列的速率,则队列的存储空间最终必定减少到零,这就使后面再进入队列的分组由于没有存储空间而只能被丢弃。以前我们提到过的分组丢失就是发生在路由器中的输入或输出队列产生溢出的时候。当然,设备或线路出故障也可能使分组丢失。
交换结构
交换结构是路由器的关键构件。正是这个交换结构把分组从一个输入端口转移到某个合适的输出端口。实现这样的交换有多种方法。
最早使用的路由器就是利用普通的计算机,用计算机的CPU作为路由器的路由选择处理机。路由器的输入和输岀端口的功能和传统的操作系统中的I/O设备一样。当路由器的某个输入端口收到一个分组时,就用中断方式通知路由选择处理机。然后分组就从输入端口复制到存储器中。路由器处理机从分组首部提取目的地址,査找路由表,再将分组复制到合适的输出端口的缓存中。
若存储器的带宽(读或写)为每秒M个分组,那么路由器的交换速率(即分组从输入端口传送到输出端口的速率)一定小于"2。这是因为存储器对分组的读和写需要花费的时间是同一个数量级。
许多现代的路由器也通过存储器进行交换,图4-45(a)的示意图表示分组通过存储器进行交换。与早期的路由器的区别就是,目的地址的査找和分组在存储器中的缓存都是在输入端口中进行的。
图4-45(b)是通过总线进行交换的示意图。釆用这种方式时,数据报从输入端口通过共享的总线直接传送到合适的输出端口,而不需要路由选择处理机的干预。但是,由于总线是共享的,因此在同一时间只能有一个分组在总线上传送。当分组到达输入端口时若发现总线忙(因为总线正在传送另一个分组),则被阻塞而不能通过交换结构,并在输入端口排队等待。因为每一个要转发的分组都要通过这一条总线,因此路由器的转发带宽就受总线速率的限制。现代的技术已经可以将总线的带宽提高到每秒吉比特的速率,因此许多的路由器产品都采用这种通过总线的交换方式。
图4-45(c)画的是通过纵横交换结构(crossbar switch fabric)进行交换。这种交换机构常称为互连网络(interconnection network),它有2N条总线,可以使N个输入端口和N个输出端口相连接,这取决于相应的交叉结点是使水平总线和垂直总线接通还是断开。当输入端口收到一个分组时,就将它发送到与该输入端口相连的水平总线上。若通向所要转发的输出端口的垂直总线是空闲的,则在这个结点将垂直总线与水平总线接通,然后将该分组转发到这个输出端口。但若该垂直总线已被占用(有另一个分组正在转发到同一个输出端口),则后到达的分组就被阻塞,必须在输入端口排队。
IPv6
IP是互联网的核心协议。现在使用的IP (即IPv4)是在20世纪70年代末期设计的。互联网经过几十年的飞速发展,到2011年2月,IPv4的地址己经耗尽,ISP已经不能再申请到新的IP地址块了。我国在2014年至2015年也逐步停止了向新用户和应用分配IPv4地址,同时全面开始商用部署IPv6。
解决IP地址耗尽的根本措施就是采用具有更大地址空间的新版本的IP,即IPv6。
IPv6的基本首部
IPv6仍支持无连接的传送,但将协议数据单元PDU称为分组,而不是IPv4的数据报。为方便起见,本书仍采用数据报这一名词。
IPv6所引进的主要变化如下:
- 更大的地址空间。IPv6把地址从IPv4的32位增大到4倍,即增大到128位,使地址空间增大了 2^96倍。这样大的地址空间在可预见的将来是不会用完的。
- 扩展的地址层次结构。IPv6由于地址空间很大,因此可以划分为更多的层次。
- 灵活的首部格式。IPv6数据报的首部和IPv4的并不兼容。IPv6定义了许多可选的扩展首部,不仅可提供比IPv4更多的功能,而且还可提高路由器的处理效率,这是因为路由器对扩展首部不进行处理(除逐跳扩展首部外)。
- 改进的选项。IPv6允许数据报包含有选项的控制信息,因而可以包含一些新的选项。但IPv6的首部长度是固定的,其选项放在有效载荷中。我们知道,IPv4所规定的选项是固定不变的,其选项放在首部的可变部分。
- 允许协议继续扩充。这一点很重要,因为技术总是在不断地发展(如网络硬件的更新)而新的应用也还会出现。但我们知道,IPv4的功能是固定不变的。
- 支持即插即用(即自动配置)。因此IPv6不需要使用DHCP。
- 支持资源的预分配。IPv6支持实时视像等要求保证一定的带宽和时延的应用。
- IPv6首部改为8字节对齐(即首部长度必须是8字节的整数倍)。原来的IPv4首部是4字节对齐。
==IPv6数据报由两大部分组成,即基本首部(base header)和后面的有效载荷(payload)。==有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部(extension header),再后面是数据部分(图4-46)。但请注意,所有的扩展首部并不属于IPv6数据报的首部。
与IPv4相比,IPv6对首部中的某些字段进行了如下的更改:
- 取消了首部长度字段,因为它的首部长度是固定的(40字节)。
- 取消了服务类型字段,因为优先级和流标号字段实现了服务类型字段的功能。
- 取消了总长度字段,改用有效载荷长度字段。
- 取消了标识、标志和片偏移字段,因为这些功能已包含在分片扩展首部中。
- 把TTL字段改称为跳数限制字段,但作用是一样的(名称与作用更加一致)。
- 取消了协议字段,改用下一个首部字段。
- 取消了检验和字段,这样就加快了路由器处理数据报的速度。我们知道,在数据链路层对检测出有差错的帧就丢弃。在运输层,当使用UDP时,若检测出有差错的用户数据报就丢弃。当使用TCP时,对检测出有差错的报文段就重传,直到正确传送到目的进程为止。因此在网络层的差错检测可以精简掉。
- 取消了选项字段,而用扩展首部来实现选项功能。
由于把首部中不必要的功能取消了,使得IPv6首部的字段数减少到只有8个(虽然首部长度增大了一倍)。
下面解释IPv6基本首部中各字段的作用(参见图4-47)。
版本(version) 占4位。它指明了协议的版本,对IPv6该字段是6。
通信量类(traffic class) 占8位。这是为了区分不同的IPv6数据报的类别或优先级。
流标号(flow label) 占20位。IPv6的一个新的机制是支持资源预分配,并且允许路由器把每一个数据报与一个给定的资源分配相联系。IPv6提出流(flow)的抽象概念。所谓“流”就是互联网络上从特定源点到特定终点(单播或多播)的一系列数据报(如实时音频或视频传输),而在这个“流"所经过的路径上的路由器都保证指明的服务质所有属于同一个流的数据报都具有同样的流标号。因此,流标号对实时音频/视频数据的传送特别有用。对于传统的电子邮件或非实时数据,流标号则没有用处,把它置为0即可。
有效载荷长度(payload length) 占16位。它指明IPv6数据报除基本首部以外的字节数(所有扩展首部都算在有效载荷之内)。这个字段的最大值是64 KB (65535字节)。
下一个首部(next header) 占8位。它相当于IPv4的协议字段或可选字段。
- 当IPv6数据报没有扩展首部时,下一个首部字段的作用和IPv4的协议字段一样,
它的值指出了基本首部后面的数据应交付IP层上面的哪一个高层协议(例如:6
或17分别表示应交付运输层TCP或UDP). - 当出现扩展首部时,下一个首部字段的值就标识后面第一个扩展首部的类型。
- 当IPv6数据报没有扩展首部时,下一个首部字段的作用和IPv4的协议字段一样,
跳数限制(hop limit) 占8位。用来防止数据报在网络中无限期地存在。源点在每个数据报发出时即设定某个跳数限制(最大为255跳)。每个路由器在转发数据报时,要先把跳数限制字段中的值减1。当跳数限制的值为零时,就要把这个数据报丢弃。
源地址 占128位。是数据报的发送端的IP地址。
目的地址 占128位。是数据报的接收端的IP地址。
下面我们介绍一下IPv6的扩展首部。
大家知道,IPv4的数据报如果在其首部中使用了选项,那么沿着数据报传送的路径上的每一个路由器都必须对这些选项一一进行检查,这就降低了路由器处理数据报的速度。然而实际上很多的选项在途中的路由器上是不需要检查的(因为不需要使用这些选项的信息)。
IPv6把原来IPv4首部中选项的功能都放在扩展首部中,并把扩展首部留给路径两端的源点和终点的主机来处理,而数据报途中经过的路由器都不处理这些扩展首部(只有一个首部例外,即逐跳选项扩展首部),这样就大大提高了路由器的处理效率。
在RFC 2460中定义了以下六种扩展首部:(1)逐跳选项;(2)路由选择;(3)分片; (4)鉴别;(5)封装安全有效载荷;(6)目的站选项。
每一个扩展首部都由若干个字段组成,它们的长度也各不同。但所有扩展首部的第一个字段都是8位的“下一个首部”字段。此字段的值指出了在该扩展首部后面的字段是什么。当使用多个扩展首部时,应按以上的先后顺序出现。高层首部总是放在最后面。
IPv6地址
一般来讲,一个IPv6数据报的目的地址可以是以下三种基本类型地址之一:
- 单播(unicast) 单播就是传统的点对点通信。
- 多播(multicast) 多播是一点对多点的通信,数据报发送到一组计算机中的每一个。IPv6没有釆用广播的术语,而是将广播看作多播的一个特例。
- 任播(anycast) 这是IPv6增加的一种类型。任播的终点是一组计算机,但数据报只交付其中的一个,通常是距离最近的一个。
IPv6把实现IPv6的主机和路由器均称为结点。由于一个结点可能会使用多条链路与其他的一些结点相连,因此一个结点可能有多个与链路相连的接口。这样,IPv6给结点的每一个接口指派一个IP地址。一个结点可以有多个单播地址,而其中任何一个地址都可以当作到达该结点的目的地址。
在IPv6中,每个地址占128位,地址空间大于3.4x1038。如果整个地球表面(包括陆地和水面)都覆盖着计算机,那么IPv6允许每平方米拥有7x1023个IP地址。如果地址分配速率是每微秒分配100万个地址,则需要1019年的时间才能将所有可能的地址分配完毕。可见在想象到的将来,IPv6的地址空间是不可能用完的。
巨大的地址范围还必须使维护互联网的人易于阅读和操纵这些地址。IPv4所用的点分十进制记法现在也不够方便了。例如,一个用点分十进制记法的128位的地址为:
104.230.140.100.255.255.255.255.0.0.17.128.150.10.255.255
为了使地址再稍简洁些,IPv6使用冒号+六进制记法(colon hexadecimal notation,简写为colonhex),它把每个16位的值用十六进制值表示,各值之间用冒号分隔。例如,如果前面所给的点分十进制数记法的值改为冒号十六进制记法,就变成了 :
68E6:8C64:FFFF:FFFF:0:1180:960A:FFFF
在十六进制记法中,允许把数字前面的0省略。上面就把0000中的前三个0省略了。冒号十六进制记法还包含两个技术使它尤其有用。首先,冒号十六进制记法可以允许零压缩(zero compression),即一连串连续的零可以为一对冒号所取代,例如:
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的地址分类见表4-10所示。
对表4-10所列举的几种地址简单解释如下。
未指明地址 这是16字节的全0地址,可缩写为两个冒号“::”。这个地址不能用作目的地址,而只能为某台主机当作源地址使用,条件是这台主机还没有配置到一个标准的IP地址。这类地址仅此一个。
环回地址 IPv6的环回地址是0:0:0:0:0:0:0:1,可缩写为 ::1。它的作用和IPv4的环回地址一样。这类地址也是仅此一个。
多播地址 功能和IPv4的一样。这类地址占IPv6地址总数的1/256。
本地链路单播地址(Link-Local Unicast Address) 有些单位的网络使用TCP/IP协议,但并没有连接到互联网上。连接在这样的网络上的主机都可以使用这种本地地址进行通信,但不能和互联网上的其他主机通信。这类地址占IPv6地址总数的1/1024。
全球单播地址 IPv6的这一类单播地址是使用得最多的一类。曾提出过多种方案来进一步划分这128位的单播地址。根据2006年发布的草案标准RFC 4291的建议,IPv6单播地址的划分方法非常灵活,可以如图4-48所示的任何一种。
这就是说,可把整个的128比特都作为一个结点的地址。
也可用n比特作为子网前缀,用剩下的(128-n)比特作为接口标识符(相当于IPv4的主机号)。
当然也可以划分为三级,用“比特作为全球路由选择前缀,用洒比特作为子网前缀,而用剩下的(128-n-m)比特作为接口标识符。
从IPv4向IPv6过渡
由于现在整个互联网的规模太大,因此,“规定一个日期,从这一天起所有的路由器一律都改用IPv6”,显然是不可行的。这样,向IPv6过渡只能采用逐步演进的办法,同时,还必须使新安装的IPv6系统能够向后兼容。这就是说,IPv6系统必须能够接收和转发IPv4分组,并且能够为IPv4分组选择路由。
双协议栈
==双协议栈(dual stack)是指在完全过渡到IPv6之前,使一部分主机(或路由器)装有双协议栈:一个IPv4和一个IPv6。==因此双协议栈主机(或路由器)既能够和IPv6的系统通信,又能够和IPv4的系统通信。双协议栈的主机(或路由器)记为IPv6/IPv4,表明它同时具有两种IP地址:一个IPv6地址和一个IPv4地址。
双协议栈主机在和IPv6主机通信时釆用IPv6地址,而和IPv4主机通信时则釆用IPv4地址。但双协议栈主机怎样知道目的主机是釆用哪一种地址呢?它是使用域名系统DNS来査询的。若DNS返回的是IPv4地址,双协议栈的源主机就使用IPv4地址。但当DNS返回的是IPv6地址,源主机就使用IPv6地址。
图4-49所示的情况是源主机A和目的主机F都使用IPv6,所以A向F发送IPv6数据报,路径是A->B->C->D->E->F。中间B到E这段路径是IPv4网络,路由器B不能向C转发IPv6数据报,因为C只使用IPv4协议。B是IPv6/IPv4路由器,它把IPv6数据报首部转换为IPv4数据报首部后发送给C。C再转发到D。当D转发到IPv4网络的出口路由器E时(E也是IPv6/IPv4路由器),再恢复成原来的IPv6数据报。
需要注意的是:IPv6首部中的某些字段却无法恢复。例如,原来IPv6首部中的流标号X在最后恢复出的IPv6数据报中只能变为空缺。这种信息的损失是使用首部转换方法所不可避免的。
隧道技术
向IPv6过渡的另一种方法是隧道技术(tunneling)。
图4-50给出了隧道技术的工作原理。这种方法的要点就是在IPv6数据报要进入IPv4网络时,把IPv6数据报封装成为IPv4数据报。现在整个的IPv6数据报变成了 IPv4数据报的数据部分。这样的IPv4数据报从路由器B经过路由器C和D,传送到E,而原来的IPv6数据报就好像在IPv4网络的隧道中传输,什么都没有变化。当IPv4数据报离开IPv4网络中的隧道时,再把数据部分(即原来的IPv6数据报)交给主机的IPv6协议栈。
图中的一条粗线表示在IPv4网络中好像有一个从B到E的“IPv6隧道”,路由器B是隧道的入口而E是出口。请注意,在隧道中传送的数据报的源地址是B而目的地址是E。
要使双协议栈的主机知道IPv4数据报里面封装的数据是一个IPv6数据报,就必须把IPv4首部的协议字段的值设置为41(41表示数据报的数据部分是IPv6数据报)。
ICMPv6
和IPv4 一样,IPv6也不保证数据报的可靠交付,因为互联网中的路由器可能会丢弃数据报。因此IPv6也需要使用ICMP来反馈一些差错信息。
新的版本称为ICMPv6,它比ICMPv4要复杂得多。地址解析协议ARP和网际组管理协议IGMP的功能都己被合并到ICMPv6中(图 4-51 )。
ICMPv6是面向报文的协议,它利用报文来报告差错,获取信息,探测邻站或管理多播通信。ICMPv6还增加了几个定义报文功能及含义的其他协议。
在对ICMPv6报文进行归类时,不同的文献和RFC文档使用了不同的策略,有的把其中的一些报文定义为ICMPv6报文,而把另一些报文定义为邻站发现ND (Neighbor-Discovery)报文或多播听众交付MLD(Multicast Listener Delivery)报文。
其实所有这些报文都应当是ICMPv6报文,只是功能和作用不同而已。因此我们把这些报文都列入ICMPv6的不同类别。使用这种分类方法的原因是所有这些报文都具有相同的格式,并且所有报文类型都由ICMPv6协议处理。
其实,像ND和MLD这样的协议都是运行在ICMPv6协议之下的。基于这样的考虑,可把ICMPv6报文分类如图4-52所示。请注意,邻站发现报文和组成员关系报文分别是在ND协议和MLD协议的控制下进行发送和接收的。
虚拟专用网VPN和网络地址转换NAT
虚拟专用网VPN
由于IP地址的紧缺,一个机构能够申请到的ip地址数往往远小于本机构所拥有的主机数。考虑到互联网并不很安全,一个机构内也并不需要把所有的主机接入到外部的互联网。实际上,在许多情况下,很多主机主要还是和本机构内的其他主机进行通信(例如,在大型商场或宾馆中,有很多用于营业和管理的计算机。显然这些计算机并不都需要和互联网相连)。
假定在一个机构内部的计算机通信也是釆用TCP/IP协议,那么从原则上讲,对于这些仅在机构内部使用的计算机就可以由本机构自行分配其IP地址。这就是说,让这些计算机使用仅在本机构有效的IP地址(这种地址称为本地地址),而不需要向互联网的管理机构申请全球唯一的IP地址(这种地址称为全球地址)。这样就可以大大节约宝贵的全球IP地址资源。
但是,如果任意选择一些IP地址作为本机构内部使用的本地地址,那么在某种情况下可能会引起一些麻烦。例如,有时机构内部的某台主机需要和互联网连接,那么这种仅在内部使用的本地地址就有可能和互联网中某个IP地址重合,这样就会出现地址的二义性问题。
为了解决这一问题,RFC 1918指明了一些专用地址(private address)。**这些地址只能用于一个机构的内部通信,而不能用于和互联网上的主机通信。**换言之,专用地址只能用做本地地址而不能用作全球地址。在互联网中的所有路由器,对目的地址是专用地址的数据报一律不进行转发。2013年4月,RFC 6890全面地给出了所有特殊用途的IPv4地址,但三个专用地址块的指派并无变化,即
- 10.0.0.0 到 10.255.255.255 (或记为 10.0.0.0/8,它又称为 24 位块)
- 172.16.0.0 到 172.31.255.255 (或记为 172.16.0.0/12,它又称为 20 位块)
- 192.168.0.0 到 192.168.255.255 (或记为 192.168.0.0/16,它又称为 16 位块)
上面的三个地址块分别相当于一个A类网络、16个连续的B类网络和256个连续的C类网络。A类地址本来早己用完了,而上面的地址10.0.0.0本来是分配给ARPANET的。由于ARPANET己经关闭停止运行了,因此这个地址就用作专用地址。
采用这样的专用IP地址的互连网络称为专用互联网或本地互联网,或更简单些,就叫做专用网。显然,全世界可能有很多的专用互连网络具有相同的专用IP地址,但这并不会引起麻烦,因为这些专用地址仅在本机构内部使用。专用IP地址也叫做可重用地址(reusable address)。
有时一个很大的机构的许多部门分布的范围很广(例如,在世界各地),这些部门经常要互相交换信息。这可以有两种方法。
- 租用电信公司的通信线路为本机构专用。这种方法虽然简单方便,但线路的租金太高,一般难于承受。
- 利用公用的互联网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网VPN (Virtual Private Network)。
之所以称为“专用网”是因为这种网络是为本机构的主机用于机构内部的通信,而不是用于和网络外非本机构的主机通信。如果专用网不同网点之间的通信必须经过公用的互联网,但又有保密的要求,那么所有通过互联网传送的数据都必须加密。
“虚拟”表示“好像是”,但实际上并不是,因为现在并没有真正使用通信专线,而VPN只是在效果上和真正的专用网一样。一个机构要构建自己的VPN就必须为它的每一个场所购买专门的硬件和软件,并进行配置,使每一个场所的VPN系统都知道其他场所的地址。
图4-59以两个场所为例说明如何使用IP隧道技术实现虚拟专用网。假定某个机构在两个相隔较远的场所建立了专用网A和B,其网络地址分别为专用地址10.1.0.0和10.2.0.0。现在这两个场所需要通过公用的互联网构成一个VPN。
显然,每一个场所至少要有一个路由器具有合法的全球IP地址,如图4-59(a)中的路由器R1和R2。这两个路由器和互联网的接口地址必须是合法的全球IP地址。路由器R1和R2在专用网内部网络的接口地址则是专用网的本地地址。
在每一个场所A或B内部的通信量都不经过互联网。但如果场所A的主机X要和另一个场所B的主机Y通信,那么就必须经过路由器R1和R2。
主机X向主机Y发送的IP数据报的源地址是10.1.0.1,而目的地址是10.2.0.3。这个数据报先作为本机构的内部数据报从X发送到与互联网连接的路由器R1。路由器R1收到内部数据报后,发现其目的网络必须通过互联网才能到达,就把整个的内部数据报进行加密(这样就保证了内部数据报的安全),然后重新加上数据报的首部,封装成为在互联网上发送的外部数据报,其源地址是路由器R1的全球地址125.1.2.3,而目的地址是路由器R2的全球地址194.4.5.6。路由器R?收到数据报后将其数据部分取出进行解密,恢复出原来的内部数据报(目的地址是10.2.0.3),交付主机Y。
可见,虽然X向Y发送的数据报是通过了公用的互联网,但在效果上就好像是在本部门的专用网上传送一样。如果主机Y要向X发送数据报,那么所进行的步骤也是类似的。请注意,数据报从R1传送到R2可能要经过互联网中的很多个网络和路由器。但从逻辑上看,在R1到R2之间好像是一条直通的点对点链路,图4-59(a)中的“隧道"就是这个意思。
如图4-59(b)所示的、由场所A和B的内部网络所构成的虚拟专用网VPN又称为内联网(intranet或intranet VPN,即内联网VPN),表示场所A和B都属于同一个机构。
有时一个机构的VPN需要有某些外部机构(通常就是合作伙伴)参加进来。这样的VPN就称为外联网(extranet或extranet VPN,即外联网VPN)。
请注意,内联网和外联网都采用了互联网技术,即都是基于TCP/IP协议的。
还有一种类型的VPN,就是远程接入VPN (remote access VPN)。我们知道,有的公司可能并没有分布在不同场所的部门,但却有很多流动员工在外地工作。公司需要和他们保持联系,有时还可能一起开电话会议或视频会议。远程接入VPN可以满足这种需求。在外地工作的员工通过拨号接入互联网,而驻留在员工个人电脑中的VPN软件可以在员工的个人电脑和公司的主机之间建立VPN隧道,因而外地员工与公司通信的内容也是保密的,员工们感到好像就是使用公司内部的本地网络。
网络转化地址NAT
在专用网内部的一些主机本来己经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和互联网上的主机通信(并不需要加密),那么应当釆取什么措施呢?
使用得最多的方法是釆用网络地址转换。网络地址转换NAT (Network Address Translation)方法是在1994年提出的。这种方法需要在专用网连接到互联网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和互联网连接。
图4-60给出了NAT路由器的工作原理。在图中,专用网192.168.0.0内所有主机的IP地址都是本地IP地址192.168.x.x。NAT路由器至少要有一个全球IP地址,才能和互联网相连。图4-60表示岀NAT路由器有一个全球IP地址172.38.1.5 (当然,NAT路由器可以有多个全球IP地址)。
NAT路由器收到从专用网内部的主机A发往互联网上主机B的IP数据报:源IP地址是192.168.0.3,而目的IP地址是213.18.2.4。 NAT路由器把IP数据报的源IP地址192.168.0.3,转换为新的源IP地址(即NAT路由器的全球IP地址)172.38.1.5,然后转发出去。因此,主机B收到这个IP数据报时,以为A的IP地址是172.38.1.5。当B给A发送应答时,IP数据报的目的IP地址是NAT路由器的IP地址172.38.1.5。 B并不知道A的专用地址192.168.0.3。实际上,即使知道了,也不能使用,因为互联网上的路由器都不转发目的地址是专用网本地IP地址的IP数据报。当NAT路由器收到互联网上的主机B发来的IP数据报时,还要进行一次IP地址的转换。通过NAT地址转换表,就可把IP数据报上的旧的目的IP地址172.38.1.5,转换为新的目的IP地址192.168.0.3 (主机A真正的本地IP地址)。表4-11给出了 NAT地址转换表的举例。表中的前两行数据对应于图4-60中所举的例子。第一列“方向”中的“出”表示离开专用网,而“入”表示进入专用网。表中后两行数据(图4&中没有画出对应的IP数据报)表示专用网内的另一主机192.168.0.7向互联网发送了 IP数据报,而NAT路由器还有另外一个全球IP地址172.38.1.6。
可以看出,在内部主机与外部主机通信时,在NAT路由器上发生了两次地址转换:
离开专用网时:替换源地址,将内部地址替换为全球地址;
进入专用网时:替换目的地址,将全球地址替换为内部地址;
当 NAT 路由器具有 n 个全球 IP 地址时,专用网内最多可以同时有 n 台主机接入到互联网。这样就可以使专用网内较多数量的主机,轮流使用 NAT 路由器有限数量的全球 IP 地址。
通过 NAT 路由器的通信必须由专用网内的主机发起。专用网内部的主机不能充当服务器用,因为互联网上的客户无法请求专用网内的服务器提供服务。
为了更加有效地利用 NAT 路由器上的全球IP地址,现在常用的 NAT 转换表把运输层的端口号也利用上。这样,就可以使多个拥有本地地址的主机,共用一个 NAT 路由器上的全球 IP 地址,因而可以同时和互联网上的不同主机进行通信。
使用端口号的 NAT 叫做网络地址与端口号转换NAPT (Network Address and Port Translation),而不使用端口号的 NAT 就叫做传统的 NAT (traditional NAT)。
NAPT把专用网内不同的源 IP 地址,都转换为同样的全球 IP 地址。但对源主机所采用的 TCP 端口号(不管相同或不同),则转换为不同的新的端口号。因此,当 NAPT 路由器收到从互联网发来的应答时,就可以从 IP 数据报的数据部分找出运输层的端口号,然后根据不同的目的端口号,从 NAPT 转换表中找到正确的目的主机。