码迷,mamicode.com
首页 > 其他好文 > 详细

Click模块化路由器

时间:2016-05-05 07:03:57      阅读:611      评论:0      收藏:0      [点我收藏+]

标签:

【概述】

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端口。

 

Click模块化路由器

标签:

原文地址:http://www.cnblogs.com/XiaodongZhang/p/5460407.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!