RFC 2102

Multicast Support for Nimrod : Requirements and Solution Approaches

๐Ÿ“… published February 1997, from ietf

RFC 2102: Multicast Support for Nimrod โœจ

Okay bestie, this one is from February 1997 and it's a Network Working Group doc by R. Ramanathan at BBN Systems and Technologies. ๐ŸŽ€ It's Informational, which means it's sharing info for the Internet community. It is not a standard ๐Ÿ’…. The title block doesn't list anything it obsoletes or updates, so there's no drama there ๐Ÿฆ‹.

Title: Multicast Support for Nimrod : Requirements and Solution Approaches Author: R. Ramanathan, BBN Systems and Technologies Category: Informational Date: February 1997

Status of this Memo ๐Ÿ“œ

This memo gives information to the Internet community. It does not specify an Internet standard of any kind ๐Ÿ™ˆ. Distribution is unlimited, so share it with everyone ๐ŸŒˆ.

Abstract ๐Ÿ”ฎ

Nimrod doesn't pick one specific solution for multicasting. Instead, Nimrod can use any of a bunch of emerging multicast techniques ๐Ÿงš. This doc lays out the requirements Nimrod has for a multicast support solution. It also compares existing approaches for multicasting inside an internetwork, including their pros and cons โš–๏ธ. As an example, it outlines how Nimrod could support multicast using the scheme being developed in the IETF, the Protocol Indpendent Multicast (PIM) protocol ๐Ÿ‘‘.

Table of Contents ๐Ÿ“–

1  Introduction.................................................  2
2  Multicast vs Unicast.........................................  3
3  Goals and Requirements.......................................  4
4  Approaches...................................................  6
5  A Multicasting Scheme based on PIM........................... 10
   5.1 Overview ................................................ 10
   5.2 Joining and Leaving a Tree .............................. 12
       5.2.1 An Example ........................................ 15
   5.3 Establishing a Shared Tree .............................. 16
   5.4 Switching to a Source-Rooted Shortest Path Tree.......... 18
   5.5 Miscellaneous Issues..................................... 20
6  Security Considerations...................................... 21
7  Summary...................................................... 21
8  References................................................... 22
9  Acknowledgements............................................. 23
10 Author's Address............................................. 23

1. Introduction ๐Ÿ’–

Okay so emerging apps like videoconferencing and remote classrooms are a whole vibe, and they make multicasting essential for any future routing architecture ๐Ÿ”ฅ. Multicasting works by using a multicast delivery tree whose leaves are the multicast destinations ๐ŸŒธ.

Nimrod doesn't propose a solution for the multicasting problem, and there are two main reasons ๐Ÿ’…. First, multicasting is a non-trivial problem, and its requirements still aren't well understood ๐Ÿ™ˆ. Second, a bunch of groups (like the IDMR working group of the IETF) are already studying the problem on their own, so Nimrod isn't trying to duplicate that work ๐Ÿซถ.

This attitude toward multicasting is totally consistent with Nimrod's general philosophy of flexibility, adaptability, and incremental change โœจ.

Multicasting solutions aren't part of Nimrod's "core" architecture, but Nimrod does require that the solution have certain characteristics ๐Ÿฆ‹. This document talks through some of those requirements and evaluates approaches for meeting them ๐Ÿ“.

Here's how it's organized ๐Ÿ—บ๏ธ. Section 2 explains why multicasting is treated a little differently than unicast, even though multicast is basically a generalization of unicast ๐Ÿง . Section 4 covers current approaches to multicasting ๐ŸŒˆ. Section 5 gives an example of how Nimrod multicasting could be done using PIM [DEF+94a] ๐Ÿ’œ. If you don't have time to read the whole thing, there's a summary at the end โญ.

This doc uses lots of terms and concepts from the Nimrod Architecture document [CCS96], and some terms and concepts in section 5 come from the Nimrod Functionality document [RS96] ๐ŸŽ€. Most of the discussion assumes you've read at least the Nimrod Architecture document [CCS96] ๐Ÿ“š.

2. Multicast vs Unicast ๐Ÿฆ„

