组播(四)

2018年8月4日16:54:50 发表评论 392 views
 
组播笔记
多播地址
前4个比特总为: 1110
范围:224.0.0.0 ~ 239.255.255.255
MAC地址:采用保留的IEEE802地址  0100.5E00.0000
          第8个比特位为 I/G 比特,当为1时,表示是多播地址
将组地址的最后23bit映射到保留地址0100.5E00.0000 ,
注:其中有32个不同的D类IP地址能映射成相同的一个MAC地址

注:因为组地址已知,那么MAC地址也已知,所以在组播中是不存在ARP的

保留地址
224.0.0.0 ~ 224.255.255.255       保留给路由协议和其他网络维护功能
注:多播路由器不会把目的地址是该范围的数据包前转
224.0.0.1    子网中的所有系统
224.0.0.2    子网中的所有路由器
224.0.0.4    DVMRP路由器
224.0.0.5    所有OSPF路由器
224.0.0.6    OSPF指定路由器
224.0.0.9    RIP-2路由器
224.0.0.10   EIGRP路由器
224.0.0.13   PIM路由器
224.0.0.15   CBT路由器
224.0.0.39   Cisco-RP-Announce
224.0.0.40   Cisco-RP-Discovery

注:多播源不一定是接收它发送的流量的组中的成员

IGMP
è IGMP的TTL总为1(限制IGMP消息在本地网络)
è IGMP使用协议号 2
èIGMPv2消息:32比特

IGMPv2主机功能:                
Membership Report 消息
è 加入组或相应路由器Membership Query,
è 目的地址是要加入的组的组地址(该消息本身带有要加入的组的地址)
注:为了保证路由器能收到这个加入请求,主机会在短时间内发送1个或2个复制的报告RFC2236建议这个间隔为10s
               
Version 1 Membership Report 消息
è 为了向后的兼容性

Leave Group 消息       
è 当主机退出一个组时,发送该消息
è 该消息的目的地址是 224.0.0.2 (发向子网中的所有路由器,因为让路由器知道该主机退出
这个组就可以了)

IGMPv2的路由功能
General Query 消息
è 路由器通过该消息向所有与其连接的子网轮循来发现是否有组员存在
è 支持多播的路由器在子网中首先被激活,它认为自己是查询者,会立刻发送General Query
  为了快速发现子网中激活的组员,并通知给子网中可能存在的其他多播路由器
è 默认时间间隔为60秒
è 发向224.0.0.1  (子网中的所有系统)
è ip igmp query-interval 0 ~ 65535    // 修改General Query消息默认时间间隔
注:如果在2次查询时间间隔(2分钟)里没有收到Report消息,路由器将认为这个子网中没有组员
   卷2上说是3次查询间隔,但是在Cisco Document中说的是2次间隔
 
Max Response Time值
  è 规定了主机用Reports消息相应这个查询的最大等待时间
  è 默认为10秒
  è 这个值在Query消息中占8bit
  è ip igmp query-max-response 0 ~ 25秒  §修改路由器等待主机响应Query消息的最大等待时间

Group-Specific Query消息
è 当收到Leave Group消息时,为了确定子网中是否还存在组员,会向子网中发送该消息
è 目的地址为组地址(该消息中包含组地址)
è 路由器会每隔1秒发送2个Group-Specific Query消息  (发送几次???)
  为了防止Group-Specific Query被破坏或丢弃,造成主机无法相应该消息,导致路由器认为子网中没有组员

基于源的树
SPT:为每一个源建立各自的多播树

è 每个多播路由器都有一个多播前转表,该表里记录着(S.G)地址对
è (S.G)对里记录了多播源 / 多播组 / 多播下一跳路由器 / 上下游接口等
è 以与源直连的路由器为多播树的根
è 采用隐式加入
è 通过判断(S.G)对的上游接口和下游接口来防止环路
  从非上游接口收到的该组的多播流量会被丢弃
è 注:在MA网络中从下游接口收到这个组的流量,会向下游接口发送Assert消息
共享树
RPT:为每个组建立单独的多播树

