Sending IPv4 Multicast Datagrams
To send a multicast datagram, specify an IP multicast address in the range 224.0.0.0 to
239.255.255.255 as the destination address in a sendto
call.
By default, IP multicast datagrams are sent with a time-to-live (TTL)
of 1. This value prevents the datagrams from being forwarded beyond a single
subnetwork. The socket option IP_MULTICAST_TTL
allows
the TTL for subsequent multicast datagrams to be set to any value from 0
to 255. This ability is used to control the scope of the multicasts.
u_char ttl; setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &ttl,sizeof(ttl))
Multicast datagrams with a TTL of 0 are not transmitted on any subnet, but can be delivered locally if the sending host belongs to the destination group and if multicast loopback has not been disabled on the sending socket. Multicast datagrams with a TTL greater than one can be delivered to more than one subnet if one or more multicast routers are attached to the first-hop subnet. To provide meaningful scope control, the multicast routers support the notion of TTL thresholds. These thresholds prevent datagrams with less than a certain TTL from traversing certain subnets. The thresholds enforce the conventions for multicast datagrams with initial TTL values as follows:
- 0
-
Are restricted to the same host
- 1
-
Are restricted to the same subnet
- 32
-
Are restricted to the same site
- 64
-
Are restricted to the same region
- 128
-
Are restricted to the same continent
- 255
-
Are unrestricted in scope
Sites and regions are not strictly defined and sites can be subdivided into smaller administrative units as a local matter.
An application can choose an initial TTL other than the ones previously listed. For example, an application might perform an expanding-ring search for a network resource by sending a multicast query, first with a TTL of 0 and then with larger and larger TTLs until a reply is received.
The multicast router does not forward any multicast datagram with a destination address between 224.0.0.0 and 224.0.0.255 inclusive, regardless of its TTL. This range of addresses is reserved for the use of routing protocols and other low-level topology discovery or maintenance protocols, such as gateway discovery and group membership reporting.
Each multicast transmission is sent from a single network interface, even if the host has more than one multicast-capable interface. If the host is also a multicast router and the TTL is greater than 1, a multicast can be forwarded to interfaces other than the originating interface. A socket option is available to override the default for subsequent transmissions from a given socket:
struct in_addr addr; setsockopt(sock, IPPROTO_IP, IP_MULTICAST_IF, &addr, sizeof(addr))
where addr
is the local IP address of the desired
outgoing interface. Revert to the default interface by specifying the address INADDR_ANY
. The local IP address of an interface is obtained with
the SIOCGIFCONF
ioctl
. To determine
if an interface supports multicasting, fetch the interface flags with the SIOCGIFFLAGS
ioctl
and test if the IFF_MULTICAST
flag is set. This option is intended primarily for multicast routers
and other system services specifically concerned with Internet topology.
If a multicast datagram is sent to a group to which the sending host itself belongs, a copy of the datagram is, by default, looped back by the IP layer for local delivery. Another socket option gives the sender explicit control over whether subsequent datagrams are looped back:
u_char loop; setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop))
where loop
is 0 to disable loopback and 1 to enable
loopback. This option provides a performance benefit for applications that
have only one instance on a single host by eliminating the overhead of receiving
their own transmissions. Applications that can have more than one instance
on a single host, or for which the sender does not belong to the destination
group, should not use this option.
If the sending host belongs to the destination group on another interface, a multicast datagram sent with an initial TTL greater than 1 can be delivered to the sending host on the other interface. The loopback control option has no effect on such delivery.