计算机网络之网络层

网络层

互联网采用的设计思路是这样的:网络层向上只提供简单灵活的、无连接的、尽最大

努力交付的数据报服务

网络在发送分组时不需要先建立连接。每一个分组(也就是IP数据报)独立发送,与其前后的分组无关(不进行编号)。网络层不提供服务质量的承诺。也就是说,所传送的分组可能出错、丢失、重复和失序(即不按序到达终点),当然也不保证分组交付的时限。由于传输网络不提供端到端的可靠传输服务,这就使网络中的路由器比较简单,且价格低廉(与电信网的交换机相比较)。如果主机(即端系统)中的进程之间的通信需要是可靠的,那么就由网络主机中的运输层负责(包括差错处理、流量控制等)。

网际协议IP

网际协议IP是TCP/IP体系中两个最主要的协议之一[STEV94][COME06][FORO10],也是最重要的互联网标准协议之一。网际协议IP又称为Kahn-Cerf协议,因为这个重要的协议正是 Robert Kahn和Vint Cerf二人共同研发的。这两位学者在2005年获得图灵奖(其地位相当于计算机科学领域的诺贝尔奖)。

与IP协议配套使用的还有三个协议:

  • 地址解析协议ARP( Address resolution protocol)
  • 网际控制报文协议ICMP( nternet Control Message Protocol)
  • 网际组管理协议IGMP( Internet Group Management Protocol)

注:逆地址解析协议RARP(Reverse Address Resolution Protocol)现在已经被淘汰不使用了。
请添加图片描述

虚拟互联网络

由于没有一种单一的网络能够适应所有用户的需求,所以在互联网上的网络实际上是多种多样的,而要将全球范围内数以百万计的网络都互联起来,这样的任务其实是非常复杂的。

从一般的概念上来讲,将网络互相连接起来要使用一些中间设备。根据中间设备所属的层次,可以有以下四种不同的中间设备:

(1) 物理层使用的中间设备叫做转发器(repeater)

(2) 数据链路层使用的中间设备叫做网桥或桥接器(bridge)

(3) 网络层使用的中间设备叫做路由器(router)

(4) 在网络层以上使用的中间设备叫做网关(gateway)。用网关连接两个不兼容的系统需要在高层进行协议的转换。

当中间设备是转发器或网桥时,这仅仅是把一个网络扩大了,而从网络层的角度看,这仍然是一个网络,一般并不称之为网络互连。网关由于比较复杂,目前使用得较少。因此现在我们讨论网络互连时,都是指用路由器进行网络互连和路由选择。路由器其实就是一台专用计算机,用来在互联网中进行路由选择。由于历史的原因,许多有关TCP/IP的文献曾经把网络层使用的路由器称为网关

下图(a)表示有许多计算机网络通过一些路由器进行互连。由于参加互连的计算机网络都使用了相同的网际协议IP(Internet Protocol),因此可以把互连以后的计算机网络看成如图(b)所示的一个虚拟互连网络。所谓虚拟互连网络也就是逻辑互连网络,它的意思是说互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用IP协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络。
请添加图片描述
使用虚拟互联网络的好处是:当IP网上的主机进行通信时,就好像在一个单个网络上通信一样,它们其实看不见互连的各网络的具体异构细节(如具体的编址方案、路由选择协议等等)。如果在这种覆盖全球的IP网的上层使用TCP协议,那么就是现在的互联网( Internet)。

有了虚拟互联网络的概念后,我们再讨论在这样的虚拟网络上如何寻址。
请添加图片描述

分类的IP地址

IP地址及其表示方法

整个的互联网就是一个单一的、抽象的网络。IP地址就是给互联网上的每一台主机(或路由器)的每一个接口分配一个在全世界范围内是唯一的32位的标识符。IP地址的结构使我们可以在互联网上很方便地进行寻址。IP地址现在由互联网名字和数字分配机构ICANN( nternet Corporation for Assigned Names and Numbers)进行分配。

IP地址的编址方法共经过了三个历史阶段:

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

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

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

所谓“分类的IP地址”就是将IP地址划分为若干个固定类,每一类地址都由两个固定长度的字段组成,其中第一个字段是网络号(net-id),它标志主机(或路由器)所连接到的网络。一个网络号在整个互联网范围内必须是唯一的。第二个字段是主机(host-id),它标志该主机(或路由器)。一台主机号在它前面的网络号所指明的网络范围内必须是唯一的。由此可见,一个IP地址在整个互联网范围内是唯一的。

这种两级的IP地址可以记为:

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

下图给出了各种IP地址的网络号字段和主机号字段,这里A类,B类和C类地址都是单播地址(一对一通信),是最常用的。
请添加图片描述
从上图中可以看出:

  • A类、B类和C类地址的网络号字段(在图中这个字段是灰色的)分别是1个、2个和3个字节长,而在网络号字段的最前面有1~3位的类别位,其数值分别规定为0,10和110。
  • A类、B类和C类地址的主机号字段分别为3个、2个和1个字节长。
  • D类地址(前4位是1110),用于IP多播(一对多通信)。
  • E类地址(前4位是1111)保留为以后使用。

从IP地址的结构来看,IP地址并不仅仅指明了一台主机,而且还指明了主机所连接到的网络。

对主机或路由器来说IP地址都是32位的二进制代码。但为了提高可读性,我们常常把32位的IP地址中的每8位插入一个空格(但在电脑中并没有这样的空格)。而为了便于书写,可用其等效的十进制数字表示,并且在这些数字之间加上一个点。这就叫做点分十进制记法( dotted decimal notation)。

下图是一个B类P地址的表示方法。显然,128.1.3.31比100000000101100000100011起来要方便得多。
请添加图片描述

常用的三种类别的IP地址

常用的三类IP地址分别是A类,B类和C类地址。

A类地址的网络号字段占1个字节,只有7位可供使用(该字段的第一位已固定为0),但可指派的网络号是126个(即27 − 2)。这里减2的原因是:

  1. IP地址中,网络号字段为全0的IP地址是个保留地址,意思是“本网络”;
  2. 网络号为127(即01111111)的IP地址保留,用于本地软件环回测试(loopback test)本主机进程之间的通信。

若主机发送一个目的地址为环回地址(例如127.0.0.1)的IP数据报,则本主机中的协议软件就直接处理数据报中的数据,而不会把数据报发送到任何网络。目的地址为环回地址的IP数据报永远不会出现在任何网络上,因为网络号为127的地址根本不是一个网络地址。

A类地址的主机号占3个字节,因此每一个A类网络中的最大主机数是224 − 2,即16777214。这里减2的原因是:

全0的主机号字段表示该IP地址是“本主机”所连接到的单个网络地址(例如,一主机的IP地址为5.6.7.8,则该主机所在的网络地址就是5.0.0.0),而全1表示“所有的(all)”,因此全1的主机号字段表示该网络上的所有主机。

整个IP地址空间共有232 (即4294967296)个地址。A类地址空间共有231个地址,占整个IP地址空间的50%。

