"> "> 计算机网络-网络层 | Yufei Luo's Blog

计算机网络-网络层

简介

网络层服务

分组

网络层的首要责任就是分组。源主机从上层协议接收分组,加入一个头部,头部包含了源和目的地址以及其他网络层协议所需要的信息,并将其传给数据链路层。源端不可改变负载内容,除非负载过大不能传递才需要分段。

目的主机从数据链路层接收网络层分组,解封分组并将负载传递到相应的上层协议。如果分组在源端或在沿途的路由器被分段,那么网络层负责等待,直到所有的分组都到达,它同时负责重组分组并将其传到上层协议。

在传递路径上的路由器不可以解封它们接收到的分组,除非它们接收到的分组需要分段。同时,路由器仅仅可以检查地址,不允许改变源端和目的端地址。

路由

网络层另一个同等重要的责任是路由。一个物理网络是网络和连接它们的路由器的组合。网络层负责将分组从源端路由传递到目的端,这一过程需要经过多个路由器。网络层负责寻找最佳路由,它是通过运行某些路由协议来帮助路由器协调它们关于邻居的信息,并提出当分组到达时使用的一致性表格。

转发

如果路由使用一些策略并运行某些路由协议来为每个路由器创建决策表,那么转发可以定义为当分组到达路由器的一个端口时,路由器所采取的行为。决策表又被称为转发表,路由器通常用它来实施行为。当路由器从它连接的网络接收到另一个分组时,它需要将分组转发到一个或者多个自己所连接的网络上。为了做出决策,路由器使用分组头部的一个信息片段来找到转发表中相应的输出接口号。

拥塞控制

网络层协议也提供了拥塞控制的功能。

分组交换

数据报方法

数据报方法被用于无连接服务的路由分组。当网络层提供无连接服务时,因特网中每一个正在传输的分组都是一个独立的实体,属于同一个报文的多个分组之间没有联系,网络层只负责将分组从源端传递到目的端。

此时,每个分组都是基于其头部的源地址和目的地址信息进行路由的。报文中的分组可能会也可能不会经过同一条通向目的端的路径。

无连接路由转发

虚电路方法

虚电路方法被用于面向连接服务的路由分组。此时,属于同一报文的所有分组之间存在联系。在报文中的所有数据被发送之前,应该建立虚连接从而定义数据报的路径。在连接建立之后,数据报可以沿着相同的路径发送。

在这种类型服务中,分组不仅必须包含源和目的地址,也必须包含流标号,这是一个虚电路标识符,它定义了分组应该经过的路径。每个分组基于分组中的标签被转发。

虚电路分组交换

为了创建面向连接服务,需要经过如下三个阶段:

  • 建立阶段:在这一阶段,路由器为虚电路创建了一个表格项。通过一个路由输出端口的标签与另一个路由输入端口的标签相对应,便在网络中建立了一条虚电路。这是通过请求分组和确认分组这两个辅助分组在发送方和接收方之间交换来完成的。
  • 数据传输阶段:在所有路由器为特定虚电路创建好它们的转发表之后,属于同一个报文的网络层分组可以被一个接着一个地发送。报文中所有的分组都按照相同的标签序列,并且分组有序到达目的端。
  • 拆除阶段:当所有分组全部发送完成之后,发送方发送一个被称为拆除分组的特殊分组,接收方确认分组回复,所有路由器从表格中删除相应的项。

网络层性能

延迟

网络中的延迟可以分为如下四种类型:

  • 发送延迟:一台源主机或路由器不能立即发送分组,需要将分组中的位一个接一个地发送到线上。从发送第一个位到发送最后一个位所经过的时间即为分组的发送延迟。
  • 传播延迟:指的是传输介质中一个位从A到B点所花费的时间。分组交换网络的传播延迟取决于每个网络的传播延迟,而传播延迟取决于介质的传输速度与链路的距离。
  • 处理延迟:指的是路由器或目的主机从它的输入端接收分组、去除头部、执行差错检测程序并将分组传递到输出端口或将分组传递到上层协议所需要的时间。
  • 排队延迟:指分组在输入和输出队列中的等待时间。

因此,总延迟等于发送方到接收方的过程中,这四种延迟时间的总和。

吞吐量

网络中任意一点的吞吐量指的是一秒内通过这个点的位的数量,即这一点的数据发送速率。从源到目的端的路径中,一个分组会穿过多条链路,吞吐量取决于这些链路传输速率的最小值。在实际情况中,可能会遇到链路共享的情况,这会导致实际的传输速率要被多个设备平均。

分组丢失

当路由器处理一个分组的同时接收到另一个分组,那么接收到的分组就要被存储在缓冲区等待轮次。但是由于缓冲区大小有限,如果缓冲区满则会导致新到来的分组需要被丢弃。这会导致因特网网络层的分组被重发,反过来可能造成溢出并导致更多的分组丢失。

网络层拥塞

原因

网络层的拥塞与吞吐量和延迟有关。当网络中的负载大小达到网络容量时,延迟便会急剧增加,因为此时需要考虑到排队延迟。同时,此时也会因为路由器丢弃分组而导致吞吐量急剧下降,而且丢弃分组也不会减少网络中的分组数量(因为源端会重发)。

拥塞控制

开环拥塞控制

开环拥塞控制指的是在发生拥塞之前,使用某种策略来预防拥塞现象的发生。在这些机制中,源端和目的端都可以处理拥塞控制。常用的策略有:

  • 重传策略:一个好的重传策略可以预防拥塞,因此必须优化设计重传策略和重传定时器,使之具有高效率,并用来预防拥塞。
  • 窗口策略:选择性重复窗口要优于回退N帧窗口。在回退N帧窗口时,会重发多个分组,虽然一些分组会安全完整到达接收方,但是这种重复使得拥塞更加严重。而选择性重复窗口只发送那些丢弃或者损坏的特定分组。
  • 确认策略:如果接收方并不对它所接收的每一个分组都进行确认,这会使得发送方放慢发送速度,从而有助于预防拥塞。由于确认也是网络负载的一部分,因此这样也可以减少网络负载。
  • 丢弃策略:一个好的丢弃策略可以预防拥塞,同时不破坏传输完整性。例如音频传输中丢弃不敏感的分组,仍然可以保证声音质量,并且还可以减轻或预防拥塞发生。
  • 许可策略:在允许数据流进入网络之前,与数据流通路相连的交换机首先检查其资源需求,如果网络有拥塞或是可能出现拥塞就拒绝建立虚电路。

闭环拥塞控制

在拥塞发生之后,使用闭环拥塞控制可以缓解拥塞状况。常用的机制有:

  • 背压:一个拥塞点停止接收来自直接上行节点或是一些近邻结点的数据,这样就引起上行结点或是近邻结点的拥塞,然后依次拒绝它们的上行或近邻结点的数据,以此类推。背压技术仅适用于虚电路中。
  • 抑制分组:在这种方法中,警告从已经发生拥塞的路由器直接传到源端,但是该分组经过的那些中间结点没有被警告。在这种方法中,一个单独的分组用于实现这一目的。
  • 隐含信令:虽然拥塞结点与源端之间没有通信,但是源端从其它的有关征兆中察觉到网络在某处发生拥塞。例如源端发送多个分组但是暂时没有收到确认,或者接收确认时的延迟现象。
  • 显式指令:发生拥塞的结点直接发送显式指令来通知源端或者目的端发生了拥塞。在这种方法中,信号包含在携带数据的分组中。

