亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tcp-fast.c

?? fast_tcp的源代碼加上了自己對它的中文注釋
?? C
?? 第 1 頁 / 共 3 頁
字號:
* The need for a mechanism to ensure that Sack TCP sends a packet in
* response to a partial ACK has been discussed in
* "Challenges to Reliable Data Transport over Heterogeneous
* Wireless Networks", Hari Balakrishnan, 1998, and in
* "Responding to Spurious Timeouts in TCP", Andrei Gurtov and
* Reiner Ludwig, 2003.
*/
void
FastTcpAgent::partial_ack_action()
{
	if (next_pkt_ < highest_ack_ + 1)
	{
		next_pkt_ = highest_ack_ + 1;
	}
	// Output two packets in response to a partial ack,
	//   so as not to do worse than slow-start.
	int i;
	for (i = 1; i<=2; i++)
	{
		int getNext = scb_->GetNextUnacked(next_pkt_);
		
		if (getNext > next_pkt_)
		{
			next_pkt_ = getNext;
		}
		if (t_seqno_ < next_pkt_)
		{
			t_seqno_ = next_pkt_;
		}
		output(next_pkt_, TCP_REASON_PARTIALACK);
		scb_->MarkRetran(next_pkt_);
		++next_pkt_;
	}
	return;
}

void FastTcpAgent::timeout(int tno)
{
	if (tno == TCP_TIMER_RTX)
	{
	/*
	* IF DSACK and dynamic adjustment of numdupacks_,
	*  check whether a smaller value of numdupacks_
	*  would have prevented this retransmit timeout.
	* If DSACK and detection of premature retransmit
	*  timeouts, then save some info here.
		*/
		dupacks_ = 0;
		fastrecov_ = FALSE;
		timeout_ = TRUE;
		if (highest_ack_ > last_ack_)
			last_ack_ = highest_ack_;
		recover_ = maxseq_;
		scb_->ClearScoreBoard();
		if (highest_ack_ == maxseq_ && !slow_start_restart_)
		{
		/*
		* TCP option:
		* If no outstanding data, then don't do anything.
		*
		* Note:  in the USC implementation,
		* slow_start_restart_ == 0.
		* I don't know what the U. Arizona implementation
		* defaults to.
			*/
			return;
		};
		last_cwnd_action_ = CWND_ACTION_TIMEOUT;
		reset_rtx_timer(0, 0);
		++nrexmit_;
		slowdown(CLOSE_CWND_RESTART|CLOSE_SSTHRESH_HALF);
		cwnd_ = double(slowstart_);
		newcwnd_ = 0;
		send_much(0, TCP_REASON_TIMEOUT, maxburst_);
	} else
	{
	/* delayed-sent timer, with random overhead to avoid
		* phase effect. */
		send_much(1, TCP_REASON_TIMEOUT, 3);
	}
}

void FastTcpAgent::send_much(int force, int reason, int maxburst)
{
	register int found, npacket = 0;
	int win = window();
	int xmit_seqno;
	
	found = 1;
	if (!force && delsnd_timer_.status() == TIMER_PENDING)
		return;
	/* Save time when first packet was sent, for newreno  --Allman */
	if (t_seqno_ == 0)
		firstsent_ = Scheduler::instance().clock();
		/*
		* as long as the pipe is open and there is app data to send...
	*/
	while (((!fastrecov_ && (t_seqno_ <= last_ack_ + win)) ||
		(fastrecov_ && (pipe_ < int(cwnd_))))
		&& t_seqno_ < curseq_ && found)
	{
		
		if (overhead_ == 0 || force)
		{
			found = 0;
			int oldest_unacked_pkt = scb_->GetNextUnacked(last_ack_);
			if (oldest_unacked_pkt != -1 &&
				fasttime() - sendtime_[oldest_unacked_pkt%maxwnd_] > 2*avgRTT_)	//當未得到確認的包超時時重新傳送該包
			{
				xmit_seqno = oldest_unacked_pkt;
			}
			else
				xmit_seqno = scb_->GetNextRetran ();
			if (xmit_seqno == -1) 
			{
				if ((!fastrecov_ && t_seqno_<=highest_ack_+win)||
					(fastrecov_ && t_seqno_<=highest_ack_+int(wnd_)))
				{
					found = 1;
					xmit_seqno = t_seqno_++;	//遞加要發(fā)送包序號
				}
			} else if (recover_>0 && xmit_seqno<=highest_ack_+int(wnd_))
			{
				found = 1;
				scb_->MarkRetran (xmit_seqno);
				win = window();
			}
			if (found)
			{
				output(xmit_seqno, reason);
				if (t_seqno_ <= xmit_seqno)
					t_seqno_ = xmit_seqno + 1;
				npacket++;
				pipe_++;
				if (QOption_)
					process_qoption_after_send () ;
				if (qs_approved_ == 1) 
				{
					double delay = (double) t_rtt_ * tcp_tick_ / cwnd_;
					delsnd_timer_.resched(delay);
					return;
				}
			}
		} else if (!(delsnd_timer_.status() == TIMER_PENDING))
		{
		/*
		* Set a delayed send timeout.
		* This is only for the simulator,to add some
		*   randomization if speficied.
			*/
			delsnd_timer_.resched(Random::uniform(overhead_));
			return;
		}
		if (maxburst && npacket == maxburst)
			break;
	} /* while */
}

void
FastTcpAgent::output(int seqno, int reason)
{
	Packet* p = allocpkt();
	hdr_tcp *tcph = hdr_tcp::access(p);
	double now = Scheduler::instance().clock();
	hdr_flags* hf = hdr_flags::access(p);
	hdr_ip *iph = hdr_ip::access(p);
	int databytes = hdr_cmn::access(p)->size();
	tcph->seqno() = seqno;
	tcph->ts() = now;
	tcph->reason() = reason;
	/* if this is the 1st pkt, setup senttime[] and transmits[]
	* I alloc mem here, instrad of in the constructor, to cover
	* cases which windows get set by each different tcp flows */
	if (seqno==0)
	{
		maxwnd_ = int(wnd_);
		if (sendtime_)
			delete []sendtime_;
		if (transmits_)
			delete []transmits_;
		if (cwnd_array_)
			delete []cwnd_array_;
		sendtime_ = new double[maxwnd_];
		transmits_ = new int[maxwnd_];
		cwnd_array_= new double[maxwnd_];
		for(int i=0;i<maxwnd_;i++)
		{
			sendtime_[i] = -1.;
			transmits_[i] = 0;
			cwnd_array_[i]=-1;
		}
	}
	
	if (ecn_)
	{
		hf->ect() = 1; // ECN capable transport.
	}
	
	/* Check if this is the initial SYN packet. */
	if (seqno == 0)
	{
		if (syn_)
		{
			databytes= 0;
			curseq_ += 1;
			hdr_cmn::access(p)->size() = tcpip_base_hdr_size_;
		}
		if (ecn_)
		{
			hf->ecnecho() = 1;
			//			hf->cong_action() = 1;
			hf->ect() = 0;
		}
	}
	else if (useHeaders_ == true)
	{
		hdr_cmn::access(p)->size() += headersize();
	}
	
	// record a find grained send time and # of transmits
	int index = seqno % maxwnd_;
	sendtime_[index] = fasttime();
	cwnd_array_[index]=avg_cwnd_last_RTT_;
	++transmits_[index];
	/* support ndatabytes_ in output - Lloyd Wood 14 March 2000 */
	int bytes = hdr_cmn::access(p)->size();
	ndatabytes_ += bytes;
	ndatapack_++; // Added this - Debojyoti 12th Oct 2000
	send(p, 0);
	
	if (seqno == curseq_ && seqno > maxseq_)
		idle();  // Tell application I have sent everything so far
	
	if (seqno > maxseq_)
	{
		maxseq_ = seqno;
		if (!rtt_active_)
		{
			rtt_active_ = 1;
			if (seqno > rtt_seq_)
			{
				rtt_seq_ = seqno;
				rtt_ts_ = now;
			}
		}
	} else
	{
		++nrexmitpack_;
		nrexmitbytes_ += bytes;
	}
	
	if (!(rtx_timer_.status() == TIMER_PENDING))
		/* No timer pending.  Schedule one. */
		set_rtx_timer();
}