B类地址的网络号字段有2个字节,但前面两位(10)已经固定了,只剩下14位可以进行分配。因为网络号字段后面的14位无论怎样取值也不可能出现使整个2字节的网络号字段成为全0或全1,因此这里并不存在网络总数减2的问题。但实际上B类网络地址128.0.0.0是不指派的,可以指派的B类最小网络地址是128.1.0.0[COME06]。因此B类地址可指派的网络数为214 − 1,即16383。
请添加图片描述
B类地址的每一个网络上的最大主机数是216 − 2,即65534。这里需要减2是因为要扣除全0和全1的主机号。B类地址空间共约有230个地址,占整个IP地8址空间的25%。

C类地址有3个字节的网络号字段,最前面的3位是(110),还有后面21位可以进行分配。C类网络地址192.0.0.0也是不指派的,可以指派的C类最小网络地址是192.0.1.0[COME06],因此C类地址可指派的网络总数是221 − 1,即2097151。
请添加图片描述
每一个C类地址的最大主机数是28 − 2,即254。C类地址空间共约有229个地址,占整个IP地址的12.5%。

我们可以将上述讨论的IP地址的指派范围整理为表格:
请添加图片描述
下表则给出了一般不使用的特殊IP地址,这些地址只能在特定的情况下使用。
请添加图片描述
IP地址具有以下一些重要特点:

  1. 每一个IP地址都由网络号和主机号两部分组成。分两个等级的好处是:
  2. IP地址管理机构在分配IP地址时只分配网络号(第一级),而剩下的主机号(第二级)则由得到该网络号的单位自行分配,这样就方便了IP地址的管理;
  3. 路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间以及查找路由表的时间。
  4. 实际上,IP地址是标志一台主机(或路由器)和一条链路的接口。当一台主机同时连接到两个网络上时,该主机就必须同时具有两个在相应网络上的IP地址,其网络号必须是不同的。这种主机称为多归属主机(multihomed host)。由于一个路由器至少应当连接到两个网络,因此一个路由器至少应当有两个不同的IP地址。这就好比一个建筑正好处在北京路和上海路的交叉口上,那么这个建筑就可以拥有两个门牌号码。例如,北京路4号和上海路37号。
  5. 按照互联网的观点,一个网络是指具有相同网络号 net-id的一群主机的集合,因此,用转发器或网桥连接起来的若干个局域网仍为一个网络,因为这些局域网都具有同样的网络号。具有不同网络号的局域网必须使用路由器进行互连。
  1. 在IP地址中,所有分配到网络号的网络(不管是范围很小的局域网,还是可能覆盖很大地理范围的广域网)都是平等的。所谓平等,是指互联网同等对待每一个IP地址。

下图画出了三个局域网(LAN1,LAN2和LAN3)通过三个路由器(R1,R2和R3)互联起来所构成一个互联网。
请添加图片描述
根据对上图的分析,我们应当注意到:

在同一个局域网上的主机或路由器的IP地址中的网络号必须是一样的。图中所示的网络号就是IP地址中网络号字段的值,另一种表示方法是使用主机号为全0的网络IP地址,如222.0.0.0。

用网桥(它只在链路层工作)互连的网段仍然是一个局域网,只能有一个网络号。路由器总是具有两个或两个以上的IP地址。即路由器的每一个接口都有一个不同网络号的IP地址。

当两个路由器直接相连时(例如通过一条租用线路),在连线两端的接口处,可以分配也可以不分配IP地址。如分配了IP地址,则这一段连线就构成了一种只包含一段线路的特殊“网络”(如图中的N1,N2和N3)。之所以叫做“网络”是因为它有IP地址。但为了节省IP地址资源,对于这种仅由一段连线构成的特殊“网络”,现在也常常不分配IP地址。通常把这样的特殊网络叫做无编号网络(unnumbered network)或无名网络(anonymous network)[COME06]。

IP地址与硬件地址

从层次的角度来看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层及以上各层使用的地址,是一种逻辑地址(称IP地址为逻辑地址是因为IP地址其实是由软件生成的)。
请添加图片描述
发送数据时,数据从高层下到低层,然后才到通信链路上进行传输。使用IP地址的数据报一旦交给了数据链路层,就被封装成了MAC帧。MAC帧在传送时使用的源地址和目的地址都是硬件地址,这两个地址都写在了MAC帧的首部中。

连接在通信链路上的设备(主机或路由器)在收到MAC帧时,根据MAC帧首部中的硬件地址决定收下或丢弃。只有在剥去MAC帧的首部和尾部后把MAC层的数据上交给网络层后,网络层才能在IP数据报的首部中找到源IP地址和目的IP地址。

总之,IP地址放在IP数据报的首部,而硬件地址则放在MAC帧的首部。在网络层和网络层以上使用的是IP地址,而数据链路层及以下使用的是硬件地址。

前面我们提到,路由器在两个局域网上有不同的IP,实际上当路由器连接到多个局域网时,它也有多个MAC地址。

下图(a)画的是三个局域网用两个路由器R1和R2互连起来。现在主机H1要和主机H2通信。这两台主机的IP地址分别是P1和IP2,而它们的硬件地址分别为HA1和HA2(HA表示 Hardware Address)。通信的路径是:H1→经过R1转发→再经过R2转发→H2。

路由器R1因同时连接到两个局域网上,因此它有两个硬件地址,即HA3和HA4。同理,路由器R2也有两个硬件地址HA5和HA6。
请添加图片描述
图(b)特别强调了IP地址和MAC地址的区别——IP地址在IP数据报中从未发生改变,但MAC帧中的源MAC地址和目的MAC地址当在不同的网络上进行传输时,其实一直都在发生变化。

地址解析协议ARP

ARP协议的用途是为了从网络层使用的IP地址,解析出数据链路层使用的硬件地址。以前还有一个旧的协议叫做逆地址解析协议RARP,它的作用是使知道自己硬件地址的主机能够通过RARP协议找出其自身当前的IP地址,但现在DHCP协议已经包含了这个协议的功能,RARP协议也早已弃用。
请添加图片描述
ARP协议的工作原理:

在主机的ARP高速缓冲中存放一个本局域网上的各主机和路由器的IP地址到硬件地址的映射表,并且这个映射表要经常动态更新。

当主机A要向本局域网上的某台主机B发送IP数据报时,就先在其ARP高速缓存中查看有无主机B的IP地址。如有,就在ARP高速缓存中取出其对应的硬件地址,再把这个硬件地址写入MAC帧,然后通过局域网把该MAC帧发往此硬件地址。

也有可能查不到主机B的IP地址的项目,在这种情况下,主机A就自动运行ARP,然后按以下步骤找出主机B的硬件地址:

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

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

(3) 主机B的IP地址与ARP请求分组中要查询的IP地址一致,就收下这个ARP请求分组,并向主机A发送ARP响应分组(其格式见[COME06]),同时在这个ARP响应分组中写入自己的硬件地址。由于其余所有主机的IP地址都与ARP请求分组中要查询的IP地址不一致,因此都不理睬这个ARP请求分组,见下图(b)。

(4) 主机B发出的ARP响应分组的主要内容是:“我的IP地址是209.0.0.6,我的硬件地址是08-00-2B-00-EE-0A。”请注意:虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。

(5) 主机A收到主机B的ARP响应分组后,就在其ARP高速缓存中写入主机B的IP地址到硬件地址的映射项目。
请添加图片描述
需要注意的一点是,如果仅仅只是主机A的ARP表中写入了当主机B的IP地址到硬件地址的映射项目,那么在A向B发送数据报后,很可能以后不久主机B还要向A发送数据报,因而主机B也可能要向A发送ARP请求分组。为了减少网络上的通信量,主机A在发送其ARP请求分组时,就会把自己的IP地址到硬件地址的映射写入ARP请求分组中,当主机B收到A的ARP请求分组时,就一并把主机A的这一地址映射写入主机B自己的ARP高速缓存中。以后主机B向A发送数据报时就不用再使用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地址到硬件地址的映射问题。如果所要找的主机和源主机不在同一个局域网上,主机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编址和ARP就把这个复杂问题解决了。

IP数据报的格式

请添加图片描述

IP数据报首部固定部分中的各字段解析

版本

占4位,通信双方使用的IP协议的版本号必须一致。

首部长度

占4位,可表示的最大十进制数值是15。

首部长度字段所表示的数的单位是32位字(1个32位字表示4字节)。因为IP首部的固定长度是20字节,因此首部长度字段的最小值是5(二进制的0101)。而当首部长度为最大值1111时(即十进制数的15),就表明首部长度达到了15个32位字长,即60字节。
请添加图片描述
当IP分组的首部长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。因为IP数据报的数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为方便。

区分服务

占8位,这个字段在旧标准中叫做服务类型,1998年IETF把这个字段改为区分服务DS(Differentiated Services)。只有在区分服务时,这个字段才起作用,但一般不使用。

总长度

占16位,总长度表示首部与数据部分之和的长度,单位为字节。IP数据报的最大长度为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,并将此值赋给标识字段。但与TCP报文段不同,这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须进行分片时,这时标识字段的值就会被复制到所有数据报片的标识字段中。具有相同标识字段的各数据报片最后能正确地重装为原来分片前的数据报。

标志(flag)

占3位,但目前来说,其实只有后两位有实际意义。

  • 标志字段中的最低位记为MF(More Fragment) MF=1即表示后面“还有分片”的数据报。MF=0表示这已是若干数据报片中的最后一个。
  • 标志字段中间的一位记为DF(Don’ t Fragment),意思是“不能分片”。只有当DF=0时才允许分片。

片偏移

占13位。片偏移指出:较长的分组在分片后,某片在原分组中的位置。片偏移以8个字节为偏移单位,也就是说,每个分片的长度一定是8字节(64字节)的整数倍。

为了更直观的了解IP分片的原理,下面我们来看一个例子:
请添加图片描述

生存时间TTL(Time To Live)

占8位。由发出数据报的源点设置这个字段,其目的是防止无法交付的数据报无限制地在互联网中兜圈子(例如从路由器R1转发到R2,再转发到R3,然后又转发到R1)。

路由器在每次转发数据报之前就把TTL的值减1,若TTL的值减小到0,就丢弃这个数据报,不再转发。因此,TTL的单位是路由器的跳数。

TTL的意义是指明数据报在互联网中至多可经过多少个路由器。显然,数据报能在互联网中经过的路由器的最大数值是255(28 − 1)。若把TTL的初始值设置为1,就表示这个数据报只能在本局域网中传送。因为这个数据报一传送到局域网上的某个路由器,在被转发之前,TTL值就减小到零,因而就会被这个路由器直接丢弃。

协议

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

一些常用的协议和相应的协议字段值如下:
请添加图片描述

首部检验和

占16位。这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。

为了进一步减小计算检验和的工作量,IP首部的检验和不采用复杂的CRC检验码而采用下面的简单计算方法:

在发送方,先把IP数据报首部划分为许多16位字的序列,并先把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。接收方收到数据报后,将首部的所有16位字再使用反码算术运算相加一次。将得到的和取反码,即得出接收方检验和的计算结果。

若首部未发生任何变化,则此结果必为0,于是就保留这个数据报。否则即认为出差错,并将此数据报丢弃。下图说明了IP数据报首部检验和的计算过程。
请添加图片描述

源地址

占32位。

目的地址

占32位。

IP数据报首部的可变部分

请添加图片描述

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

实际上这些选项很少被使用。

IP转发分组的流程

每个网络上的主机数量可能多达数万台,如果路由器要指出某个网络中的某台主机到另一个网络中的某台主机之间应该如何进行转发,那么路由器要存储的信息未免太过庞大。实际上,路由器只说明了当前网络的IP分组到其他网络应该如何进行转发,路由器接收到IP分组后会根据其首部中目的IP的地址决定将该分组从自己的哪个接口上转发出去,交付到哪个网络。
请添加图片描述
注:只有在到达最后一个路由器时,路由器才试图直接将IP数据报交付给目的主机,其间一直都是路由器之间的间接交付。

某些情况下,路由器还采用了默认路由(default route)的方式以减少路由表所占用的空间和搜索路由表所占用的时间(减少路由表表项)。这种转发方式在一个网络只有很少的对外连接时是很有用的。在下图中,只要目的网络是其他网络(不是N1或N2),就一律选择默认路由R1,让其转发到互联网中的下一跳路由器,一直转发到目的网络上的路由器,最后进行直接交付。
请添加图片描述
应当强调的是,在IP数据报的首部中没有地方可以用来指明“下一跳路由器的IP地址”。在IP数据报的首部写上的IP地址是源IP地址和目的IP地址,而没有中间经过的路由器的IP地址。既然IP数据报中没有下一跳路由器的IP地址,那么待转发的数据报又是怎样找到下一跳的路由器呢?

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

根据以上所述,分组转发算法可简述如下:

(1) 从IP数据报的首部提取出目的主机的IP地址D,得出目的网络的地址为N。

(2) 若N就是与此路由器直接相连的某个网络地址,则直接进行交付(这里包括把目的主机地址D转换为具体的硬件地址,把数据报封装为MAC帧,再发送此帧);否则就是间接交付,执行(3)。

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

(4) 若路由表中有到达网络N的路由,则把数据报传送给路由表中所指明的下一跳路由器;否则,执行(5)。

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

(6)报告转发分组出错(丢掉这个IP数据报并向源主机发送一个ICMP差错报文)。

划分子网和构造超网

划分子网

从二级IP地址到三级IP地址

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

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

每一个A类地址网络可连接的主机数超过1000万,而每一个B类地址网络可连接的主机数也超过6万。有的单位申请到了一个B类地址网络,但所连接的主机数并不多,可是又不愿意申请一个足够使用的C类地址,理由是考虑到今后可能的发展。IP地址的浪费,还会使IP地址空间的资源过早地被用完。

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

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

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

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

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

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

  1. 一个拥有许多物理网络的单位,可将所属的物理网络划分为若干个子网(subnet)。划分子网纯属一个单位内部的事情。本单位以外的网络看不见这个网络是由多少个子网组成,因为这个单位对外仍然表现为一个网络。
  2. 划分子网的方法是从网络的主机号借用若干位作为子网号(subnet-id),当然主机号