路由器的结构

元件

路由器大致可以分为四个元件:

  • 输入端口:它发挥路由器的物理层和链路层功能。比特位从接收信号中获取,分组从帧中解封、检查差错。如果分组被破坏那么它就会被丢弃。之后,分组准备好被网络层处理。同时,输入端口也有缓冲区队列,用来在分组被发送到交换网络之前存储它们。
  • 发送端口:发送端口与输入端口的功能相同,但是顺序相反。首先输出分组要排队,每个分组被封装进一个帧,并且最终对帧使用物理层功能来创建一个信号发送到线上。
  • 路由处理器:发挥网络层功能。目的地址被用来找到下一条的地址以及输出端口号,同时分组从这个输出端口号发送出去。这个行为有时被称为表格查询。
  • 交换结构:路由器中最复杂的任务就是将分组从输入队列移动到输出队列。这个任务影响输入/输出队列的大小以及分组传递的总延迟。路由器中使用多种不同的交换结构。

第四版网络层协议

概述

第四版网络层可以被看作是一个主要协议以及三个辅助协议。主要协议指的是因特网协议第四版(IPv4),它负责网络层的分组、转发以及传递;因特网控制报文协议第四版(ICMPv4)帮助IPv4处理一些网络层传递中可能发生的错误;因特网组管理协议(IGMP)用于帮助IPv4多播;在网络层地址映射到链路层地址当中,地址解析协议(ARP)用来将网络和数据链路层联合起来。

IPv4

简介

IPv4是一个不可靠且无连接的数据报协议,也就是说它是一个尽力而为的传递服务,因此IPv4分组可能被破坏、丢失、失序到达或延迟,也可能造成网络的拥塞。

IPv4使用数据报的分组交换网的无连接协议。这意味着每个数据报被独立处理,并且每个数据报可以沿着不同路由到达目的端。因此同一个源端发送到同一个目的端的数据报可能会失序到达,某些分组也可能在传输阶段丢失或者被破坏,IPv4依赖于高层协议来处理这些问题。

数据报格式

IP使用的分组被称为数据报,它是可变长分组,由头部和数据组成。头部长度在20~60字节,包含有与路由选择和传输相关的重要信息。IP数据报的格式如下图所示:

IP数据报

其中一些字段的含义如下:

  • 版本号(VER):定义IPv4协议的版本,它的值为4
  • 头部长度(HLEN):以4字节定义数据报头部的总长度
  • 服务类型:目前这一字段被重定义为提供差分服务
  • 总长:定义了一个以字节计算的IP数据报总长度(头部加上数据)
  • 标识(identification)、标记(flag)和分段偏移:当数据报大于底层网络可以携带的大小时,这三个字段和IP数据报的分段有关
  • 生存时间:用于控制数据报访问的最大跳数(即路由器)。当源主机发送数据报,它在这个字段存储一个数字,每个处理数据报的路由器将此数值减1。如果减1之后字段的值变为0,则路由器丢弃该数据报
  • 协议:分组的数据段称为负载,它从另一个协议中携带整个分组。因特网机构给任何一个使用IP服务的协议一个唯一的8位数字,它被插入到协议字段。在源端IP将负载被封装到数据报时,插入相应的协议号;而数据报到达目的端时,这个字段的值帮助定义负载应该被传到哪个协议。
  • 头部校验和:使用这一字段来检查头部是否被破坏。它需要在每个路由器重新计算。
  • 源和目的地址:定义源端和目的端的IP地址
  • 选项:用于进行网络测试和调试
  • 负载:使用IP服务的其他协议的分组

分段

概述

一个数据报可以通过几个不同的网络进行传输,每一个路由器将它所接收的帧拆封成IP数据报,对它进行处理,然后再封装成另一个帧。接收到的帧的格式和长度取决于此帧刚刚经过的物理网络所使用的协议。被发送帧的格式和长度取决于此帧将要经过的物理网络所使用的协议。

每一个数据链路层协议都有自己的帧格式,每种格式的特征之一就是可以封装的负载的最大长度。最大传输单元(Maximum Transfer Unit, MTU)的值随着物理网络协议的不同而不同。

为了使得IP协议独立于物理网络,IP数据报的最大长度被限制为65536字节。对于一些MTU小于这个值的物理网络,就需要将数据报进行分割,使其能够通过这些网络,这一过程就称为分段。如果一个分段的数据报遇到MTU更小的网络,它有可能再次被分段。

一个数据报可能被源主机或路径上的任意路由器分段,但是数据报的重组只能在目的主机上进行,因为每个分段都是一个独立的数据报。被分段的数据报可能沿着不同的路径被传输,而且在传输期间重组分组也会导致效率的降低。

与分段相关的字段

当数据报被分段时,主要是讲IP数据报的负载进行分段。每个段都有自己的头部,其中标记、分段偏移和总长度会被改变,校验和被重新计算,而剩余字段则直接被拷贝。

与分段相关的三个字段分别为标识、标记和分段偏移,它们的含义如下:

  • 标识:用于识别一个从源主机发出的数据报。当数据报离开源主机时,这个标识和源IP地址的组合必须唯一地定义这个数据报。为了保证唯一性,IP协议使用一个计数器来标识数据报。当IP协议发送数据报时,就将该计数器的当前值复制到标识字段中,并将此计数器的值加1。当数据报分段时,标识字段的值就被复制到所有的分组中。因此,目的端可以将所有具有相同标识的分段重组成一个数据报。
  • 标记:共有3位,定义了3个标记。最左侧为保留位(不使用);第二位(D位)称为不分段位,如果该位为1,则机器不能将该数据进行分段,如果无法将此数据报通过任何可用物理网络传递,则丢弃这个分组并向源主机发送一个ICMP差错报文,该位为0则可以根据需要进行分段;第三位(M位)称为多分段位,如果其值为1则表示此数据报不是最后的分段,如果其值为0则表示它是最后一个或者唯一的分段。
  • 分段偏移:表示这个分段在整个数据报中的相对位置。它的值为原始数据报中的数据偏移量除以8。因此,每个分段的第一个字节标号一定可以被8整除。

数据报安全

IP协议容易受下面三个问题的影响:

  • 分组嗅探:入侵者可能劫持一个IP分组并制作一份拷贝。这是一种被动攻击,分组的内容没有被改变。如果使用分组加密则可以使得攻击者的企图无效。
  • 分组修改:攻击者拦截分组,改变其内容并将新的分组发送到接收方。可以使用数据完整性机制来发现这种类型的攻击。
  • IP欺骗:一个攻击者可以伪装成其他人并创建一个IP分组,它携带另一个电脑的源地址。这种类型的攻击可以使用源鉴别机制来预防。

如今的IP分组可以使用一个称为IPSec(IP Security)的协议以免遭到之前提到的攻击。这个协议与IP协议一起使用,在两个实体之间创建一个面向连接的服务。IPSec提供了下面的四种服务:

  • 定义算法和密钥:创建安全信道的两个实体统一使用一些算法和密钥
  • 分组加密:在双方之间交换的分组可以使用约定好的加密算法和密钥来进行加密
  • 数据完整性:保证分组在传输阶段没有被修改
  • 源鉴别:通过鉴别分组的源,从而确认分组不是冒名顶替者伪造的

