Ns2实现原理
OTcl与C++关联
执行路径:Tcl->Otcl->C++
返回路径:C++->Otcl->Tcl
NS2协议修改和移植
NS2中的各种网络协议在底层通过C++实现,在网络仿真过程中最终通过调用底层C++代码实现网络行为、算法、功能等各种仿真
NS2协议修改:通过NS2中已有协议的修改,完成网络研究中通过对现有协议或算法改进效果的测试和验证
NS2协议移植:将新开发的网络协议移植到NS2中,以便能够对协议性能进行测试和比较
两个实验:
实验二:网络拥塞避免仿真实验
实验三:洪泛无线路由协议移植实验
实验二:网络拥塞避免仿真实验
网络拥塞形成的原因
存储容量的限制:端口转发数据的速率低于数据包到达速率,造成存储空间被占满的情形,后到达的数据包将被丢弃
带宽容量的限制:低速链路难以应对高速数据流的输入
处理器性能的限制:工作效率不能满足高速链路的需求
其它原因:网络规划不合理、路由协议不完善、网络链路性能不稳定等
拥塞的表现形式(对源端):
丢包->重传->…->更大的拥塞->…->网络崩溃
拥塞检测( TCP中的假设):
丢包由拥塞引起
接收端向源端发送ACK
1到2个重复ACK:可能由报文乱序引起
3个或更多重复ACK :报文被丢弃
拥塞避免:
队列管理:在一定程度上缓解拥塞(降低丢包率)
Droptail、RED等
拥塞窗口:慢启动、加法增大、乘法减小
丢包的假设
在TCP协议中,丢包通常被视为网络拥塞的迹象。TCP使用一系列的机制来检测并响应网络拥塞:
- 接收端向源端发送ACK(确认):ACK是接收端告诉发送端已成功接收数据包的方式。
- 1到2个重复ACK:当发送端收到一个或两个重复的ACK时,这可能表明数据包是乱序到达而不是被丢弃。在这种情况下,TCP可能会稍作等待,以允许乱序的数据包被正确排序。
- 3个或更多重复ACK:当发送端收到三个或更多重复的ACK时,这被解释为一个数据包已经被网络中的某处丢弃。TCP使用这个信号作为网络拥塞的明确指示,并触发快速重传机制,同时进入拥塞控制模式。
拥塞避免策略
为了应对和避免网络拥塞,TCP实施了几种机制:
-
队列管理:网络设备使用队列管理算法来处理传入的数据包,以减少拥塞和丢包。例如:
- Droptail:一种简单的队列管理策略,当队列满时简单地丢弃新到达的数据包。这种策略容易导致全局同步和队列振荡。
- RED(Random Early Detection):一种主动队列管理算法,通过在队列达到饱和前就开始丢弃数据包来避免拥塞,丢包概率与队列长度成正比,以平滑流量并避免队列过长。
-
拥塞窗口调整:TCP通过调整拥塞窗口大小来控制发送端的数据流量,主要通过以下几种方式:
- 慢启动:连接开始时,拥塞窗口从一个较小的值开始,每收到一个ACK就将窗口大小加倍,快速增加网络中的数据量,直到达到阈值。
- 加法增大(AIMD):在慢启动阈值之后,拥塞窗口以线性方式增加,每个RTT(往返时间)增加一个MSS(最大段大小),使得窗口增长更为谨慎。
- 乘法减小(MD):当检测到丢包事件(如收到三个重复ACK)时,将拥塞窗口大小减半,以减少网络中的数据流量,避免进一步拥塞。
这些机制共同作用,使TCP能够适应网络状况的变化,优化数据传输效率,同时减少数据丢失和延迟的可能性。通过这样的策略,TCP确保了网络资源的合理利用和公平分享,同时避免了网络的过度拥塞
NS2中的Droptail队列管理:
\ns-allinone-2.29\ns-2.29\queue\drop-tail.cc
RED(Random Early Detection)
for more details, please access
http://www.icir.org/floyd/papers/red/red.html
C:\cygwin\home\admin\ns-allinone-2.29\ns-2.29\queue\red.cc
Pa是随队列长度增加而增大的函数,设置的方式可以有很多种,右图为其中的一种
实验目的:
1. 了解NS2的架构和基本组件的结构
2. 在NS2已有算法的基础上,掌握通过修改NS2底层文件更改这些算法的方法,从而达到仿真自己设计算法的目的
实验步骤:
1. 基于实验一仿真环境,使用drop-tail丢包模式,分析节点队列长度对端到端时延、丢包率的影响
2. 学习随机早期检测(RED)拥塞避免方法的原理
3. 用C++实现简单的RED算法,要求算法中涉及的参数可在Tcl/OTcl脚本中设定,给出RED算法的实现步骤和代码
4. 将实现的RED算法添加到drop-tail文件中,在相同长度队列的条件下,比较添加RED算法前后端到端时延、丢包率的情况,给出添加RED算法前后端到端时延和丢包率的对比图
5. 仿真分析RED算法中不同参数设定对端到端时延、丢包率的影响
修改drop-tail.h:
定义参数:
、
修改drop-tail.h:
绑定参数
设置新定义的参数值
在\ns-allinone-2.29\ns-2.29\tcl\lib\ns-default.tcl中添加参数默认值
或在脚本中直接定义,语法和默认配置相同
修改drop-tail.cc:
修改函数体:
保存修改和的文件
重新编译make(ns2.29目录下)
修改Tcl脚本进行测试
实验结果要求:
仿真脚本代码
修改后的文件(.cc and .h)
实验报告
按照格式完成
实验步骤详细描述实验过程,RED实现步骤和代码描述
实验结果及分析
drop-tail丢包模式下,队列长度对丢包率的影响
相同队列长度下,比较drop-tail和RED对端到端时延、丢包率的影响,分析结果
调整RED参数,观测对端到端时延、丢包率的影响,分析结果
实验总结及感想:实验总结,对本实验的感想、建议等