也就相应减少了同样的位数。于是两级IP地址在本单位内部就变为三级IP地址:网络号、子网号和主机号。也可以用以下记法来表示:

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

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

下面来看一个例子,某单位拥有一个B类IP地址145.13.0.0(网络号是145.13),凡目的地址为145.13.x.x的数据报都将被送到这个网络上的路由器R1。
请添加图片描述
现在把上图中的B类网络划分为3个子网,这里我们让子网号占用8位,这样,划分子网之后,主机号就只有8位。所划分出的子网分别是:145.13.3.0,145.13.7.0和145.13.21.0。

在划分子网后,整个网络对外仍表现为一个网络,其外部IP仍为145.13.0.0,但网络上的路由器R1在接收到目的IP为145.13.0.0的数据报后,还会根据其三级子网掩码将其转发到相应的子网中。

子网掩码

一个很重要的问题是,假定现在数据报已经到达了路由器R1,此时路由器该如何把它转发到子网145.13.3.0或其它子网中去呢?

我们知道,从IP数据报的首部无法看出源主机或目的主机所连接的网络是否进行了子网的划分。这是因为32位的IP地址本身以及数据报的首部都没有包含任何有关子网划分的。因此必须另外想办法,这就是使用子网掩码(subnet mask)。
请添加图片描述
使用子网掩码的好处是:不管当前网络有没有划分子网,只要把子网掩码和IP地址进行逐位的“”运算(AND),就能立即得出网络地址来。

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

显然,
A类地址的默认子网掩码是255.0.0.0或0xFF000000
B类地址的默认子网掩码是255.255.0.0或0 XFFFF0000
C类地址的默认子网掩码是255.255.255.0或0 XFFFFFF00
请添加图片描述
子网掩码是一个网络或一个子网的重要属性。在RFC950成为互联网的正式标准后,路由器在和相邻路由器交换路由信息时,必须把自己所在网络(或子网)的子网掩码告诉相邻路由器。在路由器的路由表中的每一个项目,除了要给出目的网络地址外,还必须同时给出该网络的子网掩码。若一个路由器连接在两个子网上就拥有两个网络地址和两个子网掩码。

下面来看一个使用子网掩码和原二级IP地址得到网络地址的计算过程:
请添加图片描述
下面以一个B类地址为例,说明可以有多少种子网划分的方法。在采用固定长度的子网时,所划分出的所有子网的子网掩码也是相同的。
请添加图片描述
上表中,子网数是根据子网号(subnet-id)计算出来的。若 subnet-id有n位,则共有2n种可能的排列。除去全0和全1这两种情况,就得出表中所列出的子网数。

表中的子网数表中的“子网号的位数”中没有0,1,15和16这四种情况,因为这没有意义。

注:虽然根据已成为互联网标准的RFC 950文档的规定,子网号不能全为1或全为0,。但随着无分类域间路由选择CIDR的广泛使用,现在全1和全0的子网号也可以使用了。

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

通过简单的计算,读者不难得到这样的结论:划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。例如,本来一个B类地址最多可连接65534台主机,但上表中任意一行的最后两项的乘积(划分出的子网总的能容纳的主机数)一定小于65534。

使用子网时分组的转发

使用子网划分后,路由器必须包含以下三项内容:目的网络地址子网掩码下一跳地址

在划分子网的情况下,路由器转发分组的算法如下:

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

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

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

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

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

(6) 报告转发分组出错。
请添加图片描述

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

网络前缀

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

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

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

(3) 整个IPv4的地址空间最终将全部耗尽。在2011年2月3日,IANA宣布IPv4地址已经耗尽了。

IETF很快就研究出采用无分类编址CIDR(Variable Length Subnet Mask)的方法来解决前两个问题。IETF认为上面的第三个问题属于更加长远的问题,因此专门成立Ipv6工作组负责研究解决新版本IP协议的问题。

CIDR最主要的特点有两个:

  1. CIDR消除了传统的A类,B类和C类地址以及划分子网的概念,因而能更加有效地分配IPv4的地址空间,并且在新的IPv6使用之前容许互联网的规模继续增长。CIDR把32位的IP地址划分为前后两个部分。前面部分是“网络前缀”(network-prefix),用来指明网络,后面部分则用来指明主机。因此CIDR使IP地址从三级编址(使用子网掩码)又回到了两级编址,但这已是无分类的两级编址。其记法是:

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

CIDR还使用“斜线记法”(slash notation),或称为CIDR记法,即在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数,也就是说斜线后表示的是IP地址的网络号所占的位数。

  1. CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。我们只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的起始地址(即最小地址)和最大地址,以及地址块中的地址数。例如,已知IP地址128.14.35.7/20是CIDR地址块中的一个地址,现在把它写成二进制表示,其中的前20位是网络前缀(用粗体和下划线表示出),而前缀后面的12位是主机号:

128.14.35.7/20 = 10000000 00001110 00100011 00000111

这个地址所在的地址块中的最小地址和最大地址可以很方便地得出:
请添加图片描述
为了更方便地进行路由选择,CIDR使用32位的地址掩码(address mask)。地址掩码由串1和一串0组成,而1的个数就是网络前缀的长度。例如,/20地址块的地址掩码是:11111111 11111111 11110000 00000000(20个连续的1)。斜线记法中,斜线后面的数字就是地址掩码中1的个数。
请添加图片描述
从上表可看出,每一个CIDR地址块中的地址数一定是2的整数次幂。除最后几行外,CIDR地址块中都包含了多个C类地址(是一个C类地址的2n倍,n是整数),这就是“构成超网”这一名词的来源。

使用CIDR的一个好处就是可以更加有效地分配IPv4的地址空间,可根据客户的需要分配适当大小的CIDR地址块。然而在实际分类地址的环境中,向一个部门分配IP地址,就只能以/8(A类),/16(B类)或/24(C类)为单位来分配。这就很不灵活。

最长前缀匹配请添加图片描述

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

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

使用二叉线索查找路由表

为了进行更加有效的査找,通常是把无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索(binary trie),它是一种特殊结构的树。

网际控制报文协议ICMP

为了更有效地转发IP数据报和提高交付成功的机会,在网际层使用了网际控制报文协议ICMP( Internet Control Message Protocol)[RFC792]。ICMP允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP是互联网的标准协议,但ICMP不是高层协议(看起来好像是高层协议,因为ICMP报文是装在IP数据报中,作为其中的数据部分),而是IP层的协议。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。

ICMP报文格式如下图所示:
请添加图片描述

ICMP报文的种类

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