è 共享树的多播前转表记录的是(*.G)对
è 以RP(Rendezvous Point)为共享树的根
è 采用显式加入(因为没有其他机制来防止环路)
注:当一个源要启用一个多播会话时,源向RP进行注册!
   源靠直连的路由器来判断到RP的最短路径,或者由RP来找出到每一个源的最短路径

共享树的问题
è 可能出现次优化路由
è 成为多播的瓶颈
è 会引入单点故障

加入方式
显式加入:由接受者发起,有组员来申请自己要加入某个组
隐式加入:由发送者发起

多播路由
多播路由的功能就是判断上游接口和下游接口以及动态的管理多播树

机制
RPB
Reverse Path Broadcast 反向路径广播
è 向除了上游接口以外的所有接口发送数据

TRPB
Trancated Reverse Path Broadcast  修剪的反向路径广播
è 通过IGMP发现与它直连的一个子网上没有组员,并且没有下一跳路由器时,就停止向该子网转发多播数据

RPM
Reverse Path Multicast 反向路径多播
è 通过判断与(S.G)相关联的上/下游接口,建立起反向多播树

RPF检查
è 当一个多播路由器收到一个多播包,会对这个多播包进行RPF检查。
è 如果这个多播数据包是从(S.G)对记录里的上游接口收到的,RPF检查通过,如果是从下游接口收到的RPF检查失败,这个多播包被丢弃

PIM
PIMv1  协议号 2    使用 224.0.0.2  IGMP不是使用协议号2吗?可能是记录错误!查一下
PIMv2  协议号103  使用 224.0.0.13
注:当使用PIMv2的路由器和PIMv1通信时,该端口被自动设置为PIMv1

PIM-DM
PIM-DM使用扩散与剪除建立多播树

使用的5个PIMv2消息:
Hello
Join / Prune
Graft
Graft-Ack
Assert

Hello消息:
PIMv2路由器使用Hello消息来发现邻居,并且周期性的在启动PIM的接口上发送Hello消息

è Hello消息的时间间隔默认为30s
Ip pim query-interval                 || 改变Hello消息间隔

è Hello消息的超时时间自动设置为interval的3.5倍

注: PIMv1使用Query消息!Query消息的interval和超时时间与PIMv2相同

Join / Prune消息:
使用该消息加入或从某个多播组将自己剪除

è 当一个下游路由器被剪除,在(S.G)对中针对连接被剪除路由器的直连接口启用一个计时器,当计时器超时后,将从新进行Flood过程(会在整个PIM域扩散)
 t 因为被剪除的路由器没有关于这个组的(S.G)对,所有收到这个组的流量时,会向除了上游接口以外的所有接口Flood

 Prune消息的覆盖:
                在一个MA网络,且有多台下游路由器,当其中一台路由器要将自己从这个多播组Prune,会向224.0.0.13发送这个Prune消息,当上游路由器收到这个Prune消息后并不立刻Prune这个接口,会设置一个3s的计时器,当另一台下游路由器收到Prune消息后,会立刻向上游路由器发送一个Join消息,这个Join消息将把Prune消息覆盖

Graft消息:
è 当一台路由器将自己从一个多播组中剪除后,收到子网中主机的Report消息,这时,路由器会以
单播发送Graft消息给上游路由器,上游路由器收到这个Graft消息后,将收到Graft消息的接口设置为前转状态,并立刻发送Graft-Ack消息给下游路由器

è 下游路由器发送Graft消息以后会等待Graft-Ack消息,等待时间为3s,若在3s内没有收到Graft-Ack消息,下游路由器将再次发送Graft消息给上游路由器

Assert消息
è 在MA网络,防止多台多播路由器向同一个MA网络同时前转同一个组的多播流量

单播路由的改变:
è 当单播路由发生变化导致多播树发生变化时,会重新计算RPF接口
单播路由表的变化影响到到多播源的路由,多播的路由表也将发生变化,那么到一个源的RPF将改变,这时,该路由器首先向原来的路由器发送一个Prune消息,再向新的路由器发送一个Join消息

   选举查询者只是为了弥补PIMv1没有查询功能的缺陷
