组播
- IP组播的基本概念
- 组播路由协议概述
- IGMP
- IGMP部署及其配置
组播的基本概念
通信场景分为三种: - 单播 一对一
- 广播
- 组播
单播(Unicast)
单播面对“一对多”的通信场景(一个源=>多接收者) - 在单播通信中每一个数据包都有 明确的目的IP地址 (A/B/C类地址)=> 单播地址,唯一设备的地址;
- 对于同一份数据,如果存在多个接收者。那么Server需要发送与接收者数目相同的单播数据包。
- 当接收者增加到成百上千时,将极大加重Server创建相同数据和发送多份相同拷贝后所产生的消耗,网络中的设备性能以及链路带宽(相同包会多次占据链路)都会面临一定程度的浪费。
广播(Broadcast)
特点:目的IP地址:255.255.255.255, MAC地址全0xFF,广播包传输是有范围的,为广播域。每一个VLAN都是一个广播域。 - 广播数据包被限制在广播域中,广播包到达路由器后,一般都会被路由器终结,路由器不转发广播包,这样就要求所有设备都要在一个广播域内;
- 一旦有设备发送广播数据,则广播域内所有设备都会收到这个数据包,并且不得不耗费资源去处理,大量广播数据包将消耗网络的带宽及设备资源;
- 在IPv6中,广播的报文传输方式被取消。
组播(Multicast)
- 组播(Multicast)非常适合“一对多”的模型,只有加入特定组播组的成员,才会收到组播组数据。当存在多个组播组成员时,源无需发送多个数据拷贝,仅仅需要发送一份即可,组播网络设备(运行组播路由协议的网络设备)会根据实际需要转发或者拷贝组播数据;
- 数据流只发送给加入该组播组的接收者(组成员),而不需要该数据的设备不会收到该组的组播流量;
- 相同的组播报文,在一段链路上仅有一份数据,大大提高了网络资源的利用率。
组播的优劣势
组播最简单的应用实例:直播或者电视节目观看(CCTV?),画图。组播的优势
- 提高效率:降低网络流量、减轻硬件负荷。
- 优化性能:减少冗余流量、节约网络带宽、降低网络负载。
- 分布式应用:使多点应用成为可能。
组播的劣势
- 组播是基于UDP,采用尽力而为的传输方式。
- 没有拥塞避免机制。
- 可能出现报文重复的现象。
- 可能出现报文失序的现象。
组播应用
组播服务模型
组播网络架构分为三个部分
- 组播源 (source):负责发送组播流量,它不关心组成员所在.
- 组播网络 :一般会运行一些组播路由协议,例如PIM.将数据拷贝并转发给需要改数据或存在组播接收者的网络分支.
- 接收者 :一般会运行IGMP组成员管理协议,主机加入自己感兴趣的组播组,以便收到发往这些组播组的数据包.
术语
- 组播源(Source): 组播流量的发送者,组播流量的发送者,例如多媒体服务器.组播源无需运行任何组播协议,只需要简单地将组播数据发送出来即可.
- 组播接收者(Receiver): 也被称为组播成员,是期望接受特定组播组流量的设备,例如运行多媒体直播客户端软件的PC.
- 组播组(Multicast Grout): 一个使用组播IP地址标识 的群组.例如 224.1.1.1 便是一个IPv4组播地址,该地址标识了一组接收者,组播源可以向则个地址发送组播数据,而需要改数据的设备则需要加入组播组 224.1.1.1 ,以便从组播网络中获得源发往该组播组的数据.
D类地址作为组播地址使用,E类地址作为研究使用,不可用. - 组播路由器(Multicast Router): 支持组播,运行组播协议的网络设备. 实际上不仅仅路由器能够支持组播,交换机,***等设备(取决于设备型号)也能支持组播,路由器仅仅是一个代表.
- 第一跳路由器(First-Hop Router): 直连Source的组播路由器. 该路由器负责将Source发送出来的组播报文转发到组播网络中.
- 最后一跳路由器(Last-Hop Router): 直连组成员的组播路由器.该路由器负责将组播流量转发到直连网络(给接收者),也负责管理及维护直连网段中的组播组的成员关系.
- 组播网络分发树:
- 组播IP地址:
1.在IPV4地址空间中,D类地址(224.0.0.0/4)被用于组播.组播IP地址代表一个接收者的集合.
2.IANA对D类地址做了进一步的定义,几种主要的组播地址如下表所示(常见):
- 组播MAC地址:
单播中2层头部中一般为目的IP的MAC地址,唯一设备的网卡地址.那么组播的MAC地址应该是?
一般填写组播MAC地址: 第一个八位组的最后一个bit, 为1就是组播MAC地址
组播IP地址与MAC地址的映射
IP地址的后23bit直接映射到MAC,MAC前面固定为01:00:5E.
所以会导致不同IP共用同一个MAC地址(2的5次方=32个)
组播路由协议概述
- 组播路由器把数据拷贝并转发给需要该数据或存在组播接收者的网络分支;
- 组播流量的转发路径如何确定? =>table 路由表项
- 如何确保流量只被转发到正确的分支?
- 如何防止组播流量转发不会出现环路?
其中:
- 单播数据包的转发, 就是一个 一对一 的模型, 路由器将IP数据包送到他的目的地, 单播路由器并不关心数据包的源地址. 而组播数据是由组播源产生, 发向 一组接收者 , 组播路由器将数据包从源分发下去, 一直到组播的接收者. 那么组播路由器是如何知道, 该将组播数据向哪儿去转发, 哪些地方需要组播流量? 组播流量要走什么路径? 这就要用到组播路由协议.
- 组播流量与单播流量不同, 组播流量发往一组接收者, 如果网络中有 环路 存在, 那么情况比单播环路严重的多(因为你是发给一组接收者的), 因为所有的组播路由器必须知道组播的源, 也必须把组播数据包从源向目标转发.
- 为了保证数据从 上游转发到下游 , 每一个组播路由器都维护一个组播前传表(组播路由表)
- 单播路由协议确定去往某个目的地的最短(最优)路径, 他不会关心数据的源; 而组播路由协议必须去判断上游接口(离源更近的接口).
组播路由协议的主要功能
- 在接收组播报文时, 判断该报文是否存在正确的接口上到达, 从而确保组播数据转发的无环化.
- 在网络中建立一颗组播分发树(组播流量转发的路径树).
- 组播分发树体现在每一台组播路由器上便是(S, G)或(*, G)的组播转发表项.
组播路由表项
组播路由协议 PIM (主流组播路由协议)
- PIM路由表项即通过PIM协议建立的组播路由表项.PIM网络中存在两种路由表项: (S, G)路由表项或者(#, G)路由表项. S表示组播源, G表示组播组,#表示任意.
- (S, G)路由表项知道组播源S的位置,主要用于在PIM路由器上建立SPT.对于PIM-DM和PIM-SM网络适用.
- (*, G)路由表项由于只知道组播组G的存在, 主要用于在PIM路由器上建立RPT. 对于PIM-SM网络和双向PIM网络适用.
- PIM路由器上可能同时存在两种路由表项. 当收到源地址S, 组地址为G的组播报文, 且通过RPF检查的情况下, 按照如下规则转发:
- 如果存(S, G)路由表项, 则由(S, G)路由表项指导报文转发.
路由表项:含有S,上游接口(有且只有一个),下游接口(0个,1个和多个). - 如果不存在(S, G)路由表项, 只存在(#, G)路由表项,则先按照(#, G)路由表项创建(S, G)路由表项,再由(S, G)路由表项指导报文转发.
组播分发树的分类
组播分发树:即组播协议的工作结果或者说组播流量路径.
- SPT(Shortest-Path or Source Distribution Trees, 最短路径树或源树)
- 源树是以 组播源 为树根的组播分发树.
- 源树的分支形成了通过网络到达接收者所在分支的分布树. 因为源树使用最短的, 从源起始贯穿网络到达组播接收着的路径,所以又叫最短路径树.
- SPT同时适用于PIM-DM网络和PIM-SM网络.
- RPT(Rendezvous Point Tree, 共享树)
- 与源树使用组播源作为根不同, 共享树使用RP(Rendezvous-法语 Point)作为汇聚点.
- 多个组播组可以共用一个RP, 期望接接收组播流量的路由器通过组播协议在自己与RP之间建立一条RPT的分支, 组播流量首先需要从源发送到RP, 然后再由RP将组播流量转发下来, 组播流量顺着RPT最终到达各个接收者所在的终端网络.
- RPT适用于PIM-DM网络和双向PIM网络.
源树SPT
其中
上行接口:GE0/0/0
下行接口:GE0/0/1,0/0/2共享树RPT
其中,有两个源.
上行接口:GE0/0/0
下行接口:GE0/0/1RPF防环
单播具有防环的机制, 组播也有防环的机制.
确保组播流量来自正确的上游接口
- 在组播网络中, 如果组播流量出现环路, 比起单播报文的转发环路的危害要大得多. 路由器再转发一个组播报文时, 除了会关注报文的目的地址, 还会特别关心该报文的源地址. 组播路由器通过一个被成为RPF(Reverse Path Forwarding, 反向路径转发)的机制来实现组播数据转发的无环化.
- RPF机制确保组播数据从正确的接口被收到,只有RPF检查的组播数据包才会被路由器沿着组播树进行转发, 如果数据包从错误的接口被接收到, 路由器将丢弃这些报文. 这里所谓的正确的接口, 其实就是RPF接口(通过RPF检查的接口), 也就是我们经常说的上游接口, 一种常见的情况是, 设备借助其单播路由表实现RPF检查.
利用单播路由表进行RPF计算.
- R1在其GE0/0/0及GE0/0/1两个接口上都收到Source发送过来的组播流量;
- R1在其单播路由表中查询到Source(11.6.3.2)的路由, 根据该路由的出接口判断组播报文的合法性.
- 由于R1到达Source的本地出接口为GE0/0/0, 因此在这个接口上到达的组播流量通过RPF检查, 反之在GE0/0/1接口上到达的组播流量则不能通过RPF检查, 从而被R1丢弃.
组播路由协议分类
其中一种分类方式:
密集模式协议: PIM-DM(Dense mode)
PIM-DM使用"推(Push)模式"转发组播报文, 一般用于组播组成员规模相对较小, 相对密集的网络. Push方式假设网络中每个子网至少有一个(S, G)组播组的接收者, 因此组播数据被推送到网络的各个角落, 然后再进行剪枝操作, 不需要组播流量的路由器将自己从组播分发树上修剪掉.
推:假设全网络都需要组播流量, 全部推送, 由路由表自己修剪.稀疏模式协议: PIM-SM(Sparse mode)
稀疏模式协议使用(Pull)的方式, 而不是强推. 这种方式假定网络中不存在接收者, 除非有设备用显示的加入(Join)机制来申请.
拉:假设全网都不需要, 谁需要谁自己拉.
密集模式协议:扩散(Flood)与剪枝
初始时, 组播流量会扩散到全网各角落(首先做RPF). 即使不存在组播成员的分支也会收到组播流量. 每一台组播路由器都会在其组播路由表中创建(S, G)表项, 在本例中, 假设组播源10.1.1.1向239.1.1.1组播组发送流量, 则表项为(10.1.1.1, 239.1.1.1).
不需要(10.1.1.1, 239.1.1.1)组播流量的分支, 通过PIM Prune报文(剪枝报文)将自己从组播分发树上剪除. 上游的路由器收到下游设备发送过来的Prune报文,则将接受该报文的接口从(10.1.1.1, 239.1.1.1)表项的出接口列表中移除.
网络收敛完成后, SPT稳定下来, 如图所示, 组播流量将沿着SPT源源不断地从组播源转发到接收者. 不需要该组播流量的路由器需要周期性地向上游发送Prune报文.
让原先不在SPT上的网络分支出现了接收者, 则最后一跳路由器向其上游邻居发送PIM Graft(嫁接)报文, 试图将自己嫁接到SPT上.
新的SPT形成, 组播流量沿着SPT从源转发到Receiver.
稀疏模式协议:共享树加入(Join)
稀疏模式协议使用拉(Pull)的方式,而不是像密集模式那样的强推.这种方式假定网络中没有设备需要组播数据,除非用显示的加入机制来申请.(当没有申请加入的组播成员时,RP会对Source说现在别给我发)
网络中有一台重要的PIM路由器:汇聚点RP,可以为随时出现的组成员或组播源服务. 当网络中出现组成员时,最后一跳路由器向RP发送Join报文, 逐跳创建(#, G)表项, 生成一棵以RP为根的RPT.
IGMP(Internet Group Manage Protocol)
- IGMP用于主机(组播成员)和最后一跳路由器之间.
- 主机使用IGMP报文向路由器申请加入和退出组播组. 默认时路由器是不会向接口下转发组播数据流的, 除非该接口上存在组成成员.
- 路由器通过IGMP查询网段上是否有组播组的成员.
- 在组播网络中, 最后一跳路由器和组播接收者之间工作着一个非常重要的协议, 那就是IGMP(Internet Group Manage Protocol, 因特网组管理协议). IGMP定义了一个网段内主机与组播路由器之间如何维护组成员信息.
- IGMP报文使用IP封装, 协议号为2, 而且TTL字段通常为1.
- 到目前为止, IGMP一共三个版本:
- IGMPv1(由RFC 1112定义) => 淘汰
- IGMPV2(由RFC 2226定义) => 逐渐淘汰
- IGMPV3(由RFC 3376定义) => 慢慢变多
IGMPv2 Packet
常用的报文类型
- 普遍组查询(General Query): IGMP查询器周期性地发送常规查询报文, 对网络中的所有组播组进行查询.
- 特定组查询(Group-Specific Query): 该查询报文面向特定的组播组, 用于查询该组播组内是否存在成员.
- 成员关系报告(Membership Report): 主机向IGMP路由器发送的报告报文, 用于申请加入某个组播组或者对查询报文进行应答.
- 成员离开报文(Leave): 成员离开组播组时主动向IGMP路由器发送的报文, 用于宣告自己离开了某个组播组.
- 版本1成员关系报告(Version1 Membership Report): 用于兼容IGMPv1
报文格式
- 版本: 固定为2
- 类型: 指示该报文的类型.
- 最大响应时间: (只在查询报文中设置, 其他报文中设置为0x00)是主机用"成员关系报告报文"来响应该查询包的最长等待时间, 默认10s(必须在10s内回应), 可以被修改(单位是秒).
- 组播组地址
- 在普遍组查询报文中, 该字段全0;
- 在特定组查询报文中, 该字段设置为该组的组播地址.
- 在成员关系报告或者离开报文中, 该字段设置为目标组组播地址.
IGMPv2 Membership Query(TYPE: 0x11)
- 常规查询(General Query)
- 路由器使用IGMP常规查询报文向网段中所有主机进行查询, 报文目的地址为224.0.0.1, 该查询面向所有的组播组, 报文中的"组地址"字段设置为0.0.0.0. 网段中的组成员收到查询报文后, 需要回应IGMP成员关系报告.
- 如果一台组播路由器在Multicast Listener Interval超时(默认2*60s+10s=130s)前仍没有收到一个特定子网的Membership Report消息, 那么这个路由器将宣布这个子网中没有组员, 不再向这个子网发送组播数据.
- 常规查询默认每隔60s发送一次, 可使用命令修改(igmp timer query)
- 查询报文中包含"最大响应时间", 这个值告诉主机用IGMP成员关系报告回应这个查询的最长等待时间, 默认为10s, 可使用igmp max-response-time命令修改.
- 特定组查询(Group-Specific Query)
- 当IGMP查询器收到某组播组的成员发出的IGMP离组报文, 路由器便会发送IGMP特定组查询报文, 以便确认该组播组内是否有其他的成员存在.
- 特定组查询报文的目的地址为该发出IGMP离组报文的主机所在组的组地址.
- 为了避免特定组查询报文被意外丢或被损坏导致路由器误以为组内没有成员, 查询路由器将缺省间隔1s(可修改)连续发送特定组查询报文, 一共发送2个报文(可修改), 如果依然没有成员响应, 则路由器将认为该组内没有其他成员, 它将会删除相关IGMP组表项.
IGMPv2 Membership Report(TYPE: 0x16)
- 主机通过IGMP成员关系报告报文宣布自己成为组播组的成员.
- 报文的目的IP地址为主机期望加入的组播组地址.
- IGMP路由器通过该报文发现直连网段内的组成员.
- IGMP成员关系报告也用于确认IGMP查询器所发送的查询报告.
IGMPv2 Leave Report(TYPE: 0x17)
- IGMPv1中没有定义组成员的离组方式, 组成员"默默地"离开组播组. IGMPv2增加了组成员离组机制.
- 当组成员离开组播组时, 需要向网络中发送IGMP离组报文, 该报文的目的IP地址为224.0.0.2.
- 当IGMP查询器收到一个离组报文的时候, 会向这个组播组发送IGMP特定组查询报文, 用于确认该组播组内是否存在其他组成员, 如果组内还有其他成员, 则这些主机需要使用IGMP成员关系报告进行回应, 如果一段时间后依然没有任何成员回应, 则IGMP查询器认为该网段内不存在这个组播组的任何成员, 于是将相关IGMP组表项删除.
IGMPv2查询器
- 如果一个网段中有多台IGMP路由器(用二层交换机连接), 这些路由器都发送IGMP查询的话, 那就显得非常多余且低效.
- IGMP会在这些路由器的接口中选举出一个IGMP查询器.
- IGMPv2定义了查询器的选举办法; IP地址最小的路由器充当该网段的IGMP查询器, 由它来发送查询报文.
- 在上图中R1的GE0/0/0接口地址比R2的GE0/0/0接口地址更小, 因此它的接口成为该网段的IGMP查询器.
- 若非查询器(例如R2)在"Other Querier Present Timer(其他查询器存活时间)"计时器(默认125s)超时后依然没有收到查询器发送的IGMP查询报文, 那么他会认为查询器已经故障, 新一轮的查询器选举将会被触发.
IGMPv2常规查询
R1路由器的接口作为该网段的IGMPv2查询器, 周期性地向网段中发送IGMP常规查询, 以便了解该网段中组成员的在线情况. 常规查询的发送周期为"Query Interval"计时器所定义, 缺省为60s.IGMPv2常规查询的响应
PC1和PC3会收到这个查询, 随后灰鸽子启动"报告延迟计时器", 这个计时器由PC随机产生, 时间是0~10s(10s即"Max Response Time")之间的一个随机值, 计时器超时后主机就会发送IGMP成员关系报告(组播包).
如果在计时器超时之前, 受到了同一组内其他PC发送的成员关系报告, 则自己不再发送. 这个IGMP成员关系报告的抑制机制可以减少网络中多余的IGMP报文数量.(对于R1不需要知道有多少成员, 只需要确定有没有成员)IGMPv2离开过程 情况1
- PC1要离开组224.1.1.1, 发送IGMPv2离组报文, 报文的目的地址是224.0.0.2.
- R1收到该报文后, 以1s为间隔连续发送IGMP特定组查询报文, 以便确认该网段中是否仍还有224.1.1.1组的其他成员.
- PC3仍然是组224.1.1.1的成员, 因此它将立即响应该特定组查询. R1知道该网段中仍然存在该该组播组成员, 于是继续向该网段转发224.1.1.1的组播流量.
IGMPv2离开过程 情况2
- PC1要离开组224.2.2.2, 发送IGMPv2离组报文, 报文的目的地址是224.0.0.2.
- R1收到该报文后, 以1s为间隔连续发送IGMP特定组查询报文, 以便确认该网段中是否仍还有224.1.1.1组的其他成员. 此时组224.2.2.2中已经没有其他成员了, 因此没有住机会响应这个查询.
- 一定时间后, R1认为该网段中已经没有224.2.2.2组播组的成员了, 将不会再向这个网段转发该组的组播流量.
Timer
健壮系数 Robustness Variable
- Robustness Variable, 健壮性变量, 默认为2, 不建议修改
- 健壮系数越大, IGMP路由器就越见状, 但是组超时的时间也就越长.
- 执行命令robust-count robust-value, 配置IGMP健壮系数.
- 当路由器启动时, 发送健壮系数次的"普遍组查询消息", 发送间隔为"IGMP普遍组查询消息的发送间隔"的1/4.
- 当路由器收到离开消息后,
- 对于IGMPv2, 路由器发送"健壮系数"次的"特定组查询消息", 发送间隔为"IGMP特定组组查询消息的发送间隔"
- 对于IGMPv2, 路由器发送"健壮系数"次的"特定组/源查询消息", 发送间隔为"IGMP特定组组/源查询消息的发送间隔"
IGMP组和路由表
- IGMP组表项是由用户主机发送的IGMP加入报文出发创建的, 用于维护组加入信息并通知组播路由协议(通常所说的PIM协议)创建相应的(#, G)表项. 只要设备接口使能了IGMP并收到组加入报文就会问每个接口维护一个组加入信息表项, 组表项形式如下所示:
- IGMP路由表也是由IGMP协议维护的, 但它只有在接口没有使能PIM协议才会存在. 它的作用主要是用来扩展组播路由表项的出接口. IGMP路由表项形式如下: