今天刚在netforum上看到一个帖子,讨论的是NS2路由协议和数据转发,转载下:
我再写一次,看能不能发上来!在ns manual中有一章是介绍classifier的,这个classifier就是一个节点的入口,功能就是利用路由表,根据一定的规则将收到的数据包进行转发,单播路由中默认的分类器是DestHashClassifier,就是根据数据包的目的地址来转发。可以看出来,这个里面和路由协议是没有关系的。但是又不是真的没有关系,路由表就是路由协议形成的。路由协议其实也是在每个节点上有一个路由agent,任何节点上的agent都是有端口的,所以这个时候可以把路由agent看作是tcp层的(事实上也是),各个路由agent之间进行通信,通信的方式和我们的tcp层的agent的通信方式是一样的。所以这个agent肯定看不到本节点上其他agent的数据,所以想在路由协议里处理节点的数据包(非路由包)是不可能的事情。
void Classifier::recv(Packet* p, Handler*)
{
NsObject* node;
int cl = classify(p);
if (cl < 0 || cl >= nslot_ || (node = slot_[cl]) == 0) {
Tcl::instance().evalf("%s no-slot %d", name(), cl);
Packet::free(p);
return;
}
node->recv(p);
}
看见没有,这个是classifier的recv函数,就是接受到一个包后,根据一定的规则(classify)来查询路由表(一个表项就是一个slot),然后再用相应的节点的recv函数接收(就是把数据转发出去了)。
这也就是说明了一个问题,如果想要做一个能处理数据报的上层overlay,那么就不能做成agent的形式,因为agent之间是不透明,overlay agent是无法看到tcp or udp agent所产生的数据报,也就无从进行处理,这就很有意思了,应该怎么做呢……
08/25
也不见得就一定是不行,难道真的不能让一个agent接收其他agent的数据吗?
不管怎么说要先明白