ICMP报文的前4个字节是统一的格式,共有三个字段:类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型。下表给出了几种常用的ICMP报文类型:
请添加图片描述
ICMP报文的代码字段是为了进一步区分某种类型中的几种不同情况。检验和字段用来检验整个ICMP报文。我们应当还记得,IP数据报首部的检验和并不检验IP数据报的内容,因此不能保证经过传输的ICMP报文不产生差错。

上表给出的ICMP差错报告报文共有四种,即

(1) 终点不可达 当路由器或主机不能交付数据报时就向源点发送终点不可达报文。
(2) 时间超过 当路由器收到生存时间为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把已收到的数据报片都丢弃,并向源点发送时间超过报文

  1. 参数问题 当路由器或目的主机收到的数据报的首部中有的字段的值不正确时就丢弃该数据报,并向源点发送参数问题报文。
  2. **改变路由(重定向)**路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。

所有的ICMP差错报告报文中的数据字段都具有同样的格式。把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段。再加上相应的ICMP差错报告报文的前8个字节,就构成了ICMP差错报告报文。

提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP)。这些信息对源点通知高层协议是有用的。整个ICMP报文报文作为IP数据报的数据字段发送给源点。

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

  • 对ICMP差错报告报文,不再发送ICMP差错报告报文。
  • 对第一个分片的数据报片的所有后续数据报片,都不发送ICMP差错报告报文。
  • 对具有多播地址的数据报,都不发送ICMP差错报告报文。
  • 对具有特殊地址(如127.0.0.0或0.0.0.0)的数据报,不发送ICMP差错报告报文。

常用的ICMP询问报文有两种,即

  1. 回送请求和回答 ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。
  2. 时间戳请求和回答 ICMP时间戳请求报文是请某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日(格林威治时间)起到当前时刻一共有多少秒。时间戳请求与回答可用于时钟同步和时间测量。

ICMP的应用——ping和tracert命令的原理

ping使用了ICMP回送请求与回送回答报文,ping是应用层直接使用网络层ICMP的一个例子,它没有通过运输层的TCP或UDP。

tracert在UNIX系统中的名称是traceroute。

Traceroute从源主机向目的主机发送一连串的I数据报,数据报中封装的是无法交付的UDP用户数据报。第一个数据报P1的生存时间TTL设置为1。当P1到达路径上的第一个路由器R1时,路由器R1先收下它,接着把TTL的值减1。由于TIL等于零了,R1就把P1丢弃,并向源主机发送一个ICMP时间超过差错报告报文。

源主机接着发送第二个数据报P2,并把TTL设置为2。P2先到达路由器R1,R1收下后把TTL减1再转发给路由器R2。R2收到P2时TTL为1,但减1后TTL变为零了。R2就丢弃P2,并向源主机发送一个ICMP时间超过差错报告报文。这样一直继续下去。当最后个数据报刚刚到达目的主机时,数据报的TTL是1。主机不转发数据报,不把TTL值减1。但因IP数据报中封装的是无法交付的运输层的UDP用户数据报,因此目的主机要向源主机发送ICMP终点不可达差错报告报文。

这样,源主机就达到了自己的目的,因为这些路由器和最后目的主机发来的ICMP报文正好给出了源主机想知道的路由信息——到达目的主机所经过的路由器的IP地址,以及到达其中的每一个路由器的往返时间。

互联网的路由选择协议

有关路由选择算法的几个基本概念

倘若从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则只有两大类,即静态路由选择策略动态路由选择策略

静态路由选择也叫做非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化。对于很简单的小网络,完全可以采用静态路由选择,用人工配置毎一条路由。

动态路由选择也叫做自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。因此,动态路由选择适用于较复杂的大网络。

分层次的路由选择协议

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

  1. 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路

由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。

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

为此,可以把整个互联网划分为许多较小的自治系统(autonomous system),一般都记为AS。自治系统AS是在单一技术管理下的一组路由器,而这些路由器使用一种自治系统内部的路由选择协议和共同的度量。一个AS对其他AS表现出的是一个单一的和一致的路由选择策略[RFC4271]。

在目前的互联网中,一个大的ISP就是一个自治系统。这样,互联网就把路由选择协议划分为两大类,即:

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

(2) 外部网关协议EGP(Extemal Gateway Protocol) 若源主机和目的主机处在不同的自治系统中(这两个自治系统可能使用不同的内部网关协议),当数据报传到一个自治系统的边界时,就需要使用一种协议来将路由选择信息传递到另一个自治系统中,这样的协议就是外部网关协议EGP。目前使用最多的外部网关协议是BGP4(边界网关协议,Border Gateway Protocol)。自治系统之间的路由选择也叫做域间路由选择(interdomain routing),而在自治系统内部的路由选择叫做域内路由选择(intradomain routing)。

下图是两个自治系统互连在一起的示意图。每个自治系统自己决定在本自治系统内部运行哪一个内部路由选择协议(例如,可以是RIP,也可以是OSPF)。但每个自治系统都有一个或多个路由器(图中的路由器R1和R2),除运行本系统的内部路由选择协议外,还要运行自治系统间的路由选择协议(BGP4)。
请添加图片描述

路由器的构成

路由器的结构

路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。从路由器某个输入端口收到的分组,按照分组要去的目的网络,把该分组从路由器的某个合适的输出端口转发给下一跳路由器。下一跳路由器也按照这种方法处理分组,直到该分组到达终点为止。路由器的转发分组正是网络层的主要工作。

下图给出了一种典型的路由器的构成框图:
请添加图片描述
可见,整个的路由器结构可划分为两大部分:路由选择部分分组转发部分

路由选择部分也叫做控制部分,其核心构件是路由选择处理机。路由选择处理机的任务是根据所选定的路由选择协议构造出路由表,同时还经常或定期地和相邻路由器交换路由信息而不断地更新和维护路由表。

分组转发部分由三部分组成:交换结构、一组输入端口和一组输出端口(这里说的端口就是硬件接口)。

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

请注意“转发”和“路由选择”的区别。在互联网中,“转发”就是路由器根据转发表把收到的IP数据报从路由器合适的端口转发出去。“转发”仅仅涉及到一个路由器。但“路由选择”则涉及到很多路由器,路由表则是许多路由器协同工作的结果。这些路由器按照复杂的路由算法,得出整个网络的拓扑变化情况,因而能够动态地改变所选择的路由,并由此构造出整个的路由表。

路由表一般仅包含从目的网络到下一跳(用IP地址表示)的映射,而转发表是从路由表得出的。转发表必须包含完成转发功能所必需的信息。这就是说在转发表的每一行必须包含从要到达的目的网络到输出端口和某些MAC地址信息(如下跳的以太网地址)的映射。

将转发表和路由表用不同的数据结构实现会带来一些好处,这是因为在转发分组时,转发表的结构应当使查找过程最优化,但路由表则需要对网络拓扑变化的计算最优化。路由表总是用软件实现的,但转发表则甚至可用特殊的硬件来实现。

要注意的是,在讨论路由选择的原理时,往往不去区分转发表和路由表的区别,而可以笼统地都使路由表这一名词

在上图所示的路由器结构中,路由器的输入和输出端口里面都各有三个方框,用方框中的1,2和3分别代表物理层、数据链路层和网络层的处理模块。物理层进行比特的接收,数据链路层则按照链路层协议接收传送分组的帧。在把帧的首部和尾部剥去后,分组就被送入网络层的处理模块。

若接收到的分组是路由器之间交换路由信息的分组(如RIP或OSPF分组等),则把这种分组送交路由器的路由选择部分中的路由选择处理机。若接收到的是数据分组,则按照分组首部中的目的地址查找转发表,根据得出的结果,分组就经过交换结构到达合适的输出端口。一个路由器的输入端口和输出端口就做在路由器的线路接口卡上。

输入端口中的查找和转发功能在路由器的交换功能中是最重要的。为了使交换功能分散化,往往把复制的转发表放在每一个输入端口中(上图中的虚线箭头所示)。路由选择处理机负责对各转发表的副本进行更新。这些副本常称为“影子副本”(shadow copy)。分散化交换可以避免在路由器中的某一点上出现瓶颈。

当一个分组正在查找转发表时,后面又紧跟着从这个输入端口收到另一个分组。这个后到的分组就必须在队列中排队等待,因而产生了一定的时延。下图给出了在输入端口的队列中排队的分组的示意图。
请添加图片描述
我们再来观察在输出端口上的情况。输出端口从交换结构接收分组,然后把它们发送到路由器外面的线路上。在网络层的处理模块中设有一个缓冲区,实际上它就是个队列。当交换结构传送过来的分组的速率超过输出链路的发送速率时,来不及发送的分组就必须暂时存放在这个队列中。数据链路层处理模块把分组加上链路层的首部和尾部,交给物理层后发送到外部线路。
请添加图片描述

IPv6

IP是互联网的核心协议。现在使用的IP(即IPv4)是在20世纪70年代末期设计的互联网经过几十年的飞速发展,到2011年2月,IPv4的地址已经耗尽,ISP已经不能再申请到新的IP地址块了。我国在2014年至2015年也逐步停止了向新用户和应用分配IPv4地址,同时全面开始商用部署IPv6解决IP地址耗尽的根本措施就是采用具有更大地址空间的新版本的IP,即IPv6。

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

IP6所引进的主要变化如下:

  1. 更大的地址空间。IPv6把地址从Pv4的32位增大到4倍,即增大到128位,使地址空间增大了26倍。这样大的地址空间在可预见的将来是不会用完的。
  2. 扩展的地址层次结构。IPV6由于地址空间很大,因此可以划分为更多的层次。
  3. 灵活的首部格式。IPV6数据报的首部和IPV4的并不兼容。IPv6定义了许多可选的扩展首部,不仅可提供比IPv4更多的功能,而且还可提高路由器的处理效率,这是因为路由器对扩展首部不进行处理(除逐跳扩展首部外)。
  4. 改进的选项。IPV6允许数据报包含有选项的控制信息,因而可以包含一些新的选项。但IPv6的首部长度是固定的,其选项放在有效载荷中。我们知道,IPv4所规定的选项是固定不变的,其选项放在首部的可变部分。
  5. 允许协议继续扩充。这一点很重要,因为技术总是在不断地发展(如网络硬件的更新)而新的应用也还会出现。但我们知道,IPV4的功能是固定不变的
  6. 支持即插即用(即自动配置)。因此IPv6不需要使用DHCP
  7. 支持资源的预分配。IPv6支持实时视像等要求保证一定的带宽和时延的应用。
  8. IPv6首部改为8字节对齐(即首部长度必须是8字节的整数倍)。原来的IPv4首部是4字节对齐。

IPv6数据报由两大部分组成,即基本首部(base header)和后面的有效载荷(payload)。有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部(extension header),再后面是数据部分(见下图)。但请注意,所有的扩展首部并不属于IPv6数据报的首部。
请添加图片描述
与IPV4相比,IPv6对首部中的某些字段进行了如下的更改:

  • 取消了首部长度字段,因为它的首部长度是固定的(40字节)。
  • 取消了服务类型字段,因为优先级和流标号字段实现了服务类型字段的功能。
  • 取消了总长度字段,改用有效载荷长度字段。
  • 取消了标识、标志和片偏移字段,因为这些功能已包含在分片扩展首部中。
  • 把TTL字段改称为跳数限制字段,但作用是一样的(名称与作用更加一致)。
  • 取消了协议字段,改用下一个首部字段。
  • 取消了检验和字段,这样就加快了路由器处理数据报的速度。我们知道,在数据链路层对检测出有差错的帧就丢弃。在运输层,当使用UDP时,若检测出有差错的用户数据报就丢弃。当使用TCP时,对检测出有差错的报文段就重传,直到正确传送到目的进程为止。因此在网络层的差错检测可以精简掉。
  • 取消了选项字段,而用扩展首部来实现选项功能。

由于把首部中不必要的功能取消了,使得IPv6首部的字段数减少到只有8个(虽然首部长度增大了一倍)。

下面来解释下IPv6各字段的的作用:
请添加图片描述
(1)版本(version) 占4位。它指明了协议的版本,对IPv6来说该字段是6.

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

(3)流标号(flow label) 占20位。IPv6的一个新的机制是支持资源预分配,并且允许路由器把每一个数据报与一个给定的资源分配相联系。IPv6提出流(fow)的抽象概念。所谓“流”就是互联网络上从特定源点到特定终点(单播或多播)的一系列数据报(如实时音频或视频传输),而在这个“流”所经过的路径上的路由器都保证指明的服务质量。所有属于同一个流的数据报都具有同样的流标号。因此,流标号对实时音频/视频数据的传送特别有用。对于传统的电子邮件或非实时数据,流标号则没有用处,把它置为0即可。关于流标号可参考[RFC6437]。

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

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

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

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

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

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

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

IP多播

IP多播的基本概念

在互联网上进行多播就叫做IP多播,IP多播所传送的分组需要使用多播IP地址。

我们知道,在互联网中每一台主机必须有一个全球唯一的IP地址。如果某台主机现在想接收某个特定多播组的分组,那么怎样才能使这个多播数据报传送到这台主机?
请添加图片描述
显然,这个多播数据报的目的地址一定不能写入这台主机的IP地址,这是因为在同时间可能有成千上万台主机加入到同一个多播组。多播数据报不可能在其首部写入这样多的主机的IP地址,在多播数据报的目的地址写入的是多播组的标识符,然后设法让加入到这个多播组的主机的IP地址与多播组的标识符关联起来。

其实,多播组的标识符就是IP地址中的D类地址。D类IP地址的前四位是1110,因此D类地址范围是224.0.0.0到239.255.255.255。我们就用每一个D类地址标志一个多播组。这样,D类地址共可标志228个多播组,也就是说,在同一时间可以允许有超过26亿的多播组在互联网上运行。多播数据报也是“尽最大努力交付”,不保证一定能够交付多播组内的所有成员。因此,多播数据报和一般的IP数据报的区别就是它使用D类IP地址作为目的地址,并且首部中的协议字段值是2,表明使用网际组管理协议IGMP。
请添加图片描述
显然,多播地址只能用于目的地址,而不能用于源地址。此外,对多播数据报不产生ICMP差错报文。因此,若在PING命令后面键入多播地址,将永远不会收到响应。

