quagga源码学习--BGP协议创建对等体
来源:互联网 发布:charles能在windows 编辑:程序博客网 时间:2024/05/22 02:02
现有的路由协议都是通过分布式协议逐个配置协商运行的,协议协议,一个就不需要协议咯,至少2个才能够协议着做事情嘛,不过呢,这样就出现网元过多配置困难的问题,对网管软件要求也越来越高,
SDN或许可能改变这个局面,但不管软件如何定义,报文还是在一个一个网络节点传输的,所以我们看到quagga这样多的传统网络配置命令不要觉得繁琐,不配置的话,协议不会工作哦。
嗯,这章的主题是创建对等体,就是通过配置命令来完成的。
“neighbor peer remote-as asn”router bgp 1neighbor 10.0.0.1 remote-as 2
neighbor peer remote-as 命令就是配置一个对等体,peer是指对等体的地址(ipv4,ipv6地址)。
接下来我们看代码是如何创建对等体的,入口函数:
1 DEFUN(neighbor_remote_as,2 neighbor_remote_as_cmd,3 NEIGHBOR_CMD2 "remote-as " CMD_AS_RANGE,4 NEIGHBOR_STR5 NEIGHBOR_ADDR_STR26 "Specify a BGP neighbor\n"7 AS_STR) {8 return peer_remote_as_vty(vty, argv[0], argv[1], AFI_IP, SAFI_UNICAST);9 }
可以看到,bgp对等体之间是单播通信。
1 /* If peer does not exist, create new one. If peer already exists,2 set AS number to the peer. */3 int4 peer_remote_as(struct bgp *bgp, union sockunion *su, as_t *as,5 afi_t afi, safi_t safi)
peer_remote_as函数来完成创建新对等体或者为对等体设置新的as号。
为避免一些书籍的作者或者网络作者的一贯的懒惰做法(只授人以鱼),我得补充一下,为什么要创建对等体。
对于路由协议,不管是基于3层的还是2层的,都需要建立自己的寻路数据库,也就是通过邻居找到下一跳,你要走的远,你就得认识更多邻居,以及邻居的邻居,好比一句老话,在家靠父母,出门靠朋友,朋友多路好走,就这么一个道理。
那么话又说回来了,创建对等体呢,就是给自己找邻居,找朋友,不过呢,BGP这个人呢,更像一个干中介的,比如卖房的中介,他自己不建房子,只把建好的房源介绍给要买房的人,同时还维护这个房源信息库,及时更新已经卖掉的房子。
话有点多,我们还是接着看代码吧:
1 /* "router bgp" commands. */ 2 DEFUN(router_bgp, 3 router_bgp_cmd, 4 "router bgp " CMD_AS_RANGE, 5 ROUTER_STR 6 BGP_STR 7 AS_STR) { 8 ...... 9 10 ret = bgp_get(&bgp, &as, name);11 12 ......13 14 vty->node = BGP_NODE;15 vty->index = bgp;16 17 return CMD_SUCCESS;18 }
router bgp 1
这条命令就是去查找一个as为1的bgp对象(struct bgp),如果没有找到就创建了一个struct bgp的指针,并保存在vty->index里,vty是每个DEFUN宏函数声明里都带的一个参数,在command里是极其重要的角色。
如果传给peer的值不是一个合法的地址,那么会被当做是一个peer group名称来处理
1 /* If peer is peer group, call proper function. */ 2 ret = str2sockunion(peer_str, &su); 3 if (ret < 0) { 4 ret = peer_group_remote_as(bgp, peer_str, &as); 5 if (ret < 0) { 6 vty_out(vty, "%% Create the peer-group first%s", VTY_NEWLINE); 7 return CMD_WARNING; 8 } 9 return CMD_SUCCESS;10 }
然后呢,是国际惯例,查找一下是不是已经为这个peer地址创建了peer,如果peer地址相同,as值不一样,就修改一下peer的as值。
嗯,如果这个peer已经是某个group的成员,那么就不能成功创建对等体关系了。
如果上面的事情都没有发生,那么就可以创建一个新的对等体了。
1 static struct peer*2 peer_new(struct bgp *bgp)
1 /* Get service port number. */2 sp = getservbyname("bgp", "tcp");3 peer->port = (sp == NULL) ? BGP_PORT_DEFAULT : ntohs(sp->s_port);
peer_new函数里设置默认的端口号 BGP_PORT_DEFAULT = 179,并将peer->status = Idle.
接下来会指定是IBGP peer还是EBGP peer。
最后,将这个peer加入到定时器任务中:
1 /* Set up peer's events and timers. */2 if (!active && peer_active(peer)) bgp_timer_set(peer);
然后我们就要进入对等体的状态机模式了,嗨,下一章,设计模式了喔!
- quagga源码学习--BGP协议创建对等体
- quagga源码学习--BGP协议创建对等体
- quagga源码学习--BGP协议对等体连接tcp md5签名认证选项
- quagga源码学习--BGP协议对等体连接tcp md5签名认证选项
- quagga源码学习--BGP协议对等体连接tcp md5签名认证选项
- quagga源码学习--BGP协议对等体连接tcp md5签名认证选项
- 如何在Quagga BGP路由器中设置IPv6的BGP对等体和过滤
- 如何使用 Quagga BGP(边界网关协议)路由器来过滤 BGP 路由
- 当BGP要穿越防火墙时,两个对等体要建立BGP邻居问题处理
- bgp 协议
- BGP 协议
- BGP 协议
- BGP协议
- 【实验9.11.4d】 BGP对等体组【IEEEnjoy.L.ZH】
- (二)网络协议学习——BGP协议
- 计算机网络学习--边界网关协议BGP(7)
- BGP socket在quagga中启动的流程
- 使用Quagga测试Neutron BGP动态路由(by quqi99)
- [netty]-消息编解码之google的Protobuf编解码
- html5 canvas 扑克牌游戏开发探索
- Jedis整合到SpringMVC
- 重温Spring之旅6——基于XML配置方式进行AOP开发
- C++初级主题--(1)this指针
- quagga源码学习--BGP协议创建对等体
- 线性表的顺序储存结构定义(动态)实现
- MyEclipse2017CI破解教程以及MyEclipse2017CI和MyEclipse2016、MyEclipse2015、MyEclipse2014并存破解
- QT程序返回值255
- BZOJ 1096: [ZJOI2007]仓库建设 斜率优化
- JMS简介及ActiveMQ使用
- Unknown SSL protocol error in connection to github.com:443
- quagga源码学习--BGP协议对等体连接tcp md5签名认证选项
- Python的循环引用研究(Python版本3.5.1测试通过)