注:è 查询者的选举:具有最小IP地址的路由器成为查询者
                    路由器收到其他路由器的General Query消息后,检查源地址,以选举查询者
  
è 非查询者在2个General Query消息时间间隔(120秒)内没有收到查询者的查询,会认为
查询者已经不存在,自己将成为查询者  
     Ip igmp query-timeout       § 修改等待Query消息的超时时间

PIM的前转路由器
为了避免在一个MA网络中,有多台多播路由器向该网络前转同一个组的多播流量而选举出一个前转路由器

è 当多播路由器从下游接口收到该组的多播包时,会向网络中发送Assert消息
  该消息包括:源和组的地址、到源单播路由的Metric和发现这条路由的单播路由协议的distance

前转路由器的选举:
? 最低的distance
? 最低的Metric
? 最大的IP地址

注:前转路由器继续向该网络转发多播流,其他路由器会将这个接口从下游接口中删除

PIM-SM
使用的7个PIMv2消息:
Hello
Bootstrap
Candidate-RP-Advertisement
Join / Prune
Assert
Register
Register-Stop

Hello
于PIM-DM相同

Bootstrap
è 宣告C-BSR的优先级和BSR IP地址
è 更新周期60s
è 使用地址:224.0.0.13
è TTL=1

Candidate-RP-advertisement
è 该消息由C-RP单播向BSR传送,包含RP地址、担当C-RP那个组的组地址和优先级

Join / Prune
与PIM-DE相同

Assert
与PIM-DE相同

Register
è 由与源直连的路由器封装多播组流量
è 单播发送的RP

Register-Stop
è 由RP发出,来通知源DR停止在Register消息中封装多播包

查找RP
      è 静态配置
è 使用开放的标准协议来指定和宣告RP
è 使用Cisco私有的自动RP协议来指定和宣告RP

自举协议
        è 为了运行选举协议,C-BSR和C-RP在网络中使用管理方式指定(手工指定)
        è C-BSR和C-RP使用IP地址来识别自己(建议使用loopback口地址)
           ip pim bsr-candidate Loopback0 0 10 ||   配置C-BSR
           第2个0是hash掩码的长度(用途未知)
            10是C-BSR的优先级,默认为0

        ? 每个C-BSR分配一直优先级1 ~ 255 默认是0和一个BSR IP地址,并启动自举计时器超时时间为150s,同时开始监听Bootstrap消息(监听地址224.0.0.13)
        ? 收到Bootstrap消息,比较优先级和BSR IP地址
                      ? BSR:  每60s发送一个Bootstrap消息
                      ?C-BSR:重设自举计时器(计时器超时,就认为自己是BSR)
                             è收到Bootstrap消息后,会向除了收到消息的接口外的所有接口发送Bootstrap消息,确保整个PIM域都知道BSR的位置
        ? C-RP收到Bootstrap消息后,获取到BSR的位置,单播向BSR发送Candidate-RP-Adversement
           BSR向整个PIM域宣告RP集(BSR将所有C-RP信息整理成RP集)
       ip pim rp-candidate Loopback0 group-list 10 interval 20 priority 30
Access-list 10 permit 239.1.2.3
将loopback0的地址做为RP地址,切仅做为组239.1.2.3的RP,C-RP向BSR发送
Candidate-RP-Adversement

RP的选举
        ? 如果组中只有一个C-RP,这台路由器被选举为RP
        ? 如果组中存在多个C-RP,选举优先权低的路由器成为RP
        ? 若优先级相同,则运行一个hash函数,结果最大的成为RP
        ? 若返回的值相同,则IP地址最大的路由器成为RP

   注:使用hash函数的原因是hash掩码允许连续组的地址号映射到同一个RP上(??????)
hash函数输入的是 组的前缀、hash掩码和C-RP地址

自动RP协议
          è Cisco私有协议
          è RP映射代理是指定的,而非选举出来的
          è RP映射代理将组映射到RP,而不是宣告RP集,并在全网分布式的选择RP
          è 使用地址:224.0.0.39和224.0.0.40