IPv4地址

简介

一个IPv4地址是32位地址,它唯一地并通用地定义了一个连接在因特网上的主机或者路由器。注意IP地址是连接的地址,而不是主机或者路由器的地址。IPv4地址是唯一的,这表示每一个地址对应于唯一一个连接到因特网上的设备。

地址空间

地址空间是该系统能够使用地址的总个数。IPv4使用32位地址,因此地址空间为\(2^{32}\),这意味着超过40亿个设备可以被连接到因特网上。

标记法

IPv4地址有下面三种常用的标记法:

  • 二进制标记法:IPv4地址用32位表示,为了使得可读性更强,通常在每8位之间插入空格来隔开。
  • 点分十进制标记法:将IPv4地址每8位为一段分成4段,并将每一段用点隔开。每一段的数据写成十进制格式,对应于0到255之间的数字。
  • 十六进制表示:使用8个十六进制数字来表示IP地址,这种方法通常用于网络编程。
地址层次结构

一个32位的IPv4地址被分为两部分,左边n位被称为前缀,它定义了网络;后面32-n位被称为后缀,它定义了设备到因特网的连接。前缀可以是固定长度的也可以是变长的。

分类寻址

地址类型

当因特网刚开始发展时,IPv4地址被设计为定长前缀。为了满足较小或较大的网络,设计了三种长度的前缀,并将整个地址空间分为五类。

前缀 首字节 作用
A 8位 0~127 128个网络可以拥有
B 16位 128~191 214个网络可以拥有
C 24位 192~223 221个网络可以拥有
D 不可用 224~239 多播地址
E 不可用 240~255 保留未来使用
地址耗尽

由于分类寻址中的地址没有被恰当分配,因此因特网迅速面临地址被用光的问题。这主要是因为使用A类或B类地址的网络中,绝大多数的地址都被浪费;而使用C类地址的网络中,每个网络可以使用的地址数量过小。

子网化和超网化

子网化中,A类或B类中的一大块地址被分成几个子网,每个子网有一个比原网络更大的前缀长度。

超网化与子网化的想法相反,是将几个C类地址块组合为一个较大的块。但是这种方法使得分组路由更加困难。

无类寻址

方法

一个解决地址空间被耗尽的短期解决办法是使用无类寻址(长期为IPv6)。在无类寻址中,整个地址空间被分为变长块,地址的前缀定义了块(网络),后缀定义了结点(设备)。但是其中的一个限制是块内的地址数量需要为2的乘方。

前缀长度

由于无类寻址中地址的前缀长度不固定,因此需要将前缀的长度加入到地址中,用斜杠来分隔。这种标记法的被称为无类域间路由,又叫斜杠标记法。

从地址中抽取信息

给出块中的任意一个地址,并假设其前缀长度为n,我们可以很容易地得到这一地址所属块的如下信息:

  • 地址数目:\(N=2^{32-n}\)
  • 块中的首地址:保持地址的最左n位不变,将右侧32-n位全部设为0
  • 块中末地址:保持地址最左n位不变,将右侧32-n位全部设为1

首末地址也可以用地址掩码来计算。地址掩码为32位数字,最左n位全部为1,最右边32-n位全部为0。

首地址也被称为网络地址,它相当于是网络的标识符,路由器用它将分组路由到目的端。

块分配与子网

块分配的最终责任被交给一个全球机构ICANN,但是它不向因特网个人用户分配地址。通常它给一个ISP或一个较大组织分配一大块地址,再由它们将获得的大块地址分成子网。一个子网又可以按照需求继续划分为更多的等级。

在分配块的时候,有两个限制条件:

  1. 请求的地址数量必须是2的N次幂;
  2. 请求块在被分配时,地址空间中要有连续的可用地址,同时块中的首地址必须可以被块中的地址数量整除,以保证首地址前缀后面全部为0。

在分配子网时,为了使其能够路由分组,需要满足如下的条件:

  • 每个子网的地址数量为2的整数次幂;
  • 每个子网的起始地址可以被子网中的地址数目Nsub整除,这样使得每个子网的最右侧32-nsub位为0,同时子网前缀长度也可以用32-log2Nsub直接计算出来。因此在设计子网时,一般按照子网规模从大到小来分配。

特殊地址

在IPv4中,有5种用于特殊目的的地址:

  • 本地主机地址:0.0.0.0/32。当主机需要发送一个IP数据报时,需要自己的地址作为源地址。但是开始时主机不知道自己的地址,便会使用本地主机地址。
  • 有限广播地址:255.255.255.255/32。当路由器或主机需要向网络中的所有设备发送一个数据报时会使用到这个地址。但是网络中的路由器会阻挡目的地址为有限广播地址的分组,使其不能传递出网络。
  • 回送地址:127.0.0.0/8。如果某个分组的目的地址是这个块中的某个地址,那么它不会离开主机,这个块中的地址用于测试机器中的一个软件。
  • 私有地址:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16和169.254.0.0/16。
  • 多播地址:224.0.0.0/4。

动态主机配置协议(DHCP)

简介

一个组织中的地址分配可以使用动态主机配置协议(Dynamic Host Configuration Protocol, DHCP)来完成。它是一个应用层的程序,使用客户-服务器模式,实际上帮助网络层的TCP/IP。

报文格式

下图所示为DHCP的报文格式:

DHCP报文格式

报文中的64字节选项字段有两个目的,它可以携带附加信息或是一些特定的厂商信息。

DHCP运行

DHCP的运行步骤大致如下:

  1. 连接主机创建一个DHCPDISCOVER报文,其中只有事务ID字段,它被设为随机数字,其他字段因为主机没有相应信息而无法被设置。这个报文被封装在UDP用户数据报中,其中源端口为68,目的端口为67。用户部分被封装在IP数据报中,源地址为0.0.0.0(本机),目的地址为255.255.255.255(广播地址),因为主机既不知道自己的地址也不知道服务器的地址。
  2. DHCP服务器以DHCPOFFER报文响应,其中你的IP地址字段定义了连接主机的IP地址,服务器IP地址字段包含服务器的IP地址。这个报文也包含了主机可以拥有这个IP地址的租赁时间。报文被封装到一个用户数据报中,它带有相同的端口号,但是顺序相反。用户数据报依次被封装到服务器地址是源IP地址的数据报中,但是目的地址是广播地址,这样服务器允许其他DHCP服务器接收这个报文,并提供一个更好的IP地址。
  3. 连接主机收到一个或者多个DHCPOFFER报文并从中选出最好的一个。之后连接主机向这个提供最好报文的服务器发送一个DHCPREQUEST报文。其中带有已知数值的字段被设置,报文被封装在用户数据报中,其中端口号是第一个报文的端口号。用户数据被封装在IP数据报中,源地址设为新的客户地址,但是目的地址仍然为广播地址,这样使得服务器知道它们的DHCPOFFER报文没有被接受。
  4. 最终如果提供的IP地址有效,被选定的服务器以DHCPACK报文响应客户端。如果服务器并没有保存这个DHCPOFFER报文,就发送一个DHCPNACK报文,并且客户需要重复上述过程。同时这个报文也被广播,使得其他服务器知道请求被接收或者被拒绝。

