如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
MAC层理解第页共NUMPAGES5页NS2mac层理解mac-802_11.h://framecontrolfield:structframe_control{u_charfc_subtype:4;u_charfc_type:2;//frametype:RTS,CTS,ACK,datau_charfc_protocol_version:2;u_charfc_order:1;u_charfc_wep:1;u_charfc_more_data:1;u_charfc_pwr_mgt:1;u_charfc_retry:1;u_charfc_more_frag:1;u_charfc_from_ds:1;u_charfc_to_ds:1;};//framefield:structhdr_mac802_11{structframe_controldh_fc;//durationofreservedtransmissiontime(RTS/CTS)u_int16_tdh_duration;//address1:MACaddressofwirelesshostorAPtoreceivethisframeu_chardh_ra[ETHER_ADDR_LEN];//MACaddressofwirelesshostorAPtransmittingthisframeu_chardh_ta[ETHER_ADDR_LEN];//MACaddressofrouterinterfacetowhichAPisattachedu_chardh_3a[ETHER_ADDR_LEN];//usedonlyinadhocmodeu_chardh_4a[ETHER_ADDR_LEN];u_int16_tdh_scontrol;u_chardh_body[1];//sizeof1forANSIcompatibility};发送包:recv()-->send()-->sendDATA()andsendRTS()-->startdefertimer-->deferHandler()-->check_pktRTS()-->transmit()-->recv()-->recievetimerstarted-->recv_timer()-->recvCTS()-->tx_resume()-->startdefertimer-->rx_resume()-->deferHandler()-->check_pktTx()-->transmit()-->recv()-->recievetimerstarted-->recv_timer()-->recvACK()-->tx_resume()-->callback_-->rx_resume()recv()(down)--要发送的数据包先被recv()处理,recv()先检查包头方向字段,如果是down,意味着包来自上层,数据包将转由send()处理。不管接收包来自上层或下层,recv()总被调用。send()--首先检查能量模式,如果在睡眠模式则丢弃包,并随包设callback_给handler(?),这是包传送完毕后会调用handler的原因。下一步,send()调用sendDATA()andsendRTS建立数据包包头,RTS包存储在pktTx_andpktRTS_并随数据包发送。数据包的MAC头赋唯一序列值。MAC用is_idle()检查backofftimer,如果backofftimer不减少,则检查信道(medium)是否空闲,如果空闲则启动defer.DIFS+arandomlychosenamountoftimeintheinterval[0,cw_),cw_当前竞争窗口。如果节点正在等待其defertime,则继续等待。如果介质忙,节点启动其backofftimer.此时,send()结束,控制将在timerexpired后调用deferHandler()或backoffHandler().//部分send()代码://若是目前backofftimer并没有在countdownif(mhBackoff_.busy()==0){//此时channel又是idleif(is_idle()){//若是节点已经再等待defertimer,则让defertimer继续,因此不做任何的设定.但是若没有defertimer,就要根据802.11的规定,需要再等待一个DIFS和一个randomtime才能做资料的传送,而这个randomtime是由[0,cw_]所决定的if(mhDefer_.busy()==0){rTime=(Random::random()%cw_)*(phymib_.getSlotTime