2007年10月31日星期三

UPnP term

1. UUID

通用唯一标识符(UUID)是128位比特的数字,用来唯一地标识因特网上的某些对象或者实体。根据使用的特定机制,UUID需要保证是彼此不相同的,或者最少也是与公元3400年之前其他任何生成的通用唯一标识符有非常大的区别。有保证的UUID包括指向生成通用唯一标识符的主机的网络地址,时间戳(用来记录事务的精确时间记录),以及一个随机生成 的组件。因为网络地址标识了唯一的计算机 ,并且时间戳对于某台主机上生成的每个UUID也是唯一的,那么这两个部分就完全可以保证唯一性了。然而,随机生成的UUID的组件也可以 作为保护措施来防止所有的不可预见的问题。UUID是tModel 数据结构的一部分,这种数据结构标识通用描述、发现,和整合(UDDI)注册中的一种服务的类型(注册服务的通用表示法)。这种机制可用来发现网络服 务。UUID还可以用来指向大多数的可能物体。微软和其他一些软件公司都倾向使用全球唯一标识符(GUID),这也是通用唯一标识符的一种类型,可用来指向组件对象、模块对象和其他的软件组件。第一个UUID是在网络计算机系统(NCS)中创建,并且随后成为开放软件基金会(OSF)的分布式计算环境(DCE)的组件。

2. URN

统一资源名(URN)是带有名字的因特网资源,与统一资源定位符(URL)不同的是,URN的拥有者可以期望其他人(或者是程序)能够总 是找到这个资源。在使用网络的时候一个常见的问题就是网络内容有时候会移动到一个新的站点或者同一站点上的另一个新的页面上。因为链接是用URL 制作的,那么当内容发生变化的时候,它们就不再起作用了。

URN看上去很像URL。例如,下面是一个假设的URN  

urn:def://blue_laser

"def://"指的是一个代理或是所有目录中某个可以访问的目录,词汇表,以及因特网上的百科全书,"blue laser" 就是术语的名字。使用代理的结果就是“最好的定义”,“最久的定义”,或者甚至是所有代理可以找到“blue laser”的定义。与其具有比较价值的URL需要为定义指定一个确定的位置,例如:  

http://www.whatis.com/bluelase.htm  

这种情况中用户需要了解资源的位置,同时还要了解如何拼写文件名和后缀。通过URN,用户只需要知道资源的名字即可。一个或者多个代理大概也能够找到最近的资源的拷贝,并且用户可以免于理解资源的具体位置或者重新分配到了哪个位置。  

URN和URL都是称为统一资源标识符的概念的一种。URN与另一个称为统一资源特征(URC)有些联系,URC允许对URN 增加一些描述的信息,例如作者、日期、长度等。 可以拥有一个包括地址等在内的名字,在某些情况下,URN还可以是一个URL,但是不是必须是。 统一资源名仍然有因特网工程工作组(IETF)的成员在继续开发


2007年10月28日星期日

Third layer switch technology

(转载)

+++ 传统交换技术 +++

传统的局域网交换机是一种二层网络设备,它在操作过程中不断收集信息去建立起它本身的一个MAC地址表。这个表相当简单,基本上说明了某个MAC 地址是在哪个端口上被发现的。这样当交换机收到一个以太网包时,它便会查看一下该以太网包的目的MAC地址,核对一下自己的地址表以确认该从哪个端口把包 发出去。但当交换机收到一个不认识的包时,也就是说如果目的MAC地址不在MAC地址表中,交换机便会把该包“扩散”出去,即从所有端口发出去,就如同交 换机收到一个广播包一样,这就暴露出传统局域网交换机的弱点:不能有效的解决广播、异种网络互连、安全性控制等问题。因此,产生了交换机上的VLAN(虚 拟局域网)技术。


+++ 第三层交换技术 +++

三层交换技术的出现,解决了局域网中网段划分之后网段中的子网必须依赖路由器进行管理的局面,解决了传统路由器低速、复杂所造成的网络瓶颈问 题。

一个具有三层交换功能的设备,是一个带有第三层路由功能的第二层交换机,但它是两者的有机结合,而不是简单地把路由器设备的硬件及软件叠加在局域网交换机上。

我们可以通过以下例子说明三层交换机是如何工作的:

假设两个使用IP协议的站点A、B通过第三层交换机进行通信,发送站点A在开始发送时,A就用子网掩码取得网络地址,判断B站是否与自 己在同一子网内。