在这一过程中,有一些需要注意的细节:

  • DHCP使用两个熟知端口号,这是因为服务器到客户的响应是广播。在多个DHCP客户同时运行时,报文可以通过事务ID进行区分,从而将响应区分开。
  • 服务器并不发送连接网络的客户所需的所有信息。在DHCPACK报文中,服务器定义了文件的路径名,其中客户可以找到完整的信息如DNS服务器地址。客户之后可以使用FTP协议来获取其余所需的信息。
  • 为了提供差错控制,DHCP使用两个策略:首先DHCP要求UDP使用校验和;第二,如果DHCP客户段没有接收到DHCP对请求的回应,那么它使用计时器以及重传策略。为了防止重传请求的拥塞,DHCP要求客户端使用随机数设置计时器。

网络地址转换(NAT)

作用

如果一个ISP给一个小公司或是家庭用户分配了一个小范围地址,但是在需要更大地址范围时,ISP可能无法满足需要。网络地址转换(Network Address Translation, NAT)提供了私有地址和通用地址的映射,同时支持虚拟私有网络。这个技术允许一个站点使用一组私有地址以及一组全局因特网地址(至少一个)来与世界上其余的计算机进行通信。

地址转换

所有通过NAT路由器发出去的分组都将分组中的源地址替换为全局NAT地址;同时所有通过NAT路由器进入的分组也都将目的地址(NAT的路由器的全局地址)替换成适当的私有地址。

将私有地址转为全局地址是容易的,但是对于相反操作,则需要使用NAT路由器的转换表进行地址转换。一个转换表中共有5列,分别为私有地址、私有端口、外部地址、外部端口和传输协议。使用5列地址能够消除连接的二义性,让私有网络主机和外部服务器程序之间建立多对多的关系。

IP分组的转发

基于目的地址的转发

#### 原理

基于目的地址的转发要求主机或者路由器有转发表,它查看转发表来找到分组的下一跳。在转发表中,需要包含四项信息:掩码、网络地址、接口号码以及下一个路由器的IP地址。

转发模块的工作是一行一行地查找表。在每一行中,目的地址的最左边n位(前缀)被保留下来,然后与表中的网络地址的最左边n位进行匹配。如果匹配成功,则找到下一跳的IP地址以及接口;否则继续查找表格。通常最后一行的第一列为默认值,表示所有目的地址都无法匹配。

为了加快搜索速度,也可以使用其它的数据结构来取代列表,但是匹配原则保持不变。

地址聚合

当使用无类寻址时,由于地址空间的分割没有固定规律,因此转发表项的数量有可能会增加,这也会导致搜索表格所消耗时间的增加。因此,路由器中一些前缀相同的地址可能会被聚合成一个地址,这被称为地址聚合。

最长掩码匹配

无类寻址的路由使用最长掩码匹配原则,这个原则表明转发表需要按照最长掩码到最短掩码的顺序来存储。

分层路由与地理路由

为了解决转发表过大的问题,可以在路由表中创建层次结构。在无类路由选择中,只要遵循无类寻址原则,层次的级是没有限制的。

将地址空间分成几大块,然后分别将其分给不同的大洲,通过这样构建的分层路由也被称为地理路由。

基于标签的转发

原理

在面向连接网络中,交换机基于附加在分组上的标签来路由分组。路由通常基于对表格内容的搜索,而基于标签的转发方式中,通过使用索引访问表格即可完成交换。

多协议标记交换

多协议标记交换(Multi-Protocol Label Switching, MPLS)标准使得因特网中的一些传统路由器可以被MPLS路由器替代,它可以作为一台路由器和交换机的结合体来工作。也就是说,它可以基于目的地址来转发分组,也可以基于标签来转发分组。

MPLS位于数据链路层和网络层之间,整个IP分组作为负载被封装到一个MPLS分组中,并且加入一个MPLS头部。一个MPLS头部可能包含许多子头部,它被用来进行多级分层交换。

一个MPLS子头部一共32位长,包含下面4个字段:

  • 标签:长20位,定义了路由器中索引转发表的标签
  • Exp:长3位,被保留用于实验目的
  • S:长1位,定义了堆中子头部的情况,如果这个位为1则意味着这个头部是堆中的最后一个。
  • TTL:长8位,于IP数据报中的TTL字段作用类似,每个被访问的路由器都减少这个字段的值,当其变为0时,则分组被丢弃以防止形成循环。

ICMPv4

作用

IPv4没有差错报告或者差错更正机制,同时IP协议还缺少主机和管理方面的查询机制。因特网控制报文协议(Internet Control Message Protocol version 4, ICMPv4)可以用于弥补上述缺点,它是配合IP协议使用的。

ICMP自身是网络层协议,但是它的报文不是直接传给数据链路层,而是首先被封装到IP数据报中,并将其协议字段值设置为1,表示IP负载是一个ICMP报文。

报文

报文格式

ICMPv4报文分为差错报告报文和查询报文。这两种报文类型的头部格式不同,它们的报文格式如下图所示:

ICMP报文

差错报告报文

差错报告报文用于报告在处理一个IP数据报时可能碰到的一些问题。但是ICMP仅仅报告差错,差错的纠正留给高层协议。差错报文总是被发给源端,ICMP使用源IP地址将差错报文发送给数据报的发送方。

为了简化差错报告,ICMP的报告报文遵循下面的规则:

  • 对于带有多播或者特殊地址(如本机或回送地址)的数据报不会产生差错报文。
  • 对于携带ICMP差错报文的数据报不再产生差错报文。
  • 对于分段的数据报文,如果不是第一个分段不产生差错报文。

所有的差错报文都包含一个数据部分,包含原始数据报的IP头部加上数据报中前8个字节的数据。加入原始数据报头部的目的是为了向原始的源端给出数据报本身的信息。

常用的差错报告报文有:

  • 目的端不可达报文(类型3): 使用不同的代码(0~15)来定义差错报文的类型和数据报不能到达目的端的原因。
  • 源端抑制报文(类型4):通知发送端,网络出现拥塞并且数据报被丢弃。源端需要减慢发送速率。
  • 重定向报文(类型5):将报文重定向到适当的路由器,但是通知源端让其以后改变默认路由器。默认路由器的IP地址在这个报文中被发送。
  • 超时报文(类型11):当IP数据报中生存时间TTL变为0时,数据被它所访问的路由器丢弃并且发送一个代码为0的超时报文给源端。如果组成一个报文的所有分段没有在某个时限内到达主机则发生代码为1的超时报文。
  • 参数问题报文(类型12):当数据报头部出现问题(代码0)或是一些选项丢失不能被解释(代码1)时,发送这一报文。

查询报文

查询报文可以独立使用,而与IP数据报无关,但是它需要作为负载被封装到数据报中。查询报文用来探测或检测互联网中的主机或者路由器是否处于活跃状态,也用来获取两台设备之间IP数据报的单向或往返时间,甚至用于检查两台设备之间的时钟是否同步。查询报文包括查询和回答,它们成对出现。

