A service that translates unicast traffic to multicast traffic.
Background & Goal
This project is part of a larger effort called Multicast to the Grandma (MTTG). Put briefly, the goal of MTTG is to bring applications that rely on multicast infrastructure to users in networks that do not support multicast. The key idea is to automatically translate unicast traffic to multicast traffic as the traffic enters a multicast-enabled network from a unicast-only network, and vice versa when the traffic enters a unicast-only network from a multicast-enabled network. So far, the latter (multicast to unicast translation) has been achieved using Automatic Multicast Tunneling (AMT), which, as the name suggests, essentially tunnels multicast traffic by wrapping it in unicast packets when the traffic leaves the multicast-enabled network, such that the traffic can travel across the unicast-only network and ultimately be unwrapped by the receiving end host.
While AMT allows for delivery of content originating from (and sent as multicast) a host in a multicast-enabled network (e.g., the Multicast Backbone (Mbone)) to receivers in unicast-only networks, it does not provide unicast-to-multicast translation, as stated in the February 2015 revision of the RFC:
This document does not describe any methods for sourcing multicast traffic from isolated sites, as this topic is out of scope.
A different solution is therefore needed to enable a host in a unicast-only network to source content intended for multiple recipients in multicast-enabled networks (and/or in unicast-only networks where there is a multicast-enabled transit network with AMT support between the source and the receiver). The goal of this project is to develop a service that performs unicast-to-multicast translation to enable such unicast-only sources to utilize the multicast capabilities of the (transit) multicast-enabled networks between the source and its receivers.
The unicast-to-multicast translator uses a socket-based design. The translator maintains two sockets:
- a regular (UDP) unicast socket Su to which the unicast-only source sends its unicast traffic;
- and a multicast (UDP) socket Sm on which the payload of the inbound unicast packets are sent out as multicast packets.
Whenever a unicast packet p arrives at Su, the translator determines if it has already received prior packets from the same unicast source s by looking up s (identified by the source IP and source port of p) in a dictionary d that maps unicast sources to their assigned multicast addresses (groups). If there is an entry for s in d, the translator simply sends the payload of p out on Sm, specifying the multicast address pointed to by s in d as the destination IP address. If there is currently no entry for s in d, the reception of p indicates the start of a new unicast flow that is to be translated. In this case, the translator randomly selects a multicast address (group) m from its (configurable) multicast address space and inserts an entry in d that maps s to m. It then sends the payload of p out on Sm, specifying m as the destination IP address.
The primary benefit of this design is that all network and transport layer headers are automatically stripped (in the case of inbound traffic) and generated (in the case of outbound traffic) by the operating system's networking stack. Furthermore, since Su is a UDP socket, there is no need for multithreading as the main thread can serve multiple clients concurrently by constantly polling a single socket (Su) as all clients send data to this single socket (as opposed to TCP, where there is one socket per connection).