刘宴涛,秦 娜,2
(1.嘉应学院,广东 梅州514015;2.蒙古国研究生大学,蒙古 乌兰巴托)
现代社会已经进入“万物互联,无网不胜”的网络时代。随着通信网络基础设施的日益完善和三网融合的持续推进,不断催生出电子商务、门户网站、网络直播、视频点播、搜索引擎、智能电网、5G移动通信、云计算、物联网等众多新技术、新经济和新业态,并进而带动上下游产业链,极大地推动了国民经济的发展。这些新兴的互联网产业亟需大量熟悉网络知识的专门人才,由于网络通信涉及领域之广、包含技术之多是其它工业形式不能比拟的,所以相关行业从业人员的知识和技能应该是多维度和全方位的,这就对我们的专业设置、培养方案和教学方法体系提出了新的更高的要求。
“计算机网络”是电子信息工程、通信工程、计算机科学与技术等相关专业的必修课,具有鲜明的跨学科、跨专业的特点。学好计算机网络,理解计算机网络体系结构,理解协议分层及各层协议的工作原理,掌握网络设备的工作原理和基本配置方法,熟悉网络运行的各项指标参数的含义和测试方法,对于学生建立完善的网络知识体系是至关重要的。
“计算机网络”是一门理论与实践紧密结合的课程,如果学生能够近距离地观察到网络设备的工作过程,尤其是通过阅读或编写代码理解网络协议的运行机制,那么对于学生深刻理解网络的工作原理是大有裨益的。然而,目前大多数高校在讲授计算机网络的时候往往采用传统的基于PPT的教学方法,理论和实践相脱节,缺少实验环节,或者只是设置非常简单和表象的网络配置和仿真实验,这不利于提高学生的动手实操能力。
为了解决这一问题,本文提出一种把粗颗粒度和细颗粒度两种网络仿真实验互相结合互相对比地融入到“计算机网络”教学中的方法。通过网络仿真实验让学生观察网络设备的工作过程,提高对网络运行的感性认识。更为重要的是,通过对两种仿真实验的对比,尤其是通过细颗粒度仿真实验,让学生能够在程序代码的层次理解协议的工作原理和网络对数据包的处理过程,就像拿着显微镜观察细胞实验一样让学生近距离地观察网络的工作过程,帮助他们更透彻地理解网络的工作原理和本质属性。
对计算机网络的研究方法可以分为理论分析和网络实验两种。前者是基于数学分析方法,比如图论、排队论、组合论、随机过程等,理论分析多用于网络性能分析[1],且只能在比较理想和简单的情况下才能起到较好的作用,若用来评估复杂的通信网络则显得力不从心。后者可以进一步分为基于实际设备的物理实验和基于仿真软件的仿真实验两种。前者通过购买实际网络设备搭建真实的网络环境[2,3]来研究和检验网络的工作性能,这种方法最接近于实际网络的运行情况,结果也最真实可靠。但物理实验成本高,周期长,灵活性和弹性差,不易扩展。对于大中型网络,这种方法往往是不现实的。
网络仿真是研究网络的一种高效的必不可少的手段,具有简单、易实现、灵活性高、成本低、可信度高、演示性好、适用于各种网络等优点。网络仿真是计算机仿真技术的一种,该技术通过建立设备、链路、移动性、业务量等模型,编程实现各层协议算法,模拟生成网络拓扑,从而在计算机上构建出一个虚拟网络。通过为虚拟节点加载业务量并模拟网络流量的传输,获取网络的性能参数,从而检验协议性能、测试网络容量、改善网络运行状况。网络仿真能够为网络的规划设计提供客观定量的依据,缩短网络建设周期,减少建设成本,降低投资风险。此外,仿真所建立的模型灵活度高,可重用性好,基于已有的模型模块可以很容易地构建新的协议栈和改变网络拓扑,从而生成新的网络,而且网络仿真在高度复杂的网络环境中能得到具有高可信度的结果,因此非常适合大中型网络的研发工作。
目前有多种网络仿真软件或模拟器,比如Cisco Packet Tracer[4],NS3,QualNet,GloMosim[5],OMnet[6],华为eNSP[7],GNS3[8],OPNET[9,10],以及基于高层体系架构的联合分布式仿真技术[11,12]。综合比较来看,OPNET是最主流最高端的网络仿真软件,无论是界面友好程度还是仿真建模能力都远远优于其他网络仿真软件。下文将基于eNSP和OPNET这两种仿真软件分别实现粗颗粒度和细颗粒度的仿真实验,从而把网络仿真融入到计算机网络的教学中以提高学生的体验度。
eNSP是华为研发的一款免费仿真软件,使用图形化操作界面,采用即拿即用的工作方式,各种华为设备,比如交换机、路由器、工作站、连接线等,都是以图标的形式提供给用户,用户只需要用这些图标连接起来构成网络拓扑,并配置相应的端口参数(比如IP地址)即可让网络运行起来。因此,eNSP非常简单易操作,能够快速高效地构建仿真网络,非常适合用于对网络工程师的培训,很多高校都把eNSP作为网络仿真教学软件。
eNSP可以比拟成软件实验箱,提供给用户的只是虚拟设备和接口,设备内部的工作过程和网络协议的处理细节都被隐藏起来,用户不能修改设备功能,因此eNSP只能实现粗颗粒度的仿真实验。所谓“颗粒度”是指对某一过程控制或描述的细节程度,颗粒度越细致,我们对过程的理解才能越透彻。下面通过一个样例介绍eNSP的工作原理。
在eNSP图形化界面中如图1所示放置两台PC机Client1和Client2、一台S5700交换机LSW1,一台S3700交换机LSW2和一台AR201路由器R1。其中LSW1通过两个G比特以太网口分别连接Client1和路由器R1,LSW2通过两个以太网口分别连接Client2和路由器R1。把图1中五台设备通过右键单击启动后,右键单击Client1和Client2可以为两台PC机设置IP地址,如图2所示。双击R1在命令行窗口的系统视图中可以将路由器R1两侧接口的IP地址分别设为10.0.1.254和10.0.2.254。IP地址设置完毕后,可以使用ping命令测试两台PC机Client1和Client2的连通性,测试结果如图3所示。
图2 Client1地址配置
图3 测试两台PC机的连通性
右键单击图1路由器左侧的GE0/0/0接口并单击开始抓包,可以启动Wireshark协议分析器,抓包结果如图4所示,可见成功抓取了ping命令执行过程的各个数据包。
图4 对路由器接口的抓包结果
由上一节可见,eNSP可以方便地提供即拿即用的服务帮助使用者快速构建网络拓扑,并通过配置一些简单的参数即可让网络运行起来,仿真网络的工作流程和可视化效果非常接近于真实的物理网络,有利于学生快速上手学习,也便于网络工程师进行网络的设计、规划、分析和检验。
然而,eNSP在用于“计算机网络”课程的仿真教学时也存在一些缺点。首先,eNSP只提供网络设备模型和接口,把很多网络处理细节隐藏了起来,学生能做的只能是配置设备参数,能看到的也只是设备之间能否通信,无法看到各层协议的处理细节,也无法透彻地理解网络协议的精髓,不利于提高学生体验度。其次,eNSP提供的是一种粗颗粒度的仿真,使用者虽然可以通过抓包观察数据包的传输过程,却无法观察各层协议的执行细节,更无法修改协议,这对于一些科研院所的科研人员进行协议的设计与分析是远远不够的。
eNSP的上述缺点在OPNET网络仿真软件中得到了很好的解决。与eNSP提供的设备层面的视图不同,OPNET提供了代码层面的视图,可以让学生进行协议的设计和开发,观察到每个数据包的传递和每个字段的处理过程,就像用显微镜观察细胞一样帮助学生更为深入地理解网络设备的工作原理。
OPNET采用三层建模机制,分别是网络模型、节点模型和进程模型。网络建模用于生成网络拓扑,由节点和链路构成;节点建模用于构建节点的协议栈,各个协议模块实现不同的功能;进程建模用于实现各个协议的功能,基于有限状态机(FSM-Finite State Machine)实现。OPNET提供了状态变量、临时变量和全局变量等多种变量形式,还提供了大量的核心函数,极大方便了仿真程序的开发。OPNET采用离散事件仿真机理,数据包的到达和定时中断都被当做事件,仿真内核生成并维护事件列表,按顺序执行各个事件,由此推进仿真向前执行。与时间驱动相比,这种基于事件的仿真驱动方式极大提高了计算效率,比如要知道数据包是否到达,不必隔一段时间去查看一次,而是当数据包到达中断发生才去查看,每个时刻FSM将停留在某种状态,只有当事件到达才进行状态的跳转。
OPNET仿真可以工作在全速运行和单步调试(ODB-OPNET DeBugger)两种模式下,在ODB模式下可以清晰地看到各个网络协议的工作过程和仿真事件的发生,比如发送和接收数据包、定时中断、远程中断等,而且还可以读取数据包的各个字段的内容,从而理解有限状态机在各个状态之间是如何跳转的。此外,在ODB模式下还可以进行OPNET和Visual C++的联合调试,在Visual C++中通过设置断点清晰地看到OPNET中各个变量每时每刻发生的变化,从而检验协议的正确性,让我们对仿真运行过程有更精细的观察。通过在ODB中对数据包进行跟踪,可以帮助学生清晰地看到网络各层协议是如何相互配合、协调工作的,从而真切、透彻地理解计算机网络的运行过程。另外,通过在OPNET中用C语言写一些简单的网络协议的小程序,可以帮助学生学会搭建网络和控制网络运行,极大地提高学习体验度。下面通过一个TCP协议的建模和仿真实例演示如何在OPNET中构建一个仿真网络。
仿真网络如图5所示,其中包含一个客户机Client和一个服务器Server,采用无线通信的方式。
图5 网络模型
网络中还包含一个特殊节点COMM_RANGE_SET,该节点用于设置无线通信半径。仿真应用场景如下:仿真启动后,由Client向Server传输数据,数据传输以控制帧SOF开始,以控制帧EOF结束,两帧的中间周期性地传输100个DATA业务帧。仿真运行过程记录3个结果矢量统计量PK_SENT、PK_RCVD、PK_DELAY,分别表示Client发送的包数,Server接收的包数,以及包延时。在OPNET中,矢量统计量是指以时间轴为横轴,被测量为纵轴的仿真结果统计量,矢量统计量反映了被测量随时间的变化。
Client和Server采用相同的节点模型,如图6所示。除了物理层无线收发信机之外,协议栈中只包括了应用层(APP)、传输层(TCP)和链路层(TDMA),为了简化问题规模和复杂度,省略了对网际层(IP)的建模。
图6 节点模型
OPNET对物理层的建模是通过管道阶段(pipeline stage)实现的,接收组、传输延时、传播延时、发射接收增益、信噪比等都被编写成管道阶段文件,由发射机和接收机顺序调用执行,用户只需要设定无线收发信机的工作参数(比如数据率、发射功率、带宽等)即可,因此大大省去了用户对物理层的建模负担,用户只需要完成上面各层协议的建模即可。下面分别介绍本实验设计的3层协议模块。
图7所示为APP模块对应的有限状态机,其中红色状态表示非强制状态,进程可以停留在其中消耗仿真时间,绿色状态表示强制状态,进程不能停留,其中程序代码的执行不消耗仿真时间。
具体的,INIT状态在仿真开始时进入,用于读取工作参数、初始化各种变量、以及启动数据传输等;当进程不需要处理事件的时候将停留在IDLE状态等待下一个中断的到来。INIT和IDLE是所有OPNET进程模型都具有的状态。Send_Data状态用于发送数据,由于本实验的仿真想定为周期性地发送100个DATA包,周期定义为状态变量packet_interval,所以进程要周期性地重复进入Send_Data状态,该功能被定义在出口代码(即下半圆)中,如下:
if(SENT_pk_number<Max_Packet_Number)
{
op_intrpt_schedule_self(op_sim_time()+packet_interval,SEND_DATA);
}
OPNET使用了大量以op_开头的核心函数用于完成装帧、发包、设置中断等功能,极大地方便了用户的程序设计工作。
图7中Rec_PK状态当APP模块收到下层TCP模块发来的数据包时进入,用以从包流线接收数据包(op_pk_get函数)、读取包字段(op_pk_nfd_get函数)、记录和生成仿真结果(op_stat_write函数)等。主要代码如下:
图7 方波波形合成实验结果图a
图7 APP模块的进程模型
time=op_sim_time();
pkptr=op_pk_get(op_intrpt_strm());
pk_create_time=op_pk_creation_time_get(pkptr);
op_pk_nfd_get(pkptr,“pk_number”,&temp_pk_number);
op_stat_write(PK_rcvd_gsh,RCVD_pk_number);
op_stat_write(PK_delay_gsh,time-pk_create_time);
本实验的核心任务和关键模块是TCP协议模块,其有限状态机如图8所示。由于本实验主要是为了说明OPNET的建模与仿真过程,所以对TCP协议做了简化处理,只实现了发送数据帧和确认帧的过程以及连接的建立和拆除过程,略去了TCP的拥塞控制、流量控制等功能。
图8 TCP模块的进程模型
图8中除了INIT和IDLE状态之外,有一个接收数据包状态Rec_PK,当进程收到包中断后进入该状态。OPNET中每个状态下方的两个数字分别表示该状态入口代码和出口代码的行数,可见Rec_PK的入口代码由632行代码组成,功能比较复杂。由于到达TCP的数据包可能来自于上层APP模块或下层TDMA模块,所以Rec_PK首先判断包的来源。其次,用op_pk_format(pkptr_RCVD,PK_format)语句获取数据包的包格式,并根据不同的包格式做出不同的动作。比如,如果收到的是SOF包,则启动建立连接的3次握手过程;如果收到的是EOF包,则启动拆除连接的4次握手过程;如果收到的是APP发来的DATA包,则封装成TCP标准帧格式后向TDMA发送;如果收到的是下层TDMA模块发来的包,则解封装,读取TCP包头和各个字段的信息并根据这些信息做出相应的动作,比如取出DATA字段传给APP模块,或回复ACK给发送端,或收发双方配合完成建立连接和拆除连接过程。
图8中设置了两个定时器Timer1和Timer2,Timer1用于建立连接和拆除连接的握手过程中对控制帧传输的计时,Timer2用于数据传输过程中对数据帧传输的计时。以Timer2为例,当Client发出数据帧的时候启动Timer2定时器,如果在定时器期满还没有收到Server发来的ACK确认帧,则Client重发该数据帧,代码如下:
图8 方波波形合成实验结果图b
pkptr=op_subq_pk_access(1,OPC_QPOS_HEAD);
op_pk_nfd_set(pkptr,“SYN”,0);
op_pk_nfd_set(pkptr,“ACK”,0);
op_pk_nfd_set(pkptr,“FIN”,0);
op_pk_nfd_set(pkptr,“SEQ_NUMBER”,Seq_Number);
op_pk_nfd_set(pkptr,“ACK_NUMBER”,(Peer_Seq_Number+1));
op_pk_send(pkptr,down_output);
retrans_timer2=op_intrpt_schedule_self(op_sim_time()+RETRANS_TIMER,TIMER2_OUT);
其中,op_subq_pk_access函数用于读取TCP子队列中的数据包,op_pk_nfd_set函数用于设置TCP包的各个字段,op_pk_send函数用于发出TCP包,op_intrpt_schedule_self函数用于设置定时中断。如果发端TCP模块在定时器期满之前收到了收端TCP模块回复的ACK确认帧,则Client停止Timer2的计时并为其清零。
TDMA模块完成无线信道接入控制功能,本实验采用的是时分多址接入方式,Client和Server分时使用无线信道。TDMA模块的有限状态机如图9所示。
图9 TDMA模块的进程模型
其中,INIT状态指定了Client和Server的初次接入时刻分别为1s和1.1s,代码如下所示。
if(node_id==1)
{op_intrpt_schedule_self(1,TIMER_OUT);}
if(node_id==2)
{op_intrpt_schedule_self(1.1,TIMER_OUT);}
其中,中断码TIMER_OUT代表图9中的MY_SLOT跳转条件,即让进程从idle状态跳转到Send_data状态去发送数据。在Send_data状态,以Client为例,进程通过op_subq_pk_remove函数取出数据包队列中队首的数据包发送给无线发射机,并通过op_intrpt_schedule_self函数预置下一次TDMA的接入时间。代码如下:
if(op_subq_empty(0)==OPC_FALSE)
{
pkptr=op_subq_pk_remove(0,OPC_QPOS_HEAD);
op_pk_send(pkptr,0);
}
op_intrpt_schedule_self(op_sim_time()+0.1*CYCLE,TIMER_OUT);
Rec_PK状态接收数据包,判断数据包的来源,如果是上层TCP发来的TCP帧,则插入TDMA模块的数据包队列,等待自己的时隙到来的时候发送出去;如果是来自下层无线收信机,则传给上层的TCP模块进行处理。
实验参数设置如下:无线信道的数据速率设置为65536bps,Client的APP模块产生数据包的周期packet_interval设置为0.1 s,TDMA模块的信道接入周期设置为0.2 s,TCP的两个重传定时器Timer1和Timer2设置为2 s。
在ODB模式下运行仿真,仿真结果如图10-图14所示。在图10中1#node和2#node分别代表Client和Server。由图10可见,经过初始化和TCP的连接建立过程后,TCP传输打开,Client的TDMA模块开始发送数据包,在大约1.4 s的时刻Server收到了1号数据包。需要说明的是由于Client的APP模块产生数据包的周期是0.1 s,所以在大约10 s的时间内产生了全部的DATA包(图11),这些数据包保存在Client节点的TCP模块的包队列中。
图11-图13的横轴均为时间,图11和图12的纵轴分别表示发送和接收的包序号,图13的纵轴为数据包的端到端延时。从图13可见这100个数据包的延时呈线性增长,造成这一现象的原因主要是由于TDMA信道接入周期(0.2 s)大于APP模块产生DATA包的周期(0.1 s)。具体的,统计量PK_DELAY被定义为Server的APP模块收到DATA包的时间减去该包在Client中产生创建的时间,即
图12 Server的APP模块收到的数据包
图13 数据包的延时
op_stat_write(PK_delay_gsh,time-pk_create_time);
由于Client的APP模块按照0.1 s周期产生DATA包,而TDMA模块的信道接入周期被设置0.2 s,而且当Client的TCP模块发送一个DATA包后还要等待Server的TCP模块回复ACK包,这个往返过程既要进行数据传输还要等待TDMA时隙的到来,所以消耗的时间要大于0.2 s,所以Client的APP模块产生的DATA包被大量积压在了TCP模块的包队列中等待发送,这就是为什么在图11中100个数据包的接收时间(PK_RCVD)要大于图10中100个数据包的产生时间(PK_SENT)的原因。
图10 TCP连接建立
图11 Client的APP模块发送的数据包
图14表明Server成功接收了第100号数据包后回复ACK包,然后Client和Server启动4次握手过程关闭TCP连接,完成了本次实验。
图14 TCP连接拆除
很多高校在“计算机网络”课程的实验教学中采用的都是基于eNSP的演示性实验,其优势在于学习难度低,大概只需要2个学时即可掌握基本的建模方法,可以快速构建网络拓扑,不需要编写代码,以即拿即用的方式帮助学生建立宏观的网络视图。但是正如前面分析的,由于eNSP提供的只是设备层面的视图,设备内部的工作原理和协议的工作过程对使用者是屏蔽的,因此这种粗颗粒度仿真不利于学生理解协议的工作原理,而协议才是计算机网络的精髓所在。基于OPNET的细颗粒度仿真实验提供了协议和代码层面的视图,能让学生细致地观察协议的运行过程,也能让学生编程实现或修改某些网络协议的工作过程,并通过设计性实验加深对网络协议的理解。但OPNET仿真的学习难度较大,需要10到15个学时才能掌握其建模原理并进行简单的仿真程序设计。表1从多个维度对eNSP和OPNET这两种颗粒度仿真实验进行了比较。
表1
表1 eNSP和OPNET仿真软件的比较
可见,eNSP和OPNET分别代表了入门级和专业级两种仿真软件,在仿真实验教学方面的优势和劣势呈现出一定的互补性。基于这种考虑,本文提出了把eNSP和OPNET这两种颗粒度仿真实验有机结合的教学路径。在教学过程中,为了验证这一教学路径的有效性,对嘉应学院两级学生约200人次的学习效果进行对比,为其中一级学生只开设了8个学时的eNSP实验,为另一级学生开设了4个学时的eNSP实验+8个学时的OPNET实验。对学习效果的考核指标包括网络配置能力、实操和程序设计能力、对基本概念的理解度、对协议的理解度,以及对网络工作性能参数的理解度等等。学习成绩区分为1至5级,1级最低,5级最高。教学效果的比较如表2所示,可见采用本文提出的eNSP+OPNET的仿真实验教学路径比传统教学方法仅仅多用了4个学时就取得了各项指标的全面提升。
表2 教学效果比较
在“计算机网络”的教学中合理有效地设计网络仿真实验可以极大地提高学生的理解度和学习效果,激发学生的学习兴趣。本文在“计算机网络”教学中,提出了粗颗粒度仿真和细颗粒度仿真两种网络仿真实验相结合的仿真教学方法。首先,应用eNSP进行粗颗粒度仿真实验,让学生在设备层面了解如何构建仿真网络和配置仿真参数,以及如何通过抓包工具观察协议的执行过程。其次,应用OPNET设计细颗粒度仿真实验,在程序和代码层面向学生展示协议的工作流程、数据包的传输和字段的分析处理过程,帮助学生理解和掌握网络协议的精髓和设计方法。本文详细讨论了如何应用OPNET进行网络仿真实验设计,以TCP协议建模为例说明如何构建网络模型、节点模型、进程模型、数据包格式,以及如何用C语言和OPNET的内核函数编写仿真程序和处理各种中断。该实例简洁明了地说明了OPNET仿真程序设计的基本过程,帮助学生清晰地认识和理解计算机网络的工作过程,包括数据包的生成、排队、发送和接收,以及对各个字段的存取和处理。通过对两级学生的仿真实验能力进行测试与考核,结果证明,本文提出的eNSP+OPNET的仿真实验教学路径比传统单纯依赖eNSP的仿真教学方法只需要多增加几个学时就可以使学生的动手操作和实验设计能力得到大幅度提升。