分类:
2011-05-24 19:37:07
http://happywh583.blog.sohu.com/67413384.html
为了理清楚NS底层源码的实现原理以及给后来人一些借鉴,我打算近期把NS底层的东西用图示的方式表达出来。为了便于入手和理解,我将从最底层开始画起:
第一篇
Channel(信道)
信道在通信系统中算是比较底层的东西了,你可以把它看作是通信的介质(声音通过空气才可以传播,信道的作用类似于空气)。无线通信中的信道具体可以指频率或者CDMA中的码道。
程序中的信道,我宁愿把它想像成管道之类的东西,毕竟它的作用就是连接通信的两端。言归正传,我们来看看NS2中的有线信道吧,对应代码在channel.h和channel.cc中,大致的结构如下图:
它对外的主要接口是向上层发送sendUp和接受recv;
我们再来看一下无线信道,对于的源码也在channel.{h,cc}中。大致的结构如下图:
主要的接口同上。Channel应该提供基础设施来支持Mac的载波侦听、竞争和冲突检测,不过ns2.29中,这部分代码都被注释掉了。说明:上图并未列出无线信道的所有属性,只是把主要属性和接口示意出来,下面的图示也是如此。
Phy (物理层)
在介绍Phy之间,先介绍一个通用连接“上下”的连接器BiConnector,大致的示意图如下:
它起到了“承上启下”的连接作用,它是一个虚基类,所有有上下层次关系的构件都可以继承它,Phy就是其中之一。BiConnector拥有指向上和指向下的指针uptarget、downtarget,通过它们可以迅速的地找到“上面”和“下面”的构件。此外,它还有向上通信(发送)和向下通信(发送)的接口sendUp、sendDown,以及接收接口recv;
Phy继承了BiConnector,自然具有BiConnector的所有属性和接口,但是它也有自身的一些特别重要的属性,请先看示意图:
为了突出重点,图中省略了一些从BiConnector继承的属性。注意图中的chnl_link_和node_link_都是结构体类型。chnl_link_的定义如下:
struct {
Phy *le_next; /* next element */
Phy **le_prev; /* address of previous next element */
}
chnl_link_的作用是把连在同一条信道(channel)上的Phy都串起来,
node_link_的作用是把连在同一个节点上的Phy都串起来。其它的两个属性node指向节点,channel指向信道。
物理层的主要作用是控制信道的访问,同时也能够设置带宽和计算传输时间等。
Channel和Phy合在一起可以看作我们通常所说的物理层,这样Channel就负责模拟数据包在物理层上的传输,Phy负责控制Channel传输。