若目的站B与发送站A在同一子网内,则进行二层的转发。具体步骤如下:为了得到站点B的 MAC地址,站点A首先发一个ARP广播报文,请求站点B的MAC地址。该ARP请求报文进入交换机后,首先进行源MAC地址学习,芯片自动把站点A的 MAC地址以及进入交换机的端口号等信息填入到芯片的MAC地址表中,然后在MAC地址表中进行目的地址查找。由于此时是一个广播报文,交换机则会把这个 广播报文从进入交换机端口所属的VLAN中进行广播。B站点收到这个ARP请求报文之后,会立刻发送一个ARP回复报文,这个报文是一个单播报文,目的地 址为站点A的MAC地址。该包进入交换机后,同样,首先进行源MAC地址学习,然后进行目的地址查找,由于此时MAC地址表中已经存在了A站点MAC地址 的匹配条目,所以交换机直接把此报文从相应的端口中转发出去。通过以上一次ARP过程,交换芯片就把站点A和B的信息保存在其MAC地址表中。以后A、B 之间进行通信或者同一网段的其它站点想要与A或B通信,交换机就知道该把报文从哪个端口送出。还必须说明的一点是,当查找MAC地址表的时候发现找不到匹 配表项,该报文又不是广播或多播报文,此时此报文被称为DLF(Destination Lookup Failure)报文,交换机对此类报文的处理就象对收到一个广播报文处理一样,将此报文从进入端口所属的VLAN中扩散出去。从以上过程可以看出,所有二层转发都是由硬件完成的,无论是MAC地址表的学习过程还是目的地址查找确定输出端口过程都没有软件进行干预

若站点A和站点B不在同一子网内 (站点A和B所在网段都属于交换机上的直连网段),发送站A首先要向其“缺省网关”发出ARP请求报文,而“缺省网关”的IP地址其实就是三层交换机上站点A所属VLAN的IP地址。当发送站A对“缺省网关”的IP地址广播出一个ARP请求时,交换机就向发送站A回一个 ARP回复报文,告诉站点A交换机此VLAN的MAC地址,同时可以通过软件把站点A的IP地址、MAC地址、与交换机直接相连的端口号等信息设置到交换芯片的三层硬件表项中。站点A收到这个ARP回复报文之后,进行目的MAC地址替换,把要发给B的包首先发给交换机。交换机收到这个包以后,同样首先进行源MAC地址学习,目的MAC地址查找,由于此时目的MAC地址为交换机的MAC地址,在这种情况下将会把该报文送到交换芯片的三层引擎处理。一般来说,三层引擎会有两个表,一个是主机路由表,这个表是以IP地址为索引的,里面存放目的IP地址、下一跳MAC地址、端口号等信息。若找到一条匹配表项,就会在对报文进行一些操作(例如目的MAC与源MAC替换、TTL减1等)之后将报文从表中指定的端口转发出去。若主机路由表中没有找到匹配条目,则会继续查 找另一个表――网段路由表。这个表存放网段地址、下一跳MAC地址、端口号等信息。一般来说这个表的条目要少得多,但覆盖的范围很大,只要设置得当,基本上可以保证大部分进入交换机的报文都走硬件转发,这样不仅大大提高转发速度,同时也减轻了CPU的负荷。若查找网段路由表也没有找到匹配表项,则交换芯片会把包送给CPU处理,进行软路由。由于站点B属于交换机的直连网段之一,CPU收到这个IP报文以后,会直接以B的IP为索引检查ARP缓存,若没有站点B的MAC地址,则根据路由信息向B站广播一个ARP请求,B站得到此ARP请求后向交换机回复其MAC地址,CPU在收到这个ARP回复报文的同时, 同样可以通过软件把站点B的IP地址、MAC地址、进入交换机的端口号等信息设置到交换芯片的三层硬件表项中,然后把由站点A发来的IP报文转发给站点B,这样就完成了站点A到站点B的第一次单向通信。由于芯片内部的三层引擎中已经保存站点A、B的路由信息,以后站点A、B之间进行通信或其它网段的站点想要与A、B进行通信,交换芯片则会直接把包从三层硬件表项中指定的端口转发出去,而不必再把包交给CPU处理。这种通过“一次路由,多次交换”的方式, 大大提高了转发速度。需要说明的是,三层引擎中的路由表项大都是通过软件设置的。至于何时设置、怎么设置并不存在一个固定的标准,我们在此也不详细讨论。

三层交换机将二层交换机和三层路由器两者的优势有机而智能化的结合在一起,在各个层次上提供线速性能,从而解决了传统路由器低速、复杂所造成的网络瓶颈问题。在没有广域网连接需求的场合,用于连接不同子网的传统路由器正在以极快的速度被三层交换机所代替。凡是没有广域网连接需求,同时又需要路由器的地方,都可以用三层交换机代替(???)

2007年10月23日星期二

Automatic variables in GNU Make


$@

工作目标的文件名$%
档案文件成员(archive member)结构中的文件名元素

$<
第一个必要条件的文件名

$?
时间戳在工作目标(的时间戳)之后的所有必要条件,并以空格隔开这些必要条件

$^
所有必要条件的文件名,并以空格隔开这些文件名。这份列表已删掉重复的文件名

$+
代表所有必要条件的文件名,并以空格隔开。不过,包含重复的文件名

$*
工作目标的主文件名。一个文件名称有两部分组成:主文件名和扩展名


另外,以上变量都具有两个变体:
1. 一个变体只会返回值的目录部分,它的指定方式就是在原有的符号之后附加D这个字母
2. 另一个变体只会返回值的文件部分,它的指定方式就是在原有的符号之后附加F这个字母

Cross call between C and C++

/* C程序中如何调用C++;C++程序中如何调用C */

(转载)

extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。

extern "C" 是连接申明(linkage declaration), 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。


来看看C++中对类似C的函数是怎样编译的:
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:

void foo( int x, int y );

该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。

_foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。

同 样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编 译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。

*** 未加extern "C"声明时的连接方式 ***

假设在C++中,模块A的头文件如下:

// 模块A头文件 moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

int foo( int x, int y );

#endif

在模块B中引用该函数:

// 模块B实现文件 moduleB.cpp

#i nclude "moduleA.h"

foo(2,3);

实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!


*** 加extern "C"声明后的编译和连接方式 ***

加extern "C"声明后,模块A的头文件变为:

// 模块A头文件 moduleA.h

#ifndef MODULE_A_H

#define MODULE_A_H

extern "C" int foo( int x, int y );

#endif

在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:

(1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;

(2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。

如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。

所以,可以用一句话概括extern “C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么 做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):实现C++与C及其它语言的混合编程


明白了C++中extern "C"的设立动机,我们下面来具体分析extern "C"通常的使用技巧:

(1)在C++中引用C语言中的函数和变量

<<< 把需要做为C语言进行编译的代码用extern "C"修饰 >>>

在包含C语言头文件(假设为cExample.h)时,需进行下列处理:

extern "C"

{

#include "cExample.h"

}

而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误

C++引用C函数例子工程中包含的三个文件的源代码如下:

/* c语言头文件:cExample.h */

#ifndef C_EXAMPLE_H

#define C_EXAMPLE_H

extern int add(int x,int y);

#endif

/* c语言实现文件:cExample.c */

#i nclude "cExample.h"

int add( int x, int y )

{

return x + y;

}

// c++实现文件,调用add:cppFile.cpp

extern "C"

{

#i nclude "cExample.h"

}

int main(int argc, char* argv[])

{

add(2,3);

return 0;

}

如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }。


(2)在C中引用C++语言中的函数和变量

<<< 把C++部分用extern "C"进行封装,以保证用C编译器编译 >>>

C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅在C文件中将C++中定义的extern "C"函数声明为extern类型。

C引用C++函数例子工程中包含的三个文件的源代码如下:

//C++头文件 cppExample.h

#ifndef CPP_EXAMPLE_H

#define CPP_EXAMPLE_H

extern "C" int add( int x, int y );

#endif

//C++实现文件 cppExample.cpp

#i nclude "cppExample.h"

int add( int x, int y )

{

return x + y;

}

/* C实现文件 cFile.c

/* 这样会编译出错:#include "cExample.h" */

extern int add( int x, int y );

int main( int argc, char* argv[] )

{

add( 2, 3 );

return 0;

}


Example:

如何把C++写出来的模块封装成C能调用的接口呢?

链接库头文件:
//head.h
class A
{
public:
A();
virtual ~A();
int gt();
int pt();
private:
int s;
};

.cpp
//firstso.cpp
#include
#include "head.h"

A::A(){}
A::~A(){}
int A::gt()
{
s=10;
}