Let's compare unicast routing and multicast routing ๐Ÿ‘ฏโ€โ™€๏ธ. Both need two phases: route generation and packet forwarding ๐Ÿงš. With unicast routing, Nimrod specifies the modes of packet forwarding, but route generation itself isn't specified and is left to the particular routing agent ๐Ÿ’…. For multicasting, Nimrod leaves both route generation and packet forwarding mechanisms unspecified ๐Ÿ™ˆ. To explain why, here are three aspects that make multicasting totally different from unicasting ๐Ÿ‘‘:

  • Groups and group dynamism. In multicasting, the destinations are part of a group, and that group's membership is dynamic ๐ŸŒŠ. This brings up the following issues:
    • An association between the multicast group and the EIDs and locators of the members in that group ๐Ÿ”—. This is especially relevant for sender-initiated multicasting and policy support ๐Ÿ’Œ.
    • A mechanism to fold new group members into the delivery when they get added, and a mechanism to "prune" the delivery when members leave ๐ŸŒฟ.
  • State creation. Most multicasting solutions can basically be viewed as creating state in routers for multicast packet forwarding ๐Ÿ—๏ธ. Depending on who creates the state, multicasting solutions are different ๐Ÿญ. There are several options here, like the sender, the receivers, or the intermediate routers ๐Ÿ›ธ.
  • Route generation. Even more than in unicast routing, you can pick from a rich spectrum of heuristics, each with different tradeoffs across parameters like cost, delay, algorithmic time complexity, and optimality ๐Ÿงฎ. For example, some heuristics make a low-cost tree with high end-to-end delay, and some make trees that give the shortest path to each destination but cost more ๐Ÿ’ธ. Multicasting heuristics are a big research area right now, and we expect advances to lead to sophisticated heuristics in the near future ๐Ÿ”ญ.

Okay so there are lots of possible combinations of route generation, group dynamism handling, and state creation for a solution, and each one could be the best fit for different applications ๐ŸŒˆ. That's why Nimrod doesn't specify one particular approach to multicasting ๐Ÿ™Œ. Every implementation of Nimrod is free to use its own multicasting technique, as long as it meets the goals and requirements of Nimrod ๐Ÿฆ‹. However, for interoperability, certain things must be agreed upon, like the structure of the forwarding information database that they create (we talk about this more in section 4) ๐Ÿค.

So we won't go into the details of any multicast solution here, just its requirements in the context of Nimrod ๐Ÿ’ซ. For the rest of this document, the discussion is structured around two themes ๐ŸŽ€:

  • What goals do we want to meet when providing multicasting in Nimrod, and what specific requirements do those goals imply for the multicast solution? ๐ŸŽฏ
  • What are some of the approaches to multicasting being discussed right now, and how relevant is each one to Nimrod? ๐Ÿ”

To be continued, bestie! ๐Ÿงš๐Ÿ’œ

4. Approaches โœจ

okay bestie, here's the rundown of the multicasting approaches that are running right now or that the IETF is still cooking up ๐Ÿ“

  1. Distance vector multicast routing protocol (DVMRP)[DC90]. This one is built on distance-vector routing info distribution and hop-by-hop forwarding. It uses Reverse Path Forwarding (RPF)[DM78], which is a distributed algorithm for constructing an internetwork broadcast tree ๐ŸŒณ. DVMRP uses a modified RPF algorithm, basically a truncated broadcast tree, to build a reverse shortest path sender-based multicast delivery tree. A reverse shortest path from s to d is a path that uses the same intermediate nodes as the shortest path from d to s. (If the paths are symmetric, meaning they cost the same in either direction, the reverse shortest path is the same as the shortest path.) RPF is already out in the wild on the Internet in what people call the MBONE ๐ŸŒธ. An improvement is being rolled out too. It adds "prune" messages to truncate even more of the routers that aren't on the path to the destinations, plus "graft" messages to undo that truncation later if it's needed.

The big win here is that it's simple ๐Ÿ’…. The major handicap is scalability ๐Ÿ˜ญ. Two issues have been raised about it[BFC93]. First, if S is the number of active sources and G is the number of groups, the state overhead is O(GS), which might be unacceptable when resources are limited. Second, routers that aren't on a multicast tree still get involved (sending and tracking prune and graft messages) even when they aren't interested in that particular source-group pair. It's expected to perform relatively poorly on large networks where group membership is sparsely distributed. On top of that, there's no support for policies or QOS ๐Ÿ’€.

  1. Core Based Trees (CBT)[BFC93]. This scheme uses a single tree shared by all sources per group. The tree has a single router as its core (with additional routers for robustness), and branches come out from that core ๐ŸŽ€. The chief thing that makes CBT special is that it's receiver initiated. That means receivers who want to join a multicast group find the tree (or its core) and attach themselves to it, with no participation from the sources. Main character energy ๐Ÿ‘‘.

The big motivation here is cutting the state overhead down to O(G), compared to DVMRP and PIM (more on that below) โœจ. Also, only the routers on the path between the core and the potential members get involved. Core-based tree formation and packet flow are decoupled from the underlying unicast routing.

The main disadvantage is that packets no longer travel the shortest path from the source to their destinations ๐Ÿ™ˆ. How well it performs generally depends on carefully placing the cores and on coordination between them. Traffic concentration on links incident to the core is another problem. It also depends on network entities (in other administrative domains, for instance) for resource reservation and policy routing.

  1. Protocol Independent Multicasting (PIM)[DEFJ93]. Yet another approach built on the receiver initiated philosophy ๐Ÿฆ‹. It's designed to get the advantages of DVMRP and CBT. It uses a "rendezvous point," which is a lot like the core we just talked about, and it allows shared trees and source-specific multicast trees to exist at the same time ๐Ÿงš. In the steady state, data can be delivered either over the reverse shortest path from the sender to the receiver (for better end-to-end delay) or over the shared tree.

