欢迎来到天天文库
浏览记录
ID:40227785
大小:224.00 KB
页数:6页
时间:2019-07-27
《NS2中数据包Packet的分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、NS2中数据包packet类结构图: packet类中的access函数如下:inlineunsignedchar*access(intoff)const{ if(off<0) abort(); return(&bits_[off]);}structhdr_cmn(即共用common头)中的access函数如下:inlinestatichdr_cmn*access(constPacket*p){ return(hdr_cmn*)p->access(offset_);}从以上的函数
2、可以看出只要给出特定的报头在packet中的偏移量offset_,立刻就能够取得指向该报头的指针(通过强类型转换,原理有点类似把一个子类强类型转换为其父类),从而访问或设置该报头内容。常见TCL脚本中有如下语句:remove-all-packet-headersadd-packet-headerAODVARP...setns[newSimulator]其中涉及到的函数如下:procadd-packet-headerargs{ foreachcl$args{ PacketHeaderManag
3、ersettab_(PacketHeader/$cl)1 }}#add-packet-header函数把要激活的报头对应的tab_数组元素置1脚本中newSimulator的工作之一就是创建包结构:Simulatorinstproccreate_packetformat{}{ PacketHeaderManagerinstvartab_ setpm[newPacketHeaderManager] foreachcl[PacketHeaderinfosubclass]{
4、 if[infoexiststab_($cl)]{ setoff[$pmallochdr$cl] #取得当前子报头在整个packet中的偏移 $cloffset$off #把这个赋给当前的子报头中的offset变量 } } $selfsetpacketManager_$pm}#下面的函数取得当前子报头在整个packet中的偏移PacketHeaderManagerinstproca
5、llochdrcl{ setsize[$clsethdrlen_] #取得子报头$cl的长度hdrlen_ $selfinstvarhdrlen_ #注意此处hdrlen_变量是PacketHeaderManager的 setNS_ALIGN8 setincr[expr($size+($NS_ALIGN-1))&~($NS_ALIGN-1)] #计算偏移,使用了向上进位保证了,incr的长度是一个字节(8bit)的倍数。 setbase
6、$hdrlen_ incrhdrlen_$incr #hdrlen_加上偏移 return$base #返回当前偏移}对于计算偏移NS手册上有如下表述:Theprocedurekeepsarunningvariablehdrlen_withthecurrentlengthofBOBasnewpacketheadersareenabled.Italsoarrangesfor8-bytealignmentforanynewly-enabledpacketheader.Thisis
7、neededtoensurethatwhendouble-worldlengthquantitiesareusedinpacketheadersonmachineswheredouble-wordalignmentisrequired,accessfaultsarenotproduced. 综上取得包中子报头的基本思路:首先设置包结构(packet)的报头中含有多少个子报头,然后初始化包结构,把各个子报头的offsize字段设置成正确的偏移量。然后用access函数就可以很方便地访问各个子报头了。2.移动节点的
8、通信过程: 两个对等无线节点的结构图 两个移动节点之间的通信过程图3.每个层对packet的设置: 总结:NS2中,packet结构在一次模拟中保持不变,packet在网络各个层次流动时,唯一的变化就是各个子报头中的内容改变了。即传输层把IP报头设
此文档下载收益归作者所有