NS2中TCP源代码分析.docx
《NS2中TCP源代码分析.docx》由会员分享,可在线阅读,更多相关《NS2中TCP源代码分析.docx(89页珍藏版)》请在冰豆网上搜索。
NS2中TCP源代码分析
NS2中TCP源代码分析
1:
NS2简介
NS2是一个开放源码的多协议网络模拟软件,来源于1989年的RealNetworkSimulator项目,经过多年的发展,于1995年得到施乐公司(Xerox)的支持,加入VINT项目。
NS2一直以来都在吸收世界各地研究者的成果,包括UCB、CMU等大学和SUN等公司的无线网络方面的代码,因此NS2一直都在不断的被更新和完善。
NS2是一个面向对象的、离散事件驱动的网络环境模拟工具,可以完整地模拟整个网络环境。
NS2使用一整套C++类库实现了绝大多数常见的网络协议以及链路层的模型,如:
有线网络或无线网络的TCP、UDP、路由、多播等多种协议模型,利用这些类库的实例就可以搭建起整个网络的模型,而且包括详尽的细节实现。
NS2使用了两种编程语言,OTcl(具有面向对象特性的Tcl脚本程序设计语言)和C++,NS2采用这两种语言是因为仿真工具有两方面的事情要做:
一方面,具体协议的模拟和实现,这需要一种能高效率的处理字节、报头等信息的程序设计语言,即对运行速度非常重要,而运行模拟环境的时间、寻找和修复Bug的时间,以及重新编译和运行的时间不是很重要,在这种情况下,C++语言是非常合适的;另一方面,许多网络中的实验或研究工作主要是围绕着网络组件和环境的具体参数的设置和改变而进行的,需要在短时间内快速的开发或模拟出所需要的网络环境,并且方便的修改和发现,在这种情况下,网络环境设置的时间就显得重要了,而脚本语言在这方面有很大的优势,具有面向对象特性的Tcl脚本语言可以充分的满足此需求。
C++和OTcl两种语言的对象和变量是通过TclCL关联起来的,C++的类和对象为编译类和编译对象,相反地OTcl的类和对象为解释类和解释对象,TclCL是在OTcl基础上的封装。
通过下面的NS2架构图来理解几者之间的关系。
对NS2使用者来说,OTcl脚本语言用于实现网络拓扑部分,OTcl是架构在Tcl之上的面向对象后的延伸,事件调度器和网络组件这两部分主要用C++编写。
C++在最底层则是表示NS2的核心主要就是C++。
TclCL是连接OTcl和C++的桥梁,最后搭配用户接口就构成了NS2。
2:
NS2中TCP源码分析
在源码包中,TCP源码放置在ns-allinone-2.29\tcp文件夹里。
打开tcp.cc
#include
#include
#include
#include"ip.h"
#include"tcp.h"
#include"flags.h"
#include"random.h"
#include"basetrace.h"
#include"hdr_qs.h"
inthdr_tcp:
:
offset_;
staticclassTCPHeaderClass:
publicPacketHeaderClass{
public:
TCPHeaderClass():
PacketHeaderClass("PacketHeader/TCP",
sizeof(hdr_tcp)){
bind_offset(&hdr_tcp:
:
offset_);
}
}class_tcphdr;
staticclassTcpClass:
publicTclClass{
public:
//存储类名Agent/TCP至classname_
TcpClass():
TclClass("Agent/TCP"){}
TclObject*create(int,constchar*const*){
return(newTcpAgent());
}
}class_tcp;
TcpAgent:
:
TcpAgent()
:
Agent(PT_TCP),
t_seqno_(0),t_rtt_(0),t_srtt_(0),t_rttvar_(0),
t_backoff_(0),ts_peer_(0),ts_echo_(0),
tss(NULL),tss_size_(100),
rtx_timer_(this),delsnd_timer_(this),burstsnd_timer_(this),
dupacks_(0),curseq_(0),highest_ack_(0),cwnd_(0),ssthresh_(0),
maxseq_(0),count_(0),rtt_active_(0),rtt_seq_(-1),rtt_ts_(0.0),
lastreset_(0.0),closed_(0),first_decrease_
(1),fcnt_(0),
nrexmit_(0),restart_bugfix_
(1),cong_action_(0),
ecn_burst_(0),ecn_backoff_(0),ect_(0),
qs_requested_(0),qs_approved_(0),
qs_window_(0),qs_cwnd_(0),frto_(0),debug_(0)
{
#ifdefTCP_DELAY_BIND_ALL
#else/*!
TCP_DELAY_BIND_ALL*/
//notdelay-boundbecausedelay-boundtracevarsaren'tyetsupported
bind("t_seqno_",&t_seqno_);
bind("rtt_",&t_rtt_);
bind("srtt_",&t_srtt_);
bind("rttvar_",&t_rttvar_);
bind("backoff_",&t_backoff_);
bind("dupacks_",&dupacks_);
bind("seqno_",&curseq_);
bind("ack_",&highest_ack_);
bind("cwnd_",&cwnd_);
bind("ssthresh_",&ssthresh_);
bind("maxseq_",&maxseq_);
bind("ndatapack_",&ndatapack_);
bind("ndatabytes_",&ndatabytes_);
bind("nackpack_",&nackpack_);
bind("nrexmit_",&nrexmit_);
bind("nrexmitpack_",&nrexmitpack_);
bind("nrexmitbytes_",&nrexmitbytes_);
bind("necnresponses_",&necnresponses_);
bind("ncwndcuts_",&ncwndcuts_);
bind("ncwndcuts1_",&ncwndcuts1_);
bind("debug_",&debug_);//addedbysmallko
#endif/*TCP_DELAY_BIND_ALL*/
}
void
TcpAgent:
:
delay_bind_init_all()
{
//Defaultsforboundvariablesshouldbesetinns-default.tcl.
delay_bind_init_one("window_");
delay_bind_init_one("windowInit_");
delay_bind_init_one("windowInitOption_");
delay_bind_init_one("syn_");
delay_bind_init_one("windowOption_");
delay_bind_init_one("windowConstant_");
delay_bind_init_one("windowThresh_");
delay_bind_init_one("delay_growth_");
delay_bind_init_one("overhead_");
delay_bind_init_one("tcpTick_");
delay_bind_init_one("ecn_");
delay_bind_init_one("SetCWRonRetransmit_");
delay_bind_init_one("old_ecn_");
delay_bind_init_one("eln_");
delay_bind_init_one("eln_rxmit_thresh_");
delay_bind_init_one("packetSize_");
delay_bind_init_one("tcpip_base_hdr_size_");
delay_bind_init_one("ts_option_size_");
delay_bind_init_one("bugFix_");
delay_bind_init_one("bugFix_ack_");
delay_bind_init_one("bugFix_ts_");
delay_bind_init_one("lessCareful_");
delay_bind_init_one("slow_start_restart_");
delay_bind_init_one("restart_bugfix_");
delay_bind_init_one("timestamps_");
delay_bind_init_one("ts_resetRTO_");
delay_bind_init_one("maxburst_");
delay_bind_init_one("aggressive_maxburst_");
delay_bind_init_one("maxcwnd_");
delay_bind_init_one("numdupacks_");
delay_bind_init_one("numdupacksFrac_");
delay_bind_init_one("exitFastRetrans_");
delay_bind_init_one("maxrto_");
delay_bind_init_one("minrto_");
delay_bind_init_one("srtt_init_");
delay_bind_init_one("rttvar_init_");
delay_bind_init_one("rtxcur_init_");
delay_bind_init_one("T_SRTT_BITS");
delay_bind_init_one("T_RTTVAR_BITS");
delay_bind_init_one("rttvar_exp_");
delay_bind_init_one("awnd_");
delay_bind_init_one("decrease_num_");
delay_bind_init_one("increase_num_");
delay_bind_init_one("k_parameter_");
delay_bind_init_one("l_parameter_");
delay_bind_init_one("trace_all_oneline_");
delay_bind_init_one("nam_tracevar_");
delay_bind_init_one("QOption_");
delay_bind_init_one("EnblRTTCtr_");
delay_bind_init_one("control_increase_");
delay_bind_init_one("noFastRetrans_");
delay_bind_init_one("precisionReduce_");
delay_bind_init_one("oldCode_");
delay_bind_init_one("useHeaders_");
delay_bind_init_one("low_window_");
delay_bind_init_one("high_window_");
delay_bind_init_one("high_p_");
delay_bind_init_one("high_decrease_");
delay_bind_init_one("max_ssthresh_");
delay_bind_init_one("cwnd_range_");
delay_bind_init_one("timerfix_");
delay_bind_init_one("rfc2988_");
delay_bind_init_one("singledup_");
delay_bind_init_one("LimTransmitFix_");
delay_bind_init_one("rate_request_");
delay_bind_init_one("qs_enabled_");
delay_bind_init_one("tcp_qs_recovery_");
delay_bind_init_one("qs_request_mode_");
delay_bind_init_one("qs_thresh_");
delay_bind_init_one("qs_rtt_");
delay_bind_init_one("frto_enabled_");
delay_bind_init_one("sfrto_enabled_");
delay_bind_init_one("spurious_response_");
#ifdefTCP_DELAY_BIND_ALL
//outbecausedelay-boundtracevarsaren'tyetsupported
delay_bind_init_one("t_seqno_");
delay_bind_init_one("rtt_");
delay_bind_init_one("srtt_");
delay_bind_init_one("rttvar_");
delay_bind_init_one("backoff_");
delay_bind_init_one("dupacks_");
delay_bind_init_one("seqno_");
delay_bind_init_one("ack_");
delay_bind_init_one("cwnd_");
delay_bind_init_one("ssthresh_");
delay_bind_init_one("maxseq_");
delay_bind_init_one("ndatapack_");
delay_bind_init_one("ndatabytes_");
delay_bind_init_one("nackpack_");
delay_bind_init_one("nrexmit_");
delay_bind_init_one("nrexmitpack_");
delay_bind_init_one("nrexmitbytes_");
delay_bind_init_one("necnresponses_");
delay_bind_init_one("ncwndcuts_");
delay_bind_init_one("ncwndcuts1_");
#endif/*TCP_DELAY_BIND_ALL*/
delay_bind_init_one("debug_");//addedbysmallko
Agent:
:
delay_bind_init_all();
reset();
}
int
TcpAgent:
:
delay_bind_dispatch(constchar*varName,constchar*localName,TclObject*tracer)
{
if(delay_bind(varName,localName,"window_",&wnd_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"windowInit_",&wnd_init_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"windowInitOption_",&wnd_init_option_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"syn_",&syn_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"windowOption_",&wnd_option_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"windowConstant_",&wnd_const_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"windowThresh_",&wnd_th_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"delay_growth_",&delay_growth_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"overhead_",&overhead_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"tcpTick_",&tcp_tick_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"ecn_",&ecn_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"SetCWRonRetransmit_",&SetCWRonRetransmit_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"old_ecn_",&old_ecn_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"eln_",&eln_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"eln_rxmit_thresh_",&eln_rxmit_thresh_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"packetSize_",&size_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"tcpip_base_hdr_size_",&tcpip_base_hdr_size_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"ts_option_size_",&ts_option_size_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"bugFix_",&bug_fix_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"bugFix_ack_",&bugfix_ack_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"bugFix_ts_",&bugfix_ts_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"lessCareful_",&less_careful_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"timestamps_",&ts_option_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"ts_resetRTO_",&ts_resetRTO_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"slow_start_restart_",&slow_start_restart_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"restart_bugfix_",&restart_bugfix_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"maxburst_",&maxburst_,tracer))returnTCL_OK;
if(delay_bind_bool(varName,localName,"aggressive_maxburst_",&aggressive_maxburst_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"maxcwnd_",&maxcwnd_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"numdupacks_",&numdupacks_,tracer))returnTCL_OK;
if(delay_bind(varName,localName,"numdupacksFrac_",&numdupacksFrac_,tracer))ret