NS2:timeout时间(在check_pktRTS()函数中计算)的含义

int Mac802_11::check_pktRTS() //check_pktRTS():check if we have RTS packet to send
{ //if we have,send it then return 0; otherwise return -1
struct hdr_mac802_11 *mh;
double timeout;
assert(mhBackoff_.busy() == 0);
if(pktRTS_ == 0) // 1. have RTS packet to send?
return -1; //NO: return -1
mh = HDR_MAC802_11(pktRTS_);
switch(mh->dh_fc.fc_subtype) { //yes:
case MAC_Subtype_RTS:
if(! is_idle()) { // 2. channel is idle? 
inc_cw(); //NO: increase contention window
mhBackoff_.start(cw_, is_idle()); //start backoff timer, time out=CW
return 0;
}
setTxState(MAC_RTS); //yes: 将状态设置为MAC_RTS,后面send_timer()函数根据这个状态判断是否需要重传

timeout = txtime(phymib_.getRTSlen(), basicRate_) //timeout: the time that send the RTS out
+ DSSS_MaxPropagationDelay // 0.000002:2us
+ phymib_.getSIFS()
+ txtime(phymib_.getCTSlen(), basicRate_)
+ DSSS_MaxPropagationDelay;
break;
default:
fprintf(stderr, "check_pktRTS:Invalid MAC Control subtype\n");
exit(1);
}
transmit(pktRTS_, timeout); // 3.call transmit() ,send the RTS packet
return 0;
}

inline void Mac802_11::transmit(Packet *p, double timeout)
{
tx_active_ = 1;
....
downtarget_->recv(p->copy(), this); 
mhSend_.start(timeout); //在timeout时间之后,调用send_time()函数,在send_time()中判断是否需要重传
// 4.start TxTimer(TxTimer::handle:mac->sendHandler(), call send_timer()): judge whether need for re-transmission.
mhIF_.start(txtime(p)); // 5.start interface timer, timerout=transmit time (call txHandler() )
}





timeout时间的意义:

   在802.11的握手机制中,发送节点在发送时利用TxTimer定时器给后续响应帧的预定截止到达时刻进行定时。当定时时间timeout结束而发送节点没有接收到响应帧,表示发送失败,发送节点的sendHandler()被调用进行重传操作。


在上面的check_pktRTS()函数中,timeout = txtime(phymib_.getRTSlen(), basicRate_)

    + DSSS_MaxPropagationDela

    + phymib_.getSIFS()
    + txtime(phymib_.getCTSlen(), basicRate_)

    + DSSS_MaxPropagationDelay;

timeout = RTS包的传输时间 + 最大传播时延 + SIFS + CTS包的传输时间 + 最大传播时延

表示后续的CTS响应帧预定截止的到达时刻,如果timeout结束之后,发送节点还没有收到CTS包,则表示RTS发送失败,请求重传RTS包。

即在 transmit(pktRTS_, timeout)之后,发送节点返回rece()函数等待CTS包的接收,接收到CTS包之后,会将状态设置为setTxState(MAC_IDLE),(在recvCTS()->tx_resume()函数中设置),在send_timer()函数中通过这个状态判断发送节点已经成功收到CTS包,不需要重传RTS。如果状态仍然为发送RTS后的状态(setTxState:MAC_RTS),则表示发送节点没有成功收到CTS包,此时重传RTS(RetransmitRTS())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值