ns-2与TCP拥塞模拟 TCP拥塞控制核心模块-变量说明
来源:互联网 发布:mac最出名的豆沙色 编辑:程序博客网 时间:2024/03/29 23:41
C++中继承TcpAgent的子类
我们先从测试的角度来看,TCP代理模块都暴露了哪些属性给OTcl脚本,也就是说,用set命令可以得到哪些属性。
TCP发送端的设定参数如下所示。
表TCP发送端的设定参数
fid_
TCP连接的编号(Flow ID)
window_
通告窗口(Advertised Window)的上限值(upper bond)。通告窗口指的是接收端的缓冲区可以容纳的数据包个数。因此当拥塞窗口的值超过通告窗口时,TCP的发送端会执行流量控制,以避免发送得太快而导致接收端的缓冲区溢出
maxcwnd_
拥塞窗口的最大值
windowInit
拥塞窗口的初始值
ecn_
True表示使用ECN
packetSize_
发送包的数据大小
tcpTick_
TCP的超时时间(默认值为0.01s)
maxburst_
每收到一个ACK触发的发送端最多能送出的数据包的个数。0表示关闭此选项功能
TCP接收端的设定参数如下所示。
表 TCP接收端的设定参数
packetSize_
ACK包的尺寸大小
TCP发送端的状态参数如下所示。
表 TCP发送端的状态参数
dupacks_
重复ACK包的个数
t_seqno_
目前传送的包序号
ssthresh_
慢启动阈值
cwnd_
拥塞窗口的值
ack_
发送端最后收到的ACK序号
maxseq_
发送端最后发出的包序号
TCP Vegas的特殊参数如表所示。
表 TCP Vegas的特殊参数
v_alpha_
a 值
v_beta_
b 值
v_gamma_
当队列长度≥g 时,Vegas由慢启动阶段进入拥塞避免阶段
这些属性中,用得比较多的是发送端的拥塞窗口值cwnd_。以下给出简单的读取示例。
……
#创建TCP连接
set tcp [ new Agent/TCP ]
……
#Record过程
set f0 [open cwn_out.tr w] ;#打开记录文件
proc Record {} { ;#定义记录过程
global f0 tcp ns ;#声明全局变量
setintval 0.1 ;#设定记录间隔时间
setnow [$ns now] ;#获取当前ns时间
setcwnd [$tcp set cwnd_] ;#获取当前cwnd值
puts $f0 "$now $cwnd" ;#将时间点和cwnd值记录到文件中
$nsat [expr $now + $intval] "Record" ;#定时调用记录过程
}
$ns at 0.1 "Record" ;#ns首次调用Record过程
……
示例中,还可以使用如下更直接的语句,将cwnd的值记录到文件中(若仅给出格式化字符串,则输出到控制台,也就是没有参数$f0):
puts $f0 "$now [$tcp set cwnd_]"
设定参数值的示例如下:
$tcp set packetSize_ 100.0
接下来,转到C++源码中bind函数相关的地方。以TcpAgent为例,文件tcp/tcp.cc中相关的代码如下:
TcpAgent::TcpAgent()
:Agent(PT_TCP),
t_seqno_(0), 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), 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),
first_decrease_(1), fcnt_(0), nrexmit_(0),restart_bugfix_(1),
cong_action_(0), ecn_burst_(0), ecn_backoff_(0), ect_(0),
use_rtt_(0), qs_requested_(0), qs_approved_(0),
qs_window_(0), qs_cwnd_(0), frto_(0)
{
#ifdef TCP_DELAY_BIND_ALL
// defined since Dec 1999.
#else /* ! TCP_DELAY_BIND_ALL */
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_);
#endif /* TCP_DELAY_BIND_ALL */
}
可以看到,在TcpAgent的构造函数中,bind函数的主要目的是使Tcl的变量和C++的变量产生互连的关系,这样使用者就可以在Tcl脚本中去设定或者查看C++的变量值。还有类似的bind_bool函数,bind_bool用于绑定布尔变量;bind用于一般实数;函数中的第一个参数是Tcl的变量名,第二个参数是C++的变量名。功能类似的还有delay_bind函数。
- ns-2与TCP拥塞模拟 TCP拥塞控制核心模块-变量说明
- ns-2与TCP拥塞模拟 之六 ns-2 TCP拥塞控制核心模块-变量说明
- ns-2与TCP拥塞模拟 之五 ns-2中添加核心模块-TCPAgent子类
- ns-2与TCP拥塞模拟 之五 ns-2中添加核心模块-TCPAgent子类
- ns-2与TCP拥塞模拟 之三 脚本语言OTcl
- ns-2与TCP拥塞模拟 之一 一个简单的示例说明基本要素
- ns-2与TCP拥塞模拟 之四 ns-2仿真脚本中的元素
- TCP拥塞控制 2
- ns-2与TCP拥塞模拟 之二 模拟输出的封包trace文件格式
- ns-2与TCP拥塞模拟 之七 ns-2中自带的应用Ping解读
- TCP拥塞控制方案
- TCP的拥塞控制
- TCP 网络拥塞控制
- TCP网络拥塞控制
- TCP拥塞控制机制
- Inside TCP: 拥塞控制
- tcp拥塞控制
- TCP拥塞控制
- RPM打包原理、示例、详解及备查
- Java之序列化
- ns-2与TCP拥塞模拟 之五 ns-2中添加核心模块-TCPAgent子类
- PSR-4
- 短信的发送流程
- ns-2与TCP拥塞模拟 TCP拥塞控制核心模块-变量说明
- 郝斌的C语言基础 120 局部变量和全局变量
- 数日子
- java最基本概念小结
- ls 命令详解
- 你必须知道的25个C#基础概念
- hibernate中的操作数据库AI
- 第46课:Spark中的新解析引擎Catalyst源码初探 SQLContext、Catalog、SqlParser 、analyzer、optimizer、QueryExecution、RDD
- 二进制插入