It has two modes of operation, sparse and dense, so it gives improved performance both when group membership in an internetwork is sparse and when it's dense ๐ŸŒˆ. It is, however, a complex protocol ๐Ÿ˜ตโ€๐Ÿ’ซ. One limitation of PIM is that its shortest paths are based on the reverse metrics, so they're only truly "shortest" when the links are symmetric.

  1. Multicast Open Shortest Path First (MOSPF)[Moy92]. Unlike the approaches above, this one is based on link-state routing information distribution. The packet forwarding mechanism is hop-by-hop. Since every router has complete topology information, every router computes the shortest path multicast tree from any source to any group using Dijkstra's algorithm. If the router doing the computation falls within the tree it computed, it can figure out which links it has to forward copies onto ๐Ÿง .

MOSPF inherits the advantages of OSPF and link-state distribution, namely localized route computation (and easy verification of loop-freedom), fast convergence to link-state changes, and so on ๐Ÿ”ฅ. However, group membership information gets sent throughout the network, including over links that aren't on the direct path to the multicast destinations. So, like DVMRP, this is most suitable for small internetworks, meaning as an intra-domain routing mechanism ๐Ÿ“.

  1. Inter-Domain Policy Routing (IDPR)[Ste]. This approach uses link-state routing information distribution like MOSPF, but it uses source-specified packet forwarding ๐Ÿ’œ. Using the link-state database, the source generates a policy multicast route to the destinations. With that route, the IDPR path-setup procedure sets up state in intermediate entities for packet duplication and forwarding. That state holds info about the next-hop entities for the multicast flow. When a data packet arrives, it gets forwarded to each next-hop entity obtained from the state.

The perks of this approach are that it's great at supporting policy-based multicast routing with ease, and it gives independence (flexibility) in the choice of multicasting algorithm used at the source ๐Ÿซถ. IDPR also allows resource sharing over multiple multicast trees. The major disadvantage is that group membership changes (additions and deletions) are relatively harder to handle, since those changes have to be communicated to the source of the tree first, and then the source adds branches appropriately ๐Ÿ˜ฉ.

We're about to talk about how all of these fit with Nimrod ๐ŸŒŸ. Everything described here has one thing in common: we need to set up state in the intermediate routers for multicast packet forwarding. The approaches mainly differ on who starts the state creation. Is it the sender (like IDPR and PIM), the receiver (like CBT and PIM), or do the routers create state themselves without being kicked off by the sender or receivers (like DVMRP and MOSPF)? ๐Ÿค”

Nimrod should be able to handle both sender initiated and receiver initiated state creation for multicasting ๐Ÿ’–. In the rest of this section, we'll go over the pros and cons of these approaches for Nimrod.

Nimrod uses link-state routing information distribution (topology maps) and has four modes of packet forwarding: flow mode, Connectivity Specification Chain (CSC) mode, Connectivity Specification Sequence (CSS) mode, and datagram mode [CCS96] โœจ.

An approach similar to the one used in IDPR is viable for multicasting in flow mode. The source can set up state in intermediate routers, which can then duplicate packets appropriately ๐Ÿฆ‹. For the CSC, BTES and datagram modes, an approach similar to the one used in MOSPF is applicable. In these situations, the advantages and disadvantages of these approaches in the context of Nimrod are similar to the advantages and disadvantages of IDPR and MOSPF, respectively ๐ŸŽ€.

Sender based trees can be set up using an approach similar to IDPR, generalized to an "n" level hierarchy ๐ŸŒˆ. A significant advantage of this approach is policy-based routing. The source knows about the policies of nodes that choose to advertise them, and it can choose a route the way it wants. It doesn't have to depend on other entities to pick the route, unlike some of the schemes mentioned above ๐Ÿ‘‘. Another advantage is that each source can use the multicast route generation algorithm and packet forwarding scheme that suits it best, instead of being forced to use whatever is implemented elsewhere in the network ๐Ÿ’…. On top of that, this approach allows new multicast tree generation algorithms to be deployed incrementally as research in that area progresses ๐Ÿงš.

CBT-like methods may be used to set up receiver initiated trees. Nimrod provides link-state maps for generating routes, and a CBT-like method is compatible with that ๐Ÿ—บ๏ธ. For instance, a receiver that wants to join a group may generate a (policy) route to the core for that group using its link-state map, and then attach itself to the tree ๐Ÿซถ.

A disadvantage of sender based methods in general seems to be supporting group dynamism ๐Ÿ˜ฌ. Specifically, if the group's membership changes, the particular database containing the group-destination mapping has to be updated. By comparison, receiver oriented approaches seem to accommodate group dynamism more naturally ๐Ÿ’œ.

