In the fall of ’98 I took a networking class. For the final project, we were to code a simulation of a router that supports multicast. For example, machine M1 might want to subscribe to events broadcast by machine M4 to its registered listeners, and they might be separated by 3 hops or more. Furthermore, any of the machines could be both broadcasters or listeners (IIRC). I learned enough that the solution seemed worth sharing.