(信号与信息处理专业论文)具有自动化测试功能的bgp协议仿真工具的研究与开发.pdf_第1页
(信号与信息处理专业论文)具有自动化测试功能的bgp协议仿真工具的研究与开发.pdf_第2页
(信号与信息处理专业论文)具有自动化测试功能的bgp协议仿真工具的研究与开发.pdf_第3页
(信号与信息处理专业论文)具有自动化测试功能的bgp协议仿真工具的研究与开发.pdf_第4页
(信号与信息处理专业论文)具有自动化测试功能的bgp协议仿真工具的研究与开发.pdf_第5页
已阅读5页,还剩68页未读 继续免费阅读

(信号与信息处理专业论文)具有自动化测试功能的bgp协议仿真工具的研究与开发.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京航空航天大学硕士论文 i 摘要 摘要 三大路由协议之一的 bgp 协议是一种不同自治系统的路由器之间进行通信 的外部网关协议,是高级的距离矢量协议。动态,健壮的路由对于 internet 网 络来说极其重要,因此任何一个初涉此领域的网络工程师不仅需要理解路由的 概念,而且要有能力在真正的环境下驾驭它。在此前提下,我们迫切需要一个 面向路由器的 bgp 协议模拟仿真软件,为用户完成大部分复杂的配置和测试工 作,该软件应该在 ipv4 与 ipv6 网络中都可通用,并且具有可由 tcl 脚本控制 运行的自动化测试功能。这在 bgp 协议测试领域是一个极具挑战性的课题。 本课题的主要工作如下: 1、开发 bgp4 的协议仿真工具,在前人开发的 bgp4 协议仿真工具基础上, 继续开发该测试工具的新功能,其中宣告路由在短时间内达到 20 万条以上,并 创造性地加入了一些新功能,如震荡报文功能和从文件读路由功能等。 2、开发 bgp4+的协议仿真工具,并将 bgp4 协议仿真工具和 bgp4+协议仿真 工具集合到一个系统中。bgp4+是基于 ipv6 的 bgp 协议,虽然现阶段 ipv4 仍然 占主导地位,但在不久的将来,ipv6 将取代 ipv4,开发 bgp4+的协议仿真工具 使得本工具具有更强的时效性。 3、创造性的开发 tcl 自动化测试功能。为了更好的提高测试人员的测试效 率,我们有必要实现一种与手动测试分离的测试方法。本文提出并实现了一种 利用 tcl 脚本控制协议仿真工具进行测试工作的方案。 从软件的应用结果看,软件很好的满足了测试开发人员在日常工作中的需 要,很好的提高了工作效率,与同行业该类型软件相比具有功能齐全,稳定性 好的优点,达到了国内先进水平。 关键词:bgp4,bgp4+,ipv6,路由器,tcl 自动化测试,灌路由,震荡路 由。 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 ii abstract abstract bgp(border gateway protocal), which is one of the three most famous route protocols, is a different kind of border gateway protocol that communicate among different autonomy systems routers, is a superior distance vector protocol. dynamics and strong routes are very important to internet network, so every network engineer who is beginner of this field no only need to understand the conception of route, but also they must have the ability to control it in real condition. under this precondition, we exigent need a bgp simulate software which face to ger router,to help the user to finish a majority of work as complex configuring and testing.the software should be useable both in ipv4 nerwork and ipv6 network, also it must have roboticized testing function that be controled by tcl script.this is a challenge topic in bgp testing area. the main work of this topic is as follow: 1.develop bgp4 protocol simulator,under the bgp4 protocol simulator developped by prehominid, continue to develop new function of the implement. among them,sending 200 thousand routes in short time,and creativeness add some new functions,such as flap route and reading routes from files. 2.develop bgp4+ protocol simulator,and aggregate bgp4 simulator and bgp4+ simulator into the same system. bgp4+ is a verson of bgp that base of ipv6,although in present ipv4 is still in main position.but ipv6 will replace ipv4 in the future. developing bgp4+ protocol simulator make the implement more timeliness. 3. creativeness develop tcl roboticized testing function.for the reason of better improving the efficiency of testers,we need to come true a test method which is difference whit hand movement testing.the thesis suggest and come true a scheme that tcl script control the protol simulator to test. from the result of using the software, it well satisfies the need of testing and r if (s = -1) /* if s发送open消息-接收open消息-接收keepalive消息-发送keepalive 消息。bgp4 与 bgp4+在这个环节上是没有太大区别的,唯一不同的地方就是: bgp4+发送的 open 消息的对端地址是 ipv6 地址(128 位)而 bgp4 的是 ipv4 地 址(32 位) 。下面来详细描述这些步骤的实现。 5.2.1 建立同步 socket 连接 5.2.1 建立同步 socket 连接 在协议仿真工具与对端路由器之间我们选择同步 socket 进行连接。同步 socket 可以比较好的解决 tcp 粘包的问题。 所谓 tcp 粘包现象是指发送方发送的若干包数据到接收方接收时粘成一 包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。出现粘包现象 的原因是多方面的,它既可能由发送方造成,也可能由接收方造成。发送方引 起的粘包是由 tcp 协议本身造成的,tcp 为提高传输效率,发送方往往要收集 到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常 tcp 会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘 包数据。接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致 粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 48 该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下 一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先 设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。粘 包情况有两种,一种是粘在一起的包都是完整的数据包,另一种情况是粘在一 起的包有不完整的包。 在处理定长结构数据的粘包问题时,分包算法比较简单;在处理不定长结 构数据的粘包问题时,分包算法就比较复杂。由于一包数据内容被分在了两个 连续的接收包中,处理起来难度较大。实际工程应用中应尽量避免出现粘包现 象。 为了避免粘包现象, 可采取以下几种措施。 一是对于发送方引起的粘包现象, 用户可通过编程设置来避免,tcp 提供了强制数据立即传送的操作指令 push, tcp 软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓 冲区满。或者使用同步机制,也可达到同样效果;二是对于接收方引起的粘包, 则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施, 使其及时接收数据,从而尽量避免出现粘包现象;三是由接收方控制,将一包 数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。 在我们之前的编程工作中,曾经建立过异步 socket,但发现异步 socket 的粘包现象很严重,在接收端抓包可以看到,有很多的数据包的头紧接着前一 包数据的尾。在粘包达到一定数量后,bgp 连接会因为异常包过多而自动断掉, 尤其在灌路由时特别明显,一般只能灌 3 万至 4 万条路由 bgp 连接就会断开, 这显然是不符合性能指标的。 在我们使用了同步 socket,并配合组包的程序分包技术后,粘包现象得到 了很好的抑制, 在灌路由的测试过程中向对端发送 20 万条路由以上时 bgp 连接 仍然保持正常,并且对端也全部接收到了这些路由。 下面是建立连接的程序实现: if(m_csocket!=null) /已经存在连接 delete(m_csocket); m_csocket = new cbgpsocket(m_pwnd-getsafehwnd(), active); if (!m_csocket-createregular() /这一步决定了是发 tcp 包,详见 msdn /csocket:create delete m_csocket; 南京航空航天大学硕士论文 49 m_csocket = null; return 1; /socket create failure if (!m_csocket-connect(0, lpszpeer, 179) return 0; 其中 m_csocket 是 cbgpsocket 类型的变量,在用构造函数创建之后,将 其设置为发送 tcp 包(因为 bgp 报文是建立是 tcp 基础上的) ,然后用我们在 cbgpsocket 类内定义的函数 connect(0, lpszpeer, 179)建立 bgp 连接,该函 数第二个参数是对端的地址,第三个参数是端口号。 5.2.2 组建 bgp 报文 5.2.2 组建 bgp 报文 上文已经提到,bgp 有 5 种报文,分别是 open,keepalive,refresh, notification 和 update。在控制模块发出发送某种报文的指令后,就转到组包 模块-即 cmsg 类中组建该种报文。这个过程其实由以下几个步骤完成:获取用 户的输入-创建空白缓冲区-往缓冲区中填充参数与报文字段-返回缓冲区的 长度,等待发送。 在获取用户输入这个环节,我们主要采用结构体变量来完成。虽然 bgp 的五 种消息各有差异,如 update 消息就有很多字段,但是在组建报文这个环节上其 实做的工作是差不多的。下面以 open 报文为例,讨论一下这个过程。 首先定义一个名为 openmsg 的结构体,根据用户输入定义结构体成员。如 openmsg 的定义为: typedef struct _openmsg int asnumber; int holdtime; byte myaddr4; bool errmarker; bool errlen; int marker; int len; bool nokeep; bool m_nooption; openmsg; 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 50 在本结构体中包含了所有用户输入的参数,其中包括本地 as 号,holdtime,本 地地址以及一些发送错误的 open 报文的设置,如 errmarker,其中 bool 型的 变量获取界面上勾选控件的值,int marker 变量获取编辑(edit)控件的值。 由于 bgp 消息有着同样的头部,我们可以将 bgp 的头部作为一个结构体,定 义如下: typedef struct _bgpheader byte mark16; byte len2; byte type; bgpheader; 以 open 消息为例,在组建报文的开始阶段加入以下语句: bgpheader * pheader = (bgpheader*)buf; 在 bgp 头赋值完毕后,就按照 open 报文的字段顺序把各个参数填到缓冲区中, open 的字段顺序在前面已经讨论过,这里就不赘述了。 在控制模块中,一个 open 消息组建到发送的语句如下: memset(void *)buf,0 x0,sizeof(buf); bufferlen = (m_bgpmsg.createopenmessage( sendsuc = (m_send.senddata(buf,bufferlen); 第一句是把缓冲区清空,第二句是调用组包模块的组包函数组建 open 报文,该 函数以结构体变量和缓冲区变量为参数,返回缓冲区的长度。在第二句完成后, open 报文的内容已经填到缓冲区中, 在第三句中直接调用发包模块的 senddata 函数将该缓冲区向对端路由器发送就可以了。 5.2.3 震荡报文 5.2.3 震荡报文 上文已经提到,所谓路由震荡,指的是在实际操作中,由于线路不稳定, 人员操作失误,中继路由器发生故障等等原因,造成路由的不稳定现象。发生 路由震荡时,如果本地路由器的处理能力不足,会造成信息的丢失,这是一个 很严重的问题,将直接影响路由器产品的性能指标。在这种背景下,我们提出 来一种 bgp 协议仿真工具中模拟路由震荡的设计方案,该方案很好的测试了路 由器产品在路由震荡情况下的处理能力,并且提高了测试效率,在实践中产生 了良好的效果。bgp4 与 bgp4+的震荡报文实现方法类似,现在以 bgp4+的路由 震荡为例子对该方案进行一个描述。 在发生路由震荡时,路由器接收到不稳定的路由信息,路由器应该能对这 种不稳定的路由信息做出正确处理,将本该发往这些地址的信息截留。我们所 要做的就是模拟这些路由的“不稳定” ,利用 mp_reach_nlri 属性的宣告路由特 南京航空航天大学硕士论文 51 性和 mp_unreach_nlri 属性的撤消路由特性.。 其中mp_reach_nlri称为可达路由属性, 类型字段的值为14, 其对应于bgp4 中的 nlri 属性,但是在 bgp4+中,这个属性的功能已经做了很大的改动。我们 可以将两者作个比较,相同之处是都是携带可达路由的属性,头部都由 1 字节 的 flap 字段和 1 字节的类型字段组成; 不同之处是 mp_reach_nlri 属性除了携 带可达路由之外,它还一并携带了地址族(address family)信息和下一跳地 址(next hop network address )信息,具体的报文组成情况见图 5-4。由于 bgp4+是基于ipv6网络的协议, 所以mp_reach_nlri携带的可达路由信息是ipv6 地址,每条路由信息最多可占用 17 字节(1 字节的地址掩码长度和 16 字节的 地址) 。 图 5.4 通过抓包看到的 update 报文结构 mp_unreach_nlri 称为不可达路由属性,也称为撤消路由属性,类型字段 的值为 15,该属性对应于 bgp4 中的 unfeasible 属性,主要用于携带不可达路 由信息,每条路由信息最多占用 17 字节。与 unfeasible 属性相比,没有做出 太大的改变。 首先,我们要确定程序的框架。上一章已经提到,模拟震荡路由其实就是 以下步骤的不断循环:宣告路由-等待时间-撤消路由-等待时间。我们可以 设计一个定时器来完成这个循环过程, 定时器的参数就是用户设定的等待时间。 整个流程可以如此设计:用户先在界面上设置等待时间和震荡路由参数,然后 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 52 开启定时器函数, 进入组包模块组建携带 mp_reach_nlri 属性的 update 报文并 发送,可达路由发送完毕后回到定时器中开始等待,等待时间结束后进入组包 模块组建携带 mp_unreach_nlri 属性的 update 报文并发送(见图 5-5) 。 图 5.5 程序框架图 我们可以设计出这样一个方案:1.先宣告大数量的路由条目(这里之所以 要宣告大数量, 是因为要一并测试路由器承受路由的能力, 20万条以上为合格) ; 2.待这些路由宣告成功后,等待一段时间,等待的目的是让路由器有充足的时 间“消化”这些路由,并确定这些路由的可达性;3.发送撤消路由报文,撤消 上面宣告的路由信息,告诉路由器这些路由现在不可达;4.不断重复上面三个 步骤。 这个方案可以很好的模拟路由震荡现象,假如在运行此方案的时候路由器 仍能正常运行并正确处理信息的路由选择,那么该路由器处理震荡报文的性能 就合格了。 但是, 要在基于 socket 的网络编程中实现这个方案, 还有许多难点, 总结如下:1.每个 bgp 包限定为 1500 字节,而且 bgp4+的 update 报文中用于 存放路由的字段长度只有 1 字节,也即最多只能有 255 字节的报文空间用于存 放路由。 每条路由最多占 17 字节, 再除去下一跳地址占的字节数, 即一个 bgp4+ 的报文内最多只有 13 条路由,假如要宣告或撤消大量路由的话(如 20 万条) , 就肯定要用到分包技术;2.bgp4+是基于 tcp 的,tcp 在发送大量包的时候会有 前一个报文的尾部混到后一个报文的头部,造成报文混乱的现象发生。这种现 象我们称之为 “tcp 粘包” , 假如要完成震荡路由的模拟, 必须要解决这个问题; 3.bgp4+报文中的必选属性是哪三个?在 bgp4 中, 有三个属性是 update 报文必 选的,假如这三个属性之一没有选择,那么发出 update 报文的时候就会收到 notification 报文提示报文错误,这三个属性是:org,next_hop,as_path。 在 bgp4+中,由于 next-hop 属性已经归属到 mp_reach_nlri 属性中,所以我们 南京航空航天大学硕士论文 53 还要找出还有一个必选属性是什么。 从前面的讨论可知,tcp 粘包的问题我们可以通过设置同步 socket 的方法 解决;bgp4+的三个必选属性是:org,as_path,mp_reach_nlri 或者 mp_unreach_nlri。现在剩下的一个难点就是 tcp 包的分包技术。 为了不出现超长包的错误, 需要在组包模块的程序中手动为 update 报文分 包,将每个包的长度限定在 1500 字节内。由用户设置每个包内携带的路由条数 (最多 13 条/包) ,然后设置循环函数,只要路由条数已经累加到用户设置的数 值,就将该包送到发包模块发送,然后再继续重新组包,直至将所有路由发送 完毕为止。具体的程序算法如下: for(j=0;jm_routes_perpacket;j+) masklen = hugemsg-m _prefixlen; if (masklen) maskbyte = (masklen-1)/8 + 1; else maskbyte= 0; bufi+ = masklen; ip_byte = 15; while(maskbyte0) bufi+ = ip6ip_byte-; maskbyte-; addipv6address(ip6,masklen); 其中函数 addipv6address 的作用为: 按照地址掩码 masklen 的值递增 ipv6 地址。它的实现程序如下: void cmsg:addipv6address(byte *paddr, int masklen) int i,j; j = 15-masklen/8; for(i=j;i=0;i-) 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 54 paddri+; if(paddri = 0) continue; else break; bgp4 的 update 报文结构与 bgp4+的略有不同, 其用于存放路由的字段长度 有 2 字节,理论上来说,bgp4 的 update 报文可以用最多 65535 字节的空间来 携带路由信息;当然,由于一个包最多不能超过 1500 字节,65535 字节是不可 能全部用到的。bgp4 的没条路由最多占用 5 字节(比 bgp4+的 17 字节少得多) , 于是一个 update 包内最多可以携带 300 条路由。 5.2.4 灌路由 5.2.4 灌路由 灌路由是测试人员使用频率最高的一个功能,也可以说是本软件中最重要 的一个功能。因为路由器的主要作用就是选择信息传送的线路,提高通信速度, 减轻网络系统通信负荷,节约网络系统资源,提高网络系统畅通率,从而让网 络系统发挥出更大的效益。 所以, 我们的软件必须利用 bgp 连接给路由器灌注 足够多的路由,以供路由器选路。 本功能应该能够达到以下几个指标:1、在 10 分钟内向对端路由器发送 20 万条以上路由;2、能够设置每包路由条数以及每发完一个包后的停滞时间;3、 能够发送一些属性不断变化的包以供测试人员过滤路由。 第一个功能要解决的问题主要是 tcp 粘包以及分包技术,这个在上一节震 荡路由的实现中已经讨论过了,在我们的工具中,可以在 3 分钟内宣告 20 万条 ipv4 路由,在 7 分钟内宣告 20 万条 ipv6 路由,很好地达到了该技术指标,并 领先国内通讯公司的同类软件。第二个功能也在上一节给出了程序,主要是将 每包路由条数设置为用户输入的参数就可以,然后每发一个包停滞一段时间, 这个时间由用户控制,一般在 200-300 毫秒左右。在这个功能中,我们主要解 决第三个问题,就是在报文中携带一些不断变化的属性。 我们设计这样一个方案:用户可以选择一种属性,设置该属性的起始值和 递增值,在灌路由的时候,每个包都携带该属性,并且每个包都比上一个包多 一个递增值。这样就可以实现这种功能,测试人员在测试过程中也能很方便的 找出某一个属性值的路由并过滤。 南京航空航天大学硕士论文 55 为了使用户有更多的选择, 我们有三种属性可以选择递增, 分别是as_path, local_preference 和 med。 其中 local_preference 和 med 可以设置起始属性值 和递增值;as_path 除了这两个设置项外,还可以设置某一个 as 号递增,其他 的 as 号不递增。 由于程序的模块化,所以这个功能在实现的时候比较简单。前面在系统设 计一章里说过,所有报文的发送都是通过 ui(user interface)-控制模块- 组包模块-发包模块完成的。所以可以在每发一个包的时候将属性值在控制模 块内修改好,然后再进入组包模块和发包模块。如 local_preference 属性,可 以在控制模块内定义两个全局变量,一个全局变量代表 local_preference 值, 另一个代表它的递增值,在没有选择 local_preference 递增的时候,这两个全 局变量都由构造函数初始化为 0,一旦用户定义了递增,每次进入组包模块的 时候代表 local_preference 值的全局变量就增加一个递增值, 这样就可以很好 的完成在灌路由过程中携带不同的属性的工作,另外两个属性 med 和 as_path 的实现原理也是一样的。 5.2.5 从文件灌路由 5.2.5 从文件灌路由 前面章节已经提到过,测试人员除了需要向对端路由器灌注从某个地址递 增的路由,还需要从文本文件中读取一些特定的路由并向对端发送。前两节已 经讨论了灌路由功能的实现细节,所以我们不再赘述。本节主要解决的问题是: 1.如何辨别文件类型并给出提示;2.读文件并发送的步骤应该如何:是一次把 文件读完并保存在一个缓冲区中,然后在从该缓冲区读取路由分包发送;还是 每次限定读 n 条路由,然后发送,发送完毕后再读 n 条,直到文件底部。 解决第一个问题的方法很简单,只需要在路由文件的第一行加上一条固定 的,标识其为路由文件的语句,然后程序在读取文件之前先检查该语句是否符 合要求就可以了。假如文件第一行的语句符合要求,就继续下面的工作;假如 文件第一行不符合要求,就提示用户该文件类型不对,请重新选择。该过程通 过程序实现如下: filename = fdlg.getfilename(); stream = fopen( filename, r ); memset(s, null, 100); fgets(s, 100, stream); string sver = s; if(sver != routedata v1.0n) afxmessagebox(请选择正确的路由文本文件!); 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 56 return 1; fopen 函数的功能是打开用户选择的文件;fgets 函数的功能是读该文件的第一 行,读取范围为 100 字节。可以看到,第一行如果不是“routedata v1.0”,软 件将提示用户请选择正确的路由文本文件!,这样就完成了文件辨别的工作。 第二个问题用第二种方案比较合理,因为一般路由文件都会有几十万条路 由,一次读取并保存的话就需要开辟一个巨大的缓冲区。第二种方案实现的步 骤是:用户设置每包条数 rpp(routes per packet),每次从文件中读取 rpp 行, 将这 rpp 行路由信息保存在一个缓冲区中,从这个缓冲区中读取路由信息并调 用灌路由模块向对端发送(见图 5-6)。 图 5.6 从文件读路由步骤图 我们利用以下语句判断文件是否已经读完,未读完就继续循环: while(!feof( stream ) 以下列出读取 rpp 条路由并存在缓冲区内的程序: for(i=0;isplitstring(s, , vecsubstr); string str1 = vecsubstr0; string str2 = vecsubstr1; string str3 = vecsubstr2; 南京航空航天大学硕士论文 57 startaddr = inet_addr(str1.c_str(); startaddr = ntohl(startaddr); prefix = atoi(str2.c_str(); nhaddr = inet_addr(str3.c_str(); nhaddr = ntohl(nhaddr); route_bufbuflen_i+ = prefix; route_bufbuflen_i+ = startaddr24; route_bufbuflen_i+ = (startaddr24; route_bufbuflen_i+ = (startaddr24; route_bufbuflen_i+ = (startaddr24; if(feof( stream ) break; 可以看到,每条路由在缓冲区中占 5 个字节的空间:1 字节掩码,4 字节地 址。 5.2.6 tcl 扩展功能 5.2.6 tcl 扩展功能 上文已经讨论过 tcl 扩展的框架设计, tcl 扩展实际上就是 tcl 脚本端与协 议仿真工具建立异步 socket 连接,tcl 脚本端作为客户端,仿真工具作为服务 器端。一旦连接建立,tcl 脚本向服务器发送脚本命令,调用服务器内对应模 块完成测试工作。简单的说,tcl 扩展就是通过脚本命令控制仿真工具的过程。 现在我们讨论一下 tcl 扩展的实现细节。 首先,在仿真工具(服务器端)中建立一个 server socket,设置 server ip 与端口号,等待脚本(客户端)的连接。脚本与仿真工具建立连接之后,向仿 真工具发送脚本命令。仿真工具在收到命令后,判断该命令的类型并转到相应 的接口去执行。当该命令执行完毕后,再向脚本返回一个值,脚本端在收到该 值后继续向仿真工具发送下一条命令。最后一步返回值是很有必要的,因为服 务器处理命令需要一个时间,假如服务器正在处理第一条命令的时候第二条命 令也通过 socket 发送过来,就会导致服务器处理混乱,这样会导致脚本命令出 现命令执行的顺序不正常的后果。所以服务器返回值的最大作用,就是使得脚 本命令按照用户的意愿顺序执行。服务器与客户的关系见图 5-7。 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 58 图 5.7 服务器与客户的关系图 前面已经讨论了命令的发送原理: 每条命令有一个命令值 (message type) , 向服务器发送命令其实就是向服务器发送了一个携带该命令值的结构体变量, 服务器收到该结构体变量后,查看命令值,并从结构体变量中解析出命令的参 数,根据命令值选择接口实现功能。以下讨论一下命令的参数如何设置。 每一条自定义的 tcl 命令都会有自己的参数,但是当命令需要的参数很多 的时候,命令就会变得很长,就会给用户编写脚本的工作带来不方便,如 bgp4 的 update 消息, 这个消息有 10 种属性, 每种属性最少需要一个参数 (如 med) , 最多需要数 10 个参数(如:as_path 和 community),假如把发送 update 报文 设计成一个命令,那么这条命令将会有 20 至 30 个参数,显然这样的长命令是 不科学的,用户在编写脚本的时候将会为记忆命令花费大量时间,并且容易出 错。考虑到每一个 update 消息并不需要携带所有 10 种属性,也就是说,除了 三种必选属性外,其他的属性可以选择性在参数在体现出来。 基于这种考虑,我们提出这样一种方案:每一种消息定义两条命令,一条 命令用于定义参数,一条命令用于发送参数;如 open 消息,定义参数的命令为 set_bgp4_open,这条命令有三个参数,分别是 as,holdtime,id,返回一个 包含这三个参数的缓冲区。发送消息的命令为 send_bgp4_open,该命令有两个 参数,分别是 socketid 和参数缓冲区,具体的定义如下: proc set_bgp4_open as holdtime id #先检查参数的正确性 if $as 0|$holdtime 0 puts open arguments error!n return #存参数(开辟的空间应该是 8 的倍数) set as dectohex -w $as 南京航空航天大学硕士论文 59 set holdtime dectohex -w $holdtime set pack_intf pack_new 8 pack_set $pack_intf -w 0 $as ; #my as pack_set $pack_intf -w 2 $holdtime ; #hold time pack_set $pack_intf -ip 4 $id ; #identifier return $pack_intf proc send_bgp4_open skt intf variable bgp:bgp4_open_set variable bgp:bgp_flag_error #notes puts =send bgp4 open packet.= set result senddata $skt $bgp4_open_set $intf if $result = return $bgp_flag_error set ret _get_return_flag $skt return $ret 这样,用户在编写 tcl 脚本发送一个 open 消息的时候,这样写就可以了: set buf set_bgp4_open 22 180 168.1.51.88 send_bgp4_ open $skt $buf 这样设计命令, 对于一些参数比较多的命令, 是很有好处的。 比如 update, 为每种属性各定义一条命令,再为发送 update 消息定义一条命令,这样看起来 发送一个 update 消息需要写 11 条命令,其实不然。因为这样定义的目的就是 为了使用户更方便的编写脚本,有些不需要的属性的命令就可以不写,我们在 服务器端定义一个报文,这个报文是一个包含了 3 种必选属性的 update 报文, 当服务器端只收到一条发送 update 的命令(send_bgp4_ update)时,就将这 个默认包发送,这样用户就可以方便的发送一个最简单的 update 消息。当服务 器端收到属性定义命令时, 就修改这个默认包中的对应属性, 并等待send_bgp4_ update 将报文发送。这种设计使得每个属性的定义分开,避免了出现参数臃长 的命令,并且也便于用户记忆。 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 60 最后来讨论一下 tcl 中定义参数个数不固定的命令的问题。 在定义命令时, 我们碰到一些特殊的命令,他们的参数是变化的,如 community 属性,它可以 有多对 community as 和 community value。这种命令的定义不能用常规命令的 方法去解决。 定义这种命令的思路是先根据用户写的命令判断其参数个数,然后将参数 存到缓冲区中。在服务器端的接口内处理这些参数,即将这些参数分为 2 个一 组,每组一个 community as 和一个 community value。具体的命令定义程序如 下: proc set_bgp4_com skt args variable bgp:bgp4_com_set variable bgp:bgp_flag_error #先检查参数的正确性 set len llength $args set check expr $len % 2 if $len 2|$check!=0 puts error arguments! return #存参数 set pack_intf pack_new expr $len*2 for set i 0 $i $len incr i 1 set com lindex $args $i set com dectohex -w $com pack_set $pack_intf -w expr 2*$i $com #notes puts =set bgp4 update packet-community = set result senddata $skt $bgp4_com_set $pack_intf pack_free $pack_intf if $result = return $bgp_flag_error 南京航空航天大学硕士论文 61 5.3 本章小结 5.3 本章小结 本章先从网络编程讲起,讨论了本软件中的客户机/服务器模型,与对端建 立 socket 连接以及 bgp 连接的实现细节。 并详细描述了各个功能的具体实现步 骤,给出了解决各种难题的方法。 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 62 第六章 软件性能测试 第六章 软件性能测试 6.1 软件性能测试的意义与类型 6.1 软件性能测试的意义与类型 在软件的开发工作完成后,有必要对它进行全面的测试工作,这些后期的 测试工作一方面检查软件的性能稳定,另一方面也可以发掘软件的实用价值。 一般来说软件测试工作都分为自测和交叉测试两个阶段, 自测就是开发人 员对自己的软件进行测试,交叉测试就是开发人员以外的人对软件进行测试, 本软件的交叉测试工作是由中兴通讯公司数据事业部测试部的同事完成的。 测试大体来说分为 3 个阶段。第一个阶段是查错阶段,就是查找软件的一 些非功能的疏漏,比如系统不正常退出,报文没有正确显示,用户输入值没有 限定等等,在这里就不加赘述了;第二阶段是对比性能指标,测试软件的性能 是否达到标准;第三个阶段是将过去的 bgp 测试工作与利用 bgp 协议仿真工具 后的测试工作在工作时间和工作量上作一个对比。 整个软件完成后的界面如图 6.1 所示。 图 6.1 软件界面图 南京航空航天大学硕士论文 63 6.2 测试实验与性能分析 6.2 测试实验与性能分析 指标内容 完成情况 指标内容 完成情况 指标一.维持较长时间的 bgp 连接 软件在路由器无异常(如断电,人为重起等)情 况下,正常维持 bgp 连接 72 小时不中断。 指标二.bgp4 与 bgp4+互不干 扰,工作独立 软件可同时建立 bgp4 与 bgp4+连接,使用不同 的 socket,各自收发包互不影响。 指标三.在 bgp 连接正常建立 的情况下,可自由编辑并发送 单个报文 发送 open, keepalive, notification, refresh, update 单包都无问题,通过抓包软件显示路由 器接收到的包与本地发出的包一致, 在路由器上 查到看路由器从本地接收了 20 万新路由。 指标四.在较短时间内向对端 宣告 20 万条以上的路由。 同时向对端发送 20 万条 bgp4 路由和 20 万条 bgp4+路由,bgp4 路由 4 分钟完全发完,bgp4+ 路由 10 分钟内完全发完,连接无异常。 指标五.快捷发送功能正常 点击快捷发送按钮, 软件自动发送用户上次设置 的报文,经抓包软件抓包查看后无异常 指标六.震荡报文可发送和撤 消 20 万条以上路由, 并持续震 荡 2 小时以上 同时开启 bgp4 与 bgp4+的震荡报文功能,震荡 条数均为 20 万。 持续 12 小时, bgp 连接无异常。 指标七.从标准文件读取 20 万 条以上路由, 并于 10 分钟内发 送给对端 编辑一个 25 万条不同路由的文件,利用软件的 “从文件灌路由”功能读取并发送给对端,通过 抓包软件显示路由器接收到的包与文件上的包 一致,在路由器上查到看路由器从本地接收了 25 万新路由。 指标八.运行多条命令的 tcl 脚本,脚本顺序执行并完成脚 本功能,在较短时间内完成比 较复杂的 bgp 报文配置工作, 并输出日志供测试人员查看。 运行一个包含所有 bgp 脚本命令的 tcl 文件, 文 件顺序执行所有命令, 控制仿真工具发送各种命 令定义的报文。 在较短的时间内完成所有报文的 发送,并给出详细日志。 表 6.1 软件性能指标与完成情况 6.3 软件为工作带来的便利 6.3 软件为工作带来的便利 面向 ger 路由器的 bgp 协议仿真工具的研究与开发 64 测试工作 手动测试花费时间 利用 bgp 仿真工具测 试花费时间 测试工作 手动测试花费时间 利用 bgp 仿真工具测 试花费时间 建立 bgp 连接 2 分钟 10 秒 开启并设置震荡路由 10 分钟 10 秒 发送 20 万条 bgp4 路由 60 分钟左右 4 分钟 发送 20 万条 bgp4+路由 80 分之左右 10 分钟 同时发送20万条bgp4路由和20 万条 bgp4+路由 140 分钟左右 10 分钟 从文件读取 20 万条路由并发送 给对端 2400 分钟左右 10 分钟 表 6.2 测试效率对比 通过表 6.2 的对比,可以看出仿真工具有效缩短了测试时间。除了节约了 测试人员的时间外,还提高了工作的效率,通过查看路由器的接收情况,可以 看到宣告路由的准确率较以往手动测试要高了很多。 6.4 本

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论