常用的查询报文有:

  • 回送请求(类型8)以及回送应答(类型0)报文:主机或路由器发送回送请求报文,来检测另一台主机或者路由器是否处于活跃状态。如果活跃,则回应一个回送应答报文。
  • 时间戳请求(类型13)以及时间戳回答(类型14)报文:确定两个设备之间的往返时间或者检查两个设备之间的时钟是否同步。时间戳请求报文发送一个32位数字,表示报文被发送的时间;时间戳回答重发此数字,但是也包括一个新的32位数字以及响应被发送的时间,这个新数字即为请求被接收的时间。

单播路由选择

思想:以图的形式表示因特网

为了找到最好的路由传播路径,互联网可以用图来表示。将每个路由器看作一个结点,一对路由器之间的网络看成一条边,由于每一条网络的传输具有一定的代价,因此互联网以带权图表示。

根据上面的描述,可以得出如下的概念:

  • 最小代价路由:由于源路由器到目的路由器之间可能有多条路由,因此从源路由器到目的路由器的最佳路由就是找到两者之间的最小代价。也就是说,源路由器在所有可能的路由中找到代价最小的那条作为到目的路由器的路由。

  • 最小代价树:最小代价树以源路由器为根,访问了所有其余的结点,并且其中根和其它结点的路径是最短的。

路由选择算法

距离向量路由选择

信息交换

在距离向量路由选择中,每个结点(路由器)要利用自身所拥有的关于相邻结点的初步信息创建最小代价树。这些不完全的树在相邻结点之间不断交换,使得树越来越完整。

Bellman-Ford方程

Bellman-Ford方程用于计算源结点x到目的结点y的最小代价,而这条路径穿过了中间结点(a, b, c,……)。我们将\(D_{ij}\)记作最短距离,\(c_{ij}\)记作结点\(i,j\)之间的代价,则有:\(D_{xy}=\mathop{min} \limits_{i=a,b,c,\cdots}(c_{xi}+D_{iy})\)

距离向量

距离向量路由将最小代价路由树改写为一维数组。一个距离向量的名称定义了根结点,索引定义了目的结点,而每个索引的值则对应了根结点到目的结点的最小代价。因此,一个距离向量不包含目的结点的路径。

当互联网中的结点启动时,它创建一个基本的距离向量,包含了可从相邻结点获得的最少信息,而未知距离的结点则被标记为无穷大。在此之后,这一结点从相邻结点接收到它们的距离向量副本,然后使用Bellman-Ford方程来更新距离向量。

上述的过程可以用下图来表示:

距离向量

距离向量路由的一个问题是,任何代价的减少传播的快,而代价的增加传播的慢。为了使路由协议可以正常工作,如果链路损坏,其余每个路由器应该立即意识到这件事情。但是在距离向量路由选择中这需要花费一些时间。这个问题称为计数到无穷问题,通常需要好几个更新才能使得损坏链路被所有服务器记录为无穷。

链路状态路由选择

定义

在链路状态路由选择中,使用术语链路状态来定义链路(即图中的一条边)的特征,链路代表了互联网中的网络。在这种算法中,与边相关的代价定义了链路的状态,代价低的链路比代价高的链路更好;如果链路代价无限大则对应于链路不存在或者已经被损坏。

链路状态数据库

所有链路状态的集合称为链路状态数据库(Link-State Database, LSDB),整个互联网只有一个LSDB,它可以用一个二维数组来表示,其中每个单元格的值对应于相应链路的代价。每个结点通过使用它可以创建最小代价树。

创建LSDB的过程可以通过泛洪的过程来完成。每个结点可以给其相邻结点发送问候报文,来收集每个相邻结点的结点标识以及链路代价。这两个信息的组合成为LS分组。

当结点从一个接口接收到LSP时,它将其与已经拥有的副本进行比较。如果新到达的LSP比拥有的副本旧,则直接丢掉;如果接收到的版本更新,则丢弃旧LSP并保存接收到的新版本。在此之后,结点向每个端口发送一份副本(不包含分组到达的端口,这样保证泛洪可以停止)。

这一过程可以用下图表示:

LSDB的创建

最小代价树的形成

为了创建最小代价树,使用共享LSDB的每个结点可以运行Dijkstra算法来生成(算法的详细过程参考CLRS)。

路径向量路由选择

目标

在路径向量路由选择算法中,源端可以控制路径。这种算法主要是为ISP之间的路由分组而设计。

生成树

在路径向量路由选择中,从源端到目的端的路径是由最佳生成树决定的。然而最佳生成树不是最小代价树,它是根据源端使用的策略生成出来的。

路径向量路由选择与距离向量路由选择类似,是一种异步、分布式路由选择算法。因此,生成树(路径向量)的生成方法也类似,是每个结点异步地逐步更新创建起来的。

路径向量算法

在创建初始路径向量之后,每个结点也将其发送给相邻结点。此时,每个结点都使用与Bellman-Ford类似的方程式来更新路径向量,但是结点使用自己的策略而不是寻找最小代价。

单播路由选择协议

路由选择信息协议

概述

路由选择信息协议(Routing Information Protocol, RIP)是一个在自治系统内部使用的域内路由选择协议,它基于距离向量路由选择算法实现。

跳数

在RIP协议中,代价的实现被简化为跳数,它表示分组从源路由器到最终目的主机所需要穿过的网络(子网)的数量。路径的最大代价是15,16则意味着无连接,因此RIP只能用于自治系统(Autonomous System, AS)。

转发表

RIP中的转发表是一个三列表格,第一列是目的网络的地址,第二列是分组应该被转发到的下一跳路由器的地址,第三列是到达目的网络的跳数。

通过在转发表中加入下一跳路由器的地址,可以利用这一信息来还原出最小代价树。

RIP实现

应用层程序

RIP是使用UDP服务和熟知端口号520实现的一种进程。在BSD中,RIP是一个称为routed的守护进程。也就是说,RIP运行在应用层上,但是为网络中的IP创建转发表。

RIP报文

在一个RIP报文中,表项部分可以按需重复,每个表项携带着与转发表里面某一行相关的信息,这个转发表位于发送报文的路由器中。报文格式如下:

RIP报文格式

RIP的报文分为请求和响应两种。请求报文被创建它的路由器发送,用于询问特定表项或者全部表项;而响应报文可以是请求型的或者非请求型的。请求型报文用于回答请求报文,它包含相应请求报文中指定目的端的信息,而非请求型的响应报文被周期性地发送,或是当转发表有变化时发送。

RIP算法

RIP实现的算法与距离向量路由选择算法相同。为了使路由器可以更新其转发表,需要做一些修改:

  • 路由器需要在响应报文中发送转发表的全部内容,而不仅仅是距离向量。
  • 接收端在每个代价上加入一跳,并且将下一跳路由器字段改为发送路由器的地址。
  • 根据目的路由存储新的转发表。
RIP计时器

RIP中一共用到了三个计时器来支持其运行:

  • 周期计时器:控制常规更新报文的通告行为,每个路由器都有一个。
  • 超时计时器:控制路由的有效性。当路由器接收到路由更新信息时,设置这条路由的超时计时器。每当这条路由新的更新到达时,计时器被重置;如果在超时计数器倒计时为0时没有收到更新,则认为路由超时,将路由的跳数设置为16。每个路由都有自己的超时计数器。
  • 垃圾收集计时器:用于从转发表中清除路由。当关于路由的信息无效时,路由器不会立即将路由从表中清除。它继续将路由代价通告为16。同时,那条路由的垃圾收集计时器被设置,当计时到0时便将路由从表中清除。这个计时器允许邻居在清除路由之前,注意到路由的无效性。

RIP性能

  • 更新报文:更新报文仅仅发送给邻居,通常不会造成过大的网络通信量。
  • 转发表的收敛:由于RIP只允许域中最多15跳,通常收敛中不会存在问题。
  • 健壮性:由于每个路由器将它对整个域的了解发送给它的邻居,因此当路由失效或出错时,这个问题可以被传播给所有的路由器。

开放最短路径优先

概述

开放最短路径优先(Open Shortest Path First, OSPF)是一个和RIP类似的域内路由选择协议,但是它是基于链路状态的路由选择。OSPF是一个开放协议。

度量

在OSPF协议中,每个链路(网络)可以被分配一个基于流量、往返时间和可靠性等方面的权值;同样也可以使用跳数作为代价。对于OSPF中的代价,不同服务类型可以拥有不同的权值。

转发表

OSPF与RIP协议中,转发表唯一的不同就在于代价值。如果OSPF中使用跳数,那么它们的转发表将会完全相同。

区域

与RIP相比,OSPF用来处理小型或大型自治系统中的路由选择,而RIP通常在小型的自治系统中使用。

由于在大型系统中创建全局链路状态数据库将会产生巨大的通信量,因此OSPF会将一个大型自治系统划分为多个不同的区域,每个区域在泛洪LSP中相当于小型独立域。为了使得区域中的每个路由器知道本区域和其他区域的链路状态信息,某一个区域会被指派为主干区域,它负责将其他区域连接到一起。主干区域的路由器负责将每个区域收集到的信息传递到其他区域。

链路状态通告

OSPF协议中,要求路由器向所有邻居通告其链路状态,以此形成LSDB。一共有5种不同的链路状态通告类型:

  • 路由器链路:将路由器以结点的形式进行通告。除了给出所声明路由器的地址外,这种类型的通告还可以定义如下的多种链路类型:
    • 过渡链路:声明通向过渡网络的链路,这个网络通过一个或者多个路由器连接到网络的剩余部分。这种通告类型应该定义过渡网络地址和链路代价。
    • 残桩链路:通告残桩网络的链路,这种网络不完全算是贯穿型网络。这种通告类型定义网络地址和代价。
    • 点对点链路:定义点对点连线末端路由器的地址以及到达它所需要花费的代价。
  • 网络链路:将网络作为一个结点进行通告。由于网络无法通告自身,因此其中一个路由器被指派为指定路由器,并且由它进行通告。这一类LSP声明了所有路由器的IP地址。由于路由器发送路由器链路已经包含代价,因此这种通告不包含代价。
  • 通向网络的汇总链路:通过区域边界路由器完成,它通告了由主干收集的通往一个区域的汇总链路,或者通告区域收集的通往主干的链路汇总。将区域连接到一起时就需要这种信息交换。
  • 通向自治系统的汇总链路:通过一个AS路由器完成,它通告从其他的AS到当前AS主干区域的汇总链路,这些信息可以散播到区域中。
  • 外部链路:通过AS路由器完成。它向主干区域声明AS之外存在一个单独网络,这个信息被散播到多个区域中。

OSPF实现

概述

OSPF是以网络层程序的形式实现,它使用IP服务来进行传播。IP数据报携带来自OSPF的报文,并且将协议字段的值设置为89。

OSPF报文

OSPF共包含了5种不同类型的报文,包括:

  • 问候报文:被路由器用来向邻居介绍自己,并声明它知道的所有邻居。
  • 数据库描述报文:响应问候报文,允许一个新加入的路由器获取全部的LSDB。
  • 链路状态请求报文:被需要特定LS的路由器发送。
  • 链路状态更新报文:是用于创建LSDB的主要OSPF报文。
  • 链路状态确认报文:用来保证OSPF中的可靠性,每个接收链路状态更新报文的路由器都需要确认它。

这些报文的格式如下图所示:

OSFP协议报文
鉴定

OSPF公共头部为报文发送端提供鉴定。这可以防止恶意实体向路由器发送OSPF报文并导致路由器成为某个路由选择系统的一部分,而实际上这个路由器根本不属于这个路由选择系统。

OSPF算法

OSPF使用链路状态路由选择算法,但是需要在算法中加入一些改变和鉴定工作:在每个路由器创建最短路径树之后,算法需要用它来创建响应的路由选择算法;同时这个算法需要增强,使之能够发送和接收5种类型的报文。

性能
  • 更新报文:OSPF中的链路状态报文较复杂,它们也被泛洪到整个区域。如果区域很大,这些报文可能造成很大通信量并占用很大带宽。
  • 转发表的收敛:当LSP泛洪完成,每个路由器都可以创建它自己的最短路径树和转发表,收敛较快。但是由于每个路由器都要运行Dijkstra算法,这需要花费一些时间。
  • 健壮性:OSPF协议比RIP协议更加健壮。因为接收到完整的LSDB之后,每个路由器是独立的,不依赖与区域中的其他路由器。因此一个路由器的差错或失效不会严重影响其它路由器。

边界网关协议第四版

介绍

边界网关协议(Border Gateway Protocol, BGP)是当今因特网中唯一的一个域间路由选择协议。它居于之前描述的路径向量算法。

为了使得每个路由器都能将分组路由到互联网的任意网络上,每个边界路由器(位于每个AS的一条边上,这条边连接到另一个AS的服务器上)上需要安装外部BGP(external BGP, eBGP)。同时所有路由器上需要安装内部BGP(internal BGP, iBGP)。

BGP协议是一种点对点协议,当软件运行在两个路由器上时,它们使用熟知端口号179来创建一个TCP连接。运行BGP进程的两个路由器被称为BGP对等结点或BGP代言结点。

外部BGP

外部BGP变体允许两个建立物理连接的边界路由器形成一对eBGP代言结点并交换报文,这两个路由器位于不同的AS中。但是要实现信息交换,则需要在物理连接的基础上创建逻辑TCP连接以实现信息交换,在BGP中逻辑连接被称为会话。

内部BGP

iBGP协议也是在熟知端口179上使用TCP连接,但是它在自治系统中可能成对的路由器之间创建一个会话。

域内路由选择信息插入

BGP的职责是帮助AS内部的路由器增加路由选择信息。在路径表被收集并组织完成之后,它会被插入到用于路由分组的域内转发表(RIP或者OSPF)中。

地址聚合

由于BGP协议所获得的域间转发表在全局因特网的情况下会变得很大,因此BGP协议使用前缀作为目的标识符并且允许聚合这些前缀。

路径属性

BGP允许目的端与多达7个路径属性相关。这些路径属性分为熟知和可选,熟知属性必须被所有路由器识别,而可选属性不要求这样。

一个路径属性的格式如下:

BGP路径属性格式

每个属性的第一字节定义了四个属性标记,下一个字节定义了ICANN分配的属性类型,属性值长度定义了属性值字段的长度。

下面是每个属性的简要描述:

  • ORIGIN(类型1):熟知的强制属性,它定义了路由选择信息的源端。它可以定义为以下三种值:1代表路径信息从域内协议获得,2代表信息从BGP获得,3代表来自未知源端
  • AS-PATH(类型2):熟知的强制属性,它定义了自治系统清单,穿过这些自治系统可以到达目的端。这一属性可以帮助防止循环,也可以在路由选择中使用。
  • NEXT-HOP(类型3):熟知的强制属性,它定义了数据分组应该被转发到的下一跳路由器。
  • MULT-EXIT-DISC(类型4):多出口鉴别器是一个可选的不可迁移属性,它鉴别通向一个目的端的多个出口路径。这个属性的数值通常被相应域内协议的度量标准定义(一个四字节无符号整型的属性数值)。
  • LOCAL-PREF(类型5):本地偏好是熟知的可选属性,它从此由管理员设定,基于组织机构的策略。
  • ATOMIC-AGGREGATE(类型6):熟知的可选属性,它不以聚合方式定义目的端前缀,只定义一个目的端网络。这个属性没有数值字段。
  • AGGREGATOR(类型7):可选的可迁移属性,它强调目的端的前缀是可以聚合的。

路由选择

BGP的路由选择过程需要考虑到一些附加其上的属性,因此过程将会更加复杂一些。通常实现所使用的流程图如下:

BGP路由选择过程

报文

BGP有4类报文,用于AS间和AS内部BGP代言结点的通信。所有BGP分组分享相同的公共头部。报文格式如下图所示:

BGP报文格式

四种报文的作用如下:

  • 打开报文:为了创建邻居关系,运行BGP的路由器打开一个与邻居的TCP连接并发送一个打开报文。
  • 更新报文:它是BGP协议的核心。它被路由器用来取出之前通知的目的端,以便声明通向新的目的端的路由。BGP可以取出几个之前声明的目的端,但是一个更新报文中只能声明一个新的目的端。
  • 保活报文:处于运行状态的BGP对等结点周期性地交换保活报文,从而彼此告知它们处于活跃状态。
  • 通知:当检查到错误情况或者路由器要关闭会话时,路由器发送通知报文。

性能

BGP的代言结点交换很多报文来创建转发表,但是BGP没有循环和计数到无穷。RIP中关于传播失效和出错的缺点在BGP中仍然存在。

多播路由选择

介绍

单播

在单播中,只有一个源端和一个目的端网络。源端和目的端网络的关系是一对一的。数据报路径中的每个路由器试图将分组转发到唯一的端口上。

多播

在多播中,存在一个源端和一组目的端,其关系是一对多的。在这类通信中,源地址是一个单播地址,而目的地址是一组地址,其中存在至少一个有兴趣接收多播数据报的组成员。在多播中,多播路由器可能需要通过它的多个端口将相同数据报的副本发送出去。

注意,需要区分多播和多个单播这两个概念。多播从源地址开始时时单个分组,这个分组被路由器复制,每个分组中的目的地址对于所有的副本都是相同的;而在多个单播中,从源端发出多个分组。多播比多个单播效率更高,要求的带宽更小,同时由于源端只生成一个分组因此没有延迟。

多播有如下这些应用示例:

  • 访问分布式数据库
  • 信息发布
  • 电话会议
  • 远程学习

广播

广播意味着一对多的通信,一个主机向互联网中的所有主机发送分组。由于这种方式可能造成很大的通信量并占用大量带宽,因特网层次上没有提供广播功能。但是因特网中完成了部分广播,例如一些P2P应用或者受控广播。

多播地址

一个多播地址定义了一组接收者,它相当于是多播组的一个标识符。因此,如果一台主机是n个多播组的成员,那么它实际上有n+1个地址,包括一个单播地址以及n个多播地址。

在IPv4中,多播地址属于一大块地址,它们按此目的而特别设计。在分类寻址中,所有D类地址为多播地址;在无类寻址中,块224.0.0.0/4(即224.0.0.0到239.255.255.255)为多播地址块。

多播地址块中的地址数目很多,因此一个块被划分为多个子块,每个子块用于特定的多播应用。下面是一些公共子块:

  • 本地网络控制块:即子块224.0.0.0/24,它被分配给用于网络内部的多播路由选择协议,因此这个范围内目的地址的分组不能被路由器转发。其中地址224.0.0.0被保留,224.0.0.1用于将数据报发送到网络内的所有主机和路由器,224.0.0.2用于将数据报发送到网络内的所有路由器,剩余地址被分配给某些多播协议用于通信。
  • 因特网控制块:即子块224.0.1.0/24,它被分配给用于整个互联网的多播路由选择协议。带有这个范围内目的地址的分组可以被路由器转发。
  • 特定源多播块:即子块232.0.0.0/8,它被用于特定源多播协议。
  • 团块:即子块233.0.0.0/8,它定义了可以用于自治系统内部的地址范围。
  • 管理范围块:即子块239.0.0.0/8,这个块的地址用于因特网的特定区域。如果分组的目的地址属于这个范围,那么它不应该离开这个区域。

因特网组管理协议

因特网组管理协议(Internet Group Management Protocol, IGMP)被用于收集组成员信息,从而创建多播路由的转发表。IGMP是定义在网络层的协议,它是一个辅助协议,属于IP的一部分。IGMP的报文需要封装在IP数据报中进行传播,分为查询和报告报文。

查询报文周期性地由路由器发送给所有连接其上的主机,让哥主机报告它们对于组内成员身份的兴趣。查询报文有三种形式:

  • 普通查询报文:查询任意组中成员身份。它被封装在数据报中,目的端地址为244.0.0.1(所有主机和路由器)。所有连接到同一个网络的路由器都接收到这个报文,并且应该抑制重发。
  • 特定组查询报文:从路由器发送,查询与特定组相关的成员。当路由器没有接收到特定组的响应,并且向确定网络中哪个组没有活跃成员时,就发送这个报文。报文被封装在数据报中,目的地址为相应的多播地址。所有主机都接收这个报文,但是不感兴趣的可以丢弃它。
  • 特定源和目的查询报文:当报文来自一个或多个特定源端时,这个报文可以寻找与特定组相关的成员。当路由器没有收到与一个或多个特定主机相关的特定组时,这个报文被再次发送。报文被封装在数据报中,目的地址为相应的多播地址。所有主机都接收这个报文,但是不感兴趣的可以丢弃它。

报告报文是查询报文的响应。报文包含记录列表,其中每条记录给出相应组的标识符(多播地址)以及所有主机感兴趣的源地址。报文被封装在数据报中,多播地址为224.0.0.22。

多播转发

与单播转发的不同

在多播通信中,分组的目的端定义了一个组,因此为了到达所有的目的端,路由器可能必须从一个以上的端口发出分组。同时,多播通信的转发决定取决于分组的目的地址和源地址,这样是为了避免分组重复发送。

基于源树方法

在基于源树方法中,每个路由器需要为每个源端与组的组合创建一个单独的树。也就是说,如果互联网中有m个组和n个源端,那么路由器需要创建m*n个路由选择树。在每颗树中,相应的源端是根结点,组的成员是叶结点。

组共享树方法

在组共享树方法中,我们将一个路由器指派为每个组的伪源端。被指派的这个路由器称为核心路由器或者会合点路由器,它代表了这个组。任何源端如果要将分组发送到那个组,那么它直接将分组发送给这个核心路由器,核心路由器负责多播。

