kan*_*uth 1 networking network-programming multicast go

我是golang编程和多播编程的新人.我在https://gist.github.com/fiorix/9664255上看到了一个关于golang组播的程序.

import (
    "encoding/hex"
    "log"
    "net"
    "time"
)

const (
    srvAddr         = "224.0.0.1:9999"
    maxDatagramSize = 8192
)

//send multicast data
func ping(a string) {
    addr, err := net.ResolveUDPAddr("udp", a)
    if err != nil {
        log.Fatal(err)
    }
    c, err := net.DialUDP("udp", nil, addr)
    for {
        c.Write([]byte("hello, world\n"))
        time.Sleep(1 * time.Second)
    }
}

//print received data
func msgHandler(src *net.UDPAddr, n int, b []byte) {
    log.Println(n, "bytes read from", src)
    log.Println(hex.Dump(b[:n]))
}

//join multicast group and receive multicast data
func serveMulticastUDP(a string, h func(*net.UDPAddr, int, []byte)) {
    addr, err := net.ResolveUDPAddr("udp", a)
    if err != nil {
        log.Fatal(err)
    }
    l, err := net.ListenMulticastUDP("udp", nil, addr)
    l.SetReadBuffer(maxDatagramSize)
    for {
        b := make([]byte, maxDatagramSize)
        n, src, err := l.ReadFromUDP(b)
        if err != nil {
            log.Fatal("ReadFromUDP failed:", err)
        }
        h(src, n, b)
    }
}

我在大学实验室局域网中的几台计算机上运行了代码.一台计算机运行功能ping以发送多播数据包,其他计算机运行函数serveMulticastUDP以接收多播数据包.它被禁用.但是当我在一台计算机上运行函数ping并在Internet上的另一台计算机上运行函数serveMulticastUDP(两台计算机不在局域网中)时,它无法接收数据.接收器有NAT并且没有公共IP地址.

我看到一些人的答案,互联网不支持组播.但据我所知,VOIP是组播技术的一个例子,我们可以在互联网上实现组播.

那么接收器无法接收数据包的原因是什么?我该如何修改代码以通过Internet实现多播?