/******************************************************************************/
/* Space out increments to cwnd as acknowledegements arrive */
/* cwndp points to the actual cwnd value */
/* cwnd_incre (0 or 1) specifies the desired amount to increase cwnd by */
/* (eventually) */
void
FastTcpAgent::fast_pace(TracedDouble *cwndp, int incre_4_cwnd)
{
	if ( !avgRTT_ )		//初始化時
		return;
	
	double acks_per_period = (double)acks_last_rtt * fast_update_cwnd_interval_ / avgRTT_;//平均RTT時間內收到的確認數(shù)
	
	if ( incre_4_cwnd >= 1 )
	{
		cwnd_increments += incre_4_cwnd;
		/* bc_spacing: target number of ACKs between increments */
		bc_spacing = (short unsigned int)(acks_per_period/cwnd_increments);
		/* bc_ack: number of ACKs since last increment */
		bc_ack = 1;
	}else
	{
		bc_ack ++;
	}
	if (cwnd_increments)
	{
		/* if cwnd small, increment immediately */
		if (*cwndp <= 4)		//窗口初值很小
		{
			/* if increment would more than double cwnd, do it in stages *///最大只能以倍數(shù)增大窗口
			if (*cwndp < cwnd_increments)
			{
				cwnd_increments -= (unsigned int)*cwndp;
				*cwndp += *cwndp;
			}
			else
			{
				*cwndp += cwnd_increments;
				cwnd_increments=0;
				bc_spacing=0;
			}
			bc_ack=0;
		}
		else if (bc_ack >= bc_spacing)
		{
			(*cwndp)++;
			cwnd_increments--;
			bc_ack = 0;
		}
	}
}

/******************************************************************************/
/*
* return -1 if the oldest sent pkt has not been timeout (based on
* fine grained timer).
*/
int
FastTcpAgent::fast_expire(Packet* pkt)
{
	hdr_tcp *tcph = hdr_tcp::access(pkt);
	double elapse = fasttime() - sendtime_[(tcph->seqno()+1)%maxwnd_];
	if (elapse >= 2 * avgRTT_)		//超過兩倍的平均RTT時間,確定已經超時;
	{
		return(tcph->seqno()+1);
	}
	return(-1);
}

/******************************************************************************/
void
FastTcpAgent::fast_recv_newack_helper(Packet *pkt)
{
	newack(pkt);
	
	if (ect_)
	{
		if (!hdr_flags::access(pkt)->ecnecho())
			ecn_backoff_ = 0;
		if (!ecn_burst_ && hdr_flags::access(pkt)->ecnecho())
			ecn_burst_ = TRUE;
		else if (ecn_burst_ && ! hdr_flags::access(pkt)->ecnecho())
			ecn_burst_ = FALSE;
	}
	if (!ect_ && hdr_flags::access(pkt)->ecnecho() &&
		!hdr_flags::access(pkt)->cong_action())
		ect_ = 1;
	/* if the connection is done, call finish() */
	if ((highest_ack_ >= curseq_-1) && !closed_)
	{
		closed_ = 1;
		finish();
	}
	if (QOption_ && curseq_ == highest_ack_ +1)
	{
		cancel_rtx_timer();
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
老司机午夜精品| 日韩高清不卡一区| 色综合中文字幕国产 | 亚洲精品一区二区三区福利| 日韩国产成人精品| 555www色欧美视频| 韩国成人精品a∨在线观看| 久久综合狠狠综合久久综合88| 国产成人精品亚洲日本在线桃色| 中文字幕亚洲不卡| 欧美四级电影网| 久久国产麻豆精品| 最新久久zyz资源站| 欧美日韩国产片| 精品亚洲国内自在自线福利| 亚洲国产经典视频| 欧美三片在线视频观看| 国内精品视频一区二区三区八戒| 中文字幕第一区| 欧美日韩国产首页| 国产成人精品午夜视频免费| 亚洲综合av网| 日韩一级成人av| 成人丝袜视频网| 午夜精品久久久| 国产精品女主播av| 欧美一级片免费看| 99久久精品国产精品久久| 日韩精品福利网| 亚洲欧洲韩国日本视频| 日韩午夜中文字幕| 色综合天天综合色综合av| 免费人成黄页网站在线一区二区| 国产精品色呦呦| 91精品国产综合久久精品性色 | 日韩中文字幕不卡| 国产欧美日韩精品一区| 91精品婷婷国产综合久久竹菊| 成人少妇影院yyyy| 精品一区二区三区免费播放 | 日韩精品亚洲一区| 亚洲人成网站色在线观看| 欧美电影精品一区二区| 91国偷自产一区二区开放时间| 久久91精品久久久久久秒播| 亚洲成人激情社区| 亚洲视频资源在线| 久久久久国产精品麻豆ai换脸| 欧美另类videos死尸| 成人99免费视频| 国产在线日韩欧美| 日韩精品乱码免费| 亚洲午夜影视影院在线观看| 国产精品电影院| 久久久久久久久97黄色工厂| 777xxx欧美| 欧美日韩性生活| 在线视频国内自拍亚洲视频| jizzjizzjizz欧美| 高清av一区二区| 国产激情视频一区二区在线观看| 美女视频第一区二区三区免费观看网站| 自拍偷拍欧美精品| 欧美经典一区二区| 久久久久久久精| 精品少妇一区二区三区在线播放| 91精品国产综合久久精品| 欧美三级视频在线| 在线免费观看日本一区| 91在线高清观看| 一本大道av一区二区在线播放| 成人av小说网| 成人免费毛片片v| 成人短视频下载| 丁香亚洲综合激情啪啪综合| 国产白丝网站精品污在线入口| 国产精品自在在线| 国产精品综合网| 国产福利91精品| 成人久久久精品乱码一区二区三区| 国产精品99久久久久久有的能看| 国产精品一二三四| 国产精品一二三区在线| 国产成人综合精品三级| 国产99精品国产| 成人app软件下载大全免费| aaa亚洲精品| 91黄色免费观看| 欧美日韩国产经典色站一区二区三区| 欧美日韩视频第一区| 91精品久久久久久久99蜜桃| 精品久久久久久无| 欧美国产激情一区二区三区蜜月 | 99久久免费视频.com| 91福利视频久久久久| 欧美色视频在线| 91精品国产福利| 久久这里只有精品首页| 国产精品久久久久久久久果冻传媒 | 欧美日韩亚洲高清一区二区| 91精品在线一区二区| 久久嫩草精品久久久久| 国产欧美日产一区| 依依成人综合视频| 久久国产精品72免费观看| 大陆成人av片| 精品视频色一区| 久久久亚洲午夜电影| 亚洲乱码中文字幕| 日韩成人av影视| 国产高清不卡二三区| 欧美日韩日日摸| 国产视频一区在线观看| 亚洲国产中文字幕| 国产盗摄一区二区三区| 欧美日本在线观看| 欧美韩国日本综合| 日本女优在线视频一区二区| 国产99久久久国产精品潘金 | 日本高清免费不卡视频| 精品久久久网站| 亚洲资源中文字幕| 国产ts人妖一区二区| 欧美区一区二区三区| 国产精品污网站| 日韩高清欧美激情| 色偷偷成人一区二区三区91| 欧美电影精品一区二区| 亚洲一区二区三区三| 懂色av一区二区三区蜜臀| 欧美一级欧美三级| 综合av第一页| 国产成人免费高清| 日韩一级片在线播放| 亚洲国产视频在线| 97se亚洲国产综合自在线不卡 | 三级不卡在线观看| 91麻豆精品在线观看| 欧美精品一区二区三区久久久| 亚洲午夜免费福利视频| 91香蕉视频在线| 中文字幕欧美激情一区| 久久成人免费电影| 91精品中文字幕一区二区三区| 亚洲影院理伦片| av不卡一区二区三区| 国产精品美女久久久久久久| 精品一区二区三区香蕉蜜桃| 制服丝袜激情欧洲亚洲| 伊人性伊人情综合网| 成人app下载| 国产精品色哟哟| 国产激情视频一区二区三区欧美| 精品欧美久久久| 精品一区二区三区影院在线午夜| 日韩三级.com| 日韩国产在线观看| 在线电影欧美成精品| 午夜影院在线观看欧美| 欧美三区在线观看| 亚洲国产精品久久艾草纯爱| 91福利视频网站| 亚洲一区二区在线免费观看视频| 色悠悠久久综合| 亚洲激情第一区| 在线看不卡av| 亚洲成a人片在线不卡一二三区| 欧亚洲嫩模精品一区三区| 夜夜夜精品看看| 欧美精品久久久久久久多人混战| 天天av天天翘天天综合网| 欧美群妇大交群中文字幕| 美女在线视频一区| 久久中文娱乐网| 成人白浆超碰人人人人| 亚洲精品国产第一综合99久久| 日本精品一区二区三区四区的功能| 亚洲人成小说网站色在线| 91久久精品网| 日韩精品乱码免费| 2023国产精华国产精品| 国产高清视频一区| 亚洲日穴在线视频| 欧美日韩国产高清一区| 精品一区二区免费在线观看| 久久久亚洲精品一区二区三区| 成人av在线影院| 亚洲一区二区高清| 日韩欧美电影一区| 国产不卡免费视频| 亚洲电影一级片| 精品精品欲导航| av不卡在线观看| 日韩精品亚洲专区| 中文字幕av在线一区二区三区| 欧美中文一区二区三区| 国产一区二区不卡| 一区二区三区国产豹纹内裤在线| 日韩午夜激情av| av日韩在线网站|