int A::pt()
{
std::cout <<>
#include "head.h"
extern "C"
{

int f();

int f()
{
A a;
a.gt();
a.pt();
return 0;
}

}
编译命令:
gcc -shared -o sec.so secso.cpp -L. -lmy

这时候生成第二个.so文件,此时库从一个类变成了一个c的接口.
拷贝到/usr/lib


下面开始调用:
//test.c
#include "stdio.h"
#include "dlfcn.h"

#define SOFILE "sec.so"
int (*f)();
int main()
{
void *dp;
dp=dlopen(SOFILE,RTLD_LAZY);
f=dlsym(dp,"f");
f();
return 0;
}
编译命令如下:
gcc -rdynamic -s -o myapp test.c

运行
$./myapp
10
$

Second/Third Layer Switch and Router technology

(转载)

目前技术的发展,可以说直接面向用户的第一层接口和第二层交换技术已经日趋 成熟。但是,作为网络的核心,起网间互连作用的路由器技术却没有实质性的突破。于是一种新的路由 技术应运而生----三层交换技术,说它是路由技术,因为它工作在网络协议的三层;说它是交换技术,交换速度特别快,几乎可以达到二层交换速度。在这些技术选择的权衡中,二层交换+路由组网与三层交换组网的选择是一个焦点问题。

(一) 二层交换技术

二层交换机属数据链路层设备,可以识别数据包中的MAC地址信息,根据MAC地址进行转发,并将这些MAC地址与对应的端口记录在自己内部的一个地址表中。具体的工作流程如下:

(1) 当交换机从某个端口收到一个数据包,它先读取包头中的源MAC地址,这样它就知道源MAC地址的机器是连在哪个端口上的;

(2) 再去读取包头中的目的MAC地址,并在地址表中查找相应的端口;

(3) 如表中有与这目的MAC地址对应的端口,把数据包直接复制到这端口上;

(4) 如表中找不到相应的端口则把数据包广播到所有端口上,当目的机器对源机器回应时,交换机又可以学习一目的MAC地址与哪个端口对应,在下次传送数据时就不再需要对所有端口进行广播了。

不断的循环这个过程,对于全网的MAC地址信息都可以学习到,二层交换机就是这样建立和维护它自己的地址表。

从二层交换机的工作原理可以推知以下三点(主要技术参数):

(1) 由于交换机对多数端口的数据进行同时交换,这就要求具有很宽的交换总线带宽,如果二层交换机有N个端口,每个端口的带宽是M,交换机总线带宽超过N×M,那么这交换机就可以实现线速交换;

(2) 学习与端口连接的机器的MAC地址并写入地址表,地址表的大小(一般两种表示方式:一为BEFFER RAM,一为MAC表项数值)影响交换机的接入容量;

(3) 还有一个就是二层交换机一般都含有专门用于处理数据包转发的ASIC (Application specific Integrated Circuit)芯片,因此转发速度可以做到非常快。由于各个厂家采用ASIC不同,直接影响产品性能。

(二)路由技术

路由器工作在OSI模型的第三层---网络层操作,其工作模式与二层交换相似,但路由器工作在第三层,这个区别决定了路由和交换在传递包时使用不同的控制信 息,实现功能的方式就不同。工作原理是在路由器的内部也有一个表,这个表所标示的是如果要去某一个地方,下一步应该向那里走,如果能从路由表中找到数据包下一步往那里走,把链路层信息加上转发出去;如果不能知道下一步走向那里,则将此包丢弃,然后返回一个信息交给源地址。

路由技术实质上来说不过两种功能:决定最优路由转发数据包。路由表中写入各种信息,由路由算法计算出到达目的地址的最佳路径,然后由相对简单直接的转发机制发送数据包。接受数据的下一台路由器依照相同的工作方式继续转发,依次类推,直到数据包到达目的路由器。

而路由表的维护,也有两种不同的方式。一种是路由信息的更新,将部分或者全部的路由信息公布出去,路由器通过互相学习路由信息,就掌握了全网的拓扑结构,这 一类的路由协议称为距离矢量路由协议;另一种是路由器将自己的链路状态信息进行广播,通过互相学习掌握全网的路由信息,进而计算出最佳的转发路径,这类路 由协议称为链路状态路由协议

由于路由器需要做大量的路径计算工作,一般处理器的工作能力直接决定其性能的优劣。当然这一判断还是对中低端路由器而言,因为高端路由器往往采用分布式处理系统体系设计。

因为使用中央架构,传统路由器经常缺乏可扩展性。到达路由器的所有数据包必须被送到一个单一的处理区。您拥有的接口数量越多,系统的负载越重,从而导致资源的过度占用。

当一个使用中央阻塞架构的路由器需要处理的流量超出自己的容量时,它就会开始丢弃数据包。当网络应用或计算机不能收到响应时,它们会为恢复会话而发送更 多的数据包。这只会使情况更糟——因为很容易导致交叉会话过载。这种情况下,过载的路由器会发展出自己的非逻辑性思维,根据应用、用户的优先级或网络目的 地/来源有选择性地丢弃数据包。很明显,需要一种新的处理流量增长的方法。


(三)三层交换技术(IP交换)

这是一种利用第三层协议中的IP数据包头信息来加强第二层交换功能的机制。

三层交换的工作过程详见《第三层交换技术介绍》一文

第三层交换使用第三层路由协议确定传输路径,此路径可以只用一次,也可以存储起来供以后使用;之后数据包通过一条虚电路绕过路由器快速转发。这就是通常所说的“一次路由多次转发”。最终的目的是将数据通信时的路由次数降到最低。

三层交换的特点:

由硬件结合实现数据的高速转发
这就不是简单的二层交换机和路由器的叠加,三层路由模块直接叠加在二层交换的高速背板总线上,突破了传统路由器的接口速率限制,速率可达几十Gbit/s。
多层交换机/路由器以线速转发数据包。交换ASIC以分布式的方式存在,允许整个系统高效地输送流量。当您添加更多的接口卡时,系统的处理能力也增加了——因为相关的逻辑和转发决策分布在整个设备上。

为确定网络流量的类型和数量,ASIC现在内置了新的数据包取样技术,以提供整个系统流量监控的控制平台。
RFC3176 - InMon Corporation's sFlow: A Method for Monitoring Traffic in Switched and Routed Networks
http://www.ietf.org/rfc/rfc3176.txt?number=3176


简洁的路由软件使路由过程简化
大部分的数据转发,除了必要的路由选择通过路由软件处理,其他都是由二层模块高速转发,路由软件大多都是经过处理的高效优化软件,并不是简单照搬路由器中的软件。

结论

二层交换机用于小型的局域网络。在小型局域网中,广播包影响不大,二层交换机的快速交换功能、多个接入端口和低廉价格为小型网络用户提供了很完善的解决方案。

路由器的优点在于接口类型丰富,支持的三层功能强大,路由能力强大,适合用于大型的网络间路由,它的优势在于选择最佳路由,负荷分担,链路备份及与其他网络进行路由信息的交换等等功能。

三层交换机最重要的功能是加快大型局域网络内部的数据快速转发,加入路由功能也是为这个目的服务的。如果把大型网络按照部门,地域等等因素划分成一个个小局域网,这将导致大量的网际互访,单纯的使用二层交换机不能实现网际互访;如单纯的使用路由器,由于接口数量有限和路由转发速度慢,将限制网络的速度和 网络规模,采用具有路由功能的快速转发的三层交换机就成为首选。

一般来说,在内网数据流量大,要求快速转发响应的网络中,如全部由三层交换机来做这个工作,会造成三层交换机负担过重,响应速度受影响。将网间的路由交给路由器去完成,充分发挥不同设备的优点,不失为一种好的组网策略,当然,前提是客户的腰包很鼓,不然就退而求其次,让三层交换机也兼为网际互连。

多层交换机/路由器的功能与传统的路由器和交换机无异,它们将局域网(LAN)和城域网(WAN)的功能集成于单一的设备中。它们可在同组的用户之间实现 本地交换(即第2层交换),与不同组的用户间实现路由(即第3层交换或路由),同时为应用提供安全性和特别服务(即第4层交换)。

2007年10月22日星期一

OpenRG platforn of Jungo

/* OpenRG Version 4.7 */

OpenRG平台的程序结构
( refer to 《Programmer's Guide v4.7》)

Based on various configuration options, the OpenRG system is comprised of several components of the following types:
Linux kernel or VxWorks
Kernel modules
OpenRG user-mode main program
Additional user-mode programs

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

16.8.2. Understanding Asynchronous Programming and Main Task Architecture

OpenRG management code logic is handled by Main Task and named "openrg". Main Task is a framework for running entities that provide services, and for controlling network devices. It is responsible for system initialization, reconfiguration, and communication of the reconfiguration events to the various entities, which in turn correspond with the functional tasks. Main Task is also responsible for coordinating dependencies between entities and network devices. For example, it coordinates between a DSL PPP link and a dependent underlying ATM device.

Each Main Task feature consist of two components: an entity and a task. The entity is a basic unit of operation within the Main Task which manages a specific function. Each entity manages a task that carries out its functionality. A task performs a certain function according to the configuration defined by the entity. The Main Task is the coordination logic under which all the entities run.

16.8.2.1. The Asynchronous Nature of Main Task

Since OpenRG management is being handled in a single process which runs all the time, operations should never perform blocking actions. Blocking actions are handled by an event dispatch loop. Main Task provides a callback mechanism to enable actions to be performed while other actions wait for a result. Main Task's general behavior is as follows:
  1. Main Task runs a task for the first time by calling the task's open() function.
  2. During the task's life cycle, it may need to wait for an external event to occur. This delay may be the result of the task waiting for a timeout or a packet.
  3. The task will register a request for the desired event in Main Task's event dispatch loop, specifying a callback function, and return to its caller - usually Main Task.
  4. When the registered event occurs, the dispatch loop invokes the callback function to handle the event.
16.8.2.2. The Task

A task is a set of functions that implement a certain protocol or service, for example PPP, DNS or HTTP. A task can be characterized as being self-contained and system independent. It does not rely on other tasks, configuration files or any other kind of outside help.

The OpenRG library, libOpenRG, provides the task with rudimentary services such as an event dispatch loop, memory allocation and logging functions. The entire configuration that a task may require is imparted as parameters to its open() function. The task's genuine work is actually performed by the callback function, a pointer which is also given as a parameter to the open() function. It follows that tasks are inherently portable and reusable. To illustrate, the Ping task can be employed in two different ways:
  • The DHCP server may use the Ping task to test whether an IP address it is about to lease is already taken by pinging the address in question. The task parameters in this case will be a ping packet, a brief time-out reply and callback functions. All of these are implemented in the DHCP code.
  • The Web-based management may use the Ping task to implement a 'Connectivity Diagnostics Test' interface screen. The task parameters will be the number of ping attempts, a ten second time-out and callback functions. Again, these parameters are implemented in the Web-based management code.

16.8.3. The Entity

An entity serves as a unified API between the task and core logic of the Main Task and the Configuration Database. An entity supports the following operations:
  • open - The entity registers itself, so that it will be called on relevant events.
  • changed - When rg_conf is modified, the entity must find out if there is an impact on its managed tasks.
  • reconf - The entity should reconfigure its tasks based on the old and new values of rg_conf .
  • close - The entity should shut down its tasks.
For example, the DNS entity handles the DNS task according to OpenRG's rg_conf configuration database. It initiates the DNS task, and equips it with callback functions that enable it to search for locally configured host names. These names are entered either manually by the user using the Web-based management, or by the DHCP server, which dynamically allocates IP addresses to computers on the network. The architectural advantage of this design is that the task is unaware of the configuration database format, nor of the methods of polling the DHCP server for a host name -- all of these responsibilities are left to the entity.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

25.2.1 Coordination Logic

OpenRG is a multi-threaded multi-process product.
There are many kernel threads which handle the Firewall, Bridge, Route and others;
as well as user mode proccesses which handle the File Server (Sabma), the IPSec (FreeSwan) and others.
  • Synchronization issues between processes/threads are avoided. Tasks cannot be interrupted while processing -- only when waiting for a callback.
  • Context switches are minimized.
  • Inter Process Communication (IPC) is simplified -- functional tasks communicate with the Main Task using a simple function call. Conversely, ordinary multi-process design involves information packaging, IPC tunneling and parsing by the receiving side.
  • Memory footprint is reduced by linking all of the modules together, eliminating code needed for IPC, configuration and synchronization.

At the heart of the system lays the event loop. Main Task is designed as an event-driven application. Events are
expired timers, network events (ready for read or write on a file descriptor) or an exception. Each component registers its own handlers for various events; this is usually done upon startup. Since events are used throughout the system, it does not appear explicitly in the following figures. The Coordination Logic is devided into 2 parts:
  • Generic which always exists. The major generic part is the Entities mechanism, which serves as a uniform API between tasks and the core logic of the Main Task. Each registered entity is notified on configuration changes, and may affect other entities. Additional information can be found later in this chapter, in Section 25.2.1.1.
  • Component Specific which belongs to specific components. For example, the TOD client entity, which is a part of the TOD client component, notifies the DHCP Server when a new time was received, so that it can update its lease status. Most components register themself as an entity, thereby are notified on configuration changes. Additional information can be found later in this chapter, in Section 25.2.1.2.
25.2.4 System Services

Inter Process Communication (IPC) is used for communication between the OpenRG process and other processes. For example, L2TP daemon uses IPC to check password for a specific user. IPC is implemeted by listening on a predefined TCP port on lo interface; interested processes need to use either ipc or mgt_client libraries to send commands to the main process and receive the results.

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
当前code中的entity信息在“pkg/main/entity.h, entity.c"中定义,主要的entity包括:
dhcp, dns, ddns, igd, snmp, ipsec, h323, rip, ppp, wbm, http, firewall, syslog, igmp, telnet, bridge, route,wpa, tftp, ftp, vpn, voip, cwmp, qos, upnp等。

当前系统中的进程:
openrg, l2tpd, init, keventd, ksoftirqd_cpu0, kswapd, bdflush, kupdated,
mtdblockd, ixp425_eth等
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


Boot Sequence

The OpenRG boot sequence proceeds as follows:
1. The boot loader is copied from Flash to RAM if necessary.
2. The boot loader begins executing.
3. The kernel image is decompressed and copied from Flash to RAM.
4. The RAM disk is decompressed and copied from Flash to RAM.
5. The boot loader concludes by starting the kernel.
6. The kernel initializes devices, peripherals and the main kernel thread (PID 1).
7. The kernel executes /bin/init and becomes the init (user mode) process.
8. The init process adds several modules to the kernel using insmod.
9. The init process executes /bin/openrg to start OpenRG.


//

2007年10月12日星期五

Understand UPnP

/* Universal Plug and Play */

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

UPnP 对消费者意味着什么?
包含UPNP技术的网络产品只需实际连到网络上,即可开始正常工作。实际上,UPnP 可以和任何网络媒体技术(有线或无线)协同使用。举例来说,这包括:Category 5 以太网电缆、Wi-Fi 或 802.11 无线网络、IEEE 1394("Firewire")、电话线网络或电源线网络。当这些设备与 PC 互连时,用户即可充分利用各种具有创新性的服务和应用程序。

UPnP 是一种分布式的,开放的网络架构,它可以充分发挥 TCP/IP 和网络技术的功能,不但能对类似网络进行无缝连接,而且还能够控制网络设备及在它们之间传输信息。在 UPnP 架构中没有设备驱动程序,取而代之的是普通协议。UPnP 是独立的媒介,在任何操作系统中,利用任何编程语言都可以使用 UPnP 设备。事实上,UPNP的制定正是希望未来所有连入Internet中的设备能够不受网关阻碍的相互通信。

UPnP是一组协议的统称,不能简单理解为UPnP = “自动端口映射”。
在BitComet下载中,UPnP包含了2层意思:

1、对于一台内网电脑,BitComet的UPnP功能可以使网关或路由器的NAT模块做自动端口映射,将BitComet监听的端口从网关或路由器映射到内网电脑上。
2、网关或路由器的网络防火墙模块开始对Internet上其他电脑开放这个端口。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

UPnP协议具有下述特色:   
  • 以网络为应用环境,不考虑“孤岛”中的计算机。
  • 以TCP/IP和整个Internet为基础。这样是“中立”的,不依附于任何操作系统或应用程序,不使用特定的API函数,不受程序设计语言的局限。可以无缝地接入传统网络。
  • 设备支持0设置,可以动态地进入网络中,自动获得一个 IP 地址,“学习” 或查找自己应当进行的操作和服务的信息;“感知”别的设备是否存在以及它们的作用和当前的状态 。所有这些,都应当是可自动完成的。最后,此设备能自动顺利地切断网络连接。
  • 每个设备都可读取属于自己的、特定的状态和参数;完成控制操作后应当发出“操作完成”的响应信号。如果失败,则应发出控制失败的信号。


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

完整的UPnP服务系统由支持UPnP的网络和符合UPnP规范的设备共同构成的。整个系统是由设备服务、和控制指针三部分所构成。

那么,UPnP的完整工作过程是怎样的呢?

  UPnP在控制指针和被控制设备之间提供通讯功能。而网络介质、TCP/IP协议、HTTP仅提供基本的连接和IP地址分配。整个工作过程需要处理六个方面的内容,即地址分配发现设备对设备的描述设备控制设备事件设备表达

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

UPnP NAT Traversal:

NAT 会“瓦解”许多家庭或小型企业中日渐需要的最新型 PC 和家庭网络技术,例如多玩家游戏、实时通讯及其它对等服务。如果在公用 Internet 上使用专用地址或同时使用同一端口号,这些应用程序就会中止。应用程序必须使用公共地址,且每个会话都须使用唯一的端口号。大型机构有专门的 IT 人员来确保其公司应用程序在 NAT 上正常使用,但较小的机构和消费者却不具备这样奢侈的条件。UPnP NAT Traversal 可以自动解决 NAT 给应用程序带来的许多问题,使之成为小型企业和消费者理想的解决方案。

NAT Traversal 解决方案是 UPnP IGD Working Committee 为制定 Internet 网关设备 (IGD) 规范所从事工作的一部分。

支持 UPnP 的 NAT Traversal 可确保下列情况的实现:
  • 多玩家游戏
  • 对等连接
  • 实时通讯
  • 远程协助(Windows XP 的功能之一)

通过提供下列操作的方法,UPnP 论坛的 IGD 规范可进行自动 NAT Traversal:
  • 了解公用 IP 地址
  • 列举现有的端口映射
  • 添加和删除端口映射
  • 指定映射的租用期

2007年10月11日星期四

TR069 vs SNMP

(转载)
家庭网络设备的远程管理需要解决的技术问题主要是管理通道和管理协议。远程管理的信息承载在IP包上,管理通道问题主要是解决如何传送承载管理信息的IP 包,这主要与具体的接入技术相关。如何保证管理通道的可用性和管理通道的带宽是目前相关接入技术需要解决的问题。管理协议主要是指IP层之上的管理内容传送协议,目前主要有IETF制定的SNMP和DSLFORUM制定的TR-069。管理协议的选择主要需要权衡安全性和协议复杂性。

TR-069协议栈的基本思路是利用Web服务中广泛使用的基于S0AP的RPC方法,其会话协议使用的是HTTP1.1协议,因此TR-069可以方便地应用在Web中应用的传送层安全技术(如SSL/TLS)。TR-069协议栈的下面几层充分利用目前Internet上广泛使用的通信协议,比如TCP、HTTP、SOAP等。通过这些成熟的协议,ACS和家庭网络设备之间可以方便地建立通信的基本通道。TR-069在SOAP之上定义了用于配置、查询、诊断等操作的特定RPC方法,通信的两端(ACS和用户设备)都可以通过RPC调用来完成某个特定功能的执行和得到返回的结果。


以传输为导向的简单网络管理协议 (SNMP)
对基于IP的传输网络而言,我们广泛部署了 SNMP 以监控交换机、路由器、服务器以及系统的性能、负载和其他运行参数,这对因特网的主干网以及大型企业级虚拟专用网 (VPN) 都非常重要。SNMP 生成的数据对网络管理员很有用,可用来评估网络的性能并发现流量瓶颈或潜在的瓶颈。此外,这种信息还有助于网络的设计或再设计。

以 PC 为中心的本地网络通用即插即用技术 (UpnP)
在因特网主干网的另一端,基于IP 的小型家庭网络常采用 UPnP 技术作为控制机制。PnP 最早的设计用于PC与外设之间的透明连接,目前已发展成为一种点对点架构。对消费者来说,UPnP 的优势之一在于使用方便。新型设备自动与家庭或办公室小型网络连接,并能被网络中的其他已加入设备"检测"到。(千万不要认为UPnP只能在LAN的范围内工作!!!)有些UPnP网络不受控制,因为网络中没有动态主机配置协议 (DHCP) 服务器。如果这样的话,那么连接UPnP网络的设备必须给自己分配一个IP地址。此外,安全性也是基于UPnP的家庭网络的一个问题。

有些服务供应商需要的远程管理工具不仅可以跨因特网工作,而且还能实现对家庭网络乃至终端设备的可视性,在这种情况下 SNMP 技术就难以胜任了。从一定程度上说,SNMP能对 TR-069 的功能有所补充,但不能满足当前及今后的控制、配置与管理特性的要求。另一方面,UPnP 只能解决局域网 (LAN) 的问题,而对广域传输网络问题却束手无策。

由 DSL 论坛定义的名为"CPE WAN 管理协议"的 TR-069 规范明确表示,其不仅提供覆盖运营商广域网 (WAN) 的管理机制,而且还将作为桥接 CPE 设备(其中许多 CPE 设备位于家庭或小型办公 LAN 中)的机制。
TR-069 规范的扩展系列目前正由 DSL 论坛开发,有关文件定义了 TR-069 如何通过 DSL CPE 对某些类型的设备进行远程管理。TR-069 中的自动配置与管理功能等服务也将通过 DSL CPE 提供给相连的设备,如 VoIP 电话与系统(TR-104 与 TR-110)、STB 以及掌上游戏机等。

(转载)

World Clocks

Endless Space Headline Animator

Mobile Ads