组播与UDP

sin 2025-04-01 PM 103℃ 0条

我文档由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
标签: none

非特殊说明,本博所有文章均为博主原创。

上一篇 MySQL触发器、事务以及FastJSON漏洞
下一篇 没有了

评论啦~