PIM路由协议基础:
PIM-DM的工作机制:
邻居发现:
pim路由器会像目的地址为224.0.0.13发送hello来建立邻居关系,TTL值为1
==目的地址224.0.0.13标识区域内的所有pim路由器,为什么采用组播地址,因为不一定是只跟一台路由器建立邻居关系==
pim邻居建立过程中,会通过hello报文协商option参数,pim协议支持各种选项参数。
| 选项id | 选项内容 | 选项作用 |
| :—-: | :—————: | :———————————————-: |
| 1 | hello hold time | 邻居关系的维持时间,默认为3.5倍的hello时间,105s |
| 2 | Lan prune delay | 发送prune的最大延时时间,默认为0.5s |
| | override-interval | 发送否决剪枝jion报文的时间间隔,默认为2.5s |
| 19 | DR priority | DR优先级,先比较优先级再比较接口ip地址,都比大 |
| | generation ID | 跟踪邻居路由器的变化 |==hello报文每30s发送一次,死亡时间是hello时间的3.5倍、105s==
扩散:
- 路由器收到组播报文,先进行RPF检查,然后向所有的pim邻居和IGMP接受者进行复制转发。
- 接受到组播报文的pim路由器会在本地创建相应的S G表项。
- 当扩散到叶子路由器,叶子路由器会判断是否有组播接受者,有的话,会创建相应的sg表项,没有的话,则向上游进行剪枝
剪枝:
- 在SG表项中,当下游接口列表为空,并有扩散的组播数据时,那么就会像上游的pim邻居组播发送剪枝报文(prune),目的地址为224.0.0.13,让他不要再发送组播报文过来,
- pim邻居收到报文后,会将下游端口删除,并启动剪枝计时器(210s),那么自己的下游接口又为空,那么就又会向上游邻居发送剪枝报文,
- join/prune报文中,P置位为1是剪枝报文,J置位为1是加入报文。
剪枝延缓计时器:
- 当收到下游发送的剪枝报文后,会根据邻居数量是否大于1来进行相应的处理,
- 只有一个邻居,收到剪枝报文后,立即将该接口变为剪枝状态
- 有多个邻居,收到剪枝报文后,会启动一个剪枝延时计时器==(3s=0.5+2.5)==,在这个时间内从其中一个邻居收到了一个join报文(2.5s),就会启动剪枝否决机制。
- 在下游接口有直连接受者,就不管了pim邻居的数量。
- ==pim prune的最大传输时间为0.5。==
- ==join报文发送的默认时间间隔为2.5s。==
嫁接:
- 当有一条新的主机想加入某个组播组,那么就会像上游的pim邻居单播发送graft嫁接报文,
- 发送graft报文,并启动嫁接定时器(3s),要求上游路由器主动将被剪除的接口添加到下游接口列表中,并向其转发组播数据
- 收到graft报文后,会回复一个graft ack报文来做确认,没收到就每3s重传一次。
状态刷新:
离组播源最近的第一条路由器会以每60s周期性发送刷新报文,并进行全网扩散。
可以用来刷新剪枝计时器,刷新报文置位为1时进行刷新,每三次报文置位为1,每180s刷新一次。
断言:
- 当从其下游接口发送一份组播数据,又从其下游接口收到该数据时,启动断言机制:
- 刚开始设备都认为自己的winner,并发送assert报文,里面携带了到达组播源的协议优先级和开销,通过对比来选出winner,先比较协议优先级,比小优先,相等就比开销,越小越优。再次相等就比较数据的源地址和自己接口的ip地址,比大优先,
- ==优胜者为winner,失败者为loser,winner之能有一个,loser可以有多个。==
- 成为loser的设备后,会自动剪除自己的下游接口,当下游接口列表为空时,发起剪枝,winner也会收到这个剪枝报文,同时开启断言计时器180s。在超时之前,接口一直处于剪枝状态。
==winner会周期性的向下游接口发送状态刷新报文,用来给loser刷新断言计时器。==
winner从下游接口收到剪枝报文,启动剪枝延时计时器,等待join报文的到来。否决剪枝行为。
关于断言场景下网络拓扑变化时,组播路径的切换:
- winner的上游接口中断:会从下游接口发送最差的assert报文来通知其他的loser。
- 最差的assert报文:协议优先级无限大,开销无限大。
- winner的下游接口中断:此时无法从下游接口发送assert cancel报文,那么loser路由器只有等待与winner邻居失效后(默认105s),才会知道winner挂掉。
PIM DM 报文:
报文类型 | 类型ID | 报文作用 |
---|---|---|
hello | 0 | 发现,协商参数。维护邻居关系 |
jion/prune | 3 | 加入/剪枝,J置位为1,表明为jion报文,p置位为1,表明为prune报文 |
assert | 5 | 断言 |
graft | 6 | 剪枝 |
graft ack | 7 | 剪枝确认 |
state-refresh | 9 | 状态刷新 |