Nimrod doesn't rule out multiple approaches to multicasting existing at the same time, or switching from one to another depending on how group distributions are changing ๐Ÿ”„. Interoperability is an issue, meaning the question of whether or not different implementations of Nimrod can take part in the same tree. But as long as the structure of the state created is agreed on (so the states can be interpreted uniformly for packet forwarding), this shouldn't be a problem ๐ŸŒธ. For instance, a receiver that wants to join a sender created tree might set up state on a path between itself and a router on the tree, with the sender itself being unaware of it. Packets entering the router would now also be forwarded along this new "branch" to the new receiver ๐ŸŒฟ.

In conclusion, the architecture of Nimrod can accommodate diverse approaches to multicasting ๐ŸŒˆ. Each approach has its disadvantages with respect to the requirements mentioned in the previous section. The architecture doesn't demand that one particular solution be used. In fact, we expect that a combination of approaches will be employed and engineered in whatever way is most appropriate to the requirements of the particular application or subscriber ๐Ÿ’–.


5. A Multicasting Scheme based on PIM ๐Ÿ’œ

The Inter-Domain Multicast Routing (IDMR) working group of the IETF has developed a specification for a new multicast scheme, namely Protocol Independent Multicasting (PIM), for use in the Internet [DEF+94a, DEF+94b] ๐ŸŒ. In this section, we describe how the schemes mentioned therein may be implemented using the facilities provided by Nimrod.

We note that the path setup facility provided in Nimrod makes it very conducive to PIM-style multicasting. Despite the length of the description given here, we assure the reader that it's quite simple to implement PIM style multicasting in Nimrod ๐Ÿซถโœจ.

Before reading this section, we recommend that the reader acquire some familiarity with PIM (see [DEF+94a, DEF+94b]) ๐Ÿ“š.

5.1. Overview โœจ

okay so PIM is giving receiver-initiated membership ๐ŸŽ€ which is the classic IP multicast vibe, and the best part is it doesn't care which unicast routing protocol you use (hence the name!) ๐Ÿ’…

PIM is lowkey iconic because it can build two kinds of trees ๐ŸŒณ. One is a shared tree, great for low "cost" multicasting, and the other is a source-based tree, great for low delay multicasting ๐Ÿ’–

A shared tree is rooted at a rendezvous point (RP), which is usually a prespecified router for the multicast group in question ๐Ÿงš To set one up, the designated router (DR) for a host that wants to join group G starts a flow setup from the RP for G to that DR. Meanwhile, a source S that wants to send to group G starts a flow setup between S and the RP for G. Once both flow setups wrap up, packets can go from S to H through the RP ๐Ÿฆ‹ For how the flow setup protocol actually works, check out [DEF+94b] ๐Ÿ“š

After the shared tree is set up, a recipient for group G can choose to switch over to a source-based shortest path tree ๐Ÿ‘‘ In this tree, packets go from the source to each recipient along the shortest path, no detours! To build it, the DR for H looks at the source S of the packets it's getting over the shared tree and sets up a flow between S and the DR. The flow follows the shortest path from the DR to S, so strictly speaking it's the reverse shortest path being used ๐Ÿ™ˆ After that, packets can go from S to H on that shortest path and skip the RP entirely โœจ For the protocol details on source-based trees in PIM, see [DEF+94b] again ๐Ÿ’œ

When a host wants to leave a multicast group, its DR sends a prune message toward the source (for source-based trees) or toward the RP (for shared trees) ๐Ÿ“ For more on this and the other PIM features, see [DEF+94b] ๐Ÿซถ

Now, how PIM works in Nimrod ๐ŸŒˆ We call PIM-based multicast Nimpim. To join a shared tree, an endpoint (or an agent acting for the endpoint) that wants to join group G queries the association database for the EID and locator of the RP for G. For well-known groups, that association might just be configured already ๐Ÿ’… Every multicast group G is required to have such an association maintained. The endpoint then gets a route for the RP and starts a multicast flow setup to the RP. A multicast flow setup is basically like the unicast flow setup in [CCS96], with one big twist: when a multicast flow setup request hits a node that already has that flow, the request doesn't get forwarded any further. Instead, the new flow gets "spliced" in as a new branch of the existing multicast tree ๐ŸŒธ The source does the same thing and sets up a flow to the RP. The RP then creates state that links these two flows together, and now packets can flow from the source to the endpoints ๐ŸŽ‰ Each flow setup can be "hierarchical" and involve lots of subflows, but honestly that's all transparent to Nimpim ๐Ÿ™ˆ For the details on managing hierarchical flows, see [CCS96] ๐ŸŽ€

To create the source-based tree, the representative for a recipient node N grabs the EID or locator of the source from the data packets and starts a multicast flow setup to the source ๐Ÿฆ‹ The route agent for node N uses its map to calculate the shortest path from the source to N, and the flow request travels along the reverse of that path ๐Ÿง  Here's the tea: how "short" the path is depends on how much routing information is available locally. But since the map is available locally, you can actually find the real shortest path from the source to N, instead of just using the shortest path from N to S. So with Nimrod you can fix a PIM shortcoming pretty easily ๐Ÿ’– slay honestly ๐Ÿ‘‘

We'll now go deeper into Nimpim ๐Ÿงš First up is multicast flow setup, which is the "basic" stuff you need to make multicasting work. Once this "building block" is clear, we'll use it to explain how the shared tree gets set up (in section 5.3) and how the source-based tree gets set up (in section 5.4) โœจ

We only talk about sparse-mode multicasting here, as described in [DEF+94a] ๐ŸŒฟ To keep things simple, we assume there's a single Rendezvous Point per group ๐Ÿ’œ And to keep things concise, we "address" every entity by its EID alone. Locators could be used alongside EIDs to cut down on database lookup overhead, but we're not doing that here ๐Ÿซถ


5.2. Joining and Leaving a Tree ๐Ÿฆ‹

Nimpim uses two control packets to set up a flow: the Nimrod Multicast Flow-Request packet (NMFReq) and the Nimrod Multicast Flow-Reply packet (NMFRep) ๐Ÿ’…

The NMFReq packet is a control packet that gets identified by a prespecified "payload type" ๐ŸŽ€ Its protocol-specific part includes the following fields. Heads up: every field except the Code field is also present in the Unicast Flow-Request packet ๐Ÿ™ˆ

  1. S-EID: The EID of the initiator of the flow.
  2. T-EID: The EID of the target of the flow.
  3. Flow-id: A label denoting the flow.
  4. Direction: The direction of the flow, whether from the initiator to the target (FORW), from the target to the initiator (REVERSE), or both (BOTH).
  5. Code: Denotes whether the packet is for joining a flow (NMFReq-Join) or for leaving a flow (NMFReq-Prune) ๐Ÿ“
  6. Source Route: A sequence of node locators the packet must travel through ๐Ÿงš

Processing an NMFReq at a forwarding agent on node N is pretty similar to processing a unicast flow request (see [CCS96]). The difference is that the new flow can now "splice" onto an existing delivery tree, or "un-splice" from one ๐ŸŒˆ Specifically:

  • If the Code is NMFReq-Join, the forwarding agent for node N runs the algorithm shown in Figure 1.
  • If the Code is NMFReq-Prune, the forwarding agent at node N runs the algorithm shown in Figure 2.

The NMFRep packet is used to accept or reject an NMFReq-Join or NMFReq-Prune ๐Ÿซถ Its packet format is the same as the one for a unicast flow request. But the NMFRep packet is generated by the first node N that grafts the new flow onto the existing tree, which might not be the same as the target of the NMFReq ๐Ÿ‘‘

It is required that a leaf router keep track of all hosts currently joined to the group, and send a prune message only if there's no host in the local network for the group ๐Ÿ’–

The NMFReq and NMFRep exchanges make up a procedure for joining a multicast delivery tree (when the Code is Join) and for leaving one (when the Code is Prune) โœจ We call these procedures Tree-Join and Tree-Leave respectively, and we'll use them as "building-blocks" for building shared trees (section 5.3) and source-based trees (section 5.4) ๐Ÿฆ‹

begin
if the flow-id F in NMFReq-Join is in flow-list then
   if T-EID in NMFReq-Join = target in flow state for F then
      if Direction in NMFReq-Join is REVERSE or BOTH then
         Add the node preceding N in source route to child list for F
      else
         discard packet
   else
      discard packet
else
   begin
     install state for F in N, i.e.,
        assign parent(F) = node succeeding N in source route
        assign child(F)  = node preceeding N in source route
        assign target(F) = T-EID in NMFReq-Join
     forward NMFReq-Join to parent(F)
   end
end.

Figure 1: Algorithm executed by a forwarding agent for node N when when it receives an NMFReq-Join. ๐ŸŒธ

begin
  if the flow-id F in NMFReq-Prune is in flow-list
  then begin
       delete previous hop in source route from child list for F, if exists
       if child list for F is empty
       then begin
             delete the flow-id and state associated with it
             forward to next hop in source route
            end
       else discard packet
       end
  else forward to next hop in source-route
end.

Figure 2: Algorithm executed by a forwarding agent for node N when it receives an NMFReq-Prune. ๐Ÿ’…

5.2.1. An Example ๐Ÿงš

Let's see how a tree gets joined with the help of Figure 3 ๐ŸŽ€ In the figure, the bold lines show an existing tree. A representative R, acting on behalf of host H, joins the tree by sending an NMFJoin-Req toward a target T. When used in shared tree mode, the target is the RP. When used in source tree mode, it's the source (root) of the multicast tree ๐ŸŒณ Say a host H wants to join the multicast tree. These steps happen:

Step 1. A representative R of H queries the route agent for a route from T to R. It gets the route T - C - B - A - R. It builds an NMFJoin-Req packet with source route R, A, B, C, T and flow F, and forwards it to A. ๐Ÿ“ฆ

Step 2. A looks for flow F in its installed flow database and doesn't find it. It installs state for F (it makes R a child and B a parent in the multicast tree) and sends the NMFJoin-Req packet to B ๐Ÿฆ‹

Step 3. B looks for flow F in its installed flow database and finds it. It adds B to its child list, builds an NMFJoin-Rep packet, and sends it to A ๐Ÿซถ

Step 4. A forwards the packet to R, and the tree joining is complete ๐ŸŽ‰ Branch B-A-R is now added to the tree ๐Ÿ”ฅ


5.3. Establishing a Shared Tree ๐ŸŒˆ

There are two parts to setting up a shared tree ๐Ÿ’– First is the receiver-to-RP communication, where the receiver joins the delivery tree rooted at the RP. Second is the sender-to-RP communication, where the RP joins the delivery tree rooted at the sender โœจ

                                    T
                                 +---+
                                 |   |\
                                 +---+  \
                                   /      \
                                  /         \
                               C /            \ X
                             +---+           +---+
                             |   |           |   |
                             +---+           +---+
                                  \
                                    \
                                      \
   R    join-req           join-req     \  B
   +---+ - - - - ->  +---+ - - - - -> +---+
   |   |<------------|   |<-----------|   |
   +---+   join-rep  +---+   join-rep +---+
     |                 A                 \
     |                                     \
     |                                       \     Y
    ( )                                        +---+
      H                                        |   |
                                               +---+

Figure 3: Illustration for the example describing joining an existing

multicast tree. ๐ŸŒณโœจ

Receiver-RP Communications: Okay so when an endpoint wants to join multicast group G, its endpoint representative goes and grabs the Rendezvous Point EID for G ๐ŸŽ€. We're assuming the association database already has that mapping, obviously. For how that database query actually gets implemented, go check [CCS96] ๐Ÿ“š.

The representative also grabs the flow-id it's going to use for the flow ๐Ÿ’…. The flow-id is built as the tuple (RP-EID, G) or some equivalent thing. The flow-id has to be unique to that particular multicast flow, no cap ๐Ÿ”’. And honestly, this isn't the only way to get a flow-id, or even the best way ๐Ÿ™ˆ. We talk about other ways to get one in section 5.5 ๐Ÿฆ‹.

Next, the representative starts a Tree-Join procedure ๐Ÿš€.

The NMFReq packet fields look like this:

  • S-EID : The EID of the endpoint that wants to join.
  • T-EID : The RP EID (grabbed from the Association Database).
  • Flow-id : The flow-id for this group (grabbed the way we just talked about).
  • Direction : REVERSE (from the RP to the receiving endpoint).
  • Code : Join.
  • Source Route : The reverse of the route the map agent gives back for a query "from RP-EID to Receiver-EID".

At the first node that already has this Flow-id, or at the RP, an NMFRep packet gets generated ๐Ÿ’–. The S-EID, T-EID, Direction and Flow-id fields get copied over from the NMFReq packet, and the Code gets set to Join-Accept or Join-Refuse, whichever one fits the situation ๐Ÿ‘‘. The source route gets reversed from the NMFReq packet too.

Sender-RP Communications: When an endpoint wants to send to multicast group G, the endpoint representative grabs the Rendezvous Point EID for G ๐Ÿ’œ. Same deal here: we assume the association database has that mapping, and [CCS96] has the details on how that query is implemented ๐Ÿงš.

The representative also gets the flow-id for the flow ๐Ÿ“. This time the flow-id is built as the tuple (Sender-EID, G) or an equivalent thereof. Again, it has to be unique to that particular multicast flow, and this isn't the only method or the best method for getting one. Alternate methods are in section 5.5 โœจ.

Then the representative sends an RP-Register Message to the RP ๐Ÿ“จ. This register message is equivalent to the PIM-Register described in [DEF+94b] ๐ŸŒˆ. The RP-Register message carries the group G, the flow-id (gotten the way we just talked about), and the sender EID.

The RP then starts a Tree-Join with the Sender EID as the target ๐ŸŽฏ. The NMFReq fields are:

  • S-EID : RP-EID.
  • T-EID : Sender EID (copied from the RP-Register Message).
  • Flow-id : The flow-id field from the RP-Register Message.
  • Code : Join.
  • Direction : REVERSE.
  • Source Route : The reverse of the route the map agent gives back for the query "from Sender-EID to RP-EID".

The NMFRep fields are obvious ๐Ÿ™„.

Shared Tree Data Forwarding: Packets sent from the source for group G carry the Flow-id that the senders and receivers use to set up the delivery tree ๐Ÿ”ฅ. The packets from the sender go to the RP, where they get multicast using the state made for the flow, into the delivery tree rooted at the RP, out to every receiver that did a Tree-Join ๐Ÿ’…โœจ.


