Как использовать golang для реализации многоадресной рассылки через Интернет?

Я новичок в программировании golang и программировании многоадресной рассылки. Я видел программу о многоадресной рассылке golang в https://gist.github.com/fiorix/9664255.

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 на одном компьютере и запустил функцию serveMulticastUDP на другом компьютере в Интернете (два компьютера не в локальной сети), он не смог получить данные. Ресивер имеет NAT и не имеет общедоступного IP-адреса. .

Я видел ответы некоторых людей, что Интернет не поддерживает многоадресную рассылку. Но, поскольку я знаю, что VOIP является примером технологии многоадресной рассылки, мы можем реализовать многоадресную рассылку в Интернете.

Так в чем причина того, что получатель не может принимать пакеты? Что мне нужно сделать, чтобы изменить код для реализации многоадресной рассылки через Интернет?


person kangsouth    schedule 19.09.2017    source источник


Ответы (1)


Многоадресная маршрутизация сильно отличается от одноадресной маршрутизации. Многоадресная рассылка — это форма широковещательной рассылки, которая обычно не проходит через маршрутизаторы. Вы можете включить многоадресную маршрутизацию, но она должна быть включена (используя один и тот же тип многоадресной маршрутизации) на всех маршрутизаторах на пути, а это просто не может произойти в общедоступном Интернете. Публичный Интернет рухнет из-за многоадресной рассылки в плотном режиме, и ни один интернет-провайдер не собирается выделять ресурсы для разреженного режима.

Я не уверен, почему вы думаете, что VoIP использует многоадресную рассылку (это не так).

Если вы хотите выполнять многоадресную рассылку с одного сайта на другой через общедоступный Интернет, вы должны использовать туннель, поддерживающий многоадресную рассылку, например. ГРЕ. При этом ваши многоадресные пакеты будут заключены в одноадресные пакеты для передачи через общедоступный Интернет. Вы по-прежнему должны настроить маршрутизаторы на каждой стороне для поддержки многоадресной маршрутизации.

person Ron Maupin    schedule 19.09.2017