网络协议工程SPIN实验报告
页脚内容
西 安 邮 电 大 学
(计算机学院)
课程设计报告
题 目: 网络协议模拟与分析
专业名称:
班 级:
学生姓名:
学号(8位):
指导教师:
设计起止时间:2014年12月15日—2014年12月26日 网络协议工程SPIN实验报告
页脚内容 网络协议分析与仿真课程设计报告
网络模拟
一、 课程设计目的
掌握网络模拟工具NS2的使用,学习基本的网络模拟方法。
二、 课程设计内容
协议模拟
工具:NS2,awk,shell,perl等;
要求:掌握NS2网络模拟的基本流程;
内容:NS2网络模拟基本流程
编写TCL脚本,搭建如下图所示的一个网络,共6个节点,其中2、3节点用做ftp服务器和客户端,4、5节点用做cbr流量的源和目的,而0、1节点用做转发设备。各节点间的链路属性见图。
012453ftpcbrftp sinknullpacket size = 1kbytes,
rate=1Mbps2mbps, 20ms1.5mbps, 10ms1.5mbps, 10ms1.5mbps, 10ms1.5mbps, 10ms
模拟时间设为13秒钟,在0.1秒开始产生cbr流量,在1.0秒开发发送发ftp流量;8.0秒ftp流量结束,12.0秒cbr流量结束。编写脚本(可用shell,awk,或perl等)分析模拟日志文件,统计每0.5s内0、1节点间链路通过的分组数以及字节数。
三、 设计与实现过程 网络协议工程SPIN实验报告
页脚内容 1.仿真脚本代码与详细注解
#Create a simulator object /创建模拟器对象
set ns [new Simulator] /模拟器对象赋值给变量ns
#Define different colors for data flows (for NAM)
$ns color 1 Red
$ns color 2 Yellow /给NAM定义不同的数据流,颜色的选择比较随意,只要易于区分就可以
#Open the NAM trace file
set nf [open out.nam w] /打开out.nam文件,一般都是在执行程序的时候自动生成的
$ns namtrace-all $nf
#Open the Trace file
set tf [open out.tr w] /打开out.tr文件,也是自动生成的
$ns trace-all $tf
/两个文件主要都是用来记录封包传输过程的
#Define a 'finish' procedure /定义finish程序,在后面执行的时候会用到
proc finish {} {
global ns nf tf
$ns flush-trace
close $nf /关闭nam文件 网络协议工程SPIN实验报告
页脚内容 close $tf /关闭trace 文件 (在后面调用的时候,是在程序结束的时候,所以前面生成的两个文件必须要关闭)
exec nam out.nam & #以后台方式执行nam
exit 0
}
#Create six nodes /创建六个节点 ,从n0到n5
set n0 [$ns node]
set n1 [$ns node]
set n2 [$ns node]
set n3 [$ns node]
set n4 [$ns node]
set n5 [$ns node]
#Create links between the nodes /创建结点之间的链路,而链路的创建都是基于题目要求的基础之上
$ns duplex-link $n0 $n2 1.5Mb 10ms DropTail
$ns duplex-link $n0 $n4 1.5Mb 10ms DropTail
$ns duplex-link $n1 $n3 1.5Mb 10ms DropTail
$ns duplex-link $n1 $n5 1.5Mb 10ms DropTail
$ns duplex-link $n1 $n0 2Mb 20ms DropTail
#Give node position (for NAM) /根据题目图示要求,给NAM创建的节点位置如下 网络协议工程SPIN实验报告
页脚内容 $ns duplex-link-op $n2 $n0 orient right-down
$ns duplex-link-op $n4 $n0 orient right-up
$ns duplex-link-op $n0 $n1 orient right
$ns duplex-link-op $n0 $n1 orient right
$ns duplex-link-op $n1 $n3 orient right-up
$ns duplex-link-op $n1 $n5 orient right-down
#Set Queue Size of link (n0-n1) to 10 /设置n0到n1之间的列长度
$ns queue-limit $n1 $n0 10
#Setup a TCP connection /建立TCP连接
set tcp [new Agent/TCP]
$tcp set class_ 2
$ns attach-agent $n2 $tcp
set sink [new Agent/TCPSink]
$ns attach-agent $n3 $sink
$ns connect $tcp $sink
$tcp set fid_ 1 /NAM中,TCP的连接用红色的数据流表示
#Setup a UDP connection /建立UDP连接
set udp [new Agent/UDP]
$ns attach-agent $n4 $udp
set null [new Agent/Null]
$ns attach-agent $n3 $null 网络协议工程SPIN实验报告
页脚内容 set null [new Agent/Null]
$ns attach-agent $n5 $null
$ns connect $udp $null
$udp set fid_ 2 /NAM中,UDP的连接用黄色的数据流表示
//TCP与UDP的建立中,agent是一个代理,用来作为网络层的传输与接收
#Setup a FTP over TCP connection /在TCP连接上建立FTP
set ftp [new Application/FTP]
$ftp attach-agent $tcp
$ftp set type_ FTP
#Setup a CBR over UDP connection /在UDP连接上建立CBR
set cbr [new Application/Traffic/CBR]
$cbr attach-agent $udp
$cbr set type_ CBR
$cbr set packet_size_ 1000
$cbr set rate_ 1mb
$cbr set random_ false /设置了cbr流量的包类型,字节大小,以及传输速率
#Schedule events for the CBR and FTP agents /设置FTP和CBR起止时间
$ns at 0.1 "$cbr start" /0.1秒产生cbr流量
$ns at 1.0 "$ftp start" /1.0秒发送ftp流量
$ns at 8.0 "$ftp stop" /8.0秒ftp流量结束 网络协议工程SPIN实验报告
页脚内容 $ns at 12.0 "$cbr stop" /12.0秒cbr流量结束
#Call the finish procedure after 13 seconds of simulation time /13秒后调用前面写出的finish程序
$ns at 13.0 "finish"
#Run the simulation /执行模拟器程序
$ns run
2.仿真过程示意(动画截图1个)
3.日志分析脚本设计(设计思路与代码、注解)
设计思路:
首先取出每行的时间(第二字段)、分组大小(第六字段);
若时间大于当前的时间段,变量加1,开始统计下一时间段信息;
数组count1记录分组的数目 网络协议工程SPIN实验报告
页脚内容 数组count2记录每个时间段通过的分组的总字节数
#!/usr/bin/perl
#count the number of packets between node0 and node1 ,the interval is 0.5
seconds.
$i=0; /定义变量i
@info; /定义三个数组
@count1;
@count2;
while(<>){ /读out.tr文件的内容
@info = split(/ +/,$_); /以空格为分字符读取每一行的内容
$reason = $info[0]; /封包事件发生原因 (r代表封包被接收,+ 表示进入队列,- 表示离开队列)
$time = $info[1]; /时间,表示流量传输的开始时间
$src = $info[2]; /封包的起始节点
$dst = $info[3]; /封包的终止节点
$length = $info[5]; /包的字节长度
#if($reason==’r’ && ($src==0 && $dst==1) || ($src==1 && $dst==0)){
if($reason==’r’ && ($src==0 && $dst==1) || ($src==1 && $dst==0)){
/包被某个节点所接受,而且链路传输是在从0到1的链路上,判断语句
if($time > $i*0.5){ /时间段超过0.5秒,执行下一行内容
$i++;
}