通过这种方法,从源端到所有组成员的多播传递分成了两部分,第一部分是从源端到核心路由器的单播传递,第二部分是从核心路由器到所有组成员的传递。这一使得路由选择树的数目大大减少,但是需要使用算法从所有路由器中选择组的核心路由器。

域内路由选择协议

多播距离向量

距离向量多播选择协议(Distance Vector Multicast Routing Protocol, DVMRP)是用于单播路由选择的路由选择信息协议(RIP)的拓展,它使用基于源树的方法来多播。它按照以下三步创建一个基于源端的多播树:

  1. 使用逆路径转发算法来创建源端和自身之间的一部分最优基于源端的树。这种算法迫使路由器从一个特定接口转发多播分组,这个接口穿过最短路径从源端到达路由器。
  2. 使用逆路径广播算法创建广播(生成)树,根结点是路由器自身,叶结点是互联网中的所有网络。这一算法通过对树进行剪枝,从而防止每个网络接收一个以上的分组副本。
  3. 使用逆路径多播算法,对树进行剪枝,从而得到多播树。这种方法是对路由器中无法到达组中活跃成员的路径进行修剪,可以通过自底向上的方式来完成。

多播链路状态

多播开放最短路径优先(Multicast Open Shortest Path First, MOSPF)是开放最短路径优先(OSPF)协议的扩展。它也使用基于源树的方法进行多播操作。路由器对于多播分组的转发过程如下:

  1. 路由器使用Dijkstra算法创建一个最短路径树,源端为根节点,且互联网的目的端是叶结点。对于每个源端,需要创建一个不同的树。
  2. 路由器使用与DVMRP中描述的类似策略来修剪广播树,使其成为一棵多播树。
  3. 路由器只从那些相当于多播树分支的端口中转发接收到的分组。

协议独立多播

协议独立多播(Protocol Independent Multicast, PIM)需要使用单播路由选择协议的转发表来找到去往目的端的下一跳路由器。它可以按两种模式工作:密集模式和稀疏模式,密集指的是互联网中组内活跃成员的数量较大,稀疏指的是路由器拥有组内成员的可能性低。当其在密集模式下工作时,称为PIM-DM,而在稀疏模式下工作时称为PIM-SM。

域间路由选择协议

当组的成员分布在不同域时,需要使用域间多播路由选择协议。

一个常见的协议为多播边界网关协议(Multicast Border Gateway Protocol, MBGP),它是BGP协议的扩展。MBGP提供了AS间的两条路径,一条用来单播,一条用来多播。它属于组共享多播路由选择协议,需要在每个AS中选定一个路由器作为会合点。MBGP协议的问题是它很难向会合点通知另一个AS中组的源端,因此引入多播源发现协议(Multicast Source Discovery Protocol, MSDP)来解决这个问题。

另一个替代的协议是边界网关多播协议(Border Gateway Multicast Protocol, BGMP),它允许在一个AS中建立带有一个根的组共享树。也就是说,对于每个组,只有一个组共享树,叶结点在其他的AS中,但是根节点位于其中一个AS中。

下一代IP

简介

因特网协议第六版(Internet Protocol version 6, IPv6)在增加了IPv4地址空间的同时,重新设计了IP分组的格式并修改了一些辅助协议。下面是IPv6协议的主要变化:

  • 更大的地址空间:IPv6地址为128位长
  • 更好的头部格式:IPv6使用了新的头部格式,其选项与基本头部分开,如果需要可将选项插入到基本头部和上层数据之间。这样简化和加速了路由选择过程。
  • 新的选项:IPv6提供了新的选项来实现附加的功能。
  • 允许扩展:如果新的技术或应用需要的话,IPv6允许协议进行扩展。
  • 支持资源分配:IPv6取消了服务类型字段,但是增加了流标号使得源端可以请求对分组进行特殊的处理。
  • 支持更多安全性:提供了加密和鉴别选项。

分组格式

IPv6报文

IPv6的一个分组由基本头部和紧跟其后的有效载荷组成。头部字段的包括:

  • 版本:定义了IP版本号,对于IPv6的值为6。
  • 流量类:用来区分不同传递要求的不同有效载荷,代替了IPv4中的服务类型字段。
  • 流标号:一个20位的字段,用来对特殊的数据流提供专门处理。
  • 有效载荷长度:一个16位字段,定义了不包括基本头部的IP数据报的总长度。
  • 下一个头部:一个8位字段,定义了第一个扩展头部的类型或是数据报中跟随在基本头部之后的头部。
  • 跳数限制:与IPv4中的TTL字段作用相同。
  • 源地址和目的地址:用于识别数据报的源端和目的端。
  • 有效载荷:开头是0个或者多个扩展头部的组合,接着是来自于其他协议的数据。每个扩展头部有两个强制字段:下一个头部和长度。

IPv6寻址

地址格式

IPv6地址一般用冒号16进制来表示,整个地址被分为8个部分,每个部分由4个十六进制数字组成,每4个数字用一个冒号隔开。由于IPv6地址很长,为了简化表示,在IPv6地址中,一个部分开头的0可以省略不写;如果有连续的部分仅仅包含0,则可以使用0压缩(一个地址只能使用一次),将所有的0移除,用两个冒号代替。

地址类型

IPv6的目的地址分为三类:单播、任播和多播。它没有定义广播,IPv6将其看作是多播的特殊情况。单播和多播与IPv4相同,任播指的是一组计算机共享一个地址,带有任播地址的分组只被传递到组中最容易到达的那个成员。

地址空间分配

IPv6的地址空间也被分成大小不同的块,其中绝大多数块是未指派的。已分配的块如下表所示:

块前缀 块任务
0000 0000 特殊地址
001 全局单播
1111 110 唯一本地单播
1111 1110 10 链路本地地址
1111 1111 多播地址

特殊地址

  • 未指明地址:0000::/128,在启动时使用,此时主机不知道自己的地址并想发送查询找出其地址。
  • 环回地址:0000::1/128,IPv6中仅仅有这一个环回地址。
  • 兼容地址:0000::/96,96个0后面紧跟32位IP地址,用于IPv4向IPv6的过渡。
  • 映射地址:0000::FFFF/96,已经过渡到IPv6的计算机发送报文给使用IPv4的计算机时使用。

IPv4到IPv6的过渡

  • 双协议栈:网络层同时运行IPv4和IPv6,直到整个因特网使用IPv6。当把分组发送到目的端时,主机需要向DNS查询使用的是哪个版本。
  • 隧道技术:当两台使用IPv6的计算机要进行通信,但其分组要经过使用IPv4的区域时,需要使用这种技术。进入这种区域时,IPv6分组要封装成IPv4分组,离开这个区域时再去掉封装。
  • 头部转换:如果发送方使用IPv6,接收方使用IPv4时,需要使用这种技术。此时头部格式需要转换成IPv4的头部。

ICMPv6

ICMPv6与ICMPv4具有相同的策略和目的,但是ICMPv6中,ICMP、ARP和IGMP三个协议被整合到一起,并且加入了一些新的报文使其更加实用。

ICMPv6的报文分为下图所示的四种。相比于ICMPv4,差错报告报文和信息报文中的一些报文被取消,邻居发现报文完成了ARP的工作,而组成员关系报文完成了IGMP的工作。

ICMPv6报文

参考

  1. 计算机网络:自顶向下方法