我文档由DEEPSEEK帮助编写
组播定义与特点
- 组播是“一对多”或“多对多”的通信方式,数据仅发送一次,网络设备自动复制并分发给组成员。
- 核心优势:节省带宽、降低服务器负载、支持动态成员管理。
- 与单播/广播的对比:单播需多次发送,广播全网泛洪,组播仅目标组接收
IP组播地址与协议
- 地址范围:IPv4中为D类地址(224.0.0.0~239.255.255.255),分为本地保留组播(如224.0.0.1)、全局组播和私有组播
关键协议:
- IGMP(组成员管理):主机与路由器间通信,管理组播组加入/退出。
- PIM(组播路由协议):构建分发树(源树或共享树),优化数据转发路径。
UDP多播监听
- 监听224.0.0.226的5589端口
- 使用enp1s0接口
- 监听多播UDP
package main
import (
"fmt"
"net"
)
func main() {
addr, err := net.ResolveUDPAddr("udp", "224.0.0.226:5589")
if err != nil {
panic(err)
}
iface, err := net.InterfaceByName("enp1s0")
if err != nil {
fmt.Println("获取接口失败:", err)
return
}
conn, err := net.ListenMulticastUDP("udp", iface, addr)
if err != nil {
panic(err)
}
defer conn.Close()
buffer := make([]byte, 1024)
for {
n, remoteAddr, err := conn.ReadFromUDP(buffer)
if err != nil {
fmt.Println("读取失败:", err)
continue
}
fmt.Printf("来自", remoteAddr, "的数据:", string(buffer[:n]))
}
}
UDP多播发送
发送 224.0.0.226:5589 UDP信息
package main
import (
"log"
"net"
)
func main() {
// 解析多播地址
multicastAddr, _ := net.ResolveUDPAddr("udp", "224.0.0.226:5589")
// 创建 UDP 连接
conn, err := net.DialUDP("udp", nil, multicastAddr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
// 发送数据到多播组
_, err = conn.Write([]byte("Hello Multicast Group!"))
if err != nil {
log.Fatal(err)
}
}
UDP监听
注意IP层 目标地址为224.0.0.226
对应mac地址为
规则
IP地址: 1110 yyyy.yxxx xxxx.xxxx xxxx.xxxx xxxx
MAC地址: 0000 0001.0000 0000.01011 110.0xxx xxxx.xxxx xxxx.xxxx xxxx
示例
IP地址: 224.0.0.226
1110 0000.0000 0000.0000 0000.1110 0010
MAC地址:
0000 0001.0000 0000.0101 1110.0000 0000.0000 0000.1110 0010
01:00:5e:00:00:e2
注意
注意下 上述代码需要关闭 防火墙
systemctl stop firewalld