Ebgp peer 之间通告路由的时候会修改next-hop属性,把自己的的AS number前缀到as-path属性上,接收方从ebgp peer收到路由更新后首先检查as-path属性,如果发现自己的AS number就认为有环路风险,直接丢弃该路由;
IBGP peer之间通告路由的时候发送方不会修改as-path属性,接收方从ibgp peer收到路由也不会检查该属性,试想如果发送方前缀自己的AS number就意味着接收方也要去检查该属性,发现自己的AS number(同一个AS),此时不就直接丢弃那?所以IBGP之间修改、检查as-path的方法无效;
这就要求所有IBGP peer之间必须有水平分割,即从一个IBGP peer收到的路由不能再通告给别的IBGP peer,所以所有IBGP之间都必须建立邻居关系,互相直接通告路由,这样以来每台路由器都要维护大量的BGP连接,为了简化这种操作有人按照不同的思路写了RFC来解决这个问题,一个是路由反射器,一个是联盟(以后再讲)
路由反射器适当放宽了水平分割限制,即容许特定情况下把从一个IBGP peer收到的路由通告给别的IIBGP peer,这种情况下可能会出现路由环路,Originator和Cluster list就是用来防止环路的
RR把从某个IBGP peer学来的某条路由反射给别的IBGP peer的时候,把该peer的router id填写为Originator,把自己的cluster id前缀到Cluster list属性上,每被反射一次Originator不变,前缀一次
所以IBGP peer之间学习路由的时候首先检查有没有这两个属性(成对出现),如果有,说明该路由是被反射过的,检查Originator是否等于自己的router id ,如果等于就意味着是自己通告出去的路由又被反射回来了,拒绝,丢弃;如果不等于自己的router id,如果自己不是RR就接收该路由,如果自己是RR,就进一步检查cluster list,看看有没有包含自己的cluster id,如果没有就接收,如果有就说明是自己反射过的路由又被反射回来了,拒绝丢弃