资源预留协议(Resource Reservation Protocol),简称RSVP,是IETF为集成服务提供的信令协议。RSVP的资源预留过程可以分为以下5步:

 

1. 数据发送方给接收放发送RSVP PATH控制消息,默认以30秒的频率周期发送,这些消息描述了它正在发送或打算发送的数据;

2. 各RSVP路由器解析PATH消息,保存上一跳的IP地址,并将自己的IP地址作为上一跳地址,然后沿数据流向发送更新后的消息;

3. 接收方收到PATH消息后,使用RSVP RESV消息向上一跳路由器发出RSVP资源预留请求,默认以30秒的频率周期发送。RSVP RESV消息从接收方到发送方所经过的路径与RSVP PATH消息到来的路径完全相同;

4. RSVP路由器确定他们是否可以满足这些RESV请求。如果不能,就拒绝预留;如果可以,就预留资源,并向上一跳路由器发送RESV请求。

5. 发送方接收到下一跳路由器的预留请求,指出预留准备就绪,整个预留过程就到此结束。

示意图如下:

RSVP-成长便签

预留类型

RSVP的预留类型主要有两类:独占和共享。

独占式预留适合于多个数据源同时发送的应用。比如再视频应用中,每个发送方都发送各自的数据流,再通往接收方的路径上,路由器需要对这些数据流进行单独的许可控制和队列管理。因此,在路径的每一条链路上,都需要针对每个发送方预留资源。单播应用程序是独占式预留最简单的例子,其只有一个发送方和一个接收方。独占式的预留使用固定过滤器(FF,Fixed Filter)来实现资源预留。

共享式预留适合那些多个数据源不太可能同时发送的应用。比如VoIP的应用程序,在这种情况下,任意时候都只有少数人同时讲话,所以在某些时间内只有有限的发送方。因此这种流不需要为每个发送方单独预留,只需要统一预留。共享是预留何以使用共享显示(SE,Shared Explicit)或通配符方式(WF,Wildcard Explicit)来实现。共享显示预留可以用来给匹配多个或者某个发送发,而通配符方式用来匹配所有发送方。

 

服务类型

RSVP提供了两种服务类型:控制负载和保证速率。这些服务的提供都是通过RSVP RESV消息规定的。

控制负载服务主要针对过载敏感的应用程序,比如FTP等。

保证速率服务主要针对对速率以及延迟要求严格的应用程序,比如VoIP应用程序的流量。

 

RSVP配置

我们来配置一个RSVP的例子,拓扑如下:

RSVP-成长便签

  我们用R1的环回口来模拟发送源,用R3的环回口来模拟接收端。因为我们无法在路由器上模拟应用程序来发送PATH消息,所以我们只能在路由器上帮助环回口发送PATH消息,也就是在两端的最后一跳路由器上配置发送和预留。首先我们要在每一跳路由器的途径接口上开启RSVP,用到的命令是ip rsvp bandwidth,这个命令后面还可以跟RSVP的总可用带宽以及最大可用流带宽。配置如下:

R1

interface Loopback0

 ip address 1.1.1.1 255.255.255.0

 ip rsvp bandwidth

 ip address 12.1.1.1 255.255.255.0

 fair-queue 64 256 37

 ip rsvp bandwidth

 

R2

interface Serial1/0

 ip address 12.1.1.2 255.255.255.0

 fair-queue 64 256 37

 ip rsvp bandwidth

interface Serial1/1

 ip address 23.1.1.1 255.255.255.0

 fair-queue 64 256 37

 ip rsvp bandwidth

 

R3

interface Serial1/0

 ip address 23.1.1.2 255.255.255.0

 fair-queue 64 256 37

 ip rsvp bandwidth

interface Loopback0

 ip address 3.3.3.3 255.255.255.0

 ip rsvp bandwidth

配置ip rsvp bandwidth路由器会自动配置fair-queue,也就是所谓的WFQ,后面会讲到队列,这里就不去关注WFQ的配置了。这里注意做实验室之前我们的底层路由必须是通的,我的环境中配置了EIGRP。接着我们在R1上配置发送方的配置,我们来为Telnet预留20K的带宽,配置如下:

R1

ip rsvp sender 3.3.3.3 1.1.1.1 TCP 23 0 1.1.1.1 Loopback0 20 20

 

配置发送以后R1就开始周期向3.3.3.3发送PATH消息了,周期是30S一次,而且R1的rsvp邻居已经显示UnKnown,如下:

RSVP-成长便签

  首先我们看Refresh Path psb这跳,这个就是刷新PATH消息的PSB,PSB全称为:Path State Block,路径状态块。PSB会在收到或产生PATH消息的时候被创建,用来标识一个RSVB PATH会话,如果在4给PATH消息周期都没有收到PATH刷新,那么PSB会被丢弃。图上我们抓到的就是一个PATH消息的刷新。Sending Path message就是向下一跳发送PATH消息了,接着说一下rsvp的邻居信息。RSVP会为接受RSVP消息的对端路由器建立邻居条目,UnKnown标识发送给了对方RSVP的消息,只有当收到RSVP消息的时候才会标识位RSVP,如下:

RSVP-成长便签

  R2从R1收到了RSVP的消息,确认为RSVP邻居,发送给R3RSVP消息,邻居关系为UnKnown。PATH消息已经成果发送到了途径的路由器上,接着我们在R3上配置预留信息,让R3发送服务类型位控制负载,预留类型为FF的RESV消息给R1,配置如下:

R3

ip rsvp reservation 3.3.3.3 1.1.1.1 TCP 23 0 3.3.3.3 Loopback0 FF LOAD 20 20

现在我们可以在R3上抓到RESV消息了,如下:

RSVP-成长便签

  在上图中我们可以看到R3是个丰富的角色,它接受R2发送过来的PATH消息,并且向R3的环回口发送PATH消息,还且向上层路由器发送RESV消息。RESV消息也是周期发送,周期为30S,每过30秒R3都会刷新REQ,这个REQ应该是RSB的值,RSB叫Reservation State Block,这个和PSB其实是一个工作原理。现在R2上的RSVP邻居应该都可以起来了,如下:

RSVP-成长便签

  接着我们首先看看R1的sender和reservation信息,用命令show ip rsvp sendershow ip rsvp reservation,如下:

RSVP-成长便签

  如果我们能看到图上所示的信息,就证明我们的RSVP消息收发没有问题,接着我们看看如下信息:

RSVP-成长便签

  看到上面的信息就证明我们的预留已经成功了,命令是show ip rsvp installed。这里我们要注意的是,只有RESV途径的入接口才会进行接口预留,我们可以用命令show ip rsvp interface来查看。我们看看R2的接口预留信息就知道了,如下:

RSVP-成长便签

  从上面我们可以看到R2的S1/1口预留了20K,而S1/0口却是allocated 0,就是没有预留,正如我们所说的。所以要在整条链路预留必须在R3上也做Sender,R1上也做Reservation,配置如下:

R1

ip rsvp sender 3.3.3.3 1.1.1.1 TCP 23 0 1.1.1.1 Loopback0 20 20

ip rsvp reservation 1.1.1.1 3.3.3.3 TCP 0 0 1.1.1.1 Loopback0 FF LOAD 20 20

 

R2

ip rsvp sender 1.1.1.1 3.3.3.3 TCP 0 0 3.3.3.3 Loopback0 20 20

ip rsvp reservation 3.3.3.3 1.1.1.1 TCP 23 0 3.3.3.3 Loopback0 FF LOAD 20 20

这里要注意的是,如果目标端口是0,那么源端口就不能配置成非0端口,所以只能这样配置了,效果如下:

RSVP-成长便签

  现在我们可以看到R2上的S1/1和S1/0口都预留了20K。注意配置RSVP的时候,不是非得这样配置,如果是UDP或者是别的什么单向流量那么我们只要预留单边就可以了。但是如果像ICMP的Echo和Reply这种有去有回的数据包,我们最好留双边,全程预留。

RSVP的流量匹配是很灵活的,它还可以匹配IP的协议号,这里就不说了。