计算机网络基础 之四:网络层

前言

现在回过头来继续写计算机网络基础。如果进度不变的话,计划两周后完成这个专栏。

网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。如果您想用尽量少的词来记住网络层,那就是“路径选择路由逻辑寻址”。

本文将着重介绍:网际协议IP子网和超网网际控制报文协议ICMP互联网的路由选择协议,简单介绍一下IPv6,而对于IP多播虚拟专用网VPN和网络地址转换NAT多协议标记交换MPLS不做介绍,有兴趣的可自行查阅。

两种服务

其实这只能算做一点历史知识,不过还是值的一看。在以前,对于网络层应当提供的服务有过长期的争论。争论焦点的实质就是:在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?

有些人认为,计算机网络应借鉴电话所使用的面向连接的通信方式。当两台计算机进行通信时,也应当先建立连接(但在分组交换中是建立一条虚电路VC (Virtual Circuit) ,以预留双方通信所需的一切网络资源。

但互联网的先驱者却提出一种崭新的网络设计思路。由于计算机有很强的差错处理能力(这点和传统的电话机有本质上的差别),网络层向上只提供简单灵活的、无连接的、尽最大努力交付的数据报服务

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

时至今日,虚电路服务已成为历史了,鉴于TCP/IP体系的网络层提供的是数据报服务,因此下面我们的讨论都是围绕网络层如何传送IP数据报

网际协议 IP

网际协议IPTCP/IP体系中两个最主要的协议之一,也是最重要的互联网标准协议之一。严格来说,这里所讲的IP其实是IP的第4个版本,应记为IPv4。但在讲述IP协议的各种原理时,往往不在IP后面加上版本号。后文将简单的提到IPv6

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

  1. 地址解析协议ARP (Address Resolution Protocol)
  2. 网际控制报文协议ICMP (Internet Control Message Protocol)
  3. 网际组管理协议IGMP (Internet Group Management Protocol)
由于网际协议`IP`是用来使互连起来的许多计算机网络能够进行通信的,因此`TCP/IP`体系中的网络层常常被称为`网际层(internet layer)`或`IP层`。

虚拟互连网络

在讨论网际协议IP之前,必须了解什么是虚拟互连网络。

我们知道,如果要在全世界范围内把数以百万计的网络都互连起来,并且能够互相通信,那么这样的任务一定非常复杂。其中会遇到许多需要解决的问题,如:不同的寻址方案;不同的最大分组长度;不同的网络接入机制;不同的超时控制;不同的差错恢复方法;不同的状态报告方法;不同的路由选择技术;不同的用户接入控制;不同的服务(面向连接服务和无连接服务); 不同的管理与控制方式;等等。

能不能让大家都使用相同的网络,这样可使网络互连变得比较简单。答案是不行的。因为用户的需求是多种多样的,没有一种单一的网络能够适应所有用户的需求。另外,网络技术是不断发展的,网络的制造厂家也要经常推出新的网络,在竞争中求生存。因此在市场上总是有很多种不同性能、不同网络协议的网络,供不同的用户选用。

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

  1. 物理层使用的中间设备叫做转发器(repeater)
  2. 数据链路层使用的中间设备叫做网桥桥接器((bridge)
  3. 网络层使用的中间设备叫做路由器(router)
  4. 在网络层以上使用的中间设备叫做网关(gateway)。用网关连接两个不兼容的系统需要在高层进行协议的转换。

网关由于比较复杂,目前使用得较少。因此现在我们讨论网络互连时,都是指用路由器进行网络互连和路由选择。路由器其实就是一台专用计算机,用来在互联网中进行路由选择。

下图(a)表示有许多计算机网络通过一些路由器进行互连。由于参加互连的计算机网络都使用相同的网际协议IP (Intemet Protocol),因此可以把互连以后的计算机网络看成如下图(b)所示的一个虚拟互连网络(intemet)。所谓虚拟互连网络也就是逻辑互连网络,它的意思就是互连起来的各种物理网络的异构性本来是客观存在的,但是我们利用IP协议就可以使这些性能各异的网络在网络层上看起来好像是一个统一的网络

(https://s1.ax1x.com/2018/08/29/POjI3Q.png)] 当很多**异构网络**通过路由器互连起来时,如果所有的网络都使用相同的IP协议,那么在网络层讨论问题就显得很方便。举个例子:

如果我们只从网络层考虑问题,那么IP数据报就可以想象是在网络层中传送,其传送路径是:H1→R1→R2→R3→R4→R5→H2 ,这样就不必画出许多完整的协议栈,使问题的描述更加简单。

分类的IP地址

在TCP/IP体系中,IP地址是一个最基本的概念,一定要把它弄清楚。

  1. IP地址及其表示方法

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

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

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

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

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

    1. 每一个IP地址都由网络号主机号两部分组成。

      有两个好处:IP地址管理机构在分配IP地址时只分配网络号(第一级),而剩下的主机号(第二级)则由得到该网络号的单位自行分配;路由器仅根据目的主机所连接的网络号来转发分组(而不考虑目的主机号),这样就可以使路由表中的项目数大幅度减少,从而减小了路由表所占的存储空间以及查找路由表的时间。

    2. 实际上IP地址是标志一台主机(或路由器)和一条链路的接口

      当一台主机同时连接到两个网络上时,该主机就必须同时具有两个相应的IP地址,其网络号必须是不同的。这种主机称为多归属主机(multihomed host)。由于一个路由器至少应当连接到两个网络,因此一个路由器至少应当有两个不同的IP地址。

    3. 用转发器或网桥连接起来的若干个局域网仍为一个网络,因为这些局域网都具有同样的网络号。具有不同网络号的局域网必须使用路由器进行互连。

    4. 在IP地址中,所有分配到网络号的网络(不管是范围很小的局域网,还是可能覆盖很大地理范围的广域网)都是平等的。所谓平等,是指互联网同等对待每一个IP地址。

IP地址与硬件地址

在局域网中,由于硬件地址已固化在网卡上的ROM中。因此常常将硬件地址称为物理地址。因为在局域网的MAC帧中的源地址和目的地址都是硬件地址。因此硬件地址又称为MAC地址物理地址、硬件地址和MAC地址常常作为同义词出现。要弄懂主机的IP地址硬件地址的区别。

下图说明了这两种地址的区别。从层次的角度看,物理地址是数据链路层和物理层使用的地址,而IP地址是网络层和以上各层使用的地址,是一种逻辑地址(称IP地址为逻辑地址是因为IP地址是用软件实现的)。

这里要强调指出以下几点:

  1. 在IP层抽象的互联网上只能看到IP数据报。发送过程中IP地址不会变化。举个例子,虽然IP数据报从IP1发往IP2要经过路由器R1和R2的两次转发,但在它的首部中的源地址和目的地址始终分别是IP1和IP2。
  2. 虽然在IP数据报首部有源站IP地址,但路由器只根据目的站的IP地址的网络号进行路由选择
  3. 在局域网的链路层,只能看见MAC帧。IP数据报被封装在MAC帧中。MAC帧在不同网络上传送时,其MAC帧首部中的源地址和目的地址会发生变化。举个例子,MAC帧从IP1发往IP2要经过路由器R1和R2的两次转发,它的首部中的源地址和目的地址会因转发而发生变化,但是, MAC帧的首部的这种变化,在上面的IP层上是看不见的
  4. 尽管互连在一起的网络的硬件地址体系各不相同,但**IP层抽象的互联网却屏蔽了下层这些很复杂的细节。只要我们在网络层上讨论问题,就能够使用统一的、抽象的IP地址研究主机和主机或路由器之间的通信。**上述的这种“屏蔽”概念是一个很有用、很普遍的基本概念。

以上这些概念是计算机网络的精髓所在,对这些重要概念务必仔细思考和掌握。

地址解析协议ARP

在实际应用中,我们经常会遇到这样的问题:己经知道了一个机器(主机或路由器)的IP地址,需要找出其相应的硬件地址。地址解析协议ARP就是用来解决这样的问题的。由于是IP协议使用了ARP协议,因此通常就把ARP协议划归网络层。但ARP协议的用途是为了从网络层使用的IP地址,解析出在数据链路层使用的硬件地址。

网络层使用的是IP地址,但在实际网络的链路上传送数据帧时,最终还是必须使用该网络的硬件地址。但IP地址和下面的网络的硬件地址之间由于格式不同而不存在简单的映射关系。此外,网络设备的动态增减,以及人为更改相关网络设置都需要良好的地址解析。

地址解析协议ARP解决这个问题的方法是在主机ARP高速缓存中存放一个从IP地址到硬件地址的映射表,并且这个映射表还经常动态更新(新增或超时删除)。

上图为地址解析协议ARP的工作过程。需要提到的是,如果主机发现ARP请求的IP地址与自己的IP地址不匹配,它将丢弃ARP请求。而且,虽然ARP请求分组是广播发送的,但ARP响应分组是普通的单播,即从一个源地址发送到一个目的地址。

请注意,ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。那么不同局域网的通讯是如何做到的呢,答案是,连接不同局域网的设备(主机或路由器)有多个IP,只要主机或路由器要和一个网络上的另一个己知IP地址的主机或路由器进行通信,ARP协议就会自动地把这个IP地址解析为链路层所需要的硬件地址。从IP地址到硬件地址的解析是自动进行的,主机的用户对这种地址解析过程是不知道的

既然在网络链路上传送的帧最终是按照硬件地址找到目的主机的,那么为什么我们还要使用抽象的IP地址,而不直接使用硬件地址进行通信?这样似乎可以免除使用ARP。

这个问题必须弄清楚。由于全世界存在着各式各样的网络,它们使用不同的硬件地址。要使这些异构网络能够互相通信就必须进行非常复杂的硬件地址转换工作,因此由用户或用户主机来完成这项工作几乎是不可能的事。但IP编址把这个复杂问题解决了。因此,在虚拟的IP网络上用IP地址进行通信给广大的计算机用户带来很大的方便。

IP数据报的格式

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

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

    1. 版本

      占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。关于以后要使用的IPv6(即版本6的IP协议),我们将在后文讨论。

    2. 首部长度

      长度占4位,可表示的最大十进制数值是15。表明IP数据报的首部长度。最小值0101(5),最大值1111(15),单位是32字(4字节)。

    3. 区分服务

      占8位,用来获得更好的服务。在一般的情况下都不使用这个字段。

    4. 总长度

      总长度字段为16位,表明首部和数据之和的长度,单位为字节。

      在上一篇文章提到,在IP层下面的每一种数据链路层协议都规定了一个数据帧中的数据字段的最大长度,这称为最大传送单元MTU (Maximum Transfer Unit)。当一个IP数据报封装成链路层的帧时,此数据报的总长度(即首部加上数据部分)一定不能超过下面的数据链路层所规定的MTU值。例如,最常用的以太网就规定其MTU值是1500字节。若所传送的数据报长度超过数据链路层的MTU值,就必须把过长的数据报进行分片处理。

      在进行分片时(见后面的“片偏移”字段),数据报首部中的“总长度”字段是指分片后的每一个分片的首部长度与该分片的数据长度的总和。

    5. 标识(identification)

      占16位。IP软件在存储器中维持一个计数器,每产生一个数据报,计数器就加1,并将此值赋给标识字段。但这个“标识”并不是序号,因为IP是无连接服务,数据报不存在按序接收的问题。当数据报由于长度超过网络的MTU而必须分片时,这个标识字段的值就被复制到所有的数据报片的标识字段中。相同的标识字段的值使分片后的各数据报片最后能正确地重装成为原来的数据报。

    6. 标志(flag)

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

    7. 片偏移

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

    8. 生存时间

      占8位,生存时间字段常用的英文缩写是TTL (Time To Live),表明这是数据报在网络中的寿命。由发出数据报的源点设置这个字段。其目的是防止无法交付的数据报无限制地在互联网中兜圈子(例如从路由器R1,转发到R2,再转发到R3,然后又转发到R1),因而白白消耗网络资源。TTL的意义是指明数据报在互联网中至多可经过多少个
      **路由器。**TTL值就减小到零,就会被转发路由器丢弃。

    9. 协议

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

  1. 首部检验和
 占16位.这个字段只检验数据报的首部,但不包括数据部分。这是因为数据报每经过一个路由器,路由器都要重新计算一下首部检验和(一些字段,如生存时间、标志、片偏移等都可能发生变化)。不检验数据部分可减少计算的工作量。为了进一步减小计算检验和的工作量,IP首部的检验和不采用复杂的CRC检验码而采用一种简单的计算
 方法。有兴趣的可自行查阅。
  1. 源地址 占32位。

  2. 目的地址 占32位。

  3. IP数据报首部的可变部分

    IP数据报首部的可变部分就是一个选项字段。选项字段用来支持排错、测量以及安全等措施,内容很丰富。这里就不讨论这些选项的细节了。有兴趣的读者可自行查阅。

IP层转发分组的流程

分组转发是指在互联网络中路由器转发IP分组的物理传输过程与数据报转发机制。根据分组的目的IP地址与源IP地址是否属于同一个子网可分为直接转发和间接转发。

先简单介绍一下路由器,从下图(a)中可以看出,路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳的传输路径,并将该数据有效地传送到目的站点。由此可见,选择最佳路径的策略即路由算法是路由器的关键所在。为了完成这项工作,在路由器中保存着各种传输路径的相关数据——路由表(Routing Table),供路由选择时使用,表中包含的信息决定了数据转发的策略。在实际上的路由器中,像下图中所示的“直接”和“其他”的几个字符并没有出现在路由表中,而是被记为0.0.0.0

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

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

当路由器收到一个待转发的数据报,在从路由表得出下一跳路由器的IP地址后,不是把这个地址填入IP数据报,而是送交数据链路层的网络接口软件。网络接口软件负责把下一跳路由器的IP地址转换成硬件地址(必须使用ARP),并将此硬件地址放在链路层的MAC帧的首部,然后根据这个硬件地址找到下一跳路由器。

那么,能不能在路由表中不使用IP地址而直接使用硬件地址呢?不行。我们一定要弄清楚,使用抽象的IP地址,本来就是为了隐蔽各种底层网络的复杂性而便于分析和研究问题,这样就不可避免地要付出些代价。

下图为分组转发算法示意图:

划分子网和构造超网

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

划分子网

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

    在早期,原来的两级IP地址的设计不够合理。

    第一,IP地址空间的利用率有时很低。有的单位申请到了一个B类地址网络,但所连接的主机数并不多,可是又不愿意申请一个足够使用的C类地址,理由是考虑到今后可能的发展。第二,给每一个物理网络分配一个网络号会使路由表变得太大因而使网络性能变坏。第三,两级IP地址不够灵活。有时情况紧急,一个单位需要在新的地点马上开通一个新的网络。但是在申请到一个新的IP地址之前,新增加的网络是不可能连接到互联网上工作的。

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

    划分子网是通过借用IP地址的若干位主机位来充当子网地址从而将原网络划分为若干子网而实现的。划分子网的思路如下:

    划分子网时,随着子网地址借用主机位数的增多,子网的数目随之增加,而每个子网中的可用主机数逐渐减少。

    以C类网络为例,原有8位主机位,2的8次方即256个主机地址,默认子网掩码255.255.255.0。借用1位主机位,产生2个子网,每个子网有126个主机地址;借用2位主机位,产生4个子网,每个子网有62个主机地址……每个网中,第一个IP地址(即主机部分全部为0的IP)和最后一个IP(即主机部分全部为1的IP)不能分配给主机使用,所以每个子网的可用IP地址数为总IP地址数量减2;根据子网ID借用的主机位数,我们可以计算出划分的子网数、掩码、每个子网主机数:

    划分子网数 子网位数 子网掩码(二进制) 子网掩码(十进制) 每个子网主机数
    1~2 1 11111111.11111111.11111111.10000000 255.255.255.128 126
    3~4 2 11111111.11111111.11111111.11000000 255.255.255.192 62
    33~64 6 11111111.11111111.11111111.11111100 255.255.255.252 2

    如上表所示的C类网络中,若子网占用7位主机位时,主机位只剩一位,无论设为0还是1,都意味着主机位是全0或全1。由于主机位全0表示本网络,全1留作广播地址,这时子网实际没有可用主机地址,所以主机位至少应保留2位

    总之,当没有划分子网时,IP地址是两级结构.划分子网后IP地址变成了三级结构。划分子网只是把IP地址的主机号这部分进行再划分,而不改变IP地址原来的网络号。

  2. 子网掩码

    子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。

    子网掩码的计算:

    如上图所示,IP地址,与掩码进行与运算,得到子网主机地址,但是需要注意的是,上图只是该IP下的一个子网之一,172.16.0.0(10101100 00010000 0000 0000) 是一个B类地址,采用上图的掩码,255.255.240.0(11111111 11111111 11110000 00000000),进行与运算,那么该IP的子网占用主机位四位,也就是说,该网络下,地址以11111111 11111111 000011111111 11111111 1111 开头的,分属于不同的子网,每个子网可以有0000 000000011111 11111111 (1 ~ 4094)台不等数量的主机。

    通过简单的计算,读者不难得到这样的结论:划分子网增加了灵活性,但却减少了能够连接在网络上的主机总数。

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

使用子网时分组的转发

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

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

无分类域IBS路由选择CIDR (Classless Inter-Domain Routing. CIDR的读音是“sider" )。

  1. 网络前缀

    CIDR最主要的特点有两个:

    1. CIDR消除了传统的A类、B类和C类地址以及划分子网的概念。

      CIDR把32位的IP地址划分为前后两个部分。前面部分是“网络前缀”(network-prefix)(或简称为“前缀”),用来指明网络,后面部分则用来指明主机。因此CIDR使IP地址从三级编址 (使用子网掩码)又回到了两级编址,但这己是无分类的两级编址。其记法是{<网络前缀>,<主机号>} 。CIDR还使用“斜线记法”(slash notation),或称为CIDR记法,即在IP地址后面加上斜线“/”,然后写上网络前缀所占的位数。例如128.14.35.7/20

    2. CIDR把网络前缀都相同的连续的IP地址组成一个“CIDR地址块”。

      我们只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的起始地址(即最小地址)和最大地址,以及地址块中的地址数。例如,128.14.35.7/20=10000000 00001110 00100011 00000111,这个地址所在的地址块中的最小地址和最大地址可以很方便地得出:

  由于一个CIDR地址块中有很多地址,所以在路由表中就利用CIDR地址块来查找目的网络。这种地址的聚合常称为**路由聚合(route aggregation)**,它使得路由表中的一个项目可以表示原来传统分类地址的很多个(例如上千个)路由。这减少路由器了之间的路由选择信息的交换,从而提高了整个互联网的性能。

  从上图可看出,每一个CIDR地址块中的地址数一定是2的整数次幕。除最后几行外,CIDR地址块都包含了多个C类地址(是一个C类地址的2^n倍,n是整数),这就是“**构成超网**”这一名词的来源。使用CIDR的一个好处就是可以更加有效地分配IPv4的地址空间,可根据客户的需要分配适当大小的CIDR地址块。
  1. 最长前缀匹配

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

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

  2. 使用二叉线索查找路由表

    使用CIDR后,由于要寻找最长前缀匹配,使路由表的查找过程变得更加复杂了。当跳由表的项目数很大时,需要设法减小路由表的查找时间。为了进行更加有效的查找,通常是把无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找.这里最常用的就是二叉线索(binary trie),它是一种特殊结构的树。IP地址中从左到右的比特值决定了从根节点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。

    下图用一个例子来说明二叉线索的结构。图中给出了5个IP地址。为了简化二叉线索的结构,可以先找出对应于每一个IP地址的唯一前缀(unique prefix)。所谓唯一前缀就是在表中所有的IP地址中,该前缀是唯一的。这样就可以用这些唯一前缀来构造二叉线索。在进行查找时,只要能够和唯一前缀相匹配就行了。

网际控制报文协议ICMP

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

ICMP报文的种类

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

ICMP报文的前4个字节是统一的格式,共有三个字段:类型、代码和检验和。接着的4个字节的内容与ICMP的类型有关。最后面是数据字段,其长度取决于ICMP的类型。下图给出了几种常用的ICMP报文类型。

ICMP的应用举例

ICMP的一个重要应用就是分组网间探测PING (Packet InterNet Groper),用来测试两台主机之间的连通性。PING使用了ICMP回送请求与回送回答报文。PING是应用层直接使用网络层ICMP的一个例子。它没有通过运输层的TCP或UDP。

Windows操作系统的用户可在接入互联网后转入MS DOS(点击“开始”,点击“运行”,再键入“cmd “)。看见屏幕上的提示符后。就键入“ping hostname”(这里的hostname是要测试连通性的主机名或它的IP地址),按回车键后就可看到结果。

另一个非常有用的应用是traceroute(这是UNIX操作系统中名字),它用来跟踪一个分组从源点到终点的路径。在Windows操作系统中这个命令是tracert。其工作原理原理有兴趣的话可自行查阅。

互联网的路由选择协议

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

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

  1. 理想的路由算法的特征

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

    1. 算法必须是正确的和完整的。这里,“正确”的含义是:沿着各路由表所指引的路由,分组一定能够最终到达目的网络和目的主机。
    2. 算法在计算上应简单。路由选择的计算不应使网络通信量增加太多的额外开销。
    3. 算法应能适应通信量和网络拓扑的变化,这就是说,要有自适应性。当网络中的通信量发生变化时,算法能自适应地改变路由以均衡各链路的负载。当某个或某些结点、链路发生故障不能工作,或者修理好了再投入运行时,算法也能及时地改变路由。有时称这种自适应性为“稳健性”(robustness)。
    4. 算法应具有稳定性。在网络通信量和网络拓扑相对稳定的情况下,路由算法应收敛于一个可以接受的解,而不应使得出的路由不停地变化。
    5. 算法应是公平的。路由选择算法应对所有用户(除对少数优先级高的用户)都是平等的。例如,若仅仅使某一对用户的端到端时延为最小,但却不考虑其他的广大用户,这就明显地不符合公平性的要求。
    6. 算法应是最佳的。路由选择算法应当能够找出最好的路由,使得分组平均时延最小而网络的吞吐量最大。虽然我们希望得到“最佳”的算法,但这并不总是最重要的。对于某些网络,网络的可靠性有时要比最小的分组平均时延或最大吞吐量更加重要。因此,所谓“最佳”只能是相对于某一种特定要求下得出的较为合理的选择而已

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

    倘若从路由算法能否随网络的通信量或拓扑自适应地进行调整变化来划分,则只有两大类,即静态路由选择策略动态路由选择策略。静态路由选择也叫做非自适应路由选择,其特点是简单和开销较小,但不能及时适应网络状态的变化.对于很简单的小网络,完全可以采用静态路由选择,用人工配置每一条路由。动态路由选择也叫做自适应路由选择,其特点是能较好地适应网络状态的变化,但实现起来较为复杂,开销也比较大。因此,动态路由选择适用于较复杂的大网络。

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

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

    1. 互联网的规模非常大。如果让所有的路由器知道所有的网络应怎样到达,则这种路由表将非常大,处理起来也太花时间。而所有这些路由器之间交换路由信息所需的带宽就会使互联网的通信链路饱和。
    2. 许多单位不愿意外界了解自己单位网络的布局细节和本部门所采用的路由选择协议(这属于本部门内部的事情),但同时还希望连接到互联网上。

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

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

    1. 内部网关协议IGP (Interior Gateway Protocol)

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

    2. 外部网关协议EGP (External Gateway Protocol)

      若源主机和目的主机处在不同的自治系统中(这两个自治系统可能使用不同的内部网关协议),当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议EGP.目前使用最多的外部网关协议是BGP的版本4 (BGP-4).

    自治系统之间的路由选择也叫做域间路由选择(interdomain routing),而在自治系统内部的路由选择叫做域内路由选择(intradomain routing)

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

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

  • 内部网关协议IGP:具体的协议有多种,如RIPOSPF等。
  • 外部网关协议EGP:目前使用的协议就是BGP

内部网关协议RIP

  1. 工作原理

    RIP (Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议[RFC1058],它的中文名称叫做路由信息协议,但很少被使用。RIP是一种分布式的基于距离向量的路由选择协议,是互联网的标准协议,其最大优点就是简单.

    RIP协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录(因此,这是一组距离,即**“距离向量”)。RIP协议将“距离”**定义如下:

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

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

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

    RIP协议的特点是:

    1. 仅和相邻路由器交换信息。

      如果两个路由器之间的通信不需要经过另一个路由器,那么这两个路由器就是相邻的。RIP协议规定,不相邻的路由器不交换信息.

    2. 路由器交换的信息是当前本路由器所知道的全部信息,即自己现在的路由表。

      也就是说,交换的信息是:“我到本自治系统中所有网络的(最短)距离,以及到每个网络应经过的下一跳路由器’,。

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

里要强调一点:路由器在刚刚开始工作时,它的路由表是空的。然后路由器就得出到直接相连的几个网络的距离(这些距离定义为1)。接着,每一个路由器也只和数目非常有限的相邻路由器交换并更新路由信息。但经过若干次的更新后,所有的路由器最终都会知道到达本自治系统中任何一个网络的最短距离和下一跳路由器的地址。最后在自治系统中所有的结点都得到了正确的路由选择信息。在一般情况下,RIP协议可以收敛,并且过程也较快。“收敛”就是在自治系统中所有的结点都得到正确的路由选择信息的过程。

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

  1. 距离向量算法

    距离向量算法的基础就是Bellman-Ford算法(或Ford-Fulkerson算法)。这种算法的要点是这样的:

    设X是结点A到B的最短路径上的一个结点。若把路径A-B拆成两段路径A-X和X- B,则每一段路径A-X和X-B也都分别是结点A到X和结点X到B的最短路径。

    至于详细的距离向量算法迭代,建议查阅资料,在此就不展开了。

  2. RIP协议的报文格式

    现在较新的RIP版本是1998年11月公布的RIP2 [RFC 2453](己成为互联网标准),新版本协议本身并无多大变化,但性能上有些改进。RIP2可以支持变长子网掩码和无分类域间路由选择CIDR。此外,RIP2还提供简单的鉴别过程支持多播。

    下图是RIP2的报文格式,它和RIP1的首部相同,但后面的路由部分不一样。从下图还可看出,RIP协议使用运输层的用户数据报UDP进行传送(使用UDP的端口520。端口的意义见下一篇计算机网络基础 之五)。

RIP2报文中的路由部分由若干个路由信息组成。每个路由信息需要用20个字节。

地址族标识符(又称为地址类别)字段用来标志所使用的地址协议。如采用IP地址就令这个字段的值为2(原来考虑RIP也可用于其他非TCP/IP协议的情况)。路由标记填入自治系统号ASN (Autonomous System Number),这是考虑使RIP有可能收到本自治系统以外的路由选择信息。再后面指出某个网络地址、该网络的子网掩码下一跳路由器地址以及到此网络的距离。一个RIP报文最多可包括25个路由,因而RIP报文的最大长度是4+20 x 25=504字节。如超过,必须再用一个RIP报文来传送。

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

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

内部网关协议OSPF

这个协议的名字是开放最短路径优先OSPF (Open Shortest Path First)。它是为克服RIP的缺点在1989年开发出来的。OSPF的原理很简单,但实现起来却较复杂。“开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的。“最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF

OSPF最主要的特征就是使用分布式的链路状态协议((link state protocol),而不是像RIP那样的距离向量协议。和RIP协议相比,OSPF的三个要点和RIP的都不一样:

  1. 向本自治系统中所有路由器发送信息。这里使用的方法是洪泛法((flooding),这就是路由器通过所有输出端口向所有相邻的路由器发送信息。而每一个相邻路由器又再将此信息发往其所有的相邻路由器(但不再发送给刚刚发来信息的那个路由器)。这样,最终整个区域中所有的路由器都得到了这个信息的一个副本。我们应注意,RIP协议是仅仅向自己相邻的几个路由器发送信息。
  2. 发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。所谓“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric). OSPF将这个“度量”用来表示费用、距离、时延、带宽,等等。这些都由网络管理人员来决定,因此较为灵活。有时为了方便就称这个度量为“代价”。我们应注意,对于RIP协议,发送的信息是:“到所有网络的距离和下一跳路由器”。
  3. 只有当链路状态发生变化时,路由器才向所有路由器用洪泛法发送此信息。而不像RIP那样,不管网络拓扑有无发生变化,路由器之间都要定期交换路由表的信息。

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

OSPF不用UDP而是直接用IP数据报传送(其IP数据报首部的协议字段值为89)0OSPF构成的数据报很短。这样做可减少路由信息的通信量。数据报很短的另一好处是可以不必将长的数据报分片传送。分片传送的数据报只要丢失一个,就无法组装成原来的数据报,而整个数据报就必须重传。

外部网关协议BGP

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

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

  1. 互联网的规模太大,使得自治系统AS之间路由选择非常困难。

    比较合理的做法是在自治系统之间交换“可达性”信息(即“可到达”或“不可到达”)。例如,告诉相邻路由器:“到达目的网络N可经过自治系统AS“

  2. 自治系统AS之间的路由选择必须考虑有关策略。

    自治系统之间的路由选择协议应当允许使用多种路由选择策略。这些策略包括政治、安全或经济方面的考虑。例如,我国国内的站点在互相传送数据报时不应经过国外兜圈子,特别是,不要经过某些对我国的安全有威胁的国家。这些策略都是由网络管理人员对每一个路由器进行设置的,但这些策略并不是自治系统之间的路由选择协议本身。

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

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

路由器的构成

  1. 路由器的结构

    路由器是一种具有多个输入端口和多个输出端口的专用计算机,其任务是转发分组。下图给出了一种典型的路由器的构成框图。

    从上图可以看出,整个的路由器结构可划分为两大部分:路由选择部分分组转发部分

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

    分组转发部分是本节所要讨论的问题,它由三部分组成:交换结构、一组输入端口和一组输出端口(请注意:这里的端口就是硬件接口)。下面分别讨论每一部分的组成。

    交换结构((switching fabric)又称为交换组织,它的作用就是根据**转发表(forwarding table)**对分组进行处理,将某个输入端口进入的分组从一个合适的输出端口转发出去。交换结构本身就是一种网络,但这种网络完全包含在路由器之中,因此交换结构可看成是“在路由器中的网络”。注意,在讨论路由选择的原理时,往往不去区分转发表和路由表的区别,而可以笼统地都使用路由表这一名词。

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

IPv6

IPv6是Internet Protocol Version 6的缩写,其中Internet Protocol译为“互联网协议”。IPv6是IETF(互联网工程任务组,Internet Engineering Task Force)设计的用于替代现行版本IP协议(IPv4)的下一代IP协议,号称可以为全世界的每一粒沙子编上一个网址。
由于IPv4最大的问题在于网络地址资源有限,严重制约了互联网的应用和发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍 。

基本首部

IPv6仍支持无连接的传送,但将协议数据单元PDU称为分组,而不是IPv4的数据报。为方便起见,本文仍采用数据报这一名词。IPv6所引进的主要变化如下:

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

IPv6数据报由两大部分组成,即基本首部(base header)和后面的有效载荷(payload)。有效载荷也称为净负荷。有效载荷允许有零个或多个扩展首部(extension header),再后面是数据部分(上图)。但请注意,所有的扩展首部并不属于IPv6数据报的首部。

IPv6的地址

一般来讲,一个IPv6数据报的目的地址可以是以下三种基本类型地址之一:

  1. 单播(unicast) 单播就是传统的点对点通信。
  2. **多播(multicast) ** 多播是一点对多点的通信,数据报发送到一组计算机中的每一个。IPv6没有采用广播的术语,而是将广播看作多播的一个特例。
  3. 任播(anycast) 这是IPv6增加的一种类型。任播的终点是一组计算机,但数据报只交付其中的一个,通常是距离最近的一个。

在IPv6中,每个地址占128位,例如,一个用点分十进制记法的128位的地址为:

104.230.140.100.255.255.255.255.0.0.17.128.150.10.255.255

为了使地址再稍简洁些,IPv6使用冒号十六进制记法(colon hexadecimal notation),它把每个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,再使用零压缩,128.10.2.1

从IPv4向IPv6过渡

由于现在整个互联网的规模太大,因此,“规定一个日期,从这一天起所有的路由器一律都改用IPv6",显然是不可行的。这样,向IPv6过渡只能采用逐步演进的办法,同时,还必须使新安装的IPv6系统能够向后兼容。这就是说,IPv6系统必须能够接收和转发IPv4分组,并且能够为IPv4分组洗择路由。

结语

这篇文章能看下来的估计没几个人,我都觉得太长了,是应该拆成几篇文章来发布的。不过我也意识到,我的长篇技术博文的写作技巧应当需要改进。我写着写着就觉得刹不住车,这篇文章深刻的让我意识到自己的不足。

谢谢观看,多多包涵。

posted @ 2018-10-21 22:52  夏洛克卷  阅读(720)  评论(0编辑  收藏  举报