为什么要使用组播: 
1、当需要发送相同的数据去往多个接收者 
2、有效的节省带宽 
3、减少主机和路由器的处理进程,减轻工作量 
4、当接收者的地址是未知的 
5、实时性,当接收者要求能够同时收到数据
单播、广播、组播的区别 
1、单播发向一个特定的目标节点 
2、广播发向网络上的所有节点 
3、组播发向网络上的一组特定的用户Multicast is UDP based 组播是基于UDP的 
由于组播是基于UDP的,所以继承了UDP的缺点 
1、只能是尽力而为的传输,传输无保证 
2、没有拥塞避免机制,不像TCP有windows窗口 
3、会产生重复的报文 
4、无序的、UDP包没有序列号 
组播应用的类型: 
1、一对多 
2、多对多,例如网络会议、共享白板 
3、多对一 
<RTP> 
实时传输协议,用来解决UDP的无序性 
端口号:16384-32767 
RTP-实时传输协议real-time 
RCTP-实时控制协议 
先封装RTP,再封装UDP 
20byte        8byte        12byte                 
IP        UDP        RTP        Vlice payload         
组播模型: 
两个术语: 
1、第一跳路由器 
2、最后一跳路由器 
组播分类: 
1、域内组播协议 
  例如:PIM、DVMRP、MOSPF、CBT 
2、域间组播协议 
  例如:MBGP、MSDP 
<Multicast> 
·一个发送方同时将信息传输给一组接收方: 
 1.将公司信息发送给所有雇员 
 2.广播视频和音频,包括用于远程学习和交互式视频 
 3.从中央数据仓库将数据传输给多个部门 
 4.将股票报价传递给经纪人 (保证同时收到,不能一个先收到一个后收到) 
·路由器不转发广播包, 
 如果目的是发往非本子网的其他主机,广播做不到。 
<Multicast Address> 
           ? 
保留的链路本地地址:224.0.0.0 - 224.0.0.255 
   保留给本地网段上的网络协议使用。路由器不转发目标地址为这段地址的数据包。 
   TTL=1 (FR Hub & Spoke 中。Spoke端不能建邻居) 
本地链路上: 
224.0.0.1   子网中的所有主机和路由器 
224.0.0.2   子网中的所有路由器(HSRP) 
224.0.0.5   所有ospf路由器 
224.0.0.6   ospf中的DR和BDR 
224.0.0.9   RIP 
224.0.0.10  EIGRP 
224.0.0.13  PIM路由器 
全局范围地址:      224.0.1.0 - 238.255.255.255 
   公司可以使用这段地址在组织之间和通过Internet以组播方式传输数据。 
   指定源多播地址:  232.0.0.0 - 232.255.255.255 
   此段地址被保留给SSM(指定源的多播)使用。SSM是PIM的一种扩展。 
   GLOP地址:        233.0.0.0 - 233.255.255.255 
   这段地址和AS号对应。 
   例:AS62010的16进制表示为F23A,F2的十进制242,3A的十进制58, 
       所以子网233.242.58.0/24被全局保留,供AS62010使用。 
除以上两段地址以外的公网组播地址需要单独申请。 
有限范围地址:      239.0.0.0 - 239.255.255.255这段地址不能在公网上路由 
   使用这些地址的组播被限定在本地或组织内。公司、大学和其他组织使用有限范围地址来进行本地组播。 
   与Internet相连的边缘路由器不会将这段多播地址帧转发到外网。 
R1(config)#access-list 100 deny ip any 224.0.0.0 15.255.255.255 
224.0.1.1   NTP 
224.0.1.39  RP-Announce 
224.0.1.40  RP-Discovery 
<组播IP和MAC的对应> 
一个mac地址总共有6字节,48位,被分成两段:前3字节和后3字节,前3字节用于标识网卡的制造厂商,其中第40位(第一字节的最低位)用于标识组播,所以在网卡的mac地址中必须置0,后3字节是厂商内部使用的序列号。一个组播IP地址映射成mac地址的规则是:前三字节强制置01:00:5E,后3字节中,第23位置0,0-22位放入IP地址的0-22位。 
                    (组播MAC地址的前25位固定) 
IP地址的最后23位被映射到MAC地址的最后23位,导致可能有32个组播地址对应一个MAC地址 
0000,0001 0000,0000 0101,1110 0000,0000 0000,0000 0000,1010 
         24位                0             23位 
  01        00        5E        00        00        0A 
<多播IP地址相对应的MAC地址> 
                   ? 
              ? 
      
          ? 
----------------------------------------------------------------------------------------- 
<IGMP(Internet Group Management Protocol)> 
·IGMP报文封装在IP包中,Protocol NO.=2  / TTL=1(TTL=1证明IGMP只会在本地链路上传输,就是说只于最后一跳路由器通信) 
IGMPv1(hold time :180second): 
只有两种报文-- 
 1.Query包   每60秒发一次 由路由器发向224.0.0.1(所有节点)DIP:224.0.0.1 GROUP:0.0.0.0(IGMP包中字段标明) 
 2.Report包  主机回应Queries或主动发  DIP:224.1.1.1(发向组地址可以抑制其它主机report报文,路由器只要运行了组播就在接口上默认加入所有的组,那么保证了路由器可以收到组地址)  GROUP: 224.1.1.1 
·IGMP-V1没有查询者机制,要靠上层的PIM选出查询者 
·查询的间隔响应时间--默认最大为10S,以1S为单位,当主机收到路由器的查询后,它必须在这个时间以内回应,为了防止大家同时发送回应报文导致冲突,每一个主机会随机选择一个不同的回应时间。 
·在MA网络上只要有一个主机回应report包就可以了,它在回应的同时也抑制了其它组员的report包,因为没必要大家都发,只要有一个组员,路由器就会将多播发下来。 
·IGMP没有离组消息,称之为静悄悄的离开,路由器连续发三次query包,都没人回应就停止发该组的消息,也即180S之后holdtime到时,才停止发送该组的数据流。 
IGMPv2: 多了一个查询者的概念和以下两种消息 
1.指定组查询消息Group-specific query  DIP: 224.1.1.1 GROUP:224.1.1.1 
2.离组消息Leaving a Group  DIP: 224.0.0.2 GROUP:224.1.1.1 
查询者:当有多个路由器在同一个网段时,用查询包来选出查询者(比最小IP地址),查询者老化时间默认是120S(IGMP V2自带查询者机制,不需要PIM) 
主机响应查询者查询的时间(回退时间)--默认10S,以0.1S为单位 
IGMP有离组消息Leaving a group 发向所有路由器 
路由器由到离组消息后,会马上发出指定组查询消息group-specific query看本组还有没有组员,而不是路由器收到什么组播流量特定查询什么组。(指定组查询默认发两个,1s发一个,当第二个发出的查询没有收到主机回复的时候,就断开相应组流量) 
实验: 
? 
R1(config)#ip multicast-routing       开启多播路由协议 
R1(config-if)#ip pim dense-mode 
R1/R2#debug ip igmp (查看加组和离组消息) 
R2(config-if)#ip igmp join-group 224.1.1.1        使R2加入"224.1.1.1"的组 
ip igmp query-interval 30   修改查询间隔时间,改了后查询者超时时间也会自动变化大2倍 
ip igmp querier-timeout 120  修改查询者超时间隔,默认是120S 
ip igmp query-max-response-time 10  最大查询响应间隔时间 
ip igmp last-member-query-count 3   路由器修改发送指定组查询消息的次数,默认2次 
ip igmp last-member-query-interval 2000  修改发送指定组查询消息的间隔,默认是1000ms,这个值乘上次数就得到路由器等待的最大时间 
比如本例3*2000=6000ms 也就是说在6S内没人回应,路由器就去掉这个组,不再把这个组的流量播下去。 
R1#show ip igmp groups [detail]             查看谁加入了哪个组 
IGMP Connected Group Membership 
Group Address    Interface                Uptime    Expires   Last Reporter 
224.0.1.40       Ethernet0                00:03:10  00:02:58  10.1.1.1 
224.1.1.1        Ethernet0                00:03:10  00:02:58  10.1.1.2 
R1#show ip igmp interface ethernet 0 
Ethernet0 is up, line protocol is up 
 Internet address is 10.1.1.1/24 
 IGMP is enabled on interface 
 Current IGMP host version is 2 
 Current IGMP router version is 2 
 IGMP query interval is 60 seconds      
   (#ip igmp query-interval 60)每60S发送Query。"query-interval"乘以2等于"querier-timeout" 
 IGMP querier timeout is 120 seconds     
   (#ip igmp querier-timeout 120)  非查询者在120S内没有收到查询者的包,自己充当这个角色。 
 IGMP max query response time is 10 seconds   
  (#ip igmp query-max-response-time 20) 查询包中的字段,告诉主机回应Report的最大响应时间(回退时间). 
 Last member query count is 2(特定组查询的次数) 
 Last member query response interval is 1000 ms(特定组查询的间隔时间) 
 Inbound IGMP access group is not set 
 IGMP activity: 5 joins, 4 leaves 
 Multicast routing is enabled on interface 
 Multicast TTL threshold is 0 
 Multicast designated router (DR) is 10.1.1.1 (this system) 
 IGMP querying router is 10.1.1.1 (this system) 
    网络中如果有多个路由器发Query,选举IP地址小的作为发送查询者。 
 Multicast groups joined by this system (number of users): 
     224.0.1.40(1) 
Show ip mroute    查看多播路由表 
R1#debug ip igmp  开启debug,演示离组消息 
------------------------------------------------------------------------------------------ 
二层组播: 
<CGMP(Cisco Group Management Protocol)>    
在路由器和交换机上都要配,用于控制二层交换机如何转发多播流量,CISCO私有的 
for 2900支持 
R3(config-if)#ip cgmp              在R3的某个接口起CGMP 
SW3#show cgmp                      2900交换机默认已起用CGMP,3550和2950不支持 
SW3(config)#cgmp                   在交换机上起cgmp 
路由器会向交换机发送一个CGMP的消息,包含以下内容: 
Group Destination Address (GDA) 组MAC地址 
Unicast Source Address (USA)  单播源地址 
Debug ip cgmp 
<IGMP Snooping>   
开启了IGMP Snooping就取消了抑制了report包的机制,否则无法确定要将组播转发到哪些端口,只好泛洪。 
只要配置交换机,业界标准 
正常情况下,交换机只看二层头部,不看三层头部,但是在IGMP的snooping中,交换机看到了三层头部。 
交换机通过截获主机发出的report包和离组包,就可以知道哪个接口加入了组或离开了组 
Show mac-address-table multicast  查看交换机多播MAC表 
Sw1(config)#ip igmp snooping 
Sw1(config)#ip igmp snooping vlan 1          基于VLAN 1 起用IGMP的SNOOPING 
SW1#show ip igmp snooping 
SW1#show ip igmp snooping groups 
2950,3550中默认就开启这一命令 
---------------------------------------------------------------------------------------- 
---------------------------------------------------------------------------------------- 
< Tree > 
·Shortest-Path / Source Distribution Tree 
 SPT(Shortest Path Tree) 
 (S,G)  (192.168.1.1,224.1.1.1) 
 源树的优点:在信源和接收方之间创建一条最优的路径,可以最大限度的降低转发多播流的网络延迟。 
 源树的缺点:同时也增加了开销,路由器要针对每个信源存储路径信息,在包含数千个信源的网络中,这种开销是庞大的。 
 一个源一棵树.适用于比较多接收者时使用.每3分钟修剪一次.推模型.一般运行在DENSE模式下. 
·Shared Distribution Tree 
 RP(Rendezvous Point) 
 (*,G)  (*,224.1.1.1) 
 共享树的优点:每台路由器存储的信息较少,降低内存消耗(RP下游的路由器)。 
 共享树的缺点:选择信源到接收方的路径不是最优的。所以要慎重考虑RP的位置。 
 拉模型.RP可以手工指定.receiver端向RP端发出register包.一般运行在SPARSE模式下. 
< RPF (Reverse Path Forwarding)> 
RPF校验的目地是为了防环和防止重复报文 
RPF的规则:收到组播包的方向也必须是本路由器用来向组播包的源地址进行数据转发的方向,否则扔掉数据包 
upstream ( 前往信源的方向) 
downstream ( 前往接收方的方向) 
RPF选接口的比较原则: 
1、lower AD     同样的路由,选最小AD值的路由所用的接口为RPF接口 
2、longest match    同样的路由,比最长掩码 
3、lower metric    如果IGP是负载均衡,同样的路由,掩码一样长,比metric 
4、higher ip      以上都一样,比接口IP地址 
通过写多播静态路由来指定自已的信源接口 
ip mroute 1.1.1.0 255.255.255.0 12.1.1.2 写去到源从哪个接口发出,1.1.1.0是源,12.1.1.2是下一跳 
show ip mroute static  查看静态多播路由,注意多播静态路由的AD是0 
 "RPF check fails"-----先查多播路由表,再查单播路由表 
RPF接口默认每5秒检测一次 
       ? 
   
<TTL> 
接口的TTL阀值必须<=数据包的ttl值,接口才会转发 
    ? 
       入向数据包的TTL值大于或等于出向接口的TTL值时,才转发. 
注意TTL值在入向不减,出方向才减,减过之后才做这一比较 
TTL值的作用:通常用来控制组播的传输范围。 
  例如:在边界路由器上设定TTL阀值为128,内部的源发出的组播包初始TTL值控制为127,就能起到作用。 
使用ACL过滤多播组 
R1(config-if)#ip multicast boundary 1   只有列表1中被允许才能通过,不分in,out方向 
R1(config)#access-list 1 permit 239.129.0.0 0.0.255.255 
Show ip pim int s0 detail 
Show ip igmp int s0 
R1(config-if)#Ip multicast ttl-threshold 2   设置TTL值,必须在接口下,默认为0 
<PIM(Protocol independent Multicast)> 
·PIM的报文直接封装在IP包中,在IP中的协议号是103 
·协议无关的组播,指的是和单播协议无关,不管是何种单播路由协议,PIM都可以使用他们实现组播转发。 
·使用现有单播路由表实现RPF校验。 
·由于不必发送组播路由更新,所以PIM比其他组播协议开销降低了很多。 
组播路由器之间也要建邻居: 
Hello:30S    发向224.0.0.13 
Hold :30*3.5= 1分45秒 
多播路由表的几个要素: 
1、源 
2、目的 
3、入接口 
4、RPF邻居 
5、出接口 
R1#debug ip packet detail 
*Mar  1 00:15:44.207: IP: s=12.1.1.2 (Serial0), d=224.0.0.13, len 54, rcvd 0, proto=103 
·在MA网络中,如果运行的是dense模式,会选出一个前转路由器,通过assert消息选出。 
 前转路由器的选举规则: 
 1、比较去往源的路由的AD值 
 2、比较去往源的Metric值 
 3、IP地址大的成为前转路由器 
·MA网络PIM通过Hello包来选择DR,在IGMPv1中,DR将成为Querier。 
 DR选举方式:1.Priority大的(默认=1) 
            2.IP地址大的 
 DR可抢占。只有以太口才选DR,串口不选DR。 
如果运行的是IGMPv2,IGMPV2自已会选查询者,DR只担负数据转发任务 
DR的作用:1、充当IGMPV1的Querier 
         2、在Dense无用 
         3、sparse中 send&receive join®ister message 
R1(config-if)#ip pim dr-priority 2        在接口下改优先级 
R1#show ip pim neighbor 
PIM Neighbor Table 
Neighbor          Interface                Uptime/Expires    Ver   DR 
Address                                                            Prio/Mode 
10.1.1.2          Ethernet0                00:31:45/00:01:30 v2    3 / DR S 
                                                              10.1.1.2的优先级为3,且为DR 
·PIM-DM ( Dense Mode ) 
在Dense模式中Flood&prune 每三分钟就要做一次 
3分钟周期发送Prune. 
被剪掉的路由器也会主动发出嫁接信息重新接收组播流量。 
PIM通用规则一:无论在什么时候,只要出现了(S,G),就会出现它的父项(*,G),但(*,G)不作转发选择。 
当组播流量停止后,(S,G)条目只会在多播路由表中保存三分钟。 
------------------------------------------------------------------------------------- 
·PIM-SM ( Sparse Mode ) 
指定RP的方式 
1、        Static  指定RP(一般用环回口),并通告进IGP 
2、        auto RP 
3、        BSR 
PIM-SPARSE模式详解: 
? 
共享树的形成: 
一、PC发出一个igmp join(224.1.1.1)消息给last router。 
二、R5形成共享树条目(*,G),并且向R4发出一个Pim join(*,224.1.1.1)的加入消息。 
三、R4形成(*,G),并且向R3发起一个Pim join(*,224.1.1.1)的加入消息。 
四、R3形成(*,G) 
源树的形成: 
一、source发出流量给first route(R1) 
二、R1将源发过来的组播信息流的组播包封装为单播包(unicast register packet),发送到RP 
   register包的封装:DIP:23.1.1.3|SIP:1.1.1.1|224.1.1.1|server'IP 
三、RP收到register packet后,做三件事 
  1、解封装,并沿共享树发下去 
  2、产生(S,G)条目,并且RPF校验指向源 
  3、向source发起一个(S,G)的加入 
四、R2形成源树(S,G),并且向R1发起一个(S,G)的加入。 
五、R1形成源树(S,G),接着做两件事: 
  1、沿(S,G)源树发出组播(真正的组播) 
  2、封装unicast register packet继续发 
六、RP从(S,G)收到multicast packet后,向first-hop router (R1)发出register-stop包。 
七、R1收到register-stop包后,停止单播register packet 
八、last router切换到源树,向源发出(S,G)的join消息 
注意:在源树中,RPF接口是去往源的接口 
     在共享树中,RPF接口是去往RP的接口 
最后一跳的阀值切换: 
可以在最后一跳路由器设定一个阀值,当收到的多播包超过阀值后,切换到源树,默认情况下阀值等于0,也就是说一有流量播下来就立马切换到源树。(以K为单位) 
产生RP的三种方法: 
一、静态RP 
Router(config)#ip pim rp-address 1.1.1.1 在每台路由器上都指定(阀值实验) 
作为RP的接口可以不运行PIM-sparse模式 
二、Auto RP 
注意:Auto RP必须运行在sparse-dense模式下,cisco私有技术。(cisco的sparse模式其实就是sparse-dense模式) 
C-RP和RP运行在dense模式下(因为这时还没有RP),然后选举出了RP再转入sparse模式下。 
C-RP-- 候选RP,也就是想成为RP的路由器 
MA-- 映射代理,MA的多播地址:224.0.1.39,一旦指定MA,它的每一个组播接口都会加入224.0.1.39 
所有运行组播的路由器都会加入224.0.1.40 
RP选举规则:IP地址大的成为RP 
注意:c-rp/ma 的用来参选的loopback口一定要宣告进IGP 
第一步:配置MA 
R1(config)#ip pim send-rp-discovery loopback 0 scope 5   
在MA上配,会每60S向224.0.1.40发送一个discovery消息,规定了只能传5跳 
第二步:配置候选RP 
R1(config)#ip pim send-rp-announce loopback 0 scope 5 
配置为候选RP,向224.0.1.39每60秒发送一个RP-Announce,且只能传5跳 
注意点: 
R1(config)#int lo0 
R1(config-if)#ip pim sparse-dense-mode(要确保loopback口也运行PIM) 
特定组-- 
ip pim accept-rp 1.1.1.1 MUL-GROUP  只允许特定组接受1.1.1.1 这个RP发出来的消息 
ip pim send-rp-announce Loopback0 scope 20 group-list MUL-GROUP  只允许lo0口参与特定组的RP选举 
ip access-list standard MUL-GROUP 
permit 224.1.1.1 
R1(config)#ip pim rp-address 1.1.1.1 override  默认情况下,Auto-RP优于静态RP,如果想静态优先,打上这一命令 
R3#show ip pim rp mapping (in-use ) 
Clear ip pim rp-mapping  清除RP映射表项 
三、BSR  自举路由器 
Router(config)#ip pim bsr-candidate loopback0   指定BSR 
Router(config)#ip pim rp-candidate loopback0 指定想成为RP的路由器 
每台路由器都向BSR发送信息,那么BSR就收集到了所有C-RP的路由器信息,BSR再向所有路由器发送这些信息,那么其他的路由器有相同的选举法则,当收到了BSR发送来的所有其他C-RP的信息就可以选举出相同的RP,选举是在所有路由器上进行并达到共识的。(BSR不参加选举) 
   |