MPLS Traffic Engineering with RSVP-TE: how explicit, bandwidth-constrained LSPs are computed with CSPF and signaled hop-by-hop, protected with FRR, and why the model doesn't scale.
RSVP-TE (RFC 3209) extends the Resource ReSerVation Protocol from a host-driven QoS mechanism into the control plane that builds MPLS Traffic-Engineered LSPs. Where plain LDP just follows the IGP shortest path, RSVP-TE lets the head-end pin a tunnel down an explicit path and reserve bandwidth along it, so operators can steer traffic off the shortest path to honour capacity, latency, and diversity constraints.
Three ideas carry the whole topic. CSPF at the head-end computes a constrained path from a TE database and emits an ERO. RSVP signaling walks that ERO to install labels and reserve bandwidth (Path downstream, Resv upstream). FRR pre-signals backup LSPs so a failure is repaired locally in ~50 ms. Everything else is detail hanging off these three.
RSVP-TE exists to solve the problem plain IGP routing cannot: the shortest path is not always the path you want. Multiple flows converging on the same shortest path congest it while parallel links sit idle. RSVP-TE gives the head-end (the ingress LSR) a way to:
RSVP is a soft-state protocol: reservations are not permanent. Each LSR must periodically refresh the state (default Path/Resv refresh ~30 s) or it times out and is torn down. This makes the protocol self-healing after transient loss but is also the source of its scaling problem — see below. It is also receiver-oriented and downstream-on-demand: the downstream node allocates the label and hands it upstream in the Resv.
Setup is a two-pass exchange: a Path message travels downstream from ingress to egress to propose the LSP; a Resv message travels back upstream, allocating labels and confirming the reservation hop by hop.
Ingress (head-end) P (transit) Egress (tail-end)
│ Path (ERO, LABEL_REQUEST, SENDER_TSPEC) │
│ ─────────────────▶│ ─────────────────────────▶│
│ │ │ (egress picks label,
│ Resv (LABEL=implicit-null / N) Resv (LABEL) │ often implicit-null=3)
│ ◀─────────────────│ ◀─────────────────────────│
│ LSP up: labels installed, bandwidth booked │
│ ... periodic Path/Resv refresh every ~30s ...│
| Message | Direction | Role |
|---|---|---|
| Path | Downstream (ingress → egress) | Proposes the LSP; carries the ERO, LABEL_REQUEST, SESSION and SENDER_TSPEC; establishes path state at each hop. |
| Resv | Upstream (egress → ingress) | Grants the reservation; carries the LABEL (downstream-on-demand allocation), RRO and FLOWSPEC; installs the forwarding label at each hop. |
| PathErr | Upstream | Reports a setup error (e.g. no route, admission-control failure) back toward the ingress — does not tear state down by itself. |
| ResvErr | Downstream | Reports a reservation error toward the egress. |
| PathTear | Downstream | Explicitly deletes path state along the LSP (fast teardown vs waiting for soft-state timeout). |
| ResvTear | Upstream | Explicitly deletes reservation state upstream. |
| ResvConf | Downstream | Optional confirmation of a reservation back to the receiver. |
Hello messages (RFC 3209) between adjacent LSRs give fast node-failure detection independent of the slow refresh timers, and drive graceful restart so the control plane can restart without dropping the data plane.
RSVP messages are containers of typed objects. The ones to be able to name in an interview:
| Object | Carried in | Purpose |
|---|---|---|
| SESSION | Path / Resv | Identifies the LSP: tunnel endpoint address, tunnel ID, extended tunnel ID. The key that binds Path and Resv to one tunnel. |
| LABEL_REQUEST | Path | Asks each downstream hop to allocate a label for this LSP (turns RSVP into a label-distribution protocol). |
| LABEL | Resv | The allocated label handed upstream — downstream-on-demand. Egress usually returns 3 (implicit-null) to request penultimate-hop popping. |
| ERO (Explicit Route) | Path | The ordered list of hops the LSP must follow — the output of CSPF. Hops can be strict (exact next hop) or loose (get there any way). |
| RRO (Record Route) | Path & Resv | Records the actual hops (and labels) traversed — used for loop detection, FRR bypass selection, and operator visibility. |
| SENDER_TSPEC | Path | Describes the traffic the sender will offer (the requested bandwidth / token-bucket parameters). |
| FLOWSPEC | Resv | The reservation actually granted along the return path (must satisfy the TSPEC). |
| SESSION_ATTRIBUTE | Path | Setup/hold priority, affinity (admin-group) constraints, and FRR flags (local-protection-desired, etc.). |
| FILTER_SPEC / SENDER_TEMPLATE | Resv / Path | Identify the specific sender (LSP-ID) the reservation applies to. |
The explicit route in the ERO is not hand-typed — it is computed by CSPF (Constrained Shortest Path First) at the head-end. CSPF is ordinary SPF/Dijkstra run over a topology that has first been pruned of every link that fails the LSP's constraints.
The topology it runs on is the Traffic-Engineering Database (TED), populated by the IGP's TE extensions, which flood per-link TE attributes in addition to the normal reachability:
| Carried by | OSPF-TE | IS-IS TE |
|---|---|---|
| Extension mechanism | Opaque Type-10 (area-scoped) LSAs (RFC 3630) | New TLVs 22/135 with sub-TLVs (RFC 5305) |
| Per-link attributes | Maximum bandwidth, maximum reservable bandwidth, unreserved bandwidth per priority, TE metric, administrative-group (color) bitmask, SRLG membership. | |
Given a request for, say, 200 Mbps, avoid color RED, ≤ 6 hops, disjoint from SRLG 42, CSPF:
Convergence via IGP + re-signaling is far too slow for carrier SLAs. FRR (RFC 4090) pre-computes and pre-signals a backup LSP before any failure, so the node adjacent to the break can redirect traffic locally in ~50 ms — the classic SONET-parity number — while the head-end re-optimizes a fresh primary in the background.
| Facility backup (bypass) | One-to-one (detour) | |
|---|---|---|
| Backup LSP | One bypass tunnel shared by many protected LSPs | A separate detour LSP per protected LSP |
| Relationship | One-to-many (N LSPs share one bypass) | One-to-one |
| Data-plane trick | Label stacking: PLR pushes the bypass label on top of the protected LSP's label | Detour carries the protected LSP's own labels |
| State in core | Scales well — few bypass tunnels | More state — a detour for every LSP |
| Typical vendor | Juniper / common default | Cisco "detour" style |
The key mechanism to state at a whiteboard: on failure the PLR pushes an extra (bypass) label and tunnels the original labeled packets to the MP, where the bypass label is popped and the packet continues down the original LSP as if nothing happened. FRR is a temporary local patch; the head-end then rebuilds an optimal end-to-end LSP and make-before-break moves traffic onto it.
Whenever an LSP is re-routed for reoptimization, a new path constraint, or after an FRR event, RSVP-TE builds the
new LSP first, moves traffic onto it, then tears down the old one — hitless. The trick that makes
this work without double-counting bandwidth is the SE (Shared Explicit) reservation style: the old
and new LSPs share the same Tunnel ID but differ in LSP-ID, so links common to both paths
count the reservation once instead of rejecting the new LSP for lack of bandwidth.
Auto-bandwidth lets an LSP measure its own traffic over a sampling interval and periodically re-signal (via MBB) a new reservation sized to the observed load — growing during busy periods and shrinking off-peak, so reservations track reality instead of a static guess.
What the state looks like on a box — names differ by vendor but the concepts map directly.
# Junos-style: a TE LSP with an explicit path + bandwidth + FRR
mpls {
label-switched-path CORE-A-to-Z {
to 10.0.0.9; # egress
bandwidth 200m; # reservation -> SENDER_TSPEC
priority 3 3; # setup / hold
fast-reroute; # request local protection (FRR)
admin-group exclude red; # affinity constraint -> CSPF prune
primary VIA-CORE; # named path (ERO seed)
}
path VIA-CORE {
10.0.0.5 strict; # ERO hop (strict)
10.0.0.9 loose; # ERO hop (loose)
}
}
# Inspect signaled LSPs
show mpls lsp extensive
Ingress LSP: CORE-A-to-Z State: Up Bandwidth: 200Mbps
Explicit Route (ERO): 10.0.0.5(S) 10.0.0.9(L)
Record Route (RRO): 10.0.0.5 (Label 299808) 10.0.0.9 (Label 3)
FastReroute Protection desired; Detour/Bypass: Up (bypass->P2)
RSVP-TE works, but its cost grows badly with network size — this is the single most important "downside" to be able to articulate, because it is the entire motivation for Segment Routing.
| Problem | Why it hurts |
|---|---|
| Per-LSP soft state in the core | Every transit LSR holds Path + Resv state for every LSP crossing it. State is proportional to the number of tunnels, not the topology. |
| N×N full mesh | Any-to-any TE among N edge routers needs ~N² LSPs; each new edge node adds ~2N tunnels. State and provisioning explode quadratically. |
| Refresh overhead | Soft state must be refreshed periodically for every LSP at every hop. Refresh-reduction (summary refresh, RFC 2961) helps but doesn't remove the fundamental O(LSPs) burden. |
| Slow, racy setup | Two-pass signaling per LSP, plus CSPF races and re-signals on every reoptimization/auto-bw change. |
Segment Routing TE keeps the same CSPF-style path computation but throws away the signaling and per-LSP core state entirely: the head-end encodes the path as a stack of segment labels (SIDs) in the packet itself. Transit routers hold no per-LSP state and run no RSVP refresh — they just forward on globally-known SIDs. That removes the full-mesh state explosion and the refresh treadmill in one move.
One-line summary for the panel: RSVP-TE signals stateful, refreshed reservations hop by hop; SR-TE source-routes with a label stack and keeps zero per-LSP state in the core. See SR-TE — Theory for the replacement.