5.4 Switching to a Source-Rooted Shortest Path Tree ๐ŸŒŠ

Switching to a Source-Rooted Shortest Path Tree has two parts ๐Ÿงฉ. First there's the receiver-source communications, where the receiver joins a multicast delivery tree rooted at the source. Second there's the receiver-RP communications, where the receiver leaves the shared tree ๐Ÿ‘‹.

Receiver-Source Communications: An endpoint E that's receiving packets through the shared tree from source S gets the option to switch to a delivery tree rooted at the source ๐Ÿฆ‹. That way, packets from S to E take the shortest path (using whatever metric you like) ๐Ÿƒโ€โ™€๏ธ.

The endpoint representative of E grabs the flow-id it'll use for the flow ๐Ÿ’–. The flow-id is built the same way as the tuple (Source-EID, G). Again, it has to be unique to that particular multicast flow, and this isn't the only method or the best method for getting a flow-id. Alternate methods are in section 5.5 ๐Ÿซถ.

The representative for E starts a Tree-Join toward S, with NMFReq fields like this:

  • S-EID : EID of the Endpoint E.
  • T-EID : EID of the source.
  • Flow-id : Flow id for the multicast (grabbed as mentioned above).
  • Code : Join.
  • Direction : REVERSE.
  • Source Route : To get the route, the route agent gets queried for a shortest path route (based on the chosen metric, which is typically the delay) from the source to the endpoint ๐Ÿ—บ๏ธ. The quality of that route is limited by how much routing information the route agent has, directly or indirectly โš ๏ธ. The Source Route is the reverse of the route that comes back.

Here's a comment on how the shortest-path trees from the RPF tree (as in [DEF+94b, DC90]) differ from the trees we get here ๐Ÿค“. With the RPF scheme, packets from the source S to the endpoint E follow the shortest path from E to S. That's only the desired path if the path is symmetric in both directions ๐Ÿ™ƒ. But in the Nimrod mechanism described here, packets follow the "actual" shortest path from S to E, symmetric or not ๐Ÿ’…โœจ.

The NMFRep fields are obvious ๐Ÿ™„.

Receiver-RP Communications: Once the receiver has joined the source-rooted tree, it can optionally disassociate itself from the shared tree ๐Ÿ‘‹. To do that, it starts a Tree-Leave procedure ๐Ÿšช.

The representative sends an NMFReq packet toward the RP with these fields:

  • S-EID : The EID of the endpoint that wants to leave the shared tree.
  • T-EID : The RP-EID.
  • Flow-id : The flow-id it used to join the shared tree.
  • Code : Prune.
  • Direction : REVERSE.
  • Source Route : Obtained the same way as for the Tree-Join.

The prune packet gets processed by the intermediate forwarding agents, as described in section 5.2 ๐Ÿงน. When the receiver gets the NMFRep packet back, it has left the shared tree ๐ŸŽ‰.

Source Tree Data Forwarding: Packets from the source carry the flow-id that was used to join the source tree for a given multicast group ๐Ÿ“ฆ. Forwarding agents just use the state made by the Tree-Join procedure to duplicate and forward packets toward the receivers ๐Ÿชž.


5.5 Miscellaneous Issues ๐ŸŽ€

Obtaining the Flow-Id: In the scheme above, the flow-id for a multicast group G was made by combining the RP-EID and the group set-id (G-SID) (for a shared tree), or by combining the Source-EID and the G-SID (for a source-based tree) ๐Ÿงƒ. The downside is that the bit-length of EID/SID can be pretty high (more than 64 bits), so the flow-id could end up super long ๐Ÿ˜ญ. There are bit-based data structures and search algorithms, like Patricia Trees, that can be used for an efficient implementation ๐ŸŒฟ. Still, it's worth considering some other methods instead of combining EID/SID. Here are some we describe below โœจ:

  1. For shared trees, the flow-id for a particular group G may be stored and updated in the association database. Since we have to use the association database anyway to get the RP-EID, this doesn't cause much extra burden ๐Ÿ’….

However, this can't be used efficiently for source-based trees, because we'd need a flow-id for every combination of Source and Group ๐Ÿ™…โ€โ™€๏ธ.

  1. The flow-id for shared trees could be done as above. When the sender does an RP-Register, it could send the RP the flow-id it wants receivers to use when they switch to a source-based tree ๐Ÿ’Œ. That could be included in the RP-Register message. The RP could then multicast that flow-id to all receivers in a special packet ๐Ÿ“ฃ. When the receivers want to switch, they use that flow-id ๐Ÿฆ‹.

This needs the definition of the "special" packet ๐Ÿ› ๏ธ.

  1. The flow-id only gets handed out by the source (for source-based trees) or the RP (for shared trees) ๐Ÿ‘‘. The receivers use a "dummy" flow-id in the NMFReq when doing a Tree-Join ๐ŸŽญ. The correct flow-id to use gets returned in the NMFRep message generated by the forwarding agent where the new branch meets the existing tree ๐ŸŒธ. Forwarding agents on the path of the NMFRep packet update the state information by rewriting the dummy flow-id with the correct flow-id from the NMFRep packet ๐Ÿ”.

