广域网 udp 组播如何发送数据?

56 天前
 dyllen

刚看 udp 组播,写了个 demo ,组播地址是 224.0.0.250 ,监听端口是 9985

发送方代码

func stdlibClient() {
	ip := net.ParseIP("224.0.0.250")
	srcAddr := &net.UDPAddr{IP: net.IPv4zero, Port: 0}
	dstAddr := &net.UDPAddr{IP: ip, Port: 9985}
	conn, err := net.DialUDP("udp", srcAddr, dstAddr)
	if err != nil {
		log.Println(err)
	}
	defer conn.Close()
	conn.Write([]byte("hello"))
	log.Printf("stdlibClient <%s>\n", conn.RemoteAddr())
}

我在想 dstAddr 指定的是组播的地址,如果接收方在广域网上,他是如何找到对方的?又没有指定对方的公网 IP 。

2690 次点击
所在节点    Go 编程语言
35 条回复
lambdaq
56 天前
@opengps 但承载业务的流量并不会因此变少啊。都改走单播了不是。
opengps
56 天前
@lambdaq 组播是在最后一个网段交换机处分散给多个目标地址吗?如果这样的话就没有我考虑的带宽不够用问题了
wolongzb
56 天前
@lambdaq 组播本身承载与 UDP 数据包中,UDP 协议本身是不可靠的,没有确认机制,不会重发。
kenvix
56 天前
@dyllen #9 是的,裸组播是没办法在广域网路由的,只能封装。可以考虑用 Zerotier 等 VPN 封装一下再合理配置组播路由就可以了
kenvix
56 天前
@dyllen #9 另外 L2 VPN 可以避免配置 IGMP 和组播路由,L3 VPN 则需要配置
kenvix
56 天前
@lambdaq #19 你说的东西是 L4 的东西。IP 单播也不管丢包啊。这种问题 L4 去解决,组播有 PGM 协议
dyllen
56 天前
@NewYear 你说的我可能会疑惑的地方我并不会疑惑,我只是看到组播理论上可以广域网,实际又没找到相关代码,就问问。
dyllen
56 天前
@NewYear 我没啥需求,纯粹是在研究 go 里面是怎么写 udp 的。
lambdaq
56 天前
@wolongzb @kenvix 所以组播这种发一堆包可能丢几个,接收方 head of line blocking 了怎么办。。。?感觉这协议用处不大,除非就是语音 视频这种丢几帧无所谓的

@opengps 我大概明白了。节约了上传者的带宽。。好像有点道理。
dyllen
56 天前
@lambdaq udp 本来就是用在对丢包不敏感的场景下的,像语音,丢了就信号不好,叫对方重新说。
GeekGao
56 天前
运营商的家庭网线路,没有对一般客户开放组播路由协议(如 PIM 、DVMRP 、MOSPF 等),所以你是播不了的。只能在你自己的局域网里耍。
tywtyw2002
56 天前
组播?
你先读一读 TCP/IP 路由技术,然后再去读一读 IP 组播

公网?业务上级路由器交换机都不配置组播,你组播包,进去就直接丢弃处理。

局域网的话,组播也要配置,交换机要根据组播 mac 地址做剪枝的。不配置的话组播没法进行。
UN2758
55 天前
@NewYear #11 「组播本质上就是在局域网使用的,不会通过路由器转发。因为它是基于“广播包”的特性来实现的。广播包绝不会经过路由器,否则随随便便全网就崩了」,有点没看懂,组播不通过组播路由表怎么转发???
pagxir
55 天前
@UN2758 #33 所以这话里面包含了错误,错误的将网络广播跟链路广播混一起了。虽然两者会有映射关系但并不等同。组播同理
sztink
50 天前
1. 发送方不需要加入多播(也叫组播)组,可以直接发送消息
2. 接收方需要加入多播组中,才能接收到消息。多播是支持广域网的,现实中限制条件太多,更多的用在局域网。

欲了解详细的基础知识可以看《 UNIX 网络编程 卷 1:套接字联网 API 》一书。这里有这本书的笔记: https://note.cyub.vip/unp-v1/

Go 语言可以参考 ssdp 协议的 go 实现: https://github.com/koron/go-ssdp/blob/main/internal/multicast/multicast.go#L68-L91

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1059679

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX