创建一个包交换网络1概述该例程将仿真一个简单的包交换网络。它包括2个周边节点和1个集线器。网络拓扑结构如图1-1所示。图1-1简单的包交换网络拓扑结构构建该网络模型的同时,我们还将接触到一些新的核心函数,学会如何使用包和链路编辑器,以及如何自定义统计结果。最后通过观察网络的包交换行为,我们将更加熟悉节点和进程模型及其如何在网络模型中运作。实验完毕,将得到业务的端对端延时结果,进而评估网络的性能。2开始建立在开始构建该网络之前,我们先熟悉它的物理通信机制和各个节点的功能:。网络的物理通信机制——如图1-2所示,每个节点至少包含一对点对点收发机,并且通过一条有线双工链路和另一对点对点收发机构成一个收发机组。每个这样的收发机组可以支持数据的双向传输。图1-2网络的物理通信拓扑结构网络功能概述——拓扑结构包含两种类型节点模型,它们分别是周边节点和中心交换节点。本例程的目的是仿真一个周边节点发出的业务能够通过中心交换节点路由至另一个目的周边节点。从中心交换节点中看,我们假设,包是以随机的方式来自四个周边节点,每个包包含目的地址,目的地址可以用一个整数来表示不同的目的周边节点,中心节点接收到包后通过对目的地址的解析最后选择一个合适的发信机将包送往目的地。中心交换节点如何实现寻址和包交换——每个有向包流(以某个进程模型为参考,某个包流或者进入该进程或者离开该进程,因此称之为有向包流)有一个惟一的索引号。这个索引号总是和某个收信机(对应进入包流)或者某个发信机(对应离开包流)惟一对应,而收信机和发信机又和某个周边节点惟一对应,因此可以直接用流索引号作为交换包的依据。当然为了增强网络的稳健性,我们也可以建立一个目的地址和流索引(可以看作是物理地址)的映射表。为了简单起见,采用前一种方法实现寻址和包交换,如图6-3所示。周边节点的功能——作为网络的业务源,周边节点产生包(用标准的业务生成模块实现),然后为每个包分配一个目的地址并且通过点对点发信机传输出去(自定义模块实现)。同时作为网络的业务终端,周边节点接收包并且统计其端对端延时(在同上的自定义模块中实现),如图6-4所示。图1-3中心交换节点结构图1-4周边节点结构OPNETModeler的精髓之一为层次化建模的思想,在构建本网络中,采用如下的层次化的步骤:定义包格式→定义链路模型→创建中心交换节点模型→创建周边节点模型→建立网络模型OPNET的包格式编辑器可以创建包含任意数量子域的数据包,包的大小由两部分组成:(1)所有子域大小的叠加。(2)校验值(bulksize)。3创建新的包格式要创建一个新的包模型:(1)从File菜单中选择New…,然后从列表中选择PacketFormat,单击OK按钮。这时打开包格式编辑器。(2)单击CreateNewField工具按钮,然后将光标移到编辑窗口中,单击鼠标左键,接着单击右键。这时一个新的包域出现在编辑窗口中。现在我们来设置包域的属性:(3)在包域上单击鼠标右键,从弹出的菜单中选择EditAttribute。(4)从弹出的属性设置对话框中,按图1-5设置属性值,然后单击OK按钮。图1-5包域的属性这时定义好的包域名称和大小会在编辑窗口中显示,如图1-6所示。图1-6定义好的包域(5)从File菜单中选择Save…,将包格式命名为initials_pksw_format。initials为文件名的前缀,可以任意取一个合适的前缀名。(6)关闭包格式编辑器。4创建新的链路模型使用链路模型编辑器创建自定义链路。要创建连接中心和周边节点的双工链路模型,并且能支持已定义的包:(1)从File菜单中选择New…,然后从列表中选择LinkModel,单击OK按钮。这时打开链路模型编辑器,如图1-7所示。图1-7链路模型编辑器接下来设置支持的包格式:(2)找到链路类型支持属性框,如图6-8所示除了ptdup外的链路类型对应的Supported属性设置为no,表明该链路只支持点对点双工连接。(3)在packetformats属性右边对应的InitialValue栏中单击鼠标左键。这时弹出选择包格式支持对话框。(4)单击“SupportsAllPacketFormats”和“SupportsUnformattedPackets”复选框,关掉所有默认支持的格式,然后找到initials_pksw_format包格式,将它属性改为supported。(5)单击OK按钮关闭此对话框。接下来需要定义链路模型的其他属性:(6)设置datarate属性值为9600。(7)设置eccmodel(错误纠错模式)属性值为ecc_zero_err(取消链路的纠错功能)。(8)设置errormodel(链路干扰模式)属性值为error_zero_err(链路无干扰)。(9)设置prodelmodel(传播延时计算模式)属性值为dpt_prodel(计算点对点传播延时)。(10)设置txdelmodel(传输延时计算模式)属性值为dpt_txdel(计算点对点传输延时)。如果需要,还可以增加对该链路模型的描述。设置完属性后,我们还需要增加link_delay外部函数。注意:这一步只针对OPNET9.0及其更高的版本,如果漏掉这一步编译dpt_prodel时会因为找不到link_delay函数而出现unresolvedexternalerror错误。在OPNET8.0系列版本中由于默认dpt_prodel管道程序没有使用link_delay函数,因此不存在这个问题。(11)从File菜单中选择DeclareExternalFiles…。这时出现申明外部函数文件对话框。(12)找到link_delay并单击其左边的复选框,这时出现绿色的勾。(13)单击OK按钮关闭对话框。最后命名链路模型:(14)File菜单中选择Save…,将链路模型命名为initials_pksw_link,然后单击Save。(15)关闭链路模型编辑器。1.5创建中心交换节点模型创建节点模型需要定义节点模型和定义进程模型两个步骤。我们从定义节点模型开始,中心交换节点包含:四对发信机和收信机(每对收发信机对应一个周边节点),一个中心交换处理进程(用来按地址转交包)。要创建节点模型:(1)从File菜单中选择New…,然后从列表中选择NodeModel,单击OK按钮。这时打开节点模型编辑器。(2)在编辑窗口中放置一个进程模块,四个点对点发信机,和四个点对点收信机。(3)如图6-9所示给每个对象命名,并用包流将每个收信机和发信机和hub相连。图1-9中心交换节点模型接下来查看包流的连接情况:(4)在hub进程模块上单击右键,从弹出的菜单中选择ShowConnectivity。这时出现一个包流指向列表,描述包流与hub连接情况(格式为:hub[输出流索引号]→发信机;收信机→hub[输入流索引号]),如图1-10所示。图1-10包流的连接关系(5)关闭该对话框。接下来你需要定义收发机模型属性:(6)按住shift键,依次以鼠标左键单击所有的收信机和发信机。注意不要选中包流。(7)在其中一个收信机或收发信机模块上单击鼠标右键,从弹出的菜单中选择EditAttributes。(8)单击channel属性右边的value栏,在弹出的信道属性表中将datarate设置为9600。(9)单击packetformats栏,在弹出的对话框中单击“SupportsAllPacketFormats”和“SupportsUnformattedPackets”复选框,关掉所有默认支持的格式,然后找到initials_pksw_format包格式,将它属性改为supported。单击OK关闭对话框。(10)确定数据率和支持的包格式正确设置,如图1-11所示,然后单击OK关闭对话框。图1-11有线收发信机的属性框(11)需要将以上的设置改变对所有选中的对象起作用,单击Applychangestoselectedobjects复选框,然后单击OK按钮。接下来需要定义节点模型的界面属性:(12)从Interfaces菜单选择NodeInterfaces。出现节点界面对话框。(13)找到节点类型支持属性表框,如图1-12所示除了fixed外的节点类型对应的Supported属性设置为no,表明该节点只能作为固定节点。图1-12节点类型支持属性表框如果需要,还可以在Comments文本栏中加上对该节点的描述。现在节点模型就建立完了,将节点模型命名为initials_pksw_hub并保存,但是不要关闭节点模型编辑器,接下来我们来创建hub进程模型。1.6创建hub进程模型hub进程模块将接收到的包按照目的地址转交给正确的发信机,然后通过发信机将包发往目的节点。在节点模型中,hub进程模块通过包流与发信机和收信机相连。因为每个包的到达都触发hub进程的一次中断,hub进程接收到中断后将从休眠状态(idle非强制状态)激活执行代码处理包(绿色的强制状态)。(1)从File菜单中选择New…,然后从列表中选择ProcessModel,单击OK按钮。这时打开进程模型编辑器。(2)单击创建状态按钮,然后将光标移到编辑窗口中,单击鼠标左键,放置一个状态,然后单击鼠标右键,命名该状态为idle。当包被收信机接收,即给进程触发一个流中断,因此状态必须能够判断出这个条件并做出正确的状态转移。接着我们来建立状态转移:(3)单击创建状态转移按钮,单击idle状态,创建一个回到该状态自身的转移。(4)在转移线上单击鼠标右键,从弹出的菜单中选择EditAttributes,然后将转移的condition属性改为PK_ARRVL,并且将executive属性改为route_pk()。如图1-13所示。图1-13hub进程模型(5)单击OK关闭转移属性对话框。接下来你需要定义PK_ARRVL条件的宏(6)单击编辑头块按钮(7)输入以下定义宏PK_ARRVL的代码#definePK_ARRVL(op_intrpt_type()==OPC_INTRPT_STRM)(8)从File菜单中选择Save。PK_ARRVL条件判断hub进程接收的中断类型是否是流中断(在OPNET中以常量OPC_INTRPT_STRM表示),如果进程异常地接收到其他类型的中断则状态找不到转移条件从而导致出错,为以防万一还需要为idle状态创建一个指向自身default(其他条件不满足则该条件满足)的转移线:(9)为idle状态创建一个指向自身的转移线。(10)在转移线上单击鼠标右键,从弹出的菜单中选择EditAttributes,然后将转移的condition属性改为default,右击鼠标关闭对话框,如图1-14所示。图1-14hub进程模型接下来你需要编写条件执行代码route_pk():(11)单击编辑函数块按钮(12)输入以下代码:staticvoidroute_pk(void){intdest_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);}真正有效的代码是在FIN(route_pk())之后。第一句用来从合适的输入流(输入流索引通过核心函数op_intrpt_strm得到)中取得包(op_pk_get)。第二句代码析取包中的目的域,它含有包的目的地址。前面提过,这里的目的地址实际上是输出流索引,它对应发往目的节点的收信机,而最后一句代码将包发送给相应的收信机。(13)从File菜单中选择Save。然后,需要更改进程的属性:(14)从Interfaces菜单中选择ProcessInterfaces。(15)把begsimintrpt属性的初识值改为enabled。(16)如果需要,在Comments文本栏增加模块的说明。(17)