RP-Announc消息:
              è 当一台多播路由器被配置成一个或多个组的C-RP,它在RP-Announce消息中对自己和多播组宣告它是C-RP
              è 更新周期 60s
              è 目的地址:224.0.0.39
C-RP:
è 向多播地址 224.0.0.39发送RP-Announce消息,更新周期为60s

   RP映射代理:
               è 在地址 224.0.0.39监听RP-Announce消息,从而获取C-RP信息
               è 从C-RP中选出RP(IP地址最大的)
               è 向多播地址 224.0.0.40发送完整的组到RP的映射,周期为60s

PIM-SM和共享树
               è 当DR收到组员的Report消息,检查多播表是否有这个组的条目
                  有:将收到Report消息的接口做为输出接口加入到这个条目中
                  无:? 建立(*,G)对,将输出接口加入条目,并查找组到RP的映射
                                                      Show ip pim rp mapping
                      ? 在单播表中查找到RP的路由,将到RP的接口加入到输入接口
              è 向组地址 224.0.0.13发送Join / Prune消息
? 这个消息包括要加入组的地址和RP的地址,Prune部分为空
                 ? 这个消息设置标志通配比特(Wc-比特)和RP树比特(RPT-比特)
                    ? WC-比特:1表示这个加入地址是一个RP地址,而不是源地址
                    ? RPT-比特:1表示这个消息顺着共享树传到RP
                                                                                 
             è 上游路由器收到Join / Prune消息会有下列4种情况中的一种动作
                ? 不是RP,在多播树上:把收到Join / Prune消息的接口加入到输出接口列表中
                ? 不是RP,不在多播树上:建立(*,G)条目,并向RP发送join / Prune消息
                ? 是RP,有这个组的条目:把收到Join / Prune消息的接口加入到输出接口列表中
                ? 是RP,没有该组的条目:建立(*,G)条目,将收到Join / Prune消息的接口加入到
                                          输出接口列表中
注:(多播组从RP的成员请求建立的多播树不一定有多播源)
            è 当建立了共享树,多播路由器向上游路由器每60s发送一次Join / Prune消息做为存活保持
ip pim message-interval    || 改变Join / Prune消息发送时间间隔
               超时时间是message-interval的3倍
                  注:PIM-SM也存在Prune覆盖

源的注册
       è PIM-SM路由器首次收到直连的源发出的多播流量,会查找组到RP的映射,来获取RP地址
       è 将多播包封装在Register消息中,单播发送给RP
       è RP收到Register消息,去除封装
          ? 组已存在:
? 将多播包备份从所有输出端口发送出去,并建立(S,G)对
                       ? 通过Join / Prune消息与源DR之间建立SPT
                       注:该消息包括多播源的地址,WC-比特=0、RPT-比特=0
          ? 组未存在:建立(*,G)对
      注:若多播源开始向RP发送多播流量,但组内没有组员时,RP不会和源DR建立SPT树,并且
          向源DR发送Register-Stop消息。有组员加入后才会和RP建立SPT
注册抑制
为了防止源DR继续向一个无效RP发送多播数据

      è 当源DR收到Register-Stop消息后启动一个60s的抑制计时器
      è 当计时器超时5s前,源DR发送标示了空注册比特的Register消息(该消息不封装任何包)
         若这个消息触发RP发送一个Register-Stop消息,将刷新抑制计时器

PIM-SM和最短路径树
PIM允许连着组员的路由器 建立到源DR的SPT来减少拓扑中的低效因素

è 路由器向RP发送Join消息,加入多播组
è 当多播包到达后,检查多播包的源IP地址,通过查询单播路由表,发送从另一个接口达到源DR更近
è 向源DR发送Join消息,在2个路由器之间建立SPT
è 向RP发送Prune消息,将自己从这个多播组中Prune
RPT到SPT的切换
                 ? Cisco默认从RPT上收到某一个(S,G)组的包,立刻加入SPT
                 ? ip pim spt-threshold  k(bit/s)   || 改变RPT到SPT的切换阀值
                 ? 防止STP到RPT的切换使用命令 ip pim threshold infinity
                 注:当路由器切换到SPT,如果组播流量的速率低与阀值的时间超过60s,路由器将尝试切换回RPT