This needs a redefinition of the NMFRep packet. Note that the NMFRep packet now needs space for two flow-ids: one for the "dummy" flow-id, and one for the "correct" flow-id that has to replace the dummy flow-id ๐Ÿง .

We claim that each of the schemes above gets the flow-id synchronized across the various parts of the internetwork, and that each flow-id is unique to the multicast delivery tree ๐Ÿคž. A formal proof of these claims is beyond the scope of this document ๐Ÿ“.

Dense Mode Multicast: The PIM architecture [DEF+94a] includes a multicast protocol for when group membership is densely distributed across the internetwork ๐ŸŒ. In this mode, no Rendezvous Points are used, and a source-rooted tree is formed based on Reverse Path Forwarding, similar to DVMRP [DC90] ๐ŸŒณ.

We don't give the details of how Nimrod can implement Dense Mode Multicast here ๐Ÿค.

Multiple RPs: Our discussion above assumed there's one RP per group. PIM allows more than one RP per group, but we don't discuss multiple-RP PIM here ๐Ÿ™ˆ.


6 Security Considerations ๐Ÿ”

Security issues are not discussed in this memo. ๐Ÿ˜ฑ

7 Summary ๐Ÿ“

  • Nimrod does not specify a particular multicast route generation algorithm or state creation procedure. Nimrod can accommodate diverse multicast techniques and leaves the choice of technique to the particular instantiation of Nimrod ๐ŸŒˆ.
  • A solution for multicasting within Nimrod should be capable of:
    • Scaling to large networks, large numbers of multicast groups, and large multicast groups ๐Ÿ“ˆ.
    • Supporting policy, including quality of service and access restrictions ๐Ÿ›ก๏ธ.
    • Resource sharing ๐Ÿค.
    • Interoperability with other solutions ๐Ÿ”—.
  • Multicasting typically requires setting up state in intermediate routers for packet forwarding. The state setup may be initiated by the sender (e.g., IDPR), by the receiver (e.g., CBT), by both (e.g., PIM), or by neither. The architecture of Nimrod provides sufficient flexibility to accommodate any of these approaches ๐Ÿฆ‹.
  • A receiver-initiated multicast protocol, PIM, is being designed by the IDMR working group of the IETF. The facilities provided by Nimrod make using PIM as a multicast protocol quite straightforward ๐Ÿ‘‘โœจ.

8 References ๐Ÿ“š

[BFC93] A. J. Ballardie, P. F. Francis, and J. Crowcroft. Core based trees. In Proceedings of ACM SIGCOMM, 1993.

[CCS96] Castineyra, I., Chiappa, N., and M. Steenstrup, "The Nimrod Routing Architecture", RFC 1992, August 1996.

[DC90] S. Deering and D. Cheriton. Multicast routing in datagram internetworks and extended lans. ACM Transactions on Computer Systems, pages 85--111, May 1990.

[DEF+94a] Deering, S., Estrin, D., Farinacci, D., Jacobson, V., Liu, C., and L. Wei, "Protocol Independent Multicast (PIM) : Motivation and Architecture, Work in Progress. ๐Ÿ’œ

[DEF+94b] Deering, S., Estrin, D., Farinacci, D., Jacobson, V., Liu, C., and L. Wei, "Protocol Independent Multicast (PIM) : Sparse Mode Protocol Specification, Work in Progress.

[DEFJ93] Deering, S., Estrin, D., Farinacci, D., and V. Jacobson, "IGMP router extensions for routing to sparse multicast groups, Work in Progress.

[DM78] Y. K. Dalal and R. M. Metcalfe. Reverse path forwarding of broadcast packets. Communications of the ACM, 21(12), pages 1040--1048, 1978.

[Moy92] Moy, J., "Multicast Extensions to OSPF, RFC 1584, March 1994.

[RS96] Ramanathan, S., and M. Steenstrup, "Nimrod functional and protocol specifications, Work in Progress.

[Ste] Steenstrup, M., "Inter-domain policy routing protocol specification: Version 2", Work in Progress.

9. Acknowledgements ๐Ÿ™Œ

Huge thank-yous to Isidro Castineyra (BBN), Charles Lynn (BBN), Martha Steenstrup (BBN) and the rest of the Nimrod Working Group ๐Ÿซถ for their comments and suggestions on this memo. Iconic team behavior, honestly ๐Ÿ’œ

10. Author's Address ๐Ÿ’Œ

Ram Ramanathan
BBN Systems and Technologies
10 Moulton Street
Cambridge, MA 02138

Phone:  (617) 873-2736
EMail:  ramanath@bbn.com
๐Ÿ“ฆ where this page comes from