CLUSTER_LIST是另外一种BGP属性,它 记录了路由穿越的簇。如果列表中发现了本地CLUSTER_ID,路由就会被丢弃。
与ORIGINATOR_ID作为AS内部防环机制不同,CLUSTER_LIST只用于RR的防环,因为客户机和非客户机不了解它属于哪个簇。
RR在反射路由时会创建或更新CLUSTER_LIST。比如:RR从客户机反射路由到非客户机,或从非客户机反射路由到客户机,或从客户机反射路由到另一个客户机时,它都会把本地的CLUSTER_ID添加到CLUSTER_LIST里。
有一些情况RR不会被创建CLUSTER_LIST:
RR发起路由是不会创建CLUSTER_LIST;
当RR向外部AS通告路由时,已有的CLUSTER_LIST会清除;
当RR从外AS学到路由通告给客户机和非客户机时,它不会创建CLUSTER_LIST。
举个例子:
R2、R3是R1的客户机,R3也是R2的客户机,R1是R3的客户机。
- 当R1收到来自下面一台客户机关于10.0.0.0/24的路由更新,会反射给R2和R3,同时会创建CLUSTER_LIST并且以router id为CLUSTER_ID放到CLUSTER_LIST里。
- R2收到路由后也会向R3反射,同时把自己的router id作为CLUSTER_ID放到CLUSTER_LIST。
- 这时R3上有两条路径,一条路径CLUSTER_LIST是192.168.1.2、192.168.1.1;另一条路径CLUSTER_LIST是192.168.1.1。默认R3会选路径短的那条,但是通过R2 的路径设置了weight值,所以R3会选择从R2走是到10.0.0.0/24的最佳路径。
- R3把自己认为的最佳路径反射给客户机R1,并把自己的router id作为CLUSTER_ID放到CLUSTER_LIST,这时R1收到路由更新后发现自己的CLUSTER_ID在CLUSTER_LIST里,所以拒绝接收,从而避免了路由环路。