IP多播可以分为两种。一种是只在本局域网上进行硬件多播,另一种则是在互联网的范围进行多播。前一种虽然比较简单,但很重要,因为现在大部分主机都是通过局域网接入到互联网的。在互联网上进行多播的最后阶段,还是要把多播数据报在局域网上用硬件多播交付多播组的所有成员。

在局域网上进行硬件多播

互联网号码指派管理局IANA拥有的以太网地址块的高24位为00-00-5E,因此TCP/IP协议使用的以太网多播地址块的范围是从00-00-5E-00-00-00到00-00-5E-FF-FF-FF。

以太网硬件地址字段中的第1字节的最低位为1时即为多播地址,这种多播地址数占IANA分配到的地址数的一半。因此IANA拥有的以太网多播地址的范围是从01-00-5E-00-00-00到01-00-5E-7F-FF-FF。不难看出,在每一个地址中,只有23位可用作多播。这只能和D类IP地址中的23位有一一对应的关系,而D类IP地址可供分配的有28位,可见在这28位中的前5位不能用来构成以太网硬件地址(见下图)。例如,IP多播地址224.128.64.32(即E0-80-40-20)和另一个IP多播地址224.0.64.32(即E0-0040-20)转换成以太网的硬件多播地址都是01-00-5E-00-40-20。由于多播IP地址与以太网硬件地址的映射关系不是唯一的,因此收到多播数据报的主机,还要在IP层利用软件进行过滤,把不是本主机要接收的数据报丢弃。
请添加图片描述

网际组管理协议IGMP

IP多播需要两种协议

下图是在互联网上传送多播数据报的例子。图中标有IP地址的四台主机都参加了个多播组,其组地址是226.15.37.123。显然,多播数据报应当传送到路由器R1,R2和R3,而不应当传送到路由器R4,因为与R4连接的局域网上现在没有这个多播组的成员。但这些路由器又怎样知道多播组的成员信息呢?这就要利用一个协议,叫做网际组管理协议IGMP(Internet Group Management Protocol),这也是一个比较常用的协议。
请添加图片描述
虽然名为网际组管理协议,但实际上,IGMP并非在互联网范围内对所有多播组成员进行管理的协议。IGMP并不知道IP多播组包含的成员数,也不知道这些成员都分布在哪些网络上等等。IGMP协议是让连接在本地局域网上的多播路由器知道本局域网上是否有主机参加或退出了某个多播组。

显然,仅有IGMP协议是不能完成多播任务的。连接在局域网上的多播路由器还必须和互联网上的其他多播路由器协同工作,以便把多播数据报用最小代价传送给所有的组成员。这就需要使用多播路由选择协议

多播路由选择协议要比单播路由选择协议要复杂得多,下面我们通过一个例子来说明。
请添加图片描述
我们假定上图中有两个多播组。多播组①的成员有主机A,B和C,而多播组②的成员有主机D,E和F。这些主机分布在三个网络上(N1,N2和N3)。

路由器R不应当向网络N3转发多播组①的分组,因为网络N3上没有多播组①的成员。但是每一台主机可以随时加入或离开一个多播组。例如,如果主机G现在加入了多播组①,那么从这时起,路由器R就必须也向网络N3转发多播组①的分组。这也就是说,多播转发必须动态地适应多播组成员的变化(这时网络拓扑并未发生变化)。请注意,单播路由选择通常是在网络拓扑发生变化时才需要更新路由(路由表中描述的就是周围网络的拓扑结构)。

再看一种情况。主机E和F都是多播组②的成员。当E向F发送多播数据报时,路由器R把这个多播数据报转发到网络N3。但当F向E发送多播数据报时,路由器R则把多播数据报转发到网络N2。如果路由器R收到来自主机A的多播数据报(A不是多播组②的成员,但也可向多播组发送多播数据报),那么路由器R就应当把多播数据报转发到N2和N3。由此可见,多播路由器在转发多播数据报时,不能仅仅根据多播数据报中的目的地址,而是还要考虑这个多播数据报从什么地方来和要到什么地方去。

还有一种情况。主机G没有参加任何多播组,但G却可向任何多播组发送多播数据报。例如,G可向多播组①或②发送多播数据报。主机G所在的局域网上可以没有任何多播组的成员。显然,多播数据报所经过的许多网络,也不一定非要有多播组成员。总之,多播数据报可以由没有加入多播组的主机发出,也可以通过没有组成员接入的网络。

网际组管理协议ICMP

迄今为止,IGMP已有了三个版本。1989年公布的RFC111( IGMPv1)早已成为了互联网的标准协议。2002年10月公布的建议标准 IGMPv3是最新的[RFC3376]。

和网际控制报文协议ICMP相似,IGMP使用IP数据报传递其报文(即IGMP报文加上IP首部构成IP数据报),但它也向IP提供服务。因此,我们不能把IGMP看成是一个单独的协议,而它是属于整个网际协议IP的一个组成部分。

从概念上来讲,IGMP的工作可分为两个阶段:

第一阶段:当某台主机要申请加入新的多播组时,该主机应向多播组的多播地址发送一个IGMP报文,声明自己要成为该组的成员。本地的多播路由器收到IGMP报文后,还要利用多播路由选择协议把这种组成员关系转发给互联网上的其他多播路由器。

第二阶段:组成员的关系是动态的。本地多播路由器要周期性地探询本地局域网上的主机,以便知道这些主机是否还继续是组的成员。只要有一台主机对某个组响应,那么多播路由器就认为这个组是活跃的。但一个组在经过几次的探询后仍然没有一台主机响应,多播路由器就认为本网络上的主机已经都离开了这个组,因此也就不再把这个组的成员关系转发给其他的多播路由器。

IGMP设计得很仔细,避免了多播控制信息给网络增加大量的开销。IGMP采用的一些具体措施如下:

  1. 在主机和多播路由器之间的所有通信都是使用IP多播。只要有可能,携带IGMP报文的数据报都用硬件多播来传送。因此在支持硬件多播的网络上,没有参加IP多播的主机不会收到IGMP报文。
  2. 多播路由器在探询组成员关系时,只需要对所有的组发送一个请求信息的询问报文,而不需要对每一个组发送一个询问报文(虽然也允许对一个特定组发送询问报文)。默认的询问速率是每125秒发送一次(通信量并不太大)。
  3. 当同一个网络上连接有几个多播路由器时,它们能够迅速和有效地选择其中的一个来探询主机的成员关系。因此,网络上多个多播路由器并不会引起IGMP通信量的增大。
  4. 在IGMP的询问报文中有一个数值N,它指明一个最长响应时间(默认值为10秒)。当收到询问时,主机在0到N之间随机选择发送响应所需经过的时延。因此,若一台主机同时参加了几个多播组,则主机对每一个多播组选择不同的随机数。对应于最小时延的响应最先发送。
  5. 同一个组内的每一台主机都要监听响应,只要有本组的其他主机先发送了响应,自己就可以不再发送响应了。这样就抑制了不必要的通信量。

多播路由器并不需要保留组成员关系的准确记录,因为向局域网上的组成员转发数据报是使用硬件多播。多播路由器只需要知道网络上是否至少还有一台主机是本组成员即可。实际上,对IGMP询问报文,每一个组只需有一台主机发送响应即可。

如果一台主机上有多个进程都加入了某个多播组,那么这台主机对发给这个多播组的每个多播数据报只接收一个副本,然后给主机中的每一个进程发送一个本地复制的副本。

最后我们还要强调指出,多播数据报的发送者和接收者都不知道(也无法找出)一个多播组的成员有多少,以及这些成员是哪些主机。互联网中的路由器和主机都不知道哪个应用进程将要向哪个多播组发送多播数据报,因为任何应用进程都可以在任何时候向任何一个多播组发送多播数据报,而这个应用进程并不需要加入这个多播组。

多播路由选择协议

虽然在TCP/IP中多播协议已成为建议标准,但多播路由选择协议(用来在多播路由器之间传播路由信息)则尚未标准化。

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

虚拟专用网VPN

由于IP地址的紧缺,一个机构能够申请到的IP地址数往往远小于本机构所拥有的主机数。考虑到互联网并不很安全,一个机构内也并不需要把所有的主机接入到外部的互联网。实际上,在许多情况下,很多主机主要还是和本机构内的其他主机进行通信(例如,在大型商场或宾馆中,有很多用于营业和管理的计算机。显然这些计算机并不都需要和互联网相连)。

假定在一个机构内部的计算机通信也是采用了TCP/IP协议,那么从原则上讲,对于这些仅在机构内部使用的计算机就可以由本机构自行分配其IP地址。这就是说,让这些计算机使用仅在本机构有效的IP地址(这种地址称为本地地址),而不需要向互联网的管理机构申请全球唯一的IP地址(这种地址称为全球地址)。这样就可以大大节约宝贵的全球IP地址资源。

但是,如果任意选择一些IP地址作为本机构内部使用的本地地址,那么在某种情况下可能会引起一些麻烦。例如,有时机构内部的某台主机需要和互联网连接,那么这种仅在内部使用的本地地址就有可能和互联网中某个IP地址重合,这样就会出现地址的二义性问题。

为了解决这一问题,RFC1918指明了一些专用地址(private address)。这些地址只能用于一个机构的内部通信,而不能用于和互联网上的主机通信。换言之,专用地址只能用作本地地址而不能用作全球地址。互联网中的所有路由器,对目的地址是专用地址的数据报一律不进行转发。2013年4月,RFC6890全面地给出了所有特殊用途的IPv4地址,但三个专用地址块的指派并无变化,即

(1) 10.0.0.0到10.255.255.255(或记为10.0.0.0/8,它又称为24位块)

(2) 172.16.0.0到172.31.255.255(或记为172.16.0.0/12,它又称为20位块)

(3) 192.168.0.0到192.168.255.255(或记为192.168.0.0/6,它又称为16位块)

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

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

有时一个很大的机构的许多部门分布的范围很广,这些部门经常要互相交换信息。这可以有两种方法。

(1) 租用电信公司的通信线路为本机构专用。这种方法虽然简单方便,但线路的租金高,一般公司难以承受。

(2) 利用公用的互联网作为本机构各专用网之间的通信载体,这样的专用网又称为虚拟专用网VPN(Virtual Private Network)。

之所以称为“专用网”,是因为这种网络是为本机构的主机用于机构内部的通信,而不是用于和网络外非本机构的主机通信。如果专用网不同网点之间的通信必须经过公用的互联网,但又有保密的要求,那么所有通过互联网传送的数据都必须加密。加密需要采用的协议是IPsec。

“虚拟”表示“好像是”,但实际上又并不是,因为其实并没有真正的使用通信专线,而VPN只是在效果上和真正的专用网一样。一个机构要构建自己的VPN就必须为它的每一个场所购买专门的硬件和软件并进行配置,使每一个场所的VPN系统都知道其他场所的地址。

假定某个机构在两个相隔较远的场所建立了专用网A和B,其网络地址分别为专用地址10.10.0和10.20.0。现在这两个场所需要通过公用的互联网构成一个VPN。

显然,每一个场所至少要有一个路由器具有合法的全球IP地址,如下图中的路由器R1和R2。这两个路由器和互联网的接口地址必须是合法的全球IP地址。路由器R1和R2在专用网内部网络的接口地址则是专用网的本地地址。
请添加图片描述
在每一个场所A或B内部的通信量都不经过互联网。但如果场所A的主机Ⅹ要和另一个场所B的主机Y进行通信,那么就必须经过路由器R1和R2。主机X向主机Y发送的IP数据报的源地址是10.1.0.1(场所A的本地地址),而目的地址是10.2.0.3(场所Y的本地地址)。这个数据报先作为本机构的内部数据报从X发送到与互联网连接的路由器R1。路由器R1收到内部数据报后,发现其目的网络必须通过互联网才能到达,就把整个的内部数据报进行加密,然后重新加上数据报的首部,封装成在互联网上发送的外部数据报,其源地址是路由器R1的全球地址125.1.2.3,而目的地址是路由器R2的全球地址194.4.5.6。路由器R2收到数据报后将其数据部分取出并进行解密,恢复出原来的内部数据报,,然后交付主机Y。

可见,虽然X向Y发送的数据报是通过了公用的互联网,但在效果上就好像是在本部门的专用网上传送一样。如果主机Y要向X发送数据报,那么所进行的步骤也是类似的。
请添加图片描述
还有一种类型的VPN,就是远程接入VPN(remote access vPn)。我们知道,有的公司可能并没有分布在不同场所的部门,但却有很多流动员工在外地工作。公司需要和他们保持联系,有时还可能一起开电话会议或视频会议。远程接入VPN可以满足这种需求(例子:远程连接VPS主机)。

网络地址转换NAT

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

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

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

下图给出了NAT路由器的工作原理。在图中,专用网192.168.0.0内所有主机的IP

地址都是本地IP地址192.168.x.x。NAT路由器至少要有一个全球IP地址,才能和互联网相

连。下图表示出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。。当NAT路由器收到互联网上的主机B发来的IP数据报时,还要进行一次IP地址的转换。通过NAT地址转换表,就可把IP数据报上的旧的目的IP地址172.38.1.5,转换为新的目的IP地址192.168.0.3(主机A真正的本地IP地址)。

下表给出了NAT地址转换表的举例。表中的前两行数据对应于上图中所举的例子。第一列“方向”中的“出”表示离开专用网,而“入”表示进入专用网。表中后两行数据表示专用网内的另一主机192.168.0.7向互联网发送了IP数据报,而NAT路由器还有另外一个全球IP地址172.38.1.6。
请添加图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值