Command
è show ip mroute       || 查看多播表
è ip multicast-routing    || 启用多播路由支持

Auto-RP
è 配置候选RP
  ? ip pim send-rp-announce e0/0 scope 16 group-list 110 interval 30
    Access-list 110 permit 224.10.10.10
    将接口e0/0的地址做为RP的地址,设置多播范围为TTL=16,使用ACL来限制做为那些组的RP,
并改变RP-Announce消息的发送时间间隔未30s
è 配置映射代理
  ? ip pim send-rp-discovery e0/0 scope 16
    将接口e0/0的地址做为映射代理的地址,设置TTL=16
    注:? 接口e0/0必须要配置PIM-SM,否则映射代理不能工作
? 但是C-RP使用的接口不需要配置PIM-SM

ü 当路由器配置成C-RP时,它开始向224.0.0.39发送RP-Announce消息,时间间隔为60s
  当3倍的发送间隔180s未收到C-RP消息,映射代理会认为该RP死亡,会重新选出RP

ü 映射代理监听地址224.0.0.39来获取C-RP的Announce消息,并选择出RP(最大的IP地址)
  并通过RP-Discovery消息向PIM域通过RP地址,时间间隔为60s
  默认是向224.0.0.0/4通告RP-Discovery消息(该地址是所有多播组)
注:若RP发生故障,映射代理会自动切换RP,并向整个PIM域通过新的RP地址

è RP公告过滤
 ? ip pim rp-announce-filter rp-list 1 group-list 22
   Access-list 1 permit 10.10.1.1
   Access-list 1 permit 20.20.2.2
 Access-list 22 permit 224.10.10.10
仅接收rp-list定义的C-RP发送的且仅做为224.10.10.10这个组的RP-Announce消息才会被映射代理接收
这个要做一下实验

IP PIM nbma-mode
当帧中继使用点到点子接口的时候就和一个串行口只接一台设备一样,不存在问题
当帧中继的多点子接口有多条PVC的时候,
关于Auto RP:
            因为C-RP是向地址224.0.0.39发送RP-announce消息,如果RP的映射代理是另一个Spoke
端,那么Hub端的路由器是不会将目的地址是224.0.0.0-224.255.255.255的多播包前转的
这时,RP的映射代理就不会收到C-RP的RP-announce消息,同样的RP映射代理的
RP-discover消息也不会被Hub端路由器前转
关于BSR:在BSR中C-RP是单播向BSR发送C-RP消息,但是前题是C-RP要知道BSR的位置,这个
         前提是通过C-RP监听224.0.0.13这个地址来获取BSR的bootstrap消息来获取BSR的地址,
那么如果一个Spoke端是BSR,那么C-RP怎么通过bootstrap消息获取BSR的位置???
这个需要再查一下文档

关于PIM的Prune消息:
                    当一个Spoke端发送Prune消息到Hub端,这时,另一个Spoke端的接受者将无法
                    接收到这个Prune消息,那么就不存在Prune消息的覆盖,Hub端路由器会将这个
                     多点子接口从输出接口列表中删除,另一个Spoke端的接受者将接收不到这个组
                     的流量
解决方法:
       使用命令 ip pim nbar-mode
       当Hub端接收到Spoke端的Join消息的时候会Track这个spoke端的IP地址,当这个spoke端
发送Prune的时候就不会影响另一个Spoke端,但是这个方法的缺点是,当有很多Spoke端的时候,Hub端路由器会为每个Spoke端复制一份这个组的多播流量,可能会产生瓶颈

注:ip pim nbar-mode仅支持sparse模式,因为它依赖于sparse模式的join消息(来源为cisco文档)
  疑问:PIM dense模式也有Join消息,为什么不支持dense模式?
        这个命令仅依赖于Join消息来Track组员的IP地址吗?

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: