标签:
【概述】
Click是一种基于软件控制的模块化路由器。其架构可以大致视为一系列数据包处理模块(称为elements)组成的。一个Click路由器可以看成一张由elements作为顶点,数据包传递路径作为边的图。这种模块化设计使得内部功能结构清晰且易于拓展。
1.介绍
现在的趋势下,路由器的功能已经不再是单纯用于包转发,往往还同时具有地址转换、包过滤等功能,并往往扮演着防火墙一类的角色。但是,现在的路由器设计的都很封闭,管理员仅仅能控制功能的开关,却很难实现各个功能之间更为复杂的交互,而第三方开发者也很难对路由器功能进行拓展。
因此就有了Click模块化路由器,它可以提供细粒度的网络控制。Click由一系列的称为element的功能模块组成。这些elements都具有很窄的功能interface,提供最为atomic的功能实现,但是可以通过多个elements互相之间的拓展来完成更为复杂的功能。这些elements拼成一个有向图(directed graph),就形成了一个模块化的路由器。要拓展一个路由器的功能,程序员可以自己写新的功能模块,也可以将已有的功能模块重新组装,完成不同的功能。 (文中提到这个idea和Unix很相似?我不太懂Unix,有空可以了解一下。)
2.架构
正如前面所说,Click由一系列的elements构成,而所有的Click路由器的原子化的功能都包含在elements中。具体来说,在一个running router 中,一个element就是一个C++对象,一条connection就是一个指向该对象的指针,而一个传递动作就是一次内部函数的调用。
一个element有如下重要的属性:
1) element类 (element class)
正如前面所述,一个element就是一个C++的对象,因此也就有一个class与之对应,element属于该element class。
2) 端口(port)
一个element可以由多个输入输出的端口。所有的connection都是始自于一个element的输出端口,终于另一个element的输入端口。
3)配置语句 (configuration string)
配置语句是一个可选项,用于在路由器初始化时配置其中的状态。
4)方法接口(method interface)
一个element可以提供一个或多个接口,如最基本的router可以提供packet transfer的接口,最基本的包转发功能,而支持队列的element可以提供回报queue length的接口。
2.1 push和pull连接
Click路由器中的连接分为push和pull两种类型。push连接是常规的包转发连接,由源element发送一个packet出来到目的element。而pull连接则是相反,由目的element向源element发出一个request索取一个包,再由源端口回复给它。一个连接是push还是pull和连接两端的端口有关。push端口到push端口的就是push连接,pull端口到pull端口的就是pull连接。而push到pull端口的连接非法。
路由器中还有一种端口称为agnostic,也就是未指定状态的端口,当它和push端口建立连接时就是push端口,当它和pull端口建立连接时就是pull端口,因此可以看作是一个中性的状态。但是需要注意的是,当一个router要进行propagation之前,所有沿途的端口都必须赋予相应且合法的状态,在此之前路由器无法进行转发功能(propagation constraint)。
2.2 数据包存储
element的端口上并不默认包含队列(queue),在Click中,队列本身就是一个element,也就是一个对象(或说是一个类)。这也就意味着网络管理员可以显式的定义数据是如何存储的。一个Queue需要一个push的input端口和一个pull的output端口。
标签:
原文地址:http://www.cnblogs.com/XiaodongZhang/p/5460407.html