网络笔记_IGMP Snooping

技术背景

二层中组播数据转发的数据
  • 组播数据在二层被泛洪,造成:
    • 网络资源浪费
    • 存在安全隐患
 
 
 

IGMP Snooping概述

  • 解决组播报文在二层泛洪的问题

  • 运行在 数据链路层,是二层交换机上的组播约束机制,用于管理和控制组播组
  • 通过 监听IGMP报文, 建立组播MAC地址表
 
 
 
下图中:
路由端口表示上游接口(接收组播源数据)
成员端口表示下游接口(对组播数据进行分发)
 
 
端口角色
作用
如何生成
路由端口
接收组播数据
上游端口
  • 收到源地址不为0.0.0.0的IGMP普遍组查询报文或PIM Hello报文的接口都将被叫做 动态路由器端口
  • 手工配置的路由器端口叫做 静态路由器端口
成员接口
发送组播数据
下游端口
  • 收到IGMP Report报文的接口,叫做 动态成员端口
  • 手工配置的成员端口叫做 静态成员端口
 
 

IGMP Snooping工作原理

  • 启用IGMP Snooping机制后,查询响应仅向路由器接口转发
  • RTA作为查询器,周期性的发送普遍组查询,该报文被广播到交换机所有端口,包括与交换机内部与CPU直连的端口0,交换机CPU收到查询报文后,判断1口为路由口。
  • 主机B希望加入组播组224.1.2.3,因此以组播方式发送一个IGMP的报告报文,报告中具有目的MAC地址为0x0100.5e01.0203。最初交换机中并没有该MAC地址对应的表项,所以就将该信息广播到交换机的所有端口,包括与交换机内部CPU直连的端口0,;当CPU收到主机B发送的IGMP报告时,CPU利用IGMP报告中的信息建立了一个转发表项,该表项中包括主机B的端口号,连接路由器的接口号和连接交换机内部CPU的接口号
  • 由此得,交换机形成的转发表项:MAC地址为0100.5e01.0203,对应的组播端口与为0、1、3,且不向其他端口发送
  • 后续,如主机C申请加入组播组224.1.2.3的话,将发送一个IGMP报文,CPU收到该报文,将在转发表项MAC地址为0100.5e01.0203增加一个端口4
  • 如主机C申请退出该组,将发送一个退出组的报文,RTA会发送两个确认报文,此时只有3端口进行回应,那么交换机转发表项的MAC地址为0100.5e01.003的端口会将4端口删除,仅留下0/1/3端口。
 
 
 

配置

命令

备注

igmp-snooping enable

开启IGMP-Snooping,系统模式配置

vlan ×

    igmp-snooping enable

开启VLAN下的IGMP-Snooping

display igmp-snooping port-info

验证IGMP-Snooping

display igmp-snooping router-port vlan ×

查看端口下IGMP-snooping状态

 
 
 
 
 
 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
IGMP Snooping是一种用于在局域网中提供基于组播的网络服务的协议,它通过监听和学习组播流量中的IGMP消息,来动态地维护一个组播组信息表,以实现组播流的有效传输。下面是一个开源实现IGMP Snooping的示例代码: ```Python import socket import struct IGMP_ALL_HOSTS = "224.0.0.1" # 组播组地址,所有主机都可以加入的组播地址 class IGMPSnooping: def __init__(self): self.socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IGMP) self.socket.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1) def join_group(self, group_addr): membership_request = struct.pack("4s4s", socket.inet_aton(group_addr), socket.inet_aton("0.0.0.0")) igmp_packet = struct.pack("!BBH4s", 0x11, 0x01, 0, membership_request) self.socket.sendto(igmp_packet, (IGMP_ALL_HOSTS, 0)) def leave_group(self, group_addr): membership_request = struct.pack("4s4s", socket.inet_aton(group_addr), socket.inet_aton("0.0.0.0")) igmp_packet = struct.pack("!BBH4s", 0x11, 0x02, 0, membership_request) self.socket.sendto(igmp_packet, (IGMP_ALL_HOSTS, 0)) def process_igmp_packet(self): igmp_packet, address = self.socket.recvfrom(1024) igmp_type = struct.unpack("!BBH4s", igmp_packet[:8])[1] if igmp_type == 0x11: # IGMP报文类型为Membership Query # 处理Membership Query消息 pass elif igmp_type == 0x12 or igmp_type == 0x16: # IGMP报文类型为Membership Report或Leave Group # 处理Membership Report和Leave Group消息 pass def run(self): while True: self.process_igmp_packet() igmp_snooping = IGMPSnooping() igmp_snooping.join_group("239.255.0.1") # 加入组播组 igmp_snooping.run() ``` 以上示例代码使用Python编写,并通过socket库实现了IGMP Snooping的功能。代码中定义了一个`IGMPSnooping`类,其中的`join_group`和`leave_group`方法用于加入和离开组播组,`process_igmp_packet`方法用于处理接收到的IGMP报文。最后通过调用`run`方法来开始监听和处理IGMP报文。请注意,在执行此代码之前,需确保用户对相关资源拥有合适的权限。虽然此示例仅实现了IGMP Snooping的基本功能,但可以根据实际需求进行扩展和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xxaafwqrtjmuio12850

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值