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

54 天前
 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 。

2686 次点击
所在节点    Go 编程语言
35 条回复
tool2dx
54 天前
组播好像是要发送 IGMP 包,用 IP_ADD_MEMBERSHIP 加入才行。
b821025551b
54 天前
组播,需要加组的啊,通过 IGMP 协议进行组内设备管理,你这里当然只管发送就行了。
kenvix
54 天前
你对网络路由的理解有一些问题,组播路由是组播路由,单播路由是单播路由。

然后答案是不可能,你发不出去。因为广域网没有路由组播地址。
kenvix
54 天前
@kenvix #3 如果一定要组播,必须要用 VPN 承载流量,封装到单播里面。IPV4 广域网只路由了单播地址
julyclyde
54 天前
广域网就基本别想了
IGMP 协议、acl 都没开放的
cnbatch
54 天前
想要使用组播,是需要事先在路由器里面做好配置才行的,并不是发送方说了算

想要在广域网发送组播,意味着需要修改广域网路由器的设置,然而这些路由器是运营商的,普通用户哪能改得了
pagxir
54 天前
需要组播路由,需要中间设备支持 igmp snooping. 终端设备发送 IP_ADD_MEMBERSHIP 请求加入主播组,中间设备就会一级级上报创建一条组播路由,当发送的时候路由器根据创建的组播路由表逐个网口进行转发,最后到终端。这就是 IPTV 直播的技术基础
dyllen
54 天前
@kenvix
@cnbatch

就是说 ucp 组播说是可以广域网,实际基本也就是只能局域网了吗?
dyllen
54 天前
@julyclyde
@cnbatch
就是说 ucp 组播说是可以广域网,实际基本也就是只能局域网了吗?
julyclyde
54 天前
@dyllen 技术上并没禁止广域网,但运营商在实际业务中禁止了
NewYear
54 天前
组播本质上就是在局域网使用的,不会通过路由器转发。因为它是基于“广播包”的特性来实现的。广播包绝不会经过路由器,否则随随便便全网就崩了。。。。如果你的使用场景不是这个,那麻烦你使用 TCP 、UDP 协议(客户端 IP 、服务器 IP)方式使用。。。不要想当然。

如果你非要经过路由器,那么麻烦你写个代(敏感词)理,收包的时候转发到互联网,也可以使用一些例如 VP(敏感词)N 、代(敏感词)理、内网穿透等技术,转到对方的局域网。

可能你很难理解,为什么是这样……这解释起来太费劲了,只能说每个协议有每个协议的特性。

另外你可能会问。224 这个网段明明不是局域网 IP ,凭什么不能经过路由器?这是因为操作系统和路由器上面都写死了啊,这个网段它就不可能被转发。(除了少数系统没有遵守这个标准)


估计这段话你还是看不懂……建议你还是直接使用 TCP 协议吧,UDP 协议是很简单的协议,但是涉及到组播,就要懂一些网络基础才能理解,否则就会满脑子疑惑为什么不按你的想法来。
julyclyde
54 天前
@NewYear 我觉得你还是再学习一下吧
NewYear
54 天前
你可以想象一下,你的路由器上层就是互联网了(虽然物理上还在机房,但逻辑上已经是互联网了),整个互联网的组播包都访问 224.0.0.250 ,你觉得 224.0.0.250 这个 IP 应该属于谁?谁家服务器扛得住?不是瞬间就爆炸了么。

哎,解释多了也没用,你研究这个也不会研究出结果。。。。。你试着用 TCP 实现你的需求吧,如果实现不了,就用 VP(敏感词)N 或者内网穿透技术,一定能解决你的问题。如果解决不了,那就是你缺少资源,比如你在互联网上没有服务器,也没有自己的公网 IP ,那就想太多了。。。。

对了,也可以用第三方服务器,比如 MQTT 协议,这种有免费的第三方服务器。
pagxir
54 天前
@NewYear #11 一段话里面就出了两个错,我也觉得你好好回去看协议。
NewYear
54 天前
@julyclyde

你上来贬低人显得你很懂吗?

我的帖子是回复给楼主的,可能不是那么的牛逼,也只是尽量在解答问题。不是为了和你比拼谁的技术更高。我很乐意从别人的回复中学到一些东西,也很乐意别人指正我写错了什么。但是不是为了和谁吵架。

不用回我了,不是技术交流我不会浪费时间回,谢谢。
NewYear
54 天前
@dyllen

楼主,建议你重新描述一下,你实际的需求是什么样的(构思的也可以),什么样的场景,传输的内容是什么类型的(如大小、频率)。

大家可以直接帮你推荐一个协议或者解决方案,以免用错了协议然后在错误的方向一直绕圈,从你的主题看,你应该是用错协议了。
NewYear
54 天前
仔细想了一下,学组播协议是之前很久了,有的细节忘记了,好像是有些冲突的地方,不好意思了。不过使用场景还记得,看楼主的用法确实不太合适。

还是从需求的角度考虑用什么吧,要不然大家的回答都是“这样不行”,“那样也不行”,不如重新提一下“需求是什么”,这样大家直接帮你找到答案了。
skykk1op
54 天前
运营商的 IPTV 就是采用了组播流量,但网络中需要路由器配置 pim-sm 、igmp 加入组等功能。
普通用户别想了
lambdaq
54 天前
组播这事我事一直有点没搞懂。比如有个终端一直丢包,这个路由器会负责重发吗?还是丢了就丢了。

如果路由器这点都不管,那组不组有啥区别。。。
opengps
54 天前
如果非局域网开放了广播,那现有的带宽哪够转发 udp 数据的,所以广域网下屏蔽了广播

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

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

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

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

© 2021 V2EX