<p>I've recently become aware that there's a distinction between IP multicasting (which apparently doesn't work that well on the public internet) and application multicasting (which is apparently used in IRC and PSYC, per <a href="http://en.wikipedia.org/wiki/Multicast" rel="nofollow noreferrer">http://en.wikipedia.org/wiki/Multicast</a>).</p>

<p>Is there a good tutorial on implementing application-level multicasting?</p>

<p>I thought the whole point of multicast was to reduce bandwidth for common network segments, so it's hard for me to understand what application-level multicast does.</p>

The purpose of IP level multicasting is to reduce bandwidth for common network segments where many users wish to receive the same traffic.   It's usually limited to one particular subnet and an IP router won't propagate the multicast beyond the subnet.   This is done for scalability reasons - it wouldn't be a good idea to allow one host to originate multicast packets which are propagated to every IP address on the internet.
There are different ways to think of "application level" multicasting.   One approach is to build a multicast tree using the host computers participating in the multicast.   Dijkstra's algorithm could be used to do this (Wikipedia has a reasonable description of this).   However, maintaining the list of participating computers - and keeping the tree up to date - can be a fair amount of work if hosts are joining and leaving the network at a substantial rate.   And you probably don't have a good estimate of hop cost available at the application level.
Another approach you should review is the flooding algorithm used in the Gnutella network's query routing protocol.     (Wikipedia also has a good description of this.)   This approach alleviates the need to build a multicast tree, but it has the downside of generating more network traffic.  In fact, a LOT more network traffic, as the traffic grows with the square of the number of nodes, i.e. O(n**2).