首页 网络测试编程及OPNET仿真-豆丁

网络测试编程及OPNET仿真-豆丁

举报
开通vip

网络测试编程及OPNET仿真-豆丁网络测试编程及OPNET仿真-豆丁 网络测试编程及OPNET仿真 一.简单网络中继/中间系统的典型测试 穿越测试法 穿越测试法是指测试器客户端通过被测试设备的某一端口发送固定格式的测试数据,测试数据通过被测设备从另一端口发送到服务器端,从而完成整个测试工程。 测试方法在提供对IUT 的控制和观察的程度上有所不同,因此测试方法的选择就影响着测试例描述中特性的可表达性。测试方法的选择主要基于以下几点考虑: (1)测试目标,不同协议测试方法的要求不同; (2)性能要求,不同的抽象测试方法由于测试协调过程的不同...

网络测试编程及OPNET仿真-豆丁
网络测试编程及OPNET仿真-豆丁 网络测试编程及OPNET仿真 一.简单网络中继/中间系统的典型测试 穿越测试法 穿越测试法是指测试器客户端通过被测试设备的某一端口发送固定格式的测试数据,测试数据通过被测设备从另一端口发送到服务器端,从而完成整个测试工程。 测试方法在提供对IUT 的控制和观察的程度上有所不同,因此测试方法的选择就影响着测试例描述中特性的可表达性。测试方法的选择主要基于以下几点考虑: (1)测试目标,不同协议测试方法的要求不同; (2)性能要求,不同的抽象测试方法由于测试协调过程的不同,对测试系统的测试有效性、可移植性等带来影响; (3)复杂性和系统开销,不同抽象测试方法其带来的复杂性和系统开销不同,在提高测试目标和性能要求时都要考虑这个因素; (4)支持环境,每种抽象测试方法都要求一定的支持环境,以保证观察、控制的顺利进行。 一.实验环境设定: 在图1所示的环境中,利用“穿越测试法”(Transverse Test Method)对以太网 的二层交换机(即MAC子层进行对以太网MAC帧进行转发的交换机)一对端口间的交换性能进行测试。 二.测试数据定义要求 请分别以表1中的长度作为以太网MAC帧的用户数据字段的长度, 连续发送上万个以太网帧,连续发送的帧的用户数据字段长度在表1中随机选择。随机数的产生范围限制在1,23, 用户数据字节数,随机数×64字节 (当随机数,1,22时); 用户数据字节数,1500(字节) (当随机数,23时) 表1:随机数与发送的MAC帧用户数据字段字节数的对应关系 随机数 1 2 3 4 5 6 7 8 9 10 用户数 据字节64 128 192 256 320 384 448 512 576 640 数 随机数 11 12 13 14 15 16 17 18 19 20 用户数 据字节704 768 832 896 960 1024 1088 1152 1216 1280 数 随机数 21 22 23 用户数 据字节1344 1408 1500 数 三.程序代码 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 代码: Send: #include #include #include #include #pragma comment(lib, "ws2_32.lib") #define BUFFER_SIZE 1500 typedef int BOOL; //基于TCP 的发送函数 BOOL Send_by_TCP(const char *dst, const short port, const int size, const int duration, int *count) //const char *dst — 接收方IP地址的字符串形式,例如:”192.168.58.58” //const short port — 接收方的端口号,例如:1234 //const int size — 需要发送的Ethernet帧大小,值必须在64到1518之间 //const int duration — 发送持续的时间,单位:秒,例如:30 秒 //int *count — 输出参数,记录发送了多少个数据包 //返回值:返回0表示操作成功,返回1表示操作失败。 { WSADATA wsaData; WORD wVersionReq = MAKEWORD(2, 2); //程序要使用2.1版本的Socket SOCKET server; struct sockaddr_in address; clock_t start, end; int len; char buffer[BUFFER_SIZE] = {0}; if(size <64 || size >1518) { fprintf(stderr, "Ethernet frame size must between 64 and 1518!\n"); return 1; } //Ethernet帧必须要在64到1518之间 address.sin_family = AF_INET; /*地址族*/ address.sin_addr.s_addr = inet_addr(dst); /*IP地址*/ address.sin_port = htons(port); /*端口号*/ //该结构中sin_zero使得sockaddr和sockaddr_in指针类型相互转换;sin_port和sin_addr //必须是网络字节顺序,因为它们被封装在包的IP和UDP层,而sin_family不发送到 //网络上可以是本机字节顺序。 if(WSAStartup(wVersionReq, &wsaData) != 0) //该函数WSAStartup () 的第一个参数指明程序请求使用的Socket版本,其中高 //字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的 //版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本 //来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可 //以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。 { fprintf(stderr, "WSAStartup() failed!\n"); return 1; } if((server = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) //应用程序调用socket函数来创建一个能够进行网络通信的套接字。该函数用于根据 //定的地址族、数据类型和协议来分配一个套接字的描述字及其所用的资源。Socket //函数原型为: //int socket( int domain , int type , int protocol ) ; //a、 参数domain指定地址描述,一般为AP_INET; //b、 参数type指定socket类型:SOCK_STREAM和SOCK_DGRAM; //c、 参数protocol通常为0; //d、 函数返回值为一个整型socket描述符,在bind函数中调用。 { fprintf(stderr, "socket() failed!\n"); return 1; } // SOCK_STREAM 流式套接字提供了一种可靠的、面向连接的双向数据传输服务。实 //现了数据的无差错,无重复地发送,内设流量控制,被传输的数据看作是无记录边界的字//节流。当用户要发送大批量的数据,或对数据传输有较高的要求时候,使用流式套接字。 if(connect(server, (struct sockaddr *)&address, sizeof address) == SOCKET_ERROR) //connect() 与远程服务器建立一个TCP连接。 //int connect(int sockfd, struct sockaddr* serv_addr, int addrlen); //a、sockfd:目的服务器的socket描述符。 //b、serv_addr:指向包含目的服务器的IP地址及端口号的指针。 //c、addrlen:sizeof( struct sockaddr)的值。 //d、connect函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,进行服务 //器端程序设计时不需调用connect函数。 { fprintf(stderr, "connect() failed!\n"); return 1; } *count = 0; start = end = clock(); while((end - start) < (1000 * duration)) { len = send(server, buffer, (size - 58), 0); if(len == (size - 58)) { (*count)++; } end = clock(); } Sleep(2000); sprintf(buffer, "FIN"); len = send(server, buffer, 4, 0); if(len != 4) { fprintf(stderr, "failed to send \"FIN\" tag!\n"); return 1; } closesocket(server); //关闭套接口 WSACleanup(); //应用程序在完成对请求的Socket库的使用后,要调用WSACleanup函数来解除与Socket //库的绑定并且释放Socket库所占用的系统资源。 return 0; } //基于TCP 的发送函数 BOOL Send_by_UDP(const char *dst, const short port, const int size, const int duration, int *count) 接收方IP地址的字符串形式,例如:”192.168.58.58” //const char *dst — //const short port — 接收方的端口号,例如:1234 //const int size — 需要发送的Ethernet帧大小,值必须在64到1518之间 //const int duration — 发送持续的时间,单位:秒,例如:30 秒 //int *count — 记录发送了多少个数据包,是输出参数 //返回值:返回0表示操作成功,返回1表示操作失败。 { WSADATA wsaData; WORD wVersionReq = MAKEWORD(2, 2); SOCKET server; struct sockaddr_in address; clock_t start, end; int len; char buffer[BUFFER_SIZE] = {0}; if(size <64 || size >1518) { fprintf(stderr, "Ethernet frame size must between 64 and 1518!\n"); return 1; } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(dst); address.sin_port = htons(port); //htons():Host to Network Short的缩写,该函数将主机的无符合短整型数字节顺 //序转换成网络字节顺序。 if(WSAStartup(wVersionReq, &wsaData) != 0) { fprintf(stderr, "WSAStartup() failed!\n"); return 1; } if((server = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { fprintf(stderr, "socket() failed!\n"); return 1; } start = end = clock(); *count = 0; while((end - start) < (1000 * duration)) { len = sendto(server, buffer, size - 46, 0, (struct sockaddr *)&address, sizeof address); // endto()和recvfrom()函数 //这两个函数是利用数据报方式(UDP)进行数据传输。在无连接的数据报socket方式 //下,由于本地socket并没有与远程机器建立连接,所以在发送数据时应指明目的地址。 //sendto()原型: //int sendto(int sockfd, const void* msg, int len, unsigned int flags, const //struct sockaddr* to, int tolen); //a、sockfd:用于传输数据的socket描述符。 //b、msg:是一个指向要发送数据的指针。 //c、len:以字节为单位的数据的长度。 //d、flags:一般情况下置为0。 //e、函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,否则返回 //所发送数据的总数,该数字可能小于len中所规定的大小。 //f、表示目的机器的IP地址和端口号。 //g、tolen:被赋值为sizeof(struct sockaddr)。 //recvfrom函数原型: //int recv(int sockfd, void* buf, int len, unsigned int flags, struct sockaddr* from, int fromlen); //a、sockfd:是接收数据的socket描述符。 //b、buf:是存放接收数据的缓冲区。 //c、len:以字节为单位的缓冲区的长度。 //d、flags:一般情况下置为0。 //e、函数返回值:为-1表示遇到错误,并且errno中包含相应的错误码,无错则 //回读入的字节数,如果连接被中止,返回0。 //f、from:保存源机器的IP地址和端口号。 //g、fromlen:常被赋值为sizeof(struct sockaddr)。 //当对于数据报socket调用了connect()函数时,也可以用send()和recv()进行数据传输,但该//socket仍然是数据报socket,并利用传输层的UDP服务。但是在发送或接收数据报时,内//核会自动为它加上目的地址和源地址信息。 if(len == (size - 46)) { (*count)++; } end = clock(); } Sleep(2000); sprintf(buffer, "FIN"); len = sendto(server, buffer, 4, 0, (struct sockaddr *)&address, sizeof address); if(len != 4) { fprintf(stderr, "failed to send \"FIN\" tag!\n"); return 1; } return 0; } Receive:(说明参考send) #include #include #include #pragma comment(lib, "ws2_32.lib") #define BUFFER_SIZE 1500 #define BACKLOG SOMAXCONN typedef int BOOL; BOOL Receive_by_TCP(const char *local, const short port, int *count) { WSADATA wsaData; WORD wVersionReq = MAKEWORD(2, 2); SOCKET server; SOCKET client; struct sockaddr_in address; struct sockaddr_in from; int fromlen = sizeof from; int len; char buffer[BUFFER_SIZE]; if(WSAStartup(wVersionReq, &wsaData) != 0) { fprintf(stderr, "WSAStartup() failed!\n"); return 1; } if((server = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { fprintf(stderr, "socket() failed!\n"); return 1; } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(local); address.sin_port = htons(port); if(bind(server, (struct sockaddr *)&address, sizeof address) == SOCKET_ERROR) { fprintf(stderr, "bind() failed!\n"); return 1; } if(listen(server, BACKLOG) == SOCKET_ERROR) { fprintf(stderr, "listen() failed!\n"); return 1; } client = accept(server, (struct sockaddr *)&from, &fromlen); if(client == INVALID_SOCKET) { fprintf(stderr, "accpet() failed!\n"); } *count = 0; while(1) { len = recv(client, buffer, sizeof buffer, 0); if(len == 4) { break; } else if(len > 0) { (*count)++; } } closesocket(client); closesocket(server); WSACleanup(); return 0; } BOOL Receive_by_UDP(const char *local, const short port, int *count) { WSADATA wsaData; WORD wVersionReq = MAKEWORD(2, 2); SOCKET server; struct sockaddr_in address; struct sockaddr_in from; int fromlen = sizeof from; int len; char buffer[BUFFER_SIZE]; if(WSAStartup(wVersionReq, &wsaData) != 0) { fprintf(stderr, "WSAStartup() failed!\n"); return 1; } if((server = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET) { fprintf(stderr, "server socket() failed!\n"); return 1; } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr(local); address.sin_port = htons(port); if(bind(server, (struct sockaddr *)&address, sizeof address) == SOCKET_ERROR) { fprintf(stderr, "bind() failed!\n"); return 1; } while(1) { len = recvfrom(server, buffer, sizeof buffer, 0, (struct sockaddr *)&from, &fromlen); if(len == 4) { break; } else if(len > 0) { (*count)++; } } closesocket(server); WSACleanup(); return 0; } int main(void) { int count = 0; int tag; tag = Receive_by_TCP("169.254.61.206", (short)1234, &count); if(tag == 0) { printf("%d packets received...\n", count); } return 0; } 四.数据截图: TCP协议下: UDP协议模式下: 五(实验结论 丢包率为1- receive/send,丢包率与数据包长度以及包发送频率相关。 二.浅谈Opnet Modeler 网络仿真 一.网络仿真相关知识 网络仿真的定义 网络仿真技术是一种通过建立网络设备和网络链路的统计模型,模拟网络传输流量。从而获取网络设计或优化所需的网络性能数据的仿真技术。它具有全新的模拟实验机理以及在高度复杂的网络情况下得到高可信度结果的能力。 网络仿真的意义 通过网络仿真,可为优化和扩容现有网络提供定量的分析数据。在进行新网络的设计时,网络仿真能根据服务等级协议进行网络预测,定量评估网络设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ,特别适用于大中型网络设计。在协议算法的研究上,网络仿真能够进行早期排错,缩短研发过程。总之,利用网络仿真软件进行网络设计,规划和研究已经是一门新兴的行业。 Opnet Modeler的应用价值 Opnet Modeler是一个大型软件包,它不仅支持一般意义上的网络建模和仿真,还为各种特殊网络提供特殊的支持。为此,Opnet Modeler有一些特殊的特性。 1. 面向对象 Opnet Modeler创建的所有系统都由一系列属性可配的对象组成。对象(object)属于某个类(class)。类以行为和属性的方式描述对象的特性。Opnet Modeler支持用户自定义新类以用于更广泛的系统研究。新类可能派生自某个父类,并根据特定应用进行“专门化”处理以提供更多对专有网络的支持。 2. 专门研究通信网络和信息系统 Opnet 提供很多与通信和信息处理相关的类型结构,为通信网络和分布式系统的模拟提供高度支持。 3. 分级模型 Opnet 的模型是分级设计的,与实际通信网络的分级结构自然对应。 4. 图形化编辑 在工程建模的大多数环节中,Opnet 都可以使用图形化编译器来定义和编辑模型。这些编辑器提供了从被模拟系统到Opnet 模型的 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 映射。 5. 灵活开发自定义模型 Opnet提供灵活的高级编程语言,为通信和分布式系统提供更广泛的支持。在这样的环境下,允许对所有已知的通信协议,算法和传输技术实施真实模拟。 6. 自动仿真生成 模型描述代码将被自动编译成C语言实现的可执行,高效率,离散的事件仿真程序。先进的仿真结构和仿真配置可将编译器对系统的要求最小化。 7. 基于特定应用的统计参量 Opnet提供内建的性能统计参量,这些统计参量可以在仿真过程中自动收集。建模者可以使用用户自定义的统计参量来对系统进行扩展。 8. 综合的仿真和分析工具 性能评估和对比分析需要对大量的仿真结果进行研究。Opnet包含一系列综合的方针和分析工具,可以仿真输出结果进行图形化表示。 9. 交互式分析 所有Opnet仿真可以通过一个交互式调制器自动合并仿真结果来对仿真进行交互式分析。 10.动画 Opnet可以自动生成被模拟系统的不同细节层次的动画。这些动画中,统计参量可以随时间变化。Opnet还提供支持用户自定义动画的功能。 11.协同仿真 Opnet可以与1个或多个第三方仿真器相连,进行协同仿真,并分析第三方仿真器中的模型与Opnet提供的模型如何相互影响。 12.应用编程接口 Opnet提供许多应用编程接口,以便对用户编程进行扩展。使用应用编程接口也是Opnet与其他仿真工具紧密结合的一种重要手段。 故而,Opnet Modeler是一种功能强大,应用领域广泛的网络模拟软件。 二(Opnet Modeler的几种说明 三层建模说明 计算机通信网络一般包括3个方面的模型 :网络拓扑、节点内部结构和通信行为。OPNET基于面向对象软件技术,采用了与真实网络相一致的层次结构设计,即三层建模 机制 综治信访维稳工作机制反恐怖工作机制企业员工晋升机制公司员工晋升机制员工晋升机制图 :其中最底层为进程建模,以有限状态机(FSM)来描述协议;其上是节点建模,由相应的协议模型构成,反映设备特性;最上面为网络建模,它需要对网络有正确的拓扑描述。三层建模机制和实际的网络、设备、协议层次完全对应,全面反映了网络的相关特性,具有很好的继承性和可重用性。OPNET的建模机制框架如图所示。 三.各种文件类别的描述: 四.建立一个包交换网络的关键步骤: 4.1要创建一个新的包模型: (1)从File 菜单中选择New„,然后从列表中选择Packet Format,单击OK 按钮。 这时打开包格式编辑器。 (2)单击Create New Field 工具按钮,然后将光标移到编辑窗口中,单击鼠标左键, 接着单击右键。 这时一个新的包域出现在编辑窗口中。 现在我们来设置包域的属性: (3)在包域上单击鼠标右键,从弹出的菜单中选择Edit Attribute。 (4)从弹出的属性设置对话框中,按图6-5 设置属性值,然后单击OK 按钮。 (5)从File 菜单中选择Save„,将包格式命名为_pksw_format。 为文件名的前缀,可以任意取一个合适的前缀名。 (6)关闭包格式编辑器。 4.2创建新的链路模型 (1)从File 菜单中选择New„,然后从列表中选择Link Model,单击OK 按钮。 这时打开链路模型编辑器 接下来设置支持的包格式: (2)找到链路类型支持属性框,如图6-8 所示除了ptdup 外的链路类型对应的Supported 属性设置为no,表明该链路只支持点对点双工连接。、 (3)在packet formats 属性右边对应的Initial Value 栏中单击鼠标左键。 这时弹出选择包格式支持对话框。 (4)单击“Supports All Packet Formats”和“Supports Unformatted Packets”复选框,关掉所有默认支持的格式,然后找到_pksw_format 包格式,将它属性改为 supported。 (5)单击OK 按钮关闭此对话框。 接下来需要定义链路模型的其他属性: (6)设置data rate 属性值为9600。 (7)设置ecc model(错误纠错模式)属性值为ecc_zero_err(取消链路的纠错功能)。 (8)设置error model(链路干扰模式)属性值为error_zero_err(链路无干扰)。 (9)设置prodel model(传播延时计算模式)属性值为dpt_prodel(计算点对点传播延 时)。 (10)设置txdel model(传输延时计算模式)属性值为dpt_txdel(计算点对点传输延 时)。 (11)从File 菜单中选择Declare External Files„。 这时出现申明外部函数文件对话框。 (12)找到link_delay 并单击其左边的复选框,这时出现绿色的勾。 (13)单击OK 按钮关闭对话框。 最后命名链路模型: (14)File 菜单中选择Save„,将链路模型命名为_pksw_link,然后单击Save。 (15)关闭链路模型编辑器。 4.3创建中心交换节点模型 (1)从File 菜单中选择New„,然后从列表中选择Node Model,单击OK 按钮。这 时打开节点模型编辑器。 (2)在编辑窗口中放置一个进程模块,四个点对点发信机,和四个点对点收信 机。 (3)如图6-9 所示给每个对象命名,并用包流将每个收信机和发信机和hub 相连。 (4)在hub 进程模块上单击右键,从弹出的菜单中选择Show Connectivity。 这时出现一个包流指向列表,描述包流与hub 连接情况(格式为:hub[输出流索引号] ?发信机;收信机?hub[输入流索引号]) (5)关闭该对话框。 接下来你需要定义收发机模型属性: (6)按住shift 键,依次以鼠标左键单击所有的收信机和发信机。 注意不要选中包流。 (7)在其中一个收信机或收发信机模块上单击鼠标右键,从弹出的菜单中选择Edit Attributes。 (8)单击channel 属性右边的value 栏,在弹出的信道属性表中将data rate 设置为9600。 (9)单击packet formats 栏,在弹出的对话框中单击“Supports All Packet Formats”和 “ Supports Unformatted Packets ” 复选框, 关掉所有默认支持的格式, 然后找到 _pksw_format 包格式,将它属性改为supported。单击OK 关闭对话框。 (10)确定数据率和支持的包格式正确设置,如图6-11 所示,然后单击OK 关闭对话 框。 (11)需要将以上的设置改变对所有选中的对象起作用,单击Apply changes to selected objects 复选框,然后单击OK 按钮。 接下来需要定义节点模型的界面属性: (12)从Interfaces 菜单选择Node Interfaces。 出现节点界面对话框。 (13)找到节点类型支持属性表框,如图6-12 所示除了fixed 外的节点类型对应的 Supported 属性设置为no,表明该节点只能作为固定节点。 4.4创建hub 进程模型 (1)从File 菜单中选择New„,然后从列表中选择Process Model,单击OK 按钮。 这时打开进程模型编辑器。 (2)单击创建状态按钮,然后将光标移到编辑窗口中,单击鼠标左键,放置一个 状态,然后单击鼠标右键,命名该状态为idle。 (3)单击创建状态转移按钮,单击idle 状态,创建一个回到该状态自身的转移。 (4)在转移线上单击鼠标右键,从弹出的菜单中选择Edit Attributes,然后将转移的 condition 属性改为PK_ARRVL,并且将executive 属性改为route_pk()。 (5)单击OK 关闭转移属性对话框。 接下来你需要定义PK_ARRVL 条件的宏 (6)单击编辑头块按钮 (7)输入以下定义宏PK_ARRVL 的代码 #define PK_ARRVL (op_intrpt_type () == OPC_INTRPT_STRM) )从File 菜单中选择Save。 (8 PK_ARRVL 条件判断hub 进程接收的中断类型是否是流中断(在OPNET 中以常量 OPC_INTRPT_STRM 表示),如果进程异常地接收到其他类型的中断则状态找不到转移条件从而导致出错,为以防万一还需要为idle 状态创建一个指向自身default(其他条件不满 足则该条件满足)的转移线: (9)为idle 状态创建一个指向自身的转移线。 (10)在转移线上单击鼠标右键,从弹出的菜单中选择Edit Attributes,然后将转移的 condition 属性改为default,右击鼠标关闭对话框 接下来需要编写条件执行代码route_pk(): (11)单击编辑函数块按钮 (12)输入以下代码: static void route_pk(void) { int dest_address; Packet* pkptr; FIN(route_pk()); pkptr = op_pk_get (op_intrpt_strm ()); op_pk_nfd_get (pkptr, "dest_address", &dest_address); op_pk_send (pkptr, dest_address); } (13)从File 菜单中选择Save。 然后,需要更改进程的属性: (14)从Interfaces 菜单中选择Process Interfaces。 (15)把begsim intrpt 属性的初识值改为enabled。 (16)如果需要,在Comments 文本栏增加模块的说明。 (17)单击OK 按钮,保存更改。 接下来,需要编译模块: )单击编译进程模型按钮。 (18 (19)从File 菜单中选择Close,关闭进程模型编辑器。 最后,需要将编译好的进程模型指定给节点模型: )从Windows 下拉菜单中选择Node Editors,然后找到(20 _pksw_hub。 这时节点模型编辑器被激活。 (21)在hub 进程上单击鼠标右键,从弹出的菜单中选择Edit Attributes,将process model 的属性值改为_pksw_hub_proc。 (22)单击OK 按钮关闭属性对话框。 (23)保存节点模型。 4.5创建周边节点模型 (1)在刚刚保存过hub 节点模型编辑器中的Edit 的菜单下选择Clear Model。 这时编辑器工作空间被清空。 (2)按图6-15 所示放置并命名模块。 (3)在src 模块上单击鼠标右键,从弹出的菜单中选择Edit Attributes,将process model属性值改为simple_source,然后单击OK 关闭属性对话框。 (4)按下列方向建立包流:rcv?proc;proc?xmt;src?proc。(5)在src 模块上单击鼠标右键,从弹出地菜单中选择Edit Attribute。 (6)在属性表中,选中左边一栏的Packet Interarrival Time(这时该属性变成蓝色), 然后单击Promote 按钮。 这样就提升了属性,可以在仿真属性中设置它的值。 同时希望业务生成模块能够产生前面定义的包格式: (7)单击Packet Format 属性对应的右边Value 栏,将它更改为_pksw_format。 (8)参考下图,确定你的设置正确,然后单击OK 关闭属性对话框。 (9)住shift 键,依次以鼠标左键单击收信机和发信机。 注意不要选中包流。 (10)在其中一个收信机或收发信机模块上单击鼠标右键,从弹出的菜单中选择Edit Attributes。 (11)单击channel 属性右边的value 栏,在弹出的信道属性表中将data rate 设置为9600. (12)单击packet formats 栏,在弹出的对话框中单击“Supports All Packet Formats” 和“Supports Unformatted Packets”复选框,关掉所有默认支持的格式,然后找到 _pksw_format 包格式,将它属性改为supported。单击OK 关闭对话框。 (13)确定数据率和支持的包格式正确设置,然后单击OK 关闭对话框。 (14)需要将以上的设置改变对所有选中的对象起作用,单击Apply changes to selected objects 复选框,然后单击OK 按钮。 接下来你需要定义节点模型的界面属性: (15)Interfaces 菜单中选择Node Interfaces 出现节点界面对话框。 (16)找到支持的节点类型属性表,除了fixed 外的节点类型对应的Supported 属性设 置为no,表明该节点只能作为固定节点。 当某个属性是由底层提升得来的,它的名称就会变得很冗长而且没有意义,这时可能 需要把它的名称简化。本例程将为包到达间隔属性重新命名。 (17)Node Interfaces 对话框中选择Rename/Merge„按钮。 (18)在Unmodified Attributes 栏中找到要更名的属性src.Packet Interarrival Time,然 后单击按钮。 (19)在Promotion Name 文本栏中中输入新的名字source interarrival time,如图 (20)单击OK 关闭重命名对话框。 (21)在Node Interfaces 对话框中,选择新命名的source interarrival time 属性,这时 左边的Edit Properties 按钮被激活,单击它。 这时出现Attribute:source interarrival time 对话框。 (22)在Symbol Map 表中,将所有Symbol 对应的Status 变为suppress。 (23)如图6-19 所示增加4 个符号与值的映射项。 (24)如图下所示除了source interarrival time 外的所有属性的Status 改为hidden。 (25)单击OK 按钮关闭节点界面对话框。 (26)从File 菜单中选择Save As„,将节点模型命名为_pksw_node,然后关 闭节点模型编辑器。 创建周边节点的过程: (1)从File 菜单中选择New„,从弹出的菜单中选择Process Model,单击OK 按钮。 (2)如图下所示在编辑窗口中放置两个状态: (3)改变状态的属性: ? 在第一个状态上单击鼠标右键,在弹出的菜单中选择 Set name 将其改名为init, 并且选择Make State Unforced 使其变为强制的(forced),这时状态颜色变为绿色。 ? 将第二个状态更名为 idle。(保持它为红色的非强制unforced 状态),如下图所 示。 在init 状态中,进程模型将加载一个从0~3 的均匀分布概率函数。 下一步,需要为状态创建转移线。 (1)如图6-23 所指定状态转移以及条件满足所执行的函数。 xmt()转移执行函数产生将调用概率函数随即产生目的地址,并将其分配给来自业务生 成模块的包,然后再将它发送出去。 rcv()转移执行函数作用是在接收到包是计算其端对端延时,并且将结果写入全局统计 量。 )单击编辑头块按钮定义转移条件。 (2 (3)输入以下代码: */ /* 包流定义 #define RCV_IN_STRM 0 #define SRC_IN_STRM 1 #define XMT_OUT_STRM 0 /* 条件宏定义 */ #define SRC_ARRVL (op_intrpt_type () == OPC_INTRPT_STRM && op_intrpt_strm () == SRC_IN_STRM) #define RCV_ARRVL (op_intrpt_type () == OPC_INTRPT_STRM && op_intrpt_strm () == RCV_IN_STRM) (4)从File 菜单中选择Save 保存文件。 接下来,需要定义状态变量和临时变量。 (1)单击编辑状态变量工具按钮。 (2)在状态变量对话框中输入以下内容,如图 (3)单击OK 关闭对话框。 下一步,需要创建一个全局统计探针收集包的端对端延时结果。 (1)在进程模型的Interfaces 菜单中选择Declare Global Statistics(申明全局统计量)。 (2)将Stat Name 属性命名为ETE Delay。 (3)在探针描述文本栏中输入: Calculates ETE delay by subtracting packet creation time from current simulation time. (4)从File 菜单中选择Save 保存描述文件。 (5)检查的设置是否完成。 (6)单击OK 关闭Declare Global Statistics 对话框。 接下来,需要为进程模型中的每个状态添加入口和出口执行代码。首先为init 状态添 加入口执行代码: (7)双击init 状态的上半部打开其入口执行代码编辑框,输入以下代码。 address_dist = op_dist_load ("uniform_int", 0, 3); ete_gsh = op_stat_reg("ETE Delay",OPC_STAT_INDEX_NONE, OPC_STAT_GLOBAL); (8)从File 菜单中选择Save 保存代码。 xmt()转移执行函数当SRC_ARRVL 条件满足时(即包从业务生成模块到达proc 模块) 才执行。该函数在将包发送之前要为它分配一个目的地址。 )在函数块中,输入以下代码: (9 static void xmt (void) { Packet* pkptr; FIN (xmt()); pkptr = op_pk_get (SRC_IN_STRM); op_pk_nfd_set_int32 (pkptr, “dest_address”, (int)op_dist_outcome (address_dist)); op_pk_send (pkptr, XMT_OUT_STRM); FOUT; } (10)在函数块中输入以下代码: static void rcv (void) { Packet* pkptr; double ete_delay; FIN (rcv()); pkptr = op_pk_get (RCV_IN_STRM); ete_delay = op_sim_time() – op_pk_creation_time_get (pkptr); op_stat_write (ete_gsh, ete_delay); op_pk_destroy (pkptr); FOUT; } (5)从File 菜单中选择Save 关闭函数编辑器。 还需要激活“仿真开始”中断: (1)在Interfaces 菜单中选择Process Interfaces,从Process Interfaces 对话框中,将begsim intrpt 属性变改为enabled。 (2)在comment 文本框中加入进程描述。单击OK 关闭对话框。 4.6创建网络模型 (1)从OPNET Modeler 主窗口中的File 菜单中选择New...,从下拉列表中选择Project, 然后单击OK。 (2)Project Name 命名为_pksw_net,将Scenario 命名为baseline,单击OK 按钮。 (3)这时出现网络建立向导,单击Quit。 将自己指定网络规格,这时需要从一个对象模板中选择。 首先需要创建一个对象模板,它包含你需要用到的模块。 (1)单击打开对象模板工具按钮。 (2)在弹出的对话框中单击配置模板按钮(Configure Palette...) 第1 章 OPNET 仿真概述 83 (3)在Configure Palette 对话框中,单击Clear 按钮,然后单击Node Models 按钮。 (4)找到_pksw_hub 和_pksw_node 节点模型并单击右边的Status 栏 。 使其变为included。然后单击OK (5)在Configure Palette 对话框中,单击Link Models 按钮。 (6)找到_pksw_link 并包括include 该链路模型。单击OK。 (7)在Configure Palette 对话框中,单击OK 按钮,将模板命名为_ pksw_palette, 现在准备构建网络了。 (1)在项目编辑窗口中放置一个subnet 模型并命名为pksw1。 (2)双击这个子网模块进入它的内部。 (3)放置四个周边节点对象_pksw_node。 (4)放置一个中心节点对象_pksw_hub,并将该节点命名为hub。 (5)单击模板中的链路对象_pksw_link, 依次(node_0,node_1,node_2,node_3)连接四个周边和hub 节点 在保存项目之前,最好验证链路的连接是否正确: (1)单击验证连接工具按钮。 (2)选中Verify links,单击OK 按钮。 (3)如果某个链路上出现红色的叉,则链路不通。 在验证连接对话框中单击Choose transceivers for selected links,这时红色的叉消失,但 并不代表问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 已经解决,只不过把连通失败链路的连接属性置为空 4.7收集统计量并分析结果 (1)在工程窗口的空白处(任意位置)单击鼠标右键,从弹出的菜单中选择Choose Individual DES Statistics。 (2)打开Global Statistics 列表,选中ETE Delay,单击OK 关闭对话框,如图 (3)在node_0 与hub 间的链路上单击鼠标右键,从弹出的菜单中选择Choose Individual DES Statistics。 (4)打开point-to-point 列表,选中上行和下行链路利用率,如图。单击OK 关闭对话框。 (5)保存项目文件。 4.8配置仿真 (1)从Simulation 菜单中选择Configure Simulation(Advanced) 这时仿真编辑器打开。 (2)在仿真设置上单击鼠标右键,从弹出的菜单中选择Edit Attributes。 回想前面我们已经将业务生成模块的interarrival time 属性提升为仿真属性了,现在可 以为它指定两个不同的值(每个值运行一次仿真)。 下面将配置当包产生间隔为“4”的仿真: (1)将仿真设置文件命名为_pksw_sim1。 (2)将随机种子Seed 设置为21,仿真时间设为1000 seconds。 (3)给source interarrival time 属性赋值: ? 单击Add 按钮,然后选择未引用的仿真属性,单击OK 按钮,如图 ? 在仿真设置对话框中单击Value 栏,并从下拉列表中选择4,如图(下拉列表的效果是因为前面给属性指定了预定值)。 (4)将矢量结果文件Vector file 命名为_pksw_sim1。 (5)单击OK 关闭仿真设置对话框。 下面将配置另一个仿真: (6)复制并且粘贴刚刚配置的仿真_pksw_sim1。 。 新的仿真配置自动命名为_pksw_sim2 (7)在仿真设置上单击鼠标右键,从弹出的菜单中选择Edit Attributes,如图. )同上,将source interarrival time 属性赋值为40。(8 (9)将矢量结果文件Vector file 命名为_pksw_sim2。 (10)单击OK 关闭仿真设置对话框。 (11)从File 菜单中选择Save 保存仿真配置文件。 4.9运行仿真 (1)单击执行仿真按钮。 (2)仿真完毕后关闭仿真消息对话框,并且关闭仿真配置编辑器。 分析结果: 配置并运行了两个不同仿真,现在需要使用分析工具来查看仿真结果。 比较两个场景的端对端延时和链路利用率: (1)从File 菜单中选择New...,从下拉列表中选择Analysis Configuration。 (2)单击创建结果图按钮 这时出现View Results 对话框。 (3)找到刚刚在仿真配置中设置的矢量结果文件名:_pksw_sim1 和_pksw_sim2 (4)如图,分别选中两个场景的点对点链路上行利用率结果 (7)在对话框下面选择结果显示视觉效果为Statistics Overlaid,结果显示模式为 time_average。 )单击Show 按钮。 (8 将看到下图所示的链路利用率比较图。 可以看出包的产生速率过小导致链路利用率很低。 接下来查看包的端对端延时,确定包是否会在队列中积压。 (1)在刚刚的View Results 对话框中单击Unselect 按钮。 (2)改变结果过滤模式为As Is。 (3)找到矢量结果文件_pksw_sim1,选择Global Statistics: ETE Delay,单击Show 按 钮,出现如下图的结果。 (4)在View Results 对话框中单击Unselect 按钮。 (5)找到矢量结果文件_pksw_sim2,选择Global Statistics: ETE Delay,单击Show 按 钮。出现如下图的结果。 (6)在画图板上单击鼠标右键,在弹出的菜单中选择Draw style?Discrete。 这时显示模式由线性变为离散,如下图: (7)同样方法改变另一副图
本文档为【网络测试编程及OPNET仿真-豆丁】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_614050
暂无简介~
格式:doc
大小:516KB
软件:Word
页数:0
分类:生活休闲
上传时间:2018-10-15
浏览量:25