发布新日志

  • RFT 常用 函数

    fengzhulin 发布于 2010-07-06 14:52:43

    startApp

           启动配置好的应用程序

    startBrowser

            启动浏览器,例如:
            startBrowser("Internet Explorer", "http://blog.csdn.net/testing_is_believing");

    logInfo (" message")  

    logWarning (" message")

    logError (" message")

           写日志

     

    sleep

           暂停脚本执行,等待指定的一段时间

     

    waitForExistence

        等待指定的对象出现

     

    timerStart

    timerStop

        计时器,分析界面执行效率时可以使用

     

    callScript

        调用脚本,用于组织脚本的运行

     

    dpDone

        用于判断DataPool中的数据是否取到最后一行(不能再取下一行)

     

    dpString

        从数据池中取数据

     

    dpNext

        从DataPool取下一行数据

     

    getProperty

        取测试对象的指定属性

     

    getProperties

           取测试对象的所有属性

     

    setProperty

           设置测试对象的指定属性值

     

    getMethods

           返回测试对象的所有方法

     

    invoke

        调用测试对象的指定方法
  • web安全测试-跨站点脚本攻击

    狙击枪 发布于 2010-06-02 12:47:30

    到目前为止,对于跨站点脚本攻击具有很大的威胁这一点大家并无异议。如果您很精通 XSS 并且只想看看有什么好的测试方法可供借鉴,那么请直接跳到本文的测试部分。如果您对 此一无所知,请按顺序认真阅读!如果某个怀有恶意的人(攻击者)可以强迫某个不知情的用户(受害者)运行攻击者选择的客户端脚本,那么便会发生跨站点脚本 攻击。“跨站点脚本”这个词应该属于用词不当的情况,因为它不仅与脚本有关,而且它甚至不一定是跨站点的。所以,它就是一个在发现这种攻击时起的一个名 字,并且一直沿用至今。从现在开始,我们将使用它常见的缩写名称“XSS”。

      XSS 攻击的过程涉及以下三方:

      •攻 击者

      •受害者

      •存在漏洞的网站(攻击者可以使用它对受害者采取行动)

      在这三方之中,只有受害者会 实际运行攻击者的代码。网站仅仅是发起攻击的一个载体,一般不会受到影响。可以用多种方式发起 XSS 攻击。例如,攻击者可通过电子邮件、IM 或其他途径向受害者发送一 个经过经心构造的恶意 URL。当受害者在 Web 浏览器中打开该 URL 的时侯,网站会显示一个页面并在受害者的计算机上执行脚本。

       XSS 漏洞是什么样的呢?

      作为一名 Web 开发人员或测试人员,您肯定知道 Web 应用程序的技术基础是由 HTTP 和 HTML 组成的。HTTP 协议是 HTML 的传输机制,可使用代码设计 Web 页面布局和生成页面。

      如果 Web 应用程序接受用户通过 HTTP 请求(如 GET 或 POST)提交的输入信息,然后使用输出 HTML 代码在某些地方显示这些信息,便可能存在 XSS 漏洞。下面是一个最简单的例子:

      1. Web 请求如下所示:

      GEThttp://www.somesite.com/page.asp?pageid=10&lang=en&title=Section%20Title

       2. 在发出请求后,服务器返回的 HTML 内容包括:

      <h1>Section Title</h1>

       可以看到,传递给“title”查询字符串参数的用户输入可能被保存在一个字符串变量中并且由 Web 应用程序插入到 <h1> 标记中。通过提供输入内容,攻击者可以控制 HTML。

      3. 现在,如果站点没有在服务器端对用户输入加以过滤(因为总是可以绕过客户端控件),那么恶意用户便可以使用许多手段对此漏洞加以滥用:

       攻击者可以通过摆脱 <h1> 标记来注入代码:
    http://www.somesite.com/page.asp?pageid=10&lang=en&title=Section%20Title</h1><scrīpt>alert(‘XSS%20attack’)</scrīpt>

       这个请求的 HTML 输出将为:

      <h1>Section Title</h1><scrīpt>alert(‘XSS attack’)</scrīpt>

       即便是这个最简单的例子,攻击者也可以利用此连接完成数不清的事情。让我们看看会有哪些潜在的威胁,然后讨论一些更高级的测试方法。

       XSS 攻击的威胁有多么严重?

      由于能够在生成的 Web 页面中注入代码,能想到的威胁有多么严重,就可以有多么严重的威胁。攻击者可以使用 XSS 漏洞窃取 Cookie,劫持帐户,执行 ActiveX,执行 Flash 内容,强迫您下载软件,或者是对硬盘和数据采取操作。

      只要您点击了某些 URL,这一切便有可能发生。每天之中,在阅读来自留言板或新闻组的受信任的电子邮件的时侯,您会多少次地单击其中的 URL?

      网络钓 鱼攻击通常利用 XSS 漏洞来装扮成合法站点。可以看到很多这样的情况,比如您的银行给你发来了一封电子邮件,向您告知对您的帐户进行了一些修改并诱使您点击某些超链接。如果仔 细观察这些 URL,它们实际上可能利用了银行网站中存在的漏洞,它们的形式类似于http://mybank.com/somepage?redirect=<scrīpt>alert(‘XSS’)</scrīpt>, 这里利用了“redirect”参数来执行攻击。

      如果您足够狡猾的话,可以将管理员定为攻击目标,您可以发送一封具有如下主题的邮件: “求救!这个网站地址总是出现错误!”在管理员打开该 URL 后,便可以执行许多恶意操作,例如窃取他(或她)的凭证。

      好了,现在我 们已经理解了它的危害性 -- 危害用户,危害管理员,给公司带来坏的公共形象。现在,让我们看看本文的重点 -- 测试您的网站是否存在这些问题。

       测试 XSS 漏洞

      多年以来,我一直是一名全职的安全顾问,已经做过无数次的这种测试了。我将好的测试计划归结为两个字:彻底。对于 你我来说,查找这些漏洞与能够有机会在 Bugtraq 或 Vulnwatch 上吹嘘一番没有任何关系;它只与如何出色完成负责的工作有关。如果这意味着对应用程序中所有的单个查询字符串参 数、cookie 值 以及 POST 数据值进行检查,那么这只能表明我们的工作还不算太艰巨。

      显然,一次完整的安全性检查所涉及的 内容通常远远超出寻找 XSS 漏洞那样简单;它需要建立整体的威胁模型,测试溢出漏洞、信息泄漏、错误处理、SQL 注入、身份验证和授权错误。好在执行这样彻底的工作时,各个领域之间都存在重叠。比如,在测试 XSS 漏洞时,经常会同时找出错误处理或信息泄漏问题。

       我假设您属于某个负责对 Web 应用程序进行开发和测试的小组。在这个幸运的位置上,您可以混合使用黑盒和白盒方法。每种方法都有它自己的优点,结合使用时甚至能相互提供支持。

       1.按顺序准备您的工具包

      测试工作也可以是自动化的,但是我们在这里只讨论手动操作。手动测试的必备工具 包括:

      •Paros proxy (http://www.parosproxy.org), 用于截获 HTTP 通信数据

      •Fiddler (http://www.fiddlertool.com/fiddler), 用于截获 HTTP 通信数据

      •Burp proxy (http://www.portswigger.net/proxy/)

       •TamperIE (http://www.bayden.com/dl/TamperIESetup.exe), 用于修改 GET 和 POST

      我们以上至少列出了三种 Web 代理软件。也可以寻找其他不同的类似产品,因为每种产品都有它自己的独到之处。下面,您需要在 Web 浏览器发出 HTTP 请求之前截获这些请求,并修改它们以注入 XSS 测试代码。上面所有这些工具都可以完成这项任务,某些工具还会显示返回的 HTML 源代码(如果您选择了截获服务器响应)。

      截获客户端发出的 GET 和 POST 请求非常重要。这样可以绕过所有的客户端 javascrīpt 输入验证代码。我在这里要提醒所有 Web 开发人员 -- 客户端安全控制是靠不住的。应该总是在服务器端执行有效性验证。

       2.确定站点及其功能 -- 与开发人员和 PM 交流

      绘制一些简单的数据流图表,对站点上的页面及其功能进行描述。此时,可以安排 一些与开发人员和项目经理的会议来建立威胁模型。在会议上尽可能对应用程序进行深入探讨。站点公开了 Web 服务吗?是否有身份验证表单?有留言板吗?有用户设置页面吗?确保列出了所有这些页面。

      3.找出并列出所有由用户提供输入的点

       对站点地图进行进一步细化。我通常会为此创建一个电子表格。对于每个页面,列出所有查询字符串参数、cookie 值、自定义 HTTP 标头、POST 数据值和以其他形式传递的用户输入。不要忘记搜索 Web 服务和类似的 SOAP 请求,并找出所有允许用户输入的字段。

       分别列出每个输入参数,因为下面需要独立测试每个参数。这可能是最重要的一个步骤!如果阅读下面的电子表格,您会看到我已经在示例站点中找出了一大堆这 样的东西。如 forwardURL 和 lang 这样的查询字符串。如 name、password、msgBody、msgTitle 和这样的 POST 数据,甚至某些 Cookie 值。所有这些都是我们感兴趣的重要测试内容。

      4.认真思考并列出测试用例

       使用已经得到的电子表格并列出各种用来测试 XSS 漏洞的方法。我们稍候将讨论各种方法,但是现在先让我们看看我的电子表格的屏幕截图,请注意,我列出了页面上允许的每个值以及每个值的所有测试类型。这种 记录测试的方法仅是我自己的习惯,您可以使用自己的方法。我喜欢记录所有东西,以便我能知道已经做了哪些工作和哪些工作没有做。

      test cases" src="http://www.microsoft.com/technet/images/community/columns/secmvp/mvp_screenshot.JPG" border=0>

      5.开始测试并注意输出结果

      在查找漏洞的过程中,最重要的部分并不是您是否找到了漏洞。 而是您是否真正知道究竟发生了哪些事情。对于 XSS,只需检查 HTML 输出并看看您输入的内容在什么地方。它在一个 HREF 标记中吗?是否在 IFRAME. 标记中?它在 CLSID 标记中吗?在 IMG SRC 中吗?某些 Flash 内容的 PARAM NAME 是怎样的?

       我会检查所有这些情况,如果您对所输入内容的目的十分了解,可以调整您的测试来找出问题。这意味着您可能需要添加一个额外的封闭括号“>”来让某 个标记变得完整,或者添加一个双引号来关闭标记内的一个元素。或者,您可能需要使用 URL 或 HTML 来编码您的字符,例如将双引号变为 %22 或 "。

      6.嗯,并不那么容易,这个站点看来防范比较严密。现在该怎么办呢?

      那么,也许您的简单测试用例 <scrīpt>alert(‘hi’)</scrīpt> 并不能产生期望中的警告对话框。仔细想想这个问题并在可能的情况下与开发人员进行交流。也许他们对输入中的尖括号、单引号或圆括号进行了过滤。也许他们会 过滤“scrīpt”这个词。重新研究为何输入会产生这样的输出,并理解每个值(查询字符串、cookie、POST 数据)的作用。“pageId=10”这样的查询字符串值可能对输出没有影响,因此不值得花费时间测试它。有时,最好试着注入单个字符(例如尖括号、双引 号标记或者圆括号),看看应用程序是否过滤这些字符。然后,便可以知道您面对的过滤级别究竟如何。接着,可以调整测试方法,对这些字符进行编码并重试,或 者寻找其他注入办法。

     改变测试用例

      我恐怕无法充分对此进行说明:研究输入的值会输出什么样的 HTML 页面非常重要。如果它们不能产生输出,那么不要在它们上面浪费时间。如果可以,请进行研究,因为您需要根据输出对测试进行相应的修改。我使用了各种变化形 式来找出能接受和显示脚本代码的参数。因为这涉及太多内容,因此在这里无法一一进行讨论,但是请务必注意以下几种情况:

      1.>"'><scrīpt>alert(‘XSS')</scrīpt>

       2.>%22%27><img%20src%3d%22javascrīpt:alert(%27XSS%27)%22>

       3.>"'><img%20src%3D%26%23x6a;%26%23x61;%26%23x76;%26%23x61;%26%23x73;%26%23x63;%26%23x72;%26%23x69;%26%23x70;%26%23x74;%26%23x3a;alert(%26quot;XSS%26quot;)>

       4.AK%22%20style%3D%22background:url(javascrīpt:alert(%27XSS%27))%22%20OS%22

      5.%22%2Balert(%27XSS%27)%2B%22

      6.<table background="javascrīpt:alert(([code])"></table>

      7.<object type=text/html data="javascrīpt:alert(([code]);"></object>

      8.<body ōnload="javascrīpt:alert(([code])"></body>

      有许多变化形式可以尝试。关键在于了解程序究竟使用何种方式处理输入和显示输出页面。如同这些例子所展示的,常见的变化形式经常是在脚本代码前 面加上 “>””,以尝试封闭网站可能在输出中生成的标记。还可以对代码进行 URL 编码,尝试绕过服务器端的输入过滤功能。此外,因为尖括号“<>”通常会在输入时被过滤和从输出中删除,所以还必须尝试不需要尖括号的 XSS,例如 ”&{alert('XSS')};”

      持久和动态

      找出一个成功的 XSS 颇费周折,因为在开始时 XSS 攻击可能并不是那么显而易见的。随便举一个例子,如果向网站添加一条新留言并在“msgTitle”值中注入代码,在提交数据后,您可能不会立即看到脚本 代码被执行。但是,当您访问留言板的时侯,将会在 HTML 页面中使用“msgTitle”值并将其作为脚本代码执行。这种情况被称作持久性 XSS 攻击,如果包含脚本代码的值将被保存到客户端或者后端系统并在稍候的时间被执行,便会发生此种攻击。

      而与此相对的是动态 XSS 攻击,这种攻击会立即执行并只发生一次。比如,如果某个链接或 GET 请求在某个用来控制页面输出的查询字符串中包含了脚本代码,那么在点击链接后会立即显示输出。

      总结

      XSS 测试通常只是整个 Web 应用程序安全性审查工作的一小部分,但是在执行测试时必须细致和彻底。在多年的工作中,我一直强调使用电子表格或其他方式来记录站点的所有页面,以及每个 页面接受的输入值(查询字符串、cookie、POST 数据、SOAP),这是在测试前必须进行的一个重要步骤。与此同等重要的是,理解输入以及它在输出的 HTML 页面上的呈现方式。如果您知道了应用程序处理输入的方式,就会非常迅速地完成许多工作。不要浪费时间测试那些不会作为输出显示的输入。与开发人员和 PM 进行交流,并在开始测试前建立完善的威胁模型。

      必须细致和彻底。在多年的工作中,我一直强调使用电子表格或其他方式来记录站点的所有页面,以及每个页面接受的输入值(查询字符串、 cookie、POST 数据、SOAP),这是在测试前必须进行的一个重要步骤。与此同等重要的是,理解输入以及它在输出的 HTML 页面上的呈现方式。如果您知道了应用程序处理输入的方式,就会非常迅速地完成许多工作。不要浪费时间测试那些不会作为输出显示的输入。与开发人员和 PM 进行交流,并在开始测试前建立完善的威胁模型。

  • WEB安全测试通常要考虑的测试点

    狙击枪 发布于 2010-06-02 12:49:01

    1、问题:没有被验证的输入

      测 试方法:

      数据类型(字符串,整型,实数,等)

      允许的字符集

      最 小和最大的长度

      是否允许空输入

      参数是否是必须的

      重复是否允许

      数值范围

       特定的值(枚举型)

      特定的模式(正则表达式)

      2、问题:有问题的访问控制

       测试方法:

      主要用于需要验证用户身份以及权限的页面,复制该页面的url地址,关闭该页面以后,查看是否可以直接进入该复制好的地址

       例:从一个页面链到另一个页面的间隙可以看到URL地址

      直接输入该地址,可以看到自己没有权限的页面信息,

      3、 错误的认证和会话管理

      例:对Grid、Label、Tree view类的输入框未作验证,输入的内容会按照html语法解析出来

      4、缓冲区溢出

       没有加密关键数据

      例:view-source:http地址可以查看源代码

      在页面输入密码,页面显示的是 *****, 右键,查看源文件就可以看见刚才输入的密码,

      5、拒绝服务

      分析: 攻击者可以从一个主机产生足够多的流量来耗尽狠多应用程序,最终使程序陷入瘫痪。需要做负载均衡来对付。

      6、不安全的配置管理

       分析:Config中的链接字符串以及用户信息,邮件,数据存储信息都需要加以保护

      程序员应该作的: 配置所有的安全机制,关掉所有不使用的服务,设置角色权限帐号,使用日 志和警报。

      分析:用户使用缓冲区溢出来破坏web应 用程序的栈,通过发送特别编写的代码到web程序中,攻击者可以让web应用程序来执行任意代码。

      7、注入式漏洞

       例:一个验证用户登陆的页面,

      如果使用的sql语句为:

      Select * from table A where username=’’ + username+’’ and pass word …..

      Sql 输入 ‘ or 1=1 ―― 就可以不输入任何password进行攻击

      或者是半角状态下的用户名与密码均为:‘or’‘=’

      8、 不恰当的异常处理

      分析:程序在抛出异常的时候给出了比较详细的内部错误信息,暴露了不应该显示的执行细节,网站存在 潜在漏洞,

      9、不安全的存储

      分析:帐号列表:系统不应该允许用户浏览到网站所有 的帐号,如果必须要一个用户列表,推荐使用某种形式的假名(屏幕名)来指向实际的帐号。

      浏览器缓存:认证和会话数据不应该作为GET的 一部分来发送,应该使用POST,

      10、问题:跨站脚本(XSS)

      分析:攻击者 使用跨站脚本来发送恶意代码给没有发觉的用户,窃取他机器上的任意资料

      测试方法:

      ● HTML标签:<…>…</…>

      ● 转义字符:&(&);<(<);>(>); (空格) ;

      ● 脚本语言:

       <script. language=‘javascript’>

      …Alert(‘’)

       </script>

      ● 特殊字符:‘ ’ < > /

      ● 最小和最大的长度

       ● 是否允许空输入

  • Web安全测试概述

    狙击枪 发布于 2010-06-02 12:51:54

    1. Web应用安全与系统安全

       能取得某个系统的完全使用权是黑客的终极目标,而且这也是危害性最大的漏洞,因此操作系统数据库,底层网络设备,各种系统配置和管理方面的安全是最被重 视的,也是黑客们最为觊觎的。

      Web 应用的漏洞则不然,要想单独通过Web漏洞来获得相关系统的完全使用权是相当困难的。但是Web应用漏洞却是传播性最大的,而且数量最多的,一个有点恶意 的人,都能非常容易的利用Web应用漏洞造成破坏。一个好奇的儿童,一个心怀不满的雇员,都能有意无意利用Web应用漏洞。某公司的调查数据说,超过 70%的攻击其实都是利用了Web应用漏洞。

      简单地说,系统漏洞会带来少而深的攻击,Web漏洞则会带来多而浅的攻击。漏洞的风险通常 都是以广播度×危害度而言,不能简单地看能危害多深。试想一个网站三天两头地被人利用Web漏洞骚扰,造成商业数据丢失,业务中断,声誉受损,不比被人直 接做掉强。因此,Web应用的安全在国外已经相当重视,有专门的组织,公司在专门研究和提供服务。如果对Web安全有兴趣,可以去OWASP和WASC的 网站上找资料。

      2. Web应用漏洞

      现在业界对于Web应用漏洞的总结和分类太 多,不同的公司都会提一套漏洞的列表,还没有形成业界的标准。其中大家对于XSS,SQL Injection都是耳熟能详,但是国内好多人一提Web安全,也只能想到这类注入的漏洞。 如果撇开Web服务器的配置管理其他外围因素,单纯从 Web应用的代码出发,我觉得Web应用的漏洞可以分为四类。代码远程执行漏洞,功能逻辑漏洞,泄密漏洞和日 志漏洞。

      XSS,LDAP injection,SQL Injection等各种Injection,可疑文件上传,缓冲区溢出,这些漏洞全都是因为输入中有代码,而且这些代码通过某些方式在某处以某些权限被 执行。这类漏洞是大家知道最清楚的。

      而功能逻辑漏洞则是指业务流程,认证授权方面的逻辑代码有问题。试想一个普通用户可以看其他用户的 工资,使用管理员的权限。或者一个流程本来要走审批这一个过程,但是居然不审批也行。这都是逻辑代码有问题,产生了安全问题。这类安全问题国内的还不太重 视,但是在OWASP上已经有了相关的文档。

      泄密漏洞是指由于异常没有处理或者其他原因造成了系统信息的泄漏。比如说我就发现过,有程 序员把测试帐号写在网页的注释 或者脚本里。日志漏洞这个就属于比较高级的了,可能很多Web应用本身都不记日志的,但是关键操作一定要保证日志的真实有效。我原来发现过一个系统记录的 日志中的用户帐号居然是来自request里面的隐藏值,换句话说,用户改掉这个值再干操作,就再也无迹可查了。

      3. 业界现状

      安全市场三大产品:防火墙,入侵检测系统和防病毒软件。安全市场三大服务,安全培训,安全评估,系统整 合。上网搜搜Web应用安全,国内基本上没有这个职位。现在国内市场上对Web应用安全的总体重视度不够。有一些大型互联网公司和专做Web应用的公司可 能内部会有一些人在搞这块,安全公司基本上都是系统安全和Web安全混淆的。Web应用安全单独在市场上占的份额还不多。今年奥运会,很多网站在讲安全, 但是是否是注重了Web应用安全,这点很难讲,呵呵。

      在国外,Web应用安全的市场相对成熟了,有不少现成的产品。比较有名的是IBM的APP SCAN,HP的Web Inspect。这两个工具的思想都是在软件开发的生命周期内对Web应用的风险进行控制,核心功能是黑盒漏洞探测。其实原理很简单,就是自动播放很多含 有测试用例的http请求,根据http的响应来提取特征,进行漏洞识别。另外其他有些专门的工具也可以针对某一个漏洞进行测试,例如sql injection,xss等。但是由于原理局限,黑盒测试工具速度快,范围广,但是误报率和漏报率都还比较高。 所以人工测试是必要地补充,而代理工具是Web安全测试中必不可少的一部分。 Webscarab,paros,charles这些代理工具都能让测试人员突破Web UI的限制,去自由地建立测试用例。在自动测试和人工测试的基础上,有一些公司,会专门测试Web应用的漏洞,进而提供相关服务。

      对 Web应用漏洞发现的另外一个思路是源代码审计。通过对代码进行分析,提取特征,发现代码里的风险点。商业化比较好的是fortify。当然人工审计代码 也是可行的。所以国外也有一些小公司,专门提供源代码审计的服务。另外,在最近两年的Web安全会议上,基本上发表的论文也都是关于源代码审计的。我个人 觉得源代码审计应该是个主流趋势。

      在 Web应用部署之后,安全产品就比较少了,我接触过的就只有siteminder和网页防篡改工具了。网页防篡改工具是深受很多人鄙视的,我就不说了。关 于siteminder,我原来在论坛上发帖问过,但是没人回。可能大家都还不了解。Siteminder在国外运用的比较多,通过部署 siteminder,可以对web资源进行细粒度的访问控制,可以认为是基于URL的访问控制,而且他提供单点登录等一些IAM产品的功能。我觉得国内 应该有相关的产品,可能是不够普适,知名度还不大。

      除了产品和服务外,Web软件安全架构的研究也一直都有进展,例如struts的 validator,spring的acegi,owasp的esapi和 anti samy,.NET本身也带有安全特性。很多公司对于输入过滤和权限控制方面也都有自己的代码经验,只不过没有公开而已。

      根据市场风向 一直是国外刮向国内这个规律(严重违反国情的除外),Web应用安全应该是比较有前景的。现在大家都在鼓吹云计算的概念,如果云计算真能普及,估计满世界 都是Web应用了,那么这方面的安全就更有前景了(呵呵,幻想一下)。当然万一Web应用发生了本质性的变革,比如说http协议推倒重来,网络架构推倒 重来,从底层上解决了上层的安全问题,那么……不过我相信这个世界向来都是解决一个老问题之后,会出来很多新问题。

  • WEB安全测试所需的基础知识提纲

    狙击枪 发布于 2010-06-02 12:52:51

     ——说明:下文是从其他地方看到的关于 WEB安全测试所需的基础知识纲 要,大家可以结合本版面的其他WEB安全测试帖子一起学 习

      第一章:B/S架构体系安全渗透测试基础

       1、HTTP协议基本概念

      (1)介绍HTTP标示URL

      (2)HTTP响应状态码

      (3)HTTP 协议传输内容

      2、WEB应用认证基本概念

      (1)HTTP常见认证机制

      (2)BASE64编码介绍

       3、B/S架构常见安全问题

      (1)拒绝服务攻击基础

      (2)Smurf攻击模型

       (3)Fraggle攻击模型

      (4)SynFlooding攻击模型

      (5)碎片攻击

      4、嗅探理论 基础

      (1)网络嗅探原理

      (2)密码嗅探介绍

      (3)协议分析基础介绍

      第 二章:B/S架构体系安全渗透测试攻击基础

      1、B/S架构结构端口扫描分析

       (1)SuperScan工具

      (2)Nmap端口扫描工具

      2、输入验证攻击基础知识

      (1)输入验 证攻击基本概念

      (2)Unicode漏洞介绍

      (3)输入验证二次解码漏洞介绍

      版权声明:本文为51Testing论坛会员ruanyongjie原创。http://bbs.51testing.com

       3、ASP脚本注入基础知识

      (1)ASP脚本注入基本概念

      (2)ASP脚本注入检测

       (3)ASP脚本注入信息获取

      (4)AASP脚本注入提权

      4、PHP脚本注入基础知识

       (1)PHP脚本注入基本概念

      (2)PHP脚本注入检测

      (3)PHP脚本注入信息获取

       (4)PHP脚本注入提权

      5、跨站脚本原理及防御

      (1)跨站脚本基本概念

      (2)跨站脚本实例

       (3)跨站脚本解决方法

      6、Web权限提升分析

      (1)Web权限提升基本概念

       (2)WeBShell上传方法

      (3)Web权限提升7大方法:密码破解、本地提权、Gina木马…

      7、APR嗅探 基础

      (1)APR协议概念

      (2)APR欺骗攻击

      (3) 交换域网络嗅探

      第 三章:B/S架构体系安全渗透测试攻击与测试工具

      1、攻击工具介绍

      (1)注入攻击工具原理

       (2)注入攻击工具分析

      (3)攻击测试平台搭建

      2、注入攻击工具使用练习(ASP+SQL Server注入攻击实战)

      (1)注入攻击工具使用

      (2)域名检查攻击工具使用及域名信息查询用

       3、拒绝服务攻击工具使用练习

      (1)SynFlooding攻击工具测试

      (2)UDPflood攻击工具测试

       (3)畸形DDOS攻击工具

      4、嗅探攻击工具使用练习

      (1)ARP欺骗攻击工具 密码嗅探练习

       (2)嗅探协议分析练习

      5、B/S安全评估工具使用练习

      (1)Web脚本评估工具安装

       (2)B/S架构扫描

      (3)评估报告分析撰写模版

  • 云南丽江、香格里拉7日游攻略(一)

    jx9747 发布于 2010-05-31 14:50:40

    为了记录这次行程同时也带着为大家出行提供帮助的美好愿望,我将如实记录这七天的详细行程以及各种花费。

    51

        五年前因为毕业实习在昆明呆了一个月,那时候班上仅有的几个小丫头每天利用各种休息时间和周末乐颠颠的在昆明周边的各大景点窜来窜去,日子过得简单快乐。所以对那地方总有些莫名的怀念,这次刚好有机会,约了3个朋友就这样又上路了。

    本着节约的原则,身为组织者兼导游的我,为大家订了最早的一趟航班,呵呵虽然大家有些怨声载道,但是当看到机票的价格就是全部收声啦!

    -------------------------------------------------

    广州-昆明 东方航空MU5740 波音737()

    起飞时间:07:55 白云机场

    降落时间:09:55 巫家坝机场

    票价:492.00/每人(20的保险50的机建 50的燃油税)

    -------------------------------------------------

    早晨5点半被手机闹钟叫醒,挣扎着爬了起来,终于在610分成功坐上了去机场的出租车,噢~~~~~从广州出发咯。

    打车从岗顶经武警医院接朋友再到机场,车费:¥135.00

    7点准时到了机场,怀着对米线以及最爱菠萝饭的憧憬,身为老人家的我快步登上了飞机!(*^__^*)

    到达昆明机场后,我们每人花10块钱寄存了背包,轻装上阵,准备甩开膀子大吃一顿!

    1100 从机场打车去金马碧鸡坊。车费:¥17.00

    来这里的主要目的是去当地朋友介绍的建新园吃过桥米线。这可是连昆明本地人都郑重推荐的哦~~~~~

    不过我最喜欢的可是这里的肠旺粉,吼吼,这可是我的最爱呢!

    吃饱喝足了,我们决定从金马坊步行30分钟去翠湖公园游玩(该公园为免费公园)。在公园里消费如下。

               划船1小时:¥40.00

           冰粥1份:¥5.00

           矿泉水4瓶:¥10.00

    恩,怎么说,对这个公园没有特别的推荐,只是觉得里面的冰粥还不错,呵呵风景就一般,但是很喜欢湖边上一大排一大排的垂柳.

    下午1600,为了赶晚上的飞机,又不错过昆明的美食,我们只得离开公园早早打车去祥云美食街吃晚饭。(PS:当年在昆明,我们几乎天天晚上来这里觅食。)呵呵 对于美食直接上图吧。


                      
     草莓甩饼

                                  竹筒虾
                                       荷叶烧肉——好吃的程度,无法形容,我们瞬间扫光了这个菜!
                                 我的最爱——菠萝饭

     这么多美食虽然比起之前价格都涨了,但是按照目前的市场价来看也不贵,详细费用如下。     

    车费:¥14.00

    小吃所有费用:¥90.00

    沙冰:¥12.00

    这可是我们四个人坐车加吃饭的价格哦~~~~

    因为昆明的天气如同三岁娃娃的脸说下雨就下雨,从而导致我们吃晚饭以后520多才打倒车去机场。

    车费:¥23.00

    当晚也是买的特价机票去丽江的。

    --------------------------------------------

    昆明-丽江 东方航空MU5716 波音737() 

    起飞时间 2010-05-01 18:25:00   

    到达时间 2010-05-01 19:15:00

    票价:324/人((20的保险和机建费以及燃油税

    --------------------------------------------------------------------

    当晚入住古城南门的陌上花开青年旅社,150.00/ (标间大床),当时因为是五一标间定完了,只剩下大床房了。

    这家客栈有三只超级可爱的狗狗,两只小黑(不知道为什么主人管他们都叫小黑),但是我叫他们小黑1号和小黑2号。以及怀有身孕的小哈趴狗淘淘。

    我一进门,小黑1号就冲了过来,当时吓了一跳,结果人家只是来嗅嗅我,算是打个招呼。然后又自顾自的玩去了。

    后面几天我天天晚上回来和他们玩,真是爱极了它们,给大家看看他们的照片吧,顺带捎上自己 呵呵。小黑们还会像人一样“咚咚”的敲门哦。

    似乎啰嗦狗狗太多。给大家展示一下我住的房间吧,呵呵因为早上起的太早,当晚我几乎是倒头就睡着了。这一天也就在我的梦中结束了。

    住宿感受:

    这家青旅虽然离四方街比较远,在古城的南门。但是晚上很安静,不像靠酒吧街近的客栈,一晚上都要伴着酒吧的迪斯科音乐入睡。而且早上起来吃早餐也很方便,门口就有小吃店,路边也有卖烤饵块的商贩。烤饵块很好吃哦。加火腿肠3块钱一个,不加就只要2块钱。一出门就有公交车3-8路可以坐,可以去很多地方比如象山市场,如果你想去花马街,往外走3,5分钟坐3路车就能到达,车费通通一块。当然晚上如果你从酒吧街玩到很晚才回来的话打的10块钱(丽江的出租车白天在城区去哪打表基本都只要7块,晚上是10块)。

    不过话说回来,如果您愿意花2,3百元一晚住在古城中的山上,那也是很不错的选择,因为那既安静又能看丽江古城的夜景,晚上推开窗微风轻轻那么一吹,还是很惬意的!!

    温馨提示:昆明的天气很善变,一点要带雨具。其次这里紫外线太强,一定要带高倍防晒霜,墨镜,遮阳帽,最好还能有一条万用头巾。
  • 软件开发方法论:RUP(Rational Unified Process)

    静澜 发布于 2010-06-01 14:30:53

       随着现代信息产业的蓬勃发展,软件开发已经成为一项浩大繁复的工程。就象是建造一座宏伟的宫殿,从计划、设计到施工,每一个环节都必须严格把关,稍有不 慎,整个工程就会失败。据统计,仅在美国,每年就有180,000个信息技术项目,耗资大约$2500亿美元,其中25-30%的项目会流产。由此可见, 由于管理不善和设计上的失误所造成的损失是巨大的。现代软件开发的管理和方法论显得比以往任何时候都更为重要。 

      软件开发的过程由方法论和工具构成(process = methodology + tools)。正如装配电子设备一样,仅有工具就可以胜任装配 任务。但为了减少失误和提高效率,人们往往采用流水线作业,流水线作业便是一种应用于电子设备装配中的方法论。目前,信息技术市场流行的方法论有RUP (Rational Unified Process), The Zachman Framework, XP (Extreme Programming)等。在这些方法论中,最流行的要数RUP。RUP是由Rational Software公司首创的。因它与 当前流行的JAVA, J2EE技术和面向对象的设计思想(OOAD)紧密的结合在一起,所以在大型的信息技术项目中得到了广泛的应用。在这篇文章中,我 们试图对RUP的特点作一个初步的探讨,并且讨论它是如何贯穿在整个软件开发的生命周期之中的。 

      RUP最重要的它有三大特点:1)软件开发是一个叠代过程,2)软件开发是由Use Case驱动的,3)软件开发是以构架设计(Architectural Design)为中心的。 

      按照传统的瀑布(Waterfall)开发模式,软件开发大致经历如下几个步骤:商务需求分析 (Business Requirement Analysis),系统分析(System Analysis),系统设计 (System Design),开发实现(Implementation),测试(Test),发布(Deployment),系统支持 (Supporting)和系统变更管理(Change Management)。 

      传统的瀑布开发模式假定在进行新的开发过程时,上一个过程已经完成,而且不会回到上一个过程。初看起来,这似乎是一个非常合理,高效率的解决方案,但 20多年的实践证明,这个开发模式存在着很大的弊病,原因是软件开发是一个非常复杂的工程,有诸多的因素影响工程的效率和成败。软件开发需要许多不同背景 的个人和团队参与。由于这些复杂性,在软件开发的整个生命周期中每一个阶段都有可能留下隐患和错误。如果等到系统已经开发实现完毕,在测试阶段发现了重大 问题,这时的返工将会造成人力、物力、财力及时间上的巨大浪费。鉴于以上的考虑,RUP强调软件开发是一个叠代模型(Iterative Model), RUP定义了四个阶段(Phase):开端(Inception),阐述(Elaboration),建造(Construction),过渡 (Transition)。其中每个阶段都有可能经历以上所提到的从商务需求分析开始的各个步骤,只是每个步骤的高峰期会发生在相应的阶段。例如开发实现 的高峰期是发生在建造阶段。实际上这样的一个开发方法论是一个二维模型。这种叠代模型的实现在很大程度上提供了及早发现隐患和错误的机会,因此被现代大型 信息技术项目所采用。 

      RUP 的另一大特征是Use Case 驱动。Use Case是RUP方法论中一个非常重要的概念。简单地说,一个Use Case就是系统的一 个功能。例如在一个基于电子商务的医疗系统中,病人可以坐在家里通过网上浏览器与医生约定看病的时间(Makeappointment),这样, “Makeappointment”就是系统的一个Use Case。在系统分析和系统设计中,Use Case被用来将一个复杂的庞大系统分割、定义成 一个个小的单元,这个小的单元就是Use Case,然后以每个小的单元为对象进行开发。按照RUP, Use Case贯穿整个软件开发的生命周期。在 商务需求分析中,客户或用户对Use Case进行描述,在系统分布和系统设计过程中,设计师对Use Case进行分析,在开发实现过程中,开发编程人 员对Use Case进行实现,在测试过程中,测试人员对Use Case进行检验。 

      RUP的第三大特征是它强调软件开发是以构架为中心的。构架设计(Architectural Design)是系统设计的一个重要组成部分。在构架 设计过程中,设计师(Architect)必须完成对技术和运行平台的选取,整个项目的基础框架(Framework)的设计,完成对公共组件的设计,如 审计(Auditing)系统,日志(Log)系统,错误处理(Exception Handling)系统,安全(Security)系统等。设计师必 须对系统的可扩展性(Extensibility),安全性(Security),可维护性(Maintainability),可延拓性 (Scalability),可重用性(Reusability)和运行速度(Performance)提出可行的解决方案。 

      在RUP方法论中,不同的角色可以从不同的侧面来认识同一个项目。RUP定义了“4+1”个场景(View):Use Case场景(Use Case View),逻辑场景(Logic View),进程场景(process View),实现场景(Implementation View)和发布场景(Deployment View)。 在Use Case场景中,客户和商务分析员对Use Case进行描述,在逻辑场景中,设计师对系统进行分析和设计,在进程场景中,设计师对系统可能出 现的并发性,运行速度和分布特性进行描述。实现场景则反映了程序开发员开发实现的过程。发布场景是描述系统管理员和组装人员实施系统发布和管理的过程。值 得强调的是,系统构架的设计是在逻辑场景中描述的。 

      RUP还定义了4个模型,即Use Case模型(Use Case Model),分析模型(Analysis Model),设计模型(Design Model)和实现模型(Implementation Model)。Use Case 模型包含Use Case Diagram和Use Case文档。Use Case模型是其他三个模型的基础,分析模型即是概念模型 (Conceptual Model),是系统分析所得到的结果,分析模型包含了类图(Class Diagram),次序图 (Sequence Diagram)以及活动图(Activity Diagram)。设计模型则是构架设计和系统设计的结果。当设计模型完成后,开发 编程人员便可以进行编程了。设计模型主要包含了类图,次序图和状态图(State Chart Diagrams)。分析模型和设计模型看起来有许多相似 之处,但两者的含义有本质的区别。分析模型强调的是问题的范围,但并不给出解决问题的方案,分析模型并不涉及具体的技术和平台。例如它并不关心是否应用 EJB或一般的JAVA BEANS,系统是安装在WebSphere或是在WebLogic。但是与之相反,设计模型要考虑这些细节,而且要提供解决这 些问题的全部方案。当然设计模型是建立在分析模型之上的,分析模型中的一个类可直接映射成为设计模型中的类,但这种映射关系一般并不是一一对应的,最后一 个模型是实现模型。实现模型包含构件图(Component Diagram),从这个模型出发,开发编程人员可以产生骨架源程序 (Skeleton Source Code),也可以从源程序出发更新设计模型。 

      目前应用于系统分析和设计的工具主要有Rational Rose和Together Software Center(TogetherJ)。 JAVA和J2EE的开发工具有IBM Websphere Application Developer(WSAD),  Borland Jbuilde和WebGain VisualCafe. WSAD和WebSphere Application Server应用 在一起,使得服务器端的排错和系统的发布变得非常的容易。Jbuilder和VisualCafe一般与WebLogic erver紧密结合在一起。目 前WebSphereServer和WebLogic Server占据了Application Server市场的66%,其中 WebSphere Server占据了37%,成为同类产品的No.1。在单位测试和集成测试中,广泛应用的工具和框架有Junit,  JunitPerf和Cactus.。 

      综上所述,软件开发的方法论已经成为现代软件工程过程中不可缺少的一个重要部分。是目前在Java/J2EE和面向对象的大型项目中广泛被采用的一种 方法论。他对整个软件开发的生命周期提供了基础框架和指导。RUP, UML/Rational Rose, Java/J2EE, WSAD,  Websphere Application Server和Oracle这样的技术、工具和平台的组合是目前许多公司、政府信息技术项目中采用的方 案。因此,RUP的知识和经验也是现在求知是场所需求的热门技能。 转自: http://www.killuakun.com/article.asp?id=419
  • 成功测试管理的九大原则

    jerrygu625 发布于 2010-05-28 09:16:58

    简介

      许多测试管理者是从技术部门进到管理阶层的。尽管他们有可能受过很多测试或软件工程的培训和指导,但他们还是很难经常从失败和错误中学到管理技巧。作为一个管理者,你有两项基本工作:找出为你工作的最好 的员工并且建立一个能够使员工完成工作的环境(使他们最好地完成工作)。这篇文章讲述了一些我学过的关于这些管理工作的经验。

      总是那些人――帮助人们最好地完成工作

      1. 为工作雇佣最好的员工

      我遇到许多管理者,他们要雇佣的员工仅仅是他们上一个雇佣的翻版。作为一个测试管理者,你必须对你需要什么人做出评估。假设现在你的部门满是极好的探索型的测试员。如果你还要雇另一个探索型的测试员,也许比你现在的要好,但是他对你的空白领域有作用吗?也许有,也许没有。

      工作的最佳人选也许就是你现在这个小组里所没有的类型。最佳人选或许并不“适合”你通常的工作方式。作为一个测试管理者,雇佣一个最佳的员工要用发展的雇佣策略,面试时要检验他是否符合这个策略。这可以让你找到最适合这份工作的人员,他能够完成必要的工作。

      2. 安排每周与你的每个小组成员在不被打扰的环境进行谈话

      最为一个测试经理,主要工作之一就是定期评定你的组织做了些什么并且是怎样做的。你还要为你的员工做一个报告,关于充分了解他们正在做什么和他们是怎样做的,以此来给做他们正式的和非正式的工作成绩考核。如果你没有了解到每个人的动态你就不应该对你的报告满意。

      我定期地给我的小组成员每周在不被打扰的条件下做一对一的谈话。(当我管理12个员工的时候,我安排在另外一周会见另一些人)。我每周用30分钟来和每个员工谈谈他们的工作:他们工作中的问题或是意见;他们是否需要帮助,他们的表现和他们达到目标的兴奋。我一般安排一周的某天来进行一对一谈话。我事先安排出和每个人的特定时间,接下来我亲自会见他们每个人。如果我们不能把所有需要谈到的细节都包括,我们会安排另外一个时间来继续。

      许多管理者说他们没有时间在一周会见每一个员工来谈他们的工作。据我的经验,如果我不能安排时间和我的员工进行每周的谈话,他们会来打扰我的工作,因为他们无论如何还是必须要来找我。

      如果你安排和你员工的谈话,你必须减少计划外的打扰(既有他们的也有你自己的),并且更多的了解他们在做什么。当你清楚你的小组正在做的,你才能更有效率地帮助他们明确优先应该做的工作,重聚资源,重新计划工程的部分,排除障碍等等。

      3. 假定员工知道如何完成他们的工作的人员

      因为很多管理者起初做的是技术工作,他们知道他们的员工现在从事的工作。他们认为他们现在知道。如果你已经管理了两三年,你也许还没有你的技术员工知道的多,尤其是怎么样完成日常工作。

      你或者你的前任者雇佣你小组的员工。假设你雇佣这些人因为你认为他们能够完成工作,如果你设想每个人都知道如何完成他们的工作,你将得到比假设他们都不知道怎么完成的更好的效果。即使有些员工在无论你设想是否都能成功完成工作,但是有些员工将会被你对他们的想法所影响工作。

      因为我知道我的员工都知道怎样做他们的工作,我给他们分派任务。问他们是否需要帮助,然后留他们独自完成(除非他们寻求帮助)。我的意思并不是你不应该在他们工作的时候和他们说话,你只是不该打扰他。打扰可以分为几种不同的形式:

      · 如果你在不知不觉的情况下来到他身后,来到他的肩膀旁边,问他:“进行的如何了?”,尤其是在他们绞尽脑汁仍不得其解时, 这将仍然不能使你对他们的要求达到。

      · 如果你每天都问,更糟的是每个钟头都问,他们是如何做的。这看起来就像对你员工进行微机管理,很惹人烦。毕竟,你没有工作要做吗?另外, 他们会以为你认为他们不知道该如何完成工作。

      · 如果当他们没有问你意见,你说“我会用这种方法”。这种予以打击的帮助不会有用。

      · 如果你不确定怎样能知道你的员工是否胜任,和每一个小组成员商讨寻求帮助的时机。每个人,包括你自己,应该选择一个规则来知道他或她什么时候成为了一个令人讨厌的家伙了。我的一个客户有一个15分钟法规。如果有人在某方面令人讨厌持续15分钟以上,他就必须停止并且和别人谈谈他的工作。

      当你分配工作时,问问你的员工是否明白该做什么,他或她是否有方法完成。确定工作进程,如果员工遇到麻烦,他应该主动找你寻求帮助,但是如果你坚决干涉,你的员工将会把找你寻求帮助作为最后的解决方法。

    4. 对待你的员工要用他们能接受的方式,而不是你自己可以接受的方式。

      “对待别人要用你愿意接受的方式”(己之不予,勿施于人)——这条黄金法则可能会对许多生活中的纯的社交因素有效,但是并不是总对工作有用。

      有效率的管理者知道他的每一个员工需要怎样的对待方式。当其他的人更乐意接受更多的信息。一些人去需要特定的任务和指示。一些因为解决新的,很棒的,复杂的问题而更有冲劲,但是还有一些只是对他们已经知道如何去处理的问题而感到舒服。

      另外,针对于不同的工作,我们都喜欢不同的认同方式。金钱不是表示认同的唯一方式,你可以用其他的方式来酬劳你的员工。有些人喜欢对他个人的感谢,有人乐意在公众面前的认可,一些喜欢以M﹠M方式,或者是奖励电影票,还有人希望有团队的排队来庆祝。记住无论什么的激励你的方式都不一定能激励你小组的每一个其他成员。和你的小组成员们通过讨论来了解他们每个人对奖励比较喜欢的给予方式。创造一个好的工作环境。

      5. 重视结果而非时间

      许多认可建立在员工完成工作的时间上,而不是他们最后的成绩上。但是,花费在工作上的时间不一定和创造性有必然的联系。如果你真的想改善对创作性和工作效率的认可的话,不妨考虑保证你员工每周只工作40个小时。 我常常听到一种表示对员工的异议就是“你整整一天什么都做不出来。”假设你自己处在一个巨大的障碍前,考虑你可以做什么来解决的时候,你是不是取消了会议?你的小组成员能否井然有序地安排他们的工作以至于能够最大限度发挥创造性?

      当人们每周工作超过40个小时的时候,他们开始在工作的时候关心他们自己的事。他们花钱,他们给很久没有联系的人打电话,因为他们一直都在工作。

      一旦你创造了一个环境,让员工在工作时间完成工作,开始鼓励他们每周不要超过40小时,接着你就可以基于他们在40个小时能够完成的工作量给他们酬劳。我总是发现这样能够提升创造力(因为员工不能在太疲劳的状态下完成工作,这是因为他们在工作时不能关心自己)。

      当你开始注意规律,不仅仅是时间,还包括更容易地给员工的表现给予精确的适度的评价。你的员工是否完成了他们的计划和测试设计?当他们开发测试的时候,他们还要修订那些他们需要的改进的部分?(如果你只是注意有多少测试可以使用,我可以重复地开展相同的测试)计划每周工作40个小时,并且为你要在这段时间完成的工作付报酬。

      6. 承认自己的错误

      每个人都会犯错。他们会因为忘记开会而使客户发怒。承认你犯错是令人尴尬的。我们中的许多人认为对小组承认自己犯错会失去尊严。

      如果你不是经常犯错,你承认错误的时候其实 能够赢得尊敬。如果你忘记一次会议,你为此道歉,其他的人会理解你并且最终原谅你。

      不管你做了什么,不要否认或故意忽略你的失误。故意忽略不会让错误消失这只会让错误成长为怪物。最近,有一个委托人在会上对他的员工大声斥责。会后,他认识到他不应该那样在小组会上那样做。他只是想让他们安心工作,等过几天再道歉。

      我建议在他们对他积累怒气之前,应该用正确的方式和他的员工交谈。他起初不愿意,但是他后来还是温和地在两天后和他的每个员工单独进行了交谈。每个人都是这样对他说的:“我只是在会后才对你感到生气的。如果您能够立即和我谈谈,我就不会把它们积累起来。但是现在已经两天过去了,我仍然对您感到生气,事实上,我还更加恼火,我现在不能确信现在是否能相信您。我不介意你对我们大吼,但是我不能确定是否还会再这样做。

      我的客户不知道应该如何处理这种情况。他认为他的等待是正确的,但是却让问题变得更加严重。他已经决定再也不会犯这样的错误了,而且会立刻和会员工交流。

      他的员工用了好几个月来重新相信他,但是我的这位客户的确通过承认过错而增加了他的个人魅力。现在,他和他的员工对这件事可以当做是玩笑来说。他们说这是他的认知和能力的巨大转折点。

     7. 决定承担一个项目必须首先问你的组员是否有能力完成当你是一个下级的员工。

      你的老板对你说“我们是否可以在下个十月完成项目?”回答说“当然”会令人惊讶。但是,你的员工会因为你回答“我要考虑一下。”而表示赞赏。

      即使你已经在考虑这个问题,告诉了你的员工你们将来做它,你还是应该得到足够的信息来考虑。你应该从这几方面来看:

      · 一段时间内,你也许会因为另一件工作而感到对这个问题迷惑。

      · 也许有你正被其它需要考虑的问题所累,因为你不再有相同的时间像你第一次看到它的时候。

      · 如果你“训练”你的上司让你的回答有漏洞,你的上司会继续给你让你回答他的压力。

      · 当你与你的员工在做决定之前讨论问题时,你应该把这些和他们说一说:

      · 我想知道是什么让你想做这个项目。

      · 我不怕告诉我的上司要怎么处置它。

      在决定做一个项目之前先好好做考虑是一种对你员工的尊重。另外,考虑他们的想法也会使你从他们那里赢得尊重和忠诚。

      8. 计划定期的培训

      作为管理学的一部分,测试是一种挑战和对规则的经常性的改变。因为经常的改变,要制定定期的培训计划。如果你没有基于不断的变化而培训你的员工,你就会有损失。

      培训可以是关于特定项目或者是技术。你可以进行训练用不同的方法:

      · 提供一个简单的午餐,让每个你的每个组员讨论一个特定的领域。这特别对同时要做很多不同项目的小组有用。当每个人做不同的项目,这会有助于每个人了解你小组所有的工程。

      · 做一个对每个部门的阶段说明。无论幸运与否,每个部门都会有和你小组相仿的工作,但是一般来说其它部门都不知道另外的部门在做什么。

      · 如果你们有交叉利益的小组,你可以让两个小组都展现他们各自为公司所作的项目,或者只是针对你的测试小组。

      · 邀请外面的专家来讲一个特定的技术或者一种项目。这些专家或者是专业的顾问,善演讲的人,也或是一个博学的朋友或同事。

      · 如果你买了工具或者已经进行了培训,考虑组织一个内部的“使用者”会议。人们可以在那里分享他们使用这种工具的感受并且讨论它的问题,优点和恶作剧。这特别对有缺陷的追踪系统和构造管理系统有效果。

      9. 计划测试

      作为一个测试经理,你不可能有时间去做所有你想做的事。所以,计划你和你小组能做什么。作为测试经理,首先应该确定自己的任务,是在发布之前找到大的缺陷?还是评估软件的状态?或者是帮助开发经理在发布之前做风险评估?你的任务有可能是其中一项又或者是其中几项结合。无论是怎样,在进入的玩命工作时期之前, 对测试进行计划, 你组里的每个人都要竭尽全力你不需要做所有的事。你不是对所有事都计划而是精简,你就会有时间, 然后你就可以计算出你能再做什么。

      测试的计划是对每个产品或是对各个开发阶段的产品开展测试的策略。测试要多严格?什么测试不用进行?你在测试里要用硬件和软件的那些组合?什么样的组合不能作为彻底的,可能的,在所有的测试里都运用到的。

      测试是一种危险的评估。你和你项目里的其它成员能够进一步做出决定:你乐意对产品的测试部分和非测试部分冒多大的的险?

      一旦你决定要测试什么,对每个产品发展发布标准。发布标准是对每一项发布挑剔的重要性评判的客观的标准。“如果那样将会不错”不是步伐标准。“如果不那样做客户将会置我们于死地”才是发布标准的组成部分。

      如果你计划一个测试并和你的组员一起开展项目, 你不能一直只扮演一个守门人的角色。你无须停止准许运用。你和你的项目小组或者你和项目经理一起制定评判的标准。当你们都通过了这些标准,就可以交货了。加入你们没有达成共识,诚实的,决定你下一步该做什么。我所有做过的项目当中,我们都必须对发布标准达成共识,所以我们为此一直工作.一些客户提出了很苛刻的标准,我们最后也达成了共识。他们更换了文件当中的发布标准,解释他们在项目小组里的位置, 并且支配管理,最后交接工作

  • UNIX 网络性能分析的一些方法和步骤

    Jon 发布于 2009-11-08 16:40:04

    了解 UNIX® 网络布局会帮助您了解自己的网络及其运行方式。但是,当 UNIX 网络性能和传输文件或连接服务的速度突然下降时,究竟发生了什么?如何诊断网络问题并找到网络中出现问题的地方?本文介绍一些快速发现和识别性能问题的方法以及解决问题的步骤。

    简介

    网络的性能对于环境其余部分的性能和可靠性影响很大。如果应用程序和服务等待通过网络传输的数据,或者客户机无法连接它们或接收信息,就需要解决这些问题。

    性能问题还会影响应用程序和环境的可靠性。性能问题可能由网络故障导致,在某些情况下性能问题甚至是网络故障的原因。要想了解和诊断网络问题,首先需要了解问题的性质;问题往往与延时或带宽相关。

    在一般情况下,网络性能问题常常与底层硬件有关;无法突破网络环境的物理限制。所有性能问题还常常与某种协议或系统相关,比如 NFS 或 Web 访问。但是,可以在操作系统中诊断和识别问题,决定正确的纠正措施。

    本文讨论识别性能问题涉及的几个步骤:

    • 确定基线性能水平
    • 判断发生问题的位置
    • 获得统计数据
    • 识别瓶颈

    了解网络指标

    要想了解和诊断性能问题,首先需要确定基线性能水平。首先介绍在判断基线性能时使用的两个重要概念:网络延时和网络带宽。

    网络延时

    网络延时是向目的地发送请求到目的地实际接收到数据包之间的时间间隔。作为网络性能指标,延时增加说明网络繁忙,这意味着要传输的数据包数量超过了传输能力,数据的发送者在传输或重新传输之前必须等待。

    当网络的复杂性以及数据包要经过的主机或网关数量增加时,也会增加网络延时。点之间的线缆长度也会影响延时。对于长距离线路,传统的铜线总是比光纤连接慢。

    网络延时与应用程序延时不同。网络延时只与通过网络传输数据包相关,而应用程序延时是指应用程序接收请求到它做出响应之间的时间间隔。

    网络带宽

    带宽表示在特定的一段时间内可以通过网络传输的数据包数量。带宽影响可以传输的数据量,它把向一个主机传输数据的速度限制为网络连接支持的最大速度,在使用多个并发连接时限制总传输速度。

    从理论上说,网络带宽应该不会变,除非改变网络接口和硬件。影响网络带宽的主要因素是在给定时刻使用网络的主机数量。

    例如,1GB 的以太网接口可以向另一个网络主机传输 1GB 数据,或向 10 个主机同时传输 100MB,或向 100 个主机同时传输 10MB。当然,实际上常常不需要稳定的带宽。在一段时间内会有来自大量主机的许多小请求,服务器的可用带宽看起来可以比客户机带宽的总和大得多。

    获得统计数据

    在判断网络中是否发生问题之前,需要先确定基线性能,然后据此做出假设。为此,必须通过检查各种网络参数(与网络应用程序环境相关的延时、性能和测试)判断性能,然后监视和对比性能随时间的变化。

    应该在可控制的状况下执行基线网络测试。在理想情况下,应该在隔离(没有其他网络通信流)和有典型的网络通信流两种场景中执行测试,这会提供两个基线:

    • 对于隔离监视,应该在网络上没有其他通信流的情况下,检查服务器与一个或多个客户机之间的性能。这意味着要么关闭其他服务,要么把服务器和客户机放在一个隔离的网络环境中,这个环境与标准网络环境完全隔离(但是完全相同)。
    • 对于标准监视,应该把客户机和服务器连接到标准网络,网络上有正常的背景通信流,但是除了要测试的服务器之外,禁用所有与应用程序相关的通信流(比如电子邮件、文件服务、Web 服务)。

    对于实际测试过程,可以使用许多标准工具和测试判断基线值。

    测量延时

    所有网络管理员都很熟悉 ping 工具,使用它作为检查网络设备的可用性和延时的基本工具。在大多数机器上都可以使用 ping,包括客户机和服务器,只要它们已经配置为对 ping 工具发送给设备的 ICMP 数据包做出响应。简单地说,ping 向设备发送一个 echo 数据包,期望设备把数据包的内容发送回来。

    在这个过程中,ping 可以监视发送数据包和接收响应花费的时间,这是测量 echo 过程的响应时间的有效方法。按照最简单的形式,可以向一个主机发送 echo 请求并查明响应时间(见清单 1)。


    清单 1. 使用 ping 判断延时

    需要使用 Control-C 停止 ping 过程。在 Solaris 和 AIX® 上,需要使用 -s 选项发送多个 echo 数据包并获得计时信息。为了获得基线数据,可以使用 -c 选项(在 Linux® 上)指定数量。在 Solaris/AIX 上,可以指定数据包大小(默认大小为 56 字节)和要发送的数据包数量,这样就不必手工终止 ping 过程。然后可以自动地获得计时信息(见清单 2)。


    清单 2. 在 Solaris/AIX 上使用 ping 时指定数据包大小

    				
    $ ping -s example 56 10
    PING example: 56 data bytes
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=0. time=0.143 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=1. time=0.163 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=2. time=0.146 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=3. time=0.134 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=4. time=0.151 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=5. time=0.107 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=6. time=0.142 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=7. time=0.136 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=8. time=0.143 ms
    64 bytes from example.example.pri (192.168.0.2): icmp_seq=9. time=0.103 ms
    
    ----example PING Statistics----
    10 packets transmitted, 10 packets received, 0% packet loss
    round-trip (ms)  min/avg/max/stddev = 0.103/0.137/0.163/0.019
    

    清单 2 中的示例是在网络比较空闲的时候得到的结果。如果在测试期间检查的主机(或网络本身)比较忙,那么 ping 时间会显著增加。只使用 ping 不足以表明是否有问题,但是有时候 ping 可以快速地查明是否有问题需要进一步诊断。

    对 ping 的支持可能会禁用,所以在使用 ping 检查主机是否可用之前应该确认能够访问此主机。

    理想情况下,应该在一段时间内连续地跟踪特定主机之间的 ping 时间,这样就可以得到平均响应时间,然后识别要检查的位置。

    使用 sprayd

    sprayd 守护进程和相关联的 spray 工具向指定的主机发送一个大的数据包流,判断这些数据包中有多少得到了响应。它是一种测量网络性能的方法,不应该把它当作性能指标,因为它使用无连接的传输机制。根据定义,使用无连接传输机制发送的数据包并不保证能够到达目的地,在通信中允许丢失数据包。

    使用 spray 可以查明网络上是否有很多通信流,因为如果无连接传输 (UDP) 丢失许多数据包,就说明网络(或主机)太忙了。

    在 Solaris、AIX 和其他一些 UNIX 平台上可以使用 spray。可能需要启用 spray 守护进程(通常通过 inetd)。启动 sprayd 守护进程之后,可以运行 spray 并指定主机名(见清单 3)。


    清单 3. 使用 spray

    				
    $ spray tiger
    sending 1162 packets of length 86 to tiger ...
            101 packets (8.692%) dropped by tiger
            70 packets/sec, 6078 bytes/sec
    

    正如前面提到的,不应该把速度作为可靠的性能指标,但是丢失的数据包数量是有意义的。

    使用简单的网络传输测试

    判断网络带宽性能的最佳方法是,在与机器收发数据时检查实际的速度。可以使用许多不同的工具执行跨许多应用程序和协议的测试,但是最简单的方法往往是最有效的。

    例如,为了判断在使用 NFS 通过网络传输文件时的网络带宽,可以对一个简单的文件传输过程进行计时。为此,使用 mkfile 创建一个大文件(例如使用 $ mkfile 2g 2gbfile 创建一个 2GB 的文件),然后通过网络把它传输给另一台机器并计算花费的时间(见清单 4)。


    清单 4. 计算通过网络把文件传输给另一台机器花费的时间

    应该多次运行测试,然后求出传输过程的平均时间,从而比较准确地了解性能水平。

    可以使用清单 5 这样的 Perl 脚本自动地执行复制和计时。


    清单 5. 使用 Perl 脚本自动地执行复制和计时

    				
    #!/usr/bin/perl
                   
    use Benchmark; 
    use File::Copy;
    use Data::Dumper;
                     
    my $file = shift or die "Need a file to copy from\n";
    my $srcdir = shift or die "Need a source directory to copy from\n";
    my $count = shift || 10;
                            
    my $t = timeit($count,sub {copy(sprintf("%s/%s",$srcdir,$file),$file)}); 
                     
    printf("Time is %.2fs\n",($t->[0]/$count)); 
    

    在执行脚本时,指定源文件的名称和源目录以及可选的复制次数。然后执行脚本并得到一个时间值(见清单 6)。


    清单 6. 执行 Perl 脚本

    				
    $ ./timexfer.pl 2gbfile /nfs/mysql-live/transient 20
    Time is 28.45s
    

    可以使用这种方法得到基线数据,也可以在正常操作期间检查传输性能。

    诊断问题

    通常,只有在与网络相关的应用程序由于某种原因失败时,您才会去寻找网络问题。但是,一定要确认问题是与网络相关的,而不是其他地方的问题。

    首先,应该尝试使用 ping 连接机器。如果此机器对 ping 请求没有响应,其他网络通信机制也无效,那么首先应该检查物理线缆,确保所有设备仍然连接在一起。

    如果仍然可以连接此机器,但是 ping 时间增加了,就需要判断出问题的位置。ping 时间增加有时候与机器上的负载相关,但更常见的原因是网络出了问题。

    从一台机器得到比较长的 ping 时间之后,应该从网络上(最好在另一台网络交换机上)的另一台机器运行 ping,查明问题是与特定的机器相关,还是与网络相关。

    检查网络统计数据

    如果 ping 时间高于预期,那么应该开始收集关于正在使用的网络接口的一些基本统计数据,查明问题是与这个网络接口相关,还是与某种协议相关。

    在 Linux 上,可以使用 ifconfig 工具获取一些基本网络统计信息(见清单 7)。


    清单 7. 使用 ifconfig 工具获取基本网络统计信息

    				
    $ ifconfig eth1
    eth1      Link encap:Ethernet  HWaddr 00:1a:ee:01:01:c0  
              inet addr:192.168.0.2  Bcast:192.168.3.255  Mask:255.255.252.0
              inet6 addr: fe80::21a:eeff:fe01:1c0/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:7916836 errors:0 dropped:78489 overruns:0 frame.:0
              TX packets:6285476 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:11675092739 (10.8 GiB)  TX bytes:581702020 (554.7 MiB)
              Interrupt:16 Base address:0x2000 
    

    以 RX 和 TX 开头的行很重要,它们提供关于发送和接收的数据包的信息。packets 值是传输的数据包的数量。errors、dropped 和 overruns 值表示出现某种错误的数据包的数量。如果与发送的数据包相比丢失的数据包数量比较高,可能说明网络忙。

    在所有平台上,还可以使用 netstat 工具获得更详细的统计信息。在 Linux 上,此工具提供与协议相关的统计数据,比如 TCP-IP 和 UDP 数据包的传输情况。其中也包含一些基本统计数据(见清单 8)。


    清单 8. 使用 netstat

    				
    $ netstat -s
    Ip:
        8437387 total packets received
        1 with invalid addresses
        0 forwarded
        0 incoming packets discarded
        8437383 incoming packets delivered
        6820934 requests sent out
        6 reassemblies required
        3 packets reassembled ok
    Icmp:
        502 ICMP messages received
        3 input ICMP message failed.
        ICMP input histogram:
            destination unreachable: 410
            echo requests: 82
            echo replies: 10
        1406 ICMP messages sent
        0 ICMP messages failed
        ICMP output histogram:
            destination unreachable: 1313
            echo request: 11
            echo replies: 82
    IcmpMsg:
            InType0: 10
            InType3: 410
            InType8: 82
            OutType0: 82
            OutType3: 1313
            OutType8: 11
    Tcp:
        8361 active connections openings
        6846 passive connection openings
        1 failed connection attempts
        164 connection resets received
        33 connections established
        8305361 segments received
        6688553 segments send out
        640 segments retransmitted
        0 bad segments received.
        676 resets sent
    Udp:
        126083 packets received
        1294 packets to unknown port received.
        0 packet receive errors
        130335 packets sent
    UdpLite:
    TcpExt:
        5 packets pruned from receive queue because of socket buffer overrun
        6792 TCP sockets finished time wait in fast timer
        5681 delayed acks sent
        Quick ack mode was activated 11637 times
        150861 packets directly queued to recvmsg prequeue.
        74333 bytes directly in process context from backlog
        9141882 bytes directly received in process context from prequeue
        3608274 packet headers predicted
        42627 packets header predicted and directly queued to user
        77132 acknowledgments not containing data payload received
        374105 predicted acknowledgments
        2 times recovered from packet loss by selective acknowledgements
        77 congestion windows recovered without slow start after partial ack
        1 TCP data loss events
        17 timeouts after SACK recovery
        2 fast retransmits
        8 retransmits in slow start
        236 other TCP timeouts
        1453 packets collapsed in receive queue due to low socket buffer
        11634 DSACKs sent for old packets
        2 DSACKs sent for out of order packets
        2 DSACKs received
        77 connections reset due to unexpected data
        50 connections aborted due to timeout
        TCPDSACKIgnoredNoUndo: 1
        TCPSackShiftFallback: 23
    IpExt:
        InBcastPkts: 4126
    

    在 Solaris 和其他 UNIX 平台上,netstat 提供的信息因平台而异。例如,在 Solaris 上,会获得针对每个协议的详细统计数据,以及分别针对 IPv4 和 IPv6 连接的信息(见清单 9)。下面的清单给出一部分输出。


    清单 9. 在 Solaris 上使用 netstat

    				
    $ netstat -s
    
    RAWIP   rawipInDatagrams    =   440     rawipInErrors       =     0
            rawipInCksumErrs    =     0     rawipOutDatagrams   =    91
            rawipOutErrors      =     0
    
    UDP     udpInDatagrams      = 15756     udpInErrors         =     0
            udpOutDatagrams     = 16515     udpOutErrors        =     0
    
    TCP     tcpRtoAlgorithm     =     4     tcpRtoMin           =   400
            tcpRtoMax           = 60000     tcpMaxConn          =    -1
            tcpActiveOpens      =  1735     tcpPassiveOpens     =    54
            tcpAttemptFails     =     2     tcpEstabResets      =    35
            tcpCurrEstab        =     2     tcpOutSegs          =13771839
            tcpOutDataSegs      =13975728   tcpOutDataBytes     =1648876686
            tcpRetransSegs      = 90215     tcpRetransBytes     =130340273
            tcpOutAck           =151539     tcpOutAckDelayed    =  5570
            tcpOutUrg           =     0     tcpOutWinUpdate     =    31
            tcpOutWinProbe      =    86     tcpOutControl       =  3750
            tcpOutRsts          =    63     tcpOutFastRetrans   =     6
            tcpInSegs           =7548720
            tcpInAckSegs        =2882026    tcpInAckBytes       =1648874900
            tcpInDupAck         =4413016    tcpInAckUnsent      =     0
            tcpInInorderSegs    =415007     tcpInInorderBytes   =367832646
            tcpInUnorderSegs    =  7650     tcpInUnorderBytes   =10389516
            tcpInDupSegs        =   222     tcpInDupBytes       = 74649
            tcpInPartDupSegs    =     0     tcpInPartDupBytes   =     0
            tcpInPastWinSegs    =     0     tcpInPastWinBytes   =     0
            tcpInWinProbe       =     0     tcpInWinUpdate      =     2
            tcpInClosed         =    33     tcpRttNoUpdate      =   660
            tcpRttUpdate        =2880379    tcpTimRetrans       =  2262
            tcpTimRetransDrop   =    10     tcpTimKeepalive     =   630
            tcpTimKeepaliveProbe=   314     tcpTimKeepaliveDrop =    17
            tcpListenDrop       =     0     tcpListenDropQ0     =     0
            tcpHalfOpenDrop     =     0     tcpOutSackRetrans   = 69348
    ...
    

    在所有情况下,都要寻找比较高的错误数据包、重新传输或丢失数据包传输数量,这些都说明网络忙。如果与传输或接收的数据包相比错误率很高,可能说明网络硬件有问题。

    检查 NFS 统计数据

    在检查与 NFS 连接和大多数其他网络应用程序相关的问题时,首先应该确定这个问题与机器上的问题无关,比如高负载(这会显著影响处理请求的速度)。使用 uptime 和 ps 检查进程,就可以查明机器是否很忙。

    还可以检查 NFS 服务生成的 NFS 统计数据。nfsstat 命令生成关于 NFS 服务的服务器端和客户端的详细统计数据。例如,通过使用 -s 命令行选项并用 -v 选项指定 NFS 版本,可以生成关于 NFS 服务的服务器端的 NFS v3 统计数据(见清单 10)。


    清单 10. 带 -s-v 命令行选项的 nfsstat 命令

    				
    $ nfsstat -s -v3  
    
    Server rpc:
    Connection oriented:
    calls      badcalls   nullrecv   badlen     xdrcall    dupchecks  dupreqs    
    36118      0          0          0          0          410        0          
    Connectionless:
    calls      badcalls   nullrecv   badlen     xdrcall    dupchecks  dupreqs
    75         0          0          0          0          0          0          
    
    Server NFSv3:
    calls     badcalls  
    35847     0         
    Version 3: (35942 calls)
    null        getattr     setattr     lookup      access      readlink
    15 0%       190 0%      83 0%       3555 9%     21222 59%   0 0%        
    read        write       create      mkdir       symlink     mknod       
    9895 27%    300 0%      7 0%        0 0%        0 0%        0 0%        
    remove      rmdir       rename      link        readdir     readdirplus 
    0 0%        0 0%        0 0%        0 0%        37 0%       20 0%       
    fsstat      fsinfo      pathconf    commit      
    521 1%      2 0%        1 0%        94 0%       
    
    Server nfs_acl:
    Version 3: (0 calls)
    null        getacl      setacl      getxattrdir 
    0 0%        0 0%        0 0%        0 0%  
    

    badcalls 值高表示有无效的请求发送给服务器,这说明客户机由于软件问题或硬件故障工作不正常,正在提交无效的请求。

    大型网络中的 ping 时间

    如果可以 ping 通机器,但是网络性能仍然有问题,就需要判断网络中出现性能问题的位置。在大型网络中,路由器把整个网络分隔为多个网段,可以使用 traceroute 工具判断两台机器之间的路由中的某个点是否出了问题。

    traceroute 工具与 ping 工具相关,它通常提供网络数据包传输所经过的每个路由器的 ping 时间。在大型网络中,这有助于缩小问题的位置范围。在 Internet 上使用许多路由器在不同的 Internet Service Providers (ISP) 之间传输数据包,在通过 Internet 发送数据包时,也可以使用 traceroute 识别潜在的问题。

    例如,清单 11 显示英国的两个办公室(它们使用不同的 ISP)之间的 traceroute。在这里,由于故障无法连接目的地机器。


    清单 11. 英国的两个办公室之间的 traceroute

    				
    $ traceroute gendarme.example.com
    traceroute to gendarme.example.com (82.70.138.102), 30 hops max, 40 byte packets
     1  voyager.example.pri (192.168.1.1)  14.998 ms  95.530 ms  4.922 ms
     2  dsl.vispa.net.uk (83.217.160.18)  32.251 ms  95.674 ms  30.742 ms
     3  rt-gw1.tcm.vispa.net.uk (62.24.228.1)  49.178 ms  47.718 ms  123.261 ms
     4  195.50.119.249 (195.50.119.249)  47.036 ms  50.440 ms  143.123 ms
     5  ae-11-11.car1.Manchesteruk1.Level3.net (4.69.133.97)  92.398 ms  137.382 ms  
    52.780 ms
     6  PACKET-EXCH.car1.Manchester1.Level3.net (195.16.169.90)  45.791 ms  140.165 ms  
    35.312 ms
     7  spinoza-ae2-0.hq.zen.net.uk (62.3.80.54)  33.034 ms  39.442 ms  33.253 ms
     8  galileo-fe-3-1-172.hq.zen.net.uk (62.3.80.174)  34.341 ms  33.684 ms  33.703 ms
     9  * * *
    10  * * *
    11  * * *
    12  * * *
    

    在小型网络中,很可能没有分隔网络的路由器,所以 traceroute 不会有任何帮助。ping 和 traceroute 都依靠连接主机来判断问题。

    现在,您已经掌握了处理 UNIX 网络性能问题的基本知识和技术。

    结束语

    很难在一台机器上确定 UNIX 网络性能问题,因为问题可能出现在网络中的任何地方。但是,可以在网络中的多个位置使用 ping 和 traceroute 检查性能,从而缩小问题位置的范围。初步了解了问题之后,可以使用其他网络工具获得关于造成问题的协议或应用程序的详细信息。

    这篇文章不过,本文讨论了获得基线信息的基本方法,然后介绍了用来识别问题的一些工具。 不是单一的从网络来分析linux性能瓶颈,而是结合多种方式和工具去查看工具和指标,综合得出一些结果,然后对结果进行分析,最后得出一些瓶颈及方案。

     

     

  • TCP/IP网络性能测试工具 - Iperf

    belie 发布于 2007-10-12 09:58:46

     

    简介

    Iperf 是一个 TCP/IP 和 UDP/IP 的性能测量工具,能够提供网络吞吐率信息,以及抖动、丢包率、最大段和最大传输单元大小等统计信息,从而能够帮助我们测试网络性能,定位网络瓶颈。其设计 从根本上克服了原来的一些工具,如 ttcp 和 nettest 等的固有的缺陷。

    下载:

    Offical Site: http://dast.nlanr.net/Projects/Iperf2.0/iperf-2.0.2.tar.gz

    安装:

    在指定目录下,按老三步进行:(1)./configure (2)make (3)make install

    功能介绍
    • TCP

    测量网络带宽

    报告MSS/MTU(最大传输单元)值的大小和观测值

    支持TCP窗口值通过套接字缓冲

    当P线程或Win32线程可用时,支持多线程。客户端与服务端支持同时多重连接

    • UDP

    客户端可以创建指定带宽的UDP流

    测量丢包

    测量延迟

    支持多播

    当P线程可用时,支持多线程。客户端与服务端支持同时多重连接(不支持Windows

    • 在适当的地方,选项中可以使用K(kilo-)和M(mega-)。例如131072字节可以用128K代替。
    • 可以指定运行的总时间,甚至可以设置传输的数据总量。
    • 在报告中,为数据选用最合适的单位。
    • 服务器支持多重连接,而不是等待一个单线程测试。
    • 在指定时间间隔重复显示网络带宽,波动和丢包情况。
    • 服务器端可作为后台程序运行。
    • 服务器端可作为Windows 服务运行。 使用典型数据流来测试链接层压缩对于可用带宽的影响。
    参数与说明

    命令行选项 环境变量选项 描述
    客户端与服务器端选项
     -f, --format $IPERF_FORMAT 格式化带宽数输出。支持的格式有: 'b'=bits/sec  'B'=Bytes/sec 
    \)GF1zZxD65703'k'=Kbits/sec 'K'=KBytes/sec 
    (?:Dm1^]eb65703'm'=Mbits/sec 'M'=MBytes/sec 51Testing软件测试网8t&}9O1e'h]b
    'g'=Gbits/sec 'G'=GBytes/sec 51Testing软件测试网:VvHm R H
    'a'=adaptive bits/sec 'A'=adaptive Bytes/sec51Testing软件测试网o l3M.\HM%v
    自适应格式是kilo-和mega-二者之一。除了带宽之外的字段都输出为字     节,除非指定输出的格式,默认的参数是a。 51Testing软件测试网(p5w.T'M [
    注意:在计算字节byte时,Kilo=1024, Mega=1024^2,Giga= 1024^3。通常,在网络中,Kilo=1000, Mega=1000^2, and Giga=1000^3,所以,Iperf也按此来计算比特(位)。
     -i, --interval $IPERF_INTERVAL 设置每次报告之间的时间间隔,单位为秒。如果设置为非零值,就会按照此时间间隔输出测试报告。默认值为零。
     -l, --len $IPERF_LEN 设置读写缓冲区的长度。TCP方式默认为8KB,UDP方式默认为1470字节。
     -m, --print_mss $IPERF_PRINT_MSS 输出TCP MSS值(通过TCP_MAXSEG支持)。MSS值一般比MTU值小40字节。
    -p, --port $IPERF_PORT 设置端口,与服务器端的监听端口一致。默认是5001端口,与ttcp的一样。
    -u, --udp $IPERF_UDP 使用UDP方式而不是TCP方式。参看-b选项。
    -w, --window $TCP_WINDOW_SIZE 设置套接字缓冲区为指定大小。对于TCP方式,此设置为TCP窗口大小。对于UDP方式,此设置为接受UDP数据包的缓冲区大小,限制可以接受数据包的最大值。
    -B, --bind host $IPERF_BIND 绑定到主机的多个地址中的一个。对于客户端来说,这个参数设置了出栈接口。对于服务器端来说,这个参数设置入栈接口。这个参数只用于具有多网络接口的主机。在Iperf的UDP模式下,此参数用于绑定和加入一个多播组。使用范围在224.0.0.0至239.255.255.255的多播地址。参考-T参数。
    -C, --compatibility $IPERF_COMPAT 与低版本的Iperf使用时,可以使用兼容模式。不需要两端同时使用兼容模式,但是强烈推荐两端同时使用兼容模式。某些情况下,使用某些数据流可以引起1.7版本的服务器端崩溃或引起非预期的连接尝试。
    -M, --mss $IPERF_MSS 通过TCP_MAXSEG选项尝试设置TCP最大信息段的值。MSS值的大小通常是TCP/IP头减去40字节。在以太网中,MSS值 为1460字节(MTU1500字节)。许多操作系统不支持此选项。
    -N, --nodelay $IPERF_NODELAY 设置TCP无延迟选项,禁用Nagle's运算法则。通常情况此选项对于交互程序,例如telnet,是禁用的。
    -V   绑定一个IPv6地址 服务端:$ iperf -s –V 51Testing软件测试网P/r+R@e;rD"|2|
    客户端:$ iperf -c <Server IPv6 Address> -V 51Testing软件测试网#{ P{H#H9i-ip6pm
    注意:在1.6.3或更高版本中,指定IPv6地址不需要使用-B参数绑定,在 1.6之前的版本则需要。在大多数操作系统中,将响应IPv4客户端映射的IPv4地址。
    服务器端专用选项
    -s, --server $IPERF_SERVER Iperf服务器模式
    -D   (仅用于Windows)Unix平台下Iperf作为后台守护进程运行。在Win32平台下,Iperf将作为服务运行。
    -R   (仅用于Windows)卸载Iperf服务(如果它在运行)。
    -o  

    (仅用于Windows)重定向输出到指定文件

    -c, --client host $IPERF_CLIENT

    如果Iperf运行在服务器模式,并且用-c参数指定一个主机,那么Iperf将只接受指定主机的连接。此参数不能工作于UDP模式。

    -P, --parallel $IPERF_PARALLEL 服务器关闭之前保持的连接数。默认是0,这意味着永远接受连接。
    客户端专用选项
    -b, --bandwidth $IPERF_BANDWIDTH UDP模式使用的带宽,单位bits/sec。此选项与-u选项相关。默认值是1 Mbit/sec。
    -c, --client host $IPERF_CLIENT 运行Iperf的客户端模式,连接到指定的Iperf服务器端。
    -d, --dualtest $IPERF_DUALTEST 运行双测试模式。这将使服务器端反向连接到客户端,使用-L 参数中指定的端口(或默认使用客户端连接到服务器端的端口)。这些在操作的同时就立即完成了。如果你想要一个交互的测试,请尝试-r参数。
    -n, --num $IPERF_NUM 传送的缓冲器数量。通常情况,Iperf按照10秒钟发送数据。-n参数跨越此限制,按照指定次数发送指定长度的数据,而不论该操作耗费多少时间。参考-l与-t选项。
    -r, --tradeoff $IPERF_TRADEOFF 往复测试模式。当客户端到服务器端的测试结束时,服务器端通过-l选项指定的端口(或默认为客户端连接到服务器端的端口),反向连接至客户端。当客户端连接终止时,反向连接随即开始。如果需要同时进行双向测试,请尝试-d参数。
    -t, --time $IPERF_TIME 设置传输的总时间。Iperf在指定的时间内,重复的发送指定长度的数据包。默认是10秒钟。参考-l与-n选项。
    -L, --listenport $IPERF_LISTENPORT 指定服务端反向连接到客户端时使用的端口。默认使用客户端连接至服务端的端口。
    -P, --parallel $IPERF_PARALLEL 指定服务端反向连接到客户端时使用的端口。默认使用客户端连接至服务端的端口。
    -S, --tos $IPERF_TOS 出栈数据包的服务类型。许多路由器忽略TOS字段。你可以指定这个值,使用以“0x”开始的16进制数,或以“0”开始的8进制数或10进制数。例如,16进制'0x10' = 8进制'020' = 十进制'16'。TOS值1349就是: 
    1d PaV"T9@ y65703IPTOS_LOWDELAY     minimize delay        0x1051Testing软件测试网+`DxWZ'R(i)QG%?!V S
    IPTOS_THROUGHPUT   maximize throughput   0x0851Testing软件测试网%o3dD0W oWR#X
    IPTOS_RELIABILITY  maximize reliability  0x04
    !g"?3@Zf s0l65703IPTOS_LOWCOST      minimize cost       
    -T, --ttl $IPERF_TTL 出栈多播数据包的TTL值。这本质上就是数据通过路由器的跳数。默认是1,链接本地。
    -F   使用特定的数据流测量带宽,例如指定的文件。 $ iperf -c <server address> -F <file-name>
    -I   与-F一样,由标准输入输出文件输入数据。
    杂项
    -h, --help   显示命令行参考并退出 。
    -v, --version   显示版本信息和编译信息并退出。

    举例:

    1)TCP测试51Testing软件测试网 J?s1_O,^`Yo
    服务器执行:./iperf -s -i 1 -w 1M51Testing软件测试网'\4A'CT#yxs
    客户端执行:./iperf -c host   -i  1  -w 1M51Testing软件测试网+Z%jx7B C,A yO*`(D
    其中-w表示TCP window size,host需替换成服务器地址。 51Testing软件测试网%xgQcL
    2)UDP测试
    MwD!i OB:X65703服务器执行:./iperf -u -s
    s#clS*[9u$\$JJ65703客户端执行:./iperf -u -c 10.255.255.251 -b 900M  -i 1  -w 1M  -t 6051Testing软件测试网]jL{w-]0g\
    其中-b表示使用多少带宽,1G的线路你可以使用900M进行测试。


     

  • 用简单命令测试网络性能

    ruanyongjie 发布于 2007-06-27 11:01:49

    用简单命令测试网络性能

      访问某一个网站时,花费了相当长的时间,有时甚至根本就无法访问该网站。这样,许多时间消耗在等待上。那么,有没有办法来节约等待的时间以提高上网的效率呢?
      
      我们知道,之所以访问一个网站需要相当长的等待时间,是因为用户的计算机与所访问网站间的链路出现了交通堵塞、不稳定情况或者故障。如果能够事先知道线路的质量,就可以做到有的放矢,回避不稳定情况所带来的不便,等线路状态重新变好后再访问特定网站。
      
      如何才能知道线路质量的好坏呢?通过以下几个网络测试命令,可以有助于更好地使用和维护网络。
      Ping命令
      利用Ping命令,可以测试一帧数据从一台主机传输到另一台主机所需的时间,从而判断主机的响应时间。该命令的作用,主要是用于检查路由是否能够到达。由于该命令的包长很小,所以在网上传递的速度非常快,可以快速地检测要去的站点是否可到达。一般访问某一站点前,可先运行此命令,以确定该站点是否可以到达。
      如果执行Ping命令不成功,则可以判断故障出现在以下几个方面:网线是否连通、网络适配器配置是否正确、IP地址是否可用等。如果执行Ping成功而网络仍无法使用,则问题很可能出在网络系统的软件配置方面。Ping命令执行成功,只说明当前主机与目的主机间存在一条可连通的物理路径。其使用格式是,在命令提示符下键入 “Ping IP地址或主机名,执行结果为显示响应时间,重复执行这个命令,你可以发现Ping报告的响应时间是不同的。具体的Ping命令后还可跟一些参数,这些参数在键入Ping后回车会得到详细说明。
      例如当访问站点www.google.com.cn时,就可以利用Ping命令来测试目前连接该网站的速度情况。假设运行的系统为Windows 9x,单击开始键,选择运行命令,接着在运行对话框中输入Ping和用户要测试的网址,即为Ping www.google.com.cn,该程序就会向指定的Web网址的主服务器发送一个32字节的消息,而后将服务器的响应时间记录下来。Ping命令将会向用户显示4次测试的结果,响应时间低于300毫秒都被认为是正常的,而时间超过400毫秒时,则认为网络速度较慢。出现请求暂停Request time out)信息,则意味着网址没有在1秒内响应,这表明服务器没有对Ping做出响应或者网址反应极慢。当出现4请求暂停信息,则表示网址拒绝 Ping请求。
      由于过多的Ping命令测试本身容易产生瓶颈,因此许多Web管理员将服务器设定为不接受此类测试。如果网址很忙或者出于其它原因运行速度很慢,如硬件动力不足,数据信道比较狭窄,可过一段时间再试一次,以确定网址是不是确有故障。如果多次测试都存在问题,通常的原因是用户的主机和该网址站点没有联接上,用户应该及时与因特网服务商或网络管理员联系。
     
      Winipcfg命令
      Winipcfg命令的作用,是用于显示用户所在主机内部IP协议的配置信息。Winipcfg程序采用Windows窗口的形式来显示IP协议的具体配置信息。如果 Winipcfg命令后面不跟任何参数直接运行,程序不但可在窗口中显示网络适配器的物理地址、主机的IP地址、子网掩码以及默认网关等,而且还可以查看主机的相关信息如主机名、DNS服务器、节点类型等。
      当试图快速了解某一台主机 IP协议的具体配置情况时,Winipcfg命令是可用的。具体操作步骤如是,在运行对话框中,直接输入Winipcfg命令,回车后出现一个视窗界面。在该界面中,可了解到主机所在计算机所用网卡的类型、网卡的物理地址、主机的IP地址、子网掩码、路由器等。如果用户想更加详细地了解该主机的其他 IP协议配置信息,如DNS服务器、DHCP服务器的信息,可以直接单击该界面中的详细信息按钮。
      
      Tracert命令
      Tracert命令的作用,是判定数据包到达目的主机所经过的路径、显示数据包经过的中继节点清单及到达时间。该命令的使用格式是在DOS命令提示符下,或者直接在运行对话框中键入如下命令:“Tracert 主机IP地址或主机名。执行结果为返回数据包到达目的主机前所经历的中继站清单,并显示到达每个中继站的时间。尽管该功能同Ping命令有点类似,但它所看到的信息要比Ping命令详细得多,它将主机送出的请求包所到达的全部站点、所走的全部路由都显示出来,并且显示出该路由的IP、通过该IP的时延。 Tracert命令后还可跟多个参数,键入Tracert后回车会得到详细的说明。
      
      如果用户想了解自己的计算机与目标主机之间详细的传输路径信息,可以使用Tracert命令进行检测。具体操作步骤如下:在运行对话框中,直接输入“Tracert  www.google.com.cn”命令,单击回车键,可看到一个界面。也可以在MS-DOS方式下,输入“Tracert  www.google.com.cn”命令,也能得同样的结果界面。由此方式,可以详细地显示出连接到目标网站的路径信息,例如中途经过多少次信息中转,每经过一个中转时花费了多长时间等,通过讯息,可以方便地查出用户主机与目标网站之间的线路到底在什么地方出了故障。
      
      netstat命令
      netstat命令可以使用户了解到自己的主机是怎样与Internet相连接的,这有助于用户了解网络的整体使用情况。它可以显示当前正在活动的网络连接的详细信息,如网络连接、路由表和网络接口等信息,也可以让用户得知目前总共有哪些网络连接正在运行。
      可以使用 “netstat/?命令来查看一下该命令的使用格式以及详细的参数说明,该命令的使用格式是,在DOS命令提示符下或者直接在运行对话框中键入如下命令:“netstat[参数],利用该程序提供的参数功能,用户可以了解该命令的其他功能信息,如显示以太网的统计信息、显示所有协议的使用状态等。这些协议包括TCP协议、UDP协议以及IP协议等,另外还可以选择特定的协议并查看其具体使用信息,还能显示所有主机的端口号以及当前主机的详细路由信息。
      例如,如果用户想要了解某城市信息网络中心节点的出口地址、网关地址及主机地址等信息,便可以使用netstat命令进行查询。具体操作方法如下:在运行对话框中,直接输入 netstat命令,单击回车键;也可以在MS-DOS方式下,输入netstat命令。从弹出界面中可以了解到用户所在的主机采用的协议类型、当前主机与远端相连主机的IP地址以及它们之间的连接状态等信息。
      
      以上是几种常用的命令工具,高效实用,比起许多硬件检测工具还省事,而且各种系统都自带,是网管员的贴身助手!

     

  • 《潜伏》在办公室——“余则成”教你职场生存

    fishy 发布于 2009-04-23 18:09:32

      《潜伏》并不是间谍片,而是一部不可多得的职场教程。余则成的经历,有绝对的现实意义,他用亲身体验,教导我们如何在险恶的职场生存。

      而现今的职场,比余则成面临的环境更糟糕,我们都是在狂涛骇浪里潜伏的小人物。

      所以,研究专家“余则成”是怎么说,怎么做的吧。

      1、办公室里只有两种人,主角和龙套。

      在《潜伏》里,每个角色都有个性。只龙套非但没性格而且还专业送死。

      职场上也一样,想要过的轻松,不想往上爬,那就只能做一辈子的龙套。

      作龙套的坏处就是:送死你先去,功劳全没有,裁员先考虑。

      现在的职场绝不是养懒人的地方,你要比别人生存的好,就唯有当主角,让别人去做龙套。

      你不能踩着别人肩膀,就只能做他人垫背。

      2、每个人都要有大志,就算要毁灭世界也可以。

      胸怀大志是做主角的首要条件。

      譬如余则成的信仰,站长的贪钱,马奎和陆桥山要当副站长,李涯为了**事业,这些都是大志,而有理想存在才能为此奋斗。

      在职场上,你若没有一个奋斗目标,就不可能进取的往上爬,到最后只能沦为龙套,成为别人的牺牲品。

      所以不管毁灭世界,还是成为第一首富,你都必须心存志向,以此为目标。

      3、别被理想忽悠,理想是需要的,但不是别人的理想,而是你自己的。

      当提起大志时,有人会想到企业目标,想到企业文化,想到老板慷慨激昂的演说。

      忘了那些吧,老板的理想只是老板的,而职场上,你是独立的。要保持清醒头脑,不能被轻易忽悠。

      《潜伏》里,不管站长还是戴笠,甚至是余则成自己都会提到**的事业。而实际上,他们心里都清楚的很,一切都该以自己为先,自己的大志才是可奋斗的目标。

      不管别人有什么理想,要牢牢记住自己的大志,这才是立命之根本。

      4、如果真的没大志,那就为钱奋斗。

      《潜伏》里,站长说过一句话。每个人都有解甲归田的时候,如果不是为了钱,谁要当这个官呢。

      所以赚钱是人最主要的追求。职场上很危险的局面,就是老板用理想笼络人,想让人不拿钱白干活。

      但真的肯不要钱干活,那你就是没价值的,既然没价值,还有什么存在的必要呢?

      金钱是唯一衡量你价值的东西。你真的一无所求的话,那就为赚钱而奋斗。

      5、你可以不聪明,但不可以不小心。

      《潜伏》里似乎每个人都聪明,其实翠平也很聪明,可为什么她就状况不断,最后还暴露身份。

      就因为她不够小心。

      职场与此一样,你可以不聪明,但不可以不小心。

      不聪明的人,最多笨拙一些,事情做的差一些。而在职场上,这不是很大的罪过。

      但不小心就随时会触犯到别人的利益,犯下得罪人这个职场大忌。

      到那时,穿小鞋都不晓得是为什么穿的。

      管牢嘴,能风花雪月的时候就少议论同事,能说人好话时就别说坏话。

      这就是余则成的生存之道。

      6、你说的每句话,老板都会知道。所以要好好想想该说什么,不该说什么。

      别奢望你私下说的话老板就听不到。老板能知道一切,这是真理。

      就像余则成给左蓝写信,自以为夹在书里没人知道,而实际上,他落下的每个文字,每句话都有人注意。

      在职场上完全相同,只要你不是一个人自言自语,就得担心谈话对象会把话传出去。

      而经验告诉我们,每一句对公司的议论,最后都会传到老板耳朵里。

      所以你跟任何人说话时,都要好好想想,该说什么,不该说什么。

      不该说的绝对不能说,可说可不说的也闭嘴。

      7、偶尔对老板交心是必要的,但要有的放矢。

      余则成和站长关系亦师亦友,可谓是站长的铁杆亲信,两人之间时不时有促膝长谈。

      记住,促膝长谈是种手段,而不是真的让你什么都说。偶尔的交心,说些无关紧要的私己话,能让老板觉着你贴心。

      而事实上,从没一个上司会对你真的交心。

      切忌一热泪盈眶,就把心窝子都交出去。

      被出卖的,永远是交心的那个。

      8、不管什么时候,装傻总是最不易犯错。

      在《潜伏》里,余则成看起来傻傻的。当别人问起一些紧要问题时,都会装傻,罔顾左右而言它。

      这实在是很高明的生存术。

      金庸也曾经说过,他年迈耳背后,该听见的话就能听见,不该听见的话就听不见。

      当有人要你当面表态站队,要你选择事情的方向,不管你怎么选都是错的。

      那么装傻就是最好的选择,这是没选择时最不易犯错的方法。

      别担心装傻的样子很拙劣,即使每个人都看出你在装傻,可他们依旧拿你没办法。

      真正倒霉的是那些明确表态的人,有这些龙套牺牲,怎么也轮不到你。

      9、把自己当成最聪明的人,往往是最笨的。

      在刚开始时,余则成向左蓝隐瞒自己是军统特务,向吕宗芳隐瞒左蓝是激进分子。余则成觉得自己能掌控大局,可实际上,他才是对方棋盘上的棋子。

      左蓝和吕宗芳早就决定把他发展成党员了。

      在职场上,总把自己当最聪明的人,一定是做龙套的命。

      真正聪明的高手,是大智若愚,该精明时精明,不该精明时装傻。

      10、一定要有靠山,但比靠山还可靠的,是让自己有价值。

      余则成向来是有靠山的人,一开始的吕宗芳,后来的站长,甚至是戴笠。正是这些靠山的存在,才让余则成多次转危为安,不引人怀疑。

      但比靠山更重要的,是余则成本身的价值。

      如果没有军统背景,吕宗芳绝不会拉拢他。如果没有立下大功,戴笠也不会青眼相加。如果他不能帮站长弄钱,也不可能获得庇护。

      所以在职场中,和上司们搞好关系是一门必须的功课,为自己找好靠山很重要。

      而比此更重要的,是让自己有足够的价值,以致于每个上司都必须拉拢你。

      11、你是上司的人,上司却不一定是你的人,这层意思一定要明白。

      当一个上司对你说,你是他的人时,心里一定要清楚,上司并不是你的人。

      你是他的,他是他自己的。

      在潜伏里,马奎曾经是毛人凤的侍卫,按说有此大靠山该有恃无恐才对。但马奎一出事情,毛人凤立刻就躲了。

      当你的事情与上司的利益有冲突时,他们会毫不犹豫的出卖你。

      无论何时都要记住,你是你自己的,只有你才能对自己负责。

      别相信上司故作亲近的话,那随时都会是陷阱。

      12、上司说他对你很放心,事实可能正好相反。

      站长经常对余则成说,我对你很放心。可事实上,站长对余则成的试探调查从没停过。

      如果上司真的对你放心,他根本不用经常提及。

      真正的信任,是通过行动表现的。当上司愿意把害人的事情,把职场斗争的事情和你一起做,那才是信任的表现。

      而上司口头说对你放心,则反而要当心了,很可能你做了什么,让上司产生你不忠的怀疑。

      13、站在上司立场上想问题,站在自己立场上办事情。

      当上司相信你,让你做一些事情时,心里必须要有本帐,别傻兮兮的什么都做。

      你要站在上司立场上去考虑问题,了解上司为什么要做,能达到什么目的。然后再以自己的立场抉择,有些做,有些推脱。

      就算是象余则成这样看似对站长忠心耿耿的人,也不是什么都会做的。

      选择符合自己利益的事情去做,不符合利益的想法推搪。

      用做了的事情取悦上司,而不做的事情则让上司知道,你已经完全尽力了。

      14、上司突然垮台,不要惊慌,独自完成任务,然后借此再找到新的靠山。

      《潜伏》里,余则成和吕宗芳被派去南京刺杀叛徒。而吕宗芳突然牺牲,余则成并没有慌张,反而独立完成任务,成为军统大功臣,完成了事业转折。

      在职场里,经常发生上司突然垮台的事情。

      如果你不幸遇见,千万别惊慌,独自完成手上的工作,而且要做的漂亮精彩。

      而这就是你将来安身立命的资本,你可以借此找到新的靠山。

      还是那句话,必须要让自己有价值,这比有人罩着你还重要。

      15、做事做的好,干活干到老。

      余则成并非总是聪明的,他与党组织相比就是弱者。余则成不懂得“做事做的好,干活干到老”这个道理,所以他从一开始做潜伏工作,一直到大陆解放后还必须做下去。

      甚至与翠平生离死别,没有得到个人最佳结局。

      “做事做的好,干活干到老”和“让自己有价值”这两句话间并没有矛盾。

      价值是体现在关键处,是一个至关重要的地方才要突然爆发的。而无关痛痒时,尤其是做些没功劳只有苦劳的活,别做太好。

      永远干得好,就会一直干下去。若让人觉得,你只有做庸碌工作的才能,就算干到累死,你也没有爬上去的那一天。

      16、一定要有缺点。

      在职场,一定要有缺点。即使象余则成这样,也并非完美,他会故意暴露一些缺点给人看,譬如感情,譬如贪财等。

      一个完美而毫无缺点的人,为遭人嫉恨,会被人敬而远之。如果连上司都对你敬而远之,那职场之路就危险了。

      所以聪明人会故意暴露些缺点,尤其是无关痛痒的缺点,让上司以为他能拿捏住你,那才是最安全的境地。

      但缺点绝不可致命,却不能是你真正的短处,只可以是风花雪月时谈起的余兴节目,和人套近乎有余,想以此要挟则没门。

      17、高你半级的人,往往是最危险的,同级的是天然敌人。

      如果已经有一官半职,那对这句一定感同身受。

      象余则成那样,比他高半级的马奎、陆桥山甚至李涯都十分危险,处处拿他当假想敌。

      因为高你半级的人会有危机感,怕你随时都可能与他们平起平坐,所以有机会他们就会打击你。而不管高半级还是一级,都是上司,他们给你穿小鞋就危险万分了。

      而同级的人是必然的敌人,只要你们的上司不是傻瓜,就一定会挑拨手下争斗。

      这是中国五千年来的帝王术,是国粹。

      18、十句里要有九句真话,这样说一句假话才有人信。

      这是《潜伏》里很明显的情景。余则成说话并不总是假的,反倒有九句是真话。正是这样,他才能得到站长的信任,以致于连去台湾都要带着他。

      职场中,九真一假也是最佳法则。一个满嘴跑火车的人是得不到上司信任的,只有忠心耿耿,几乎不说谎的人,才能够在最关键的时刻骗到所有人。

      你要当老实人,老实人才能取信于人,没有别人的信任就没有关键时的谎言。

      说谎只需要在最最关键的时刻,能少说一句就少说一句。

      狼来了的故事,大家都应该听过。

      19、把每个慌话都当成性命攸关,这样说谎就不会内疚。

      职场上很关键的难关,就是怎么过自己心理关口。有些人天生不会说谎,一说谎就内疚。

      这时候,就需要想起你的大志了。当一个人有志向,有理想,有信仰的时候,他就可以做任何事情。

      余则成为了完成任务说过谎,杀过人,也做过很多坏事。这完全因为他有信仰在支撑,所以并不会内疚。

      而你也要记住,每个谎言都可能是性命攸关,如果过不了自己的心,就可能实现不了自己的理想。

      如果这么想了,你还会内疚么?

      20、每个人都站在恶的那一面,因为各人有各人的善。

      最后讲一句关于理想的道理。每个人都有自己的理想,而有利于自己理想的则是善,不利于别人理想的则是恶。

      因人们各有各的立场,有不同的需求。所以在别人眼里,你必然站在恶的那面。

      你永远都是自己的善,别人的恶。

      但怎么样才是真正的大善,怎么样才是大恶呢?

      为实现理想说一句谎,这是恶,但不是大恶。

      而如果你的理想是毁灭世界,那才是大恶。

      譬如你以事业红火,同事幸福为理想,那么就算为这个理想做了坏事,也不过小恶。

      行大善而为小恶,历来被圣人们不齿。

      可圣人自己也这么做。如此的圣人可以从孔子、孟子、王阳明一直排到更近更近。

      儒教里有知行合一的法门,就是要你明白,只要理想大善,便可无所不为。

      然而,你必须真的确信自己的志向是善的。

      就像余则成一样善。
  • IP地址分类

    weiwei911909 发布于 2010-05-12 10:21:54

    下面是一个留给学员的关于设计有效的IP地址,下面是一个比较完善的设计方案,这个方案中,首先把IP地址分成有效可用的IP地址和有效但不可用的IP地址两个等价类;其中有效可用的IP地址中包括IP地址的A,B,C三类地址,有效但不可用的IP地址包括D、E两类IP地址和A、B、C三类地址中的全网地址、广播地址以及回环地址。
    等价类划分  
    有效可用的IP地址
    A类 1.0.0.0 -126.255.255.254
    A私有: 10.0.0.0 -10.255.255.254
    B类 128.0.0.0 -191.255.255.254
    B私有: 172.16.0.0 -172.31.255.254
    C类 192.0.0.0 -223.255.255.254
    C私有: 192.168.0.0-192.168.255.254
    windows自动分配 169.254.0.0-169.254.255.254
    有效但不可用的IP地址
    D 224.0.0.0 -239.255.255.254
    E 240.0.0.0 -255.255.255.254
    全网 0.x.x.x, x.x.x.0
    广播 x.x.x.255
    回环 127.0.0.0 -127.255.255.254

      在有效可用的IP地址中,还应该区别出共有地址和私有地址,在等价类划分的分类中,也给出了相应的范围。下表是根据等价类设计的测试用例,在设计的测试用例中,明确使用了各个等价类。

    测试用例(Windows)   
    输入 结果
    64.11.22.33 有效可用
    10.12.13.14 有效可用,不能直接访问公网
    151.123.234.56 有效可用
    172.20.123.56 有效可用,不能直接访问公网
    192.127.35.65 有效可用
    192.168.128.128 有效可用,不能直接访问公网
    169.254.15.200 有效可用,不能直接访问公网
    224.1.2.3 有效不可用,超过有效范围(D类)
    250.11.22.33 有效不可用,超过有效范围(E类)
    0.200.3.4 有效不可用,全网地址
    64.11.22.0 有效不可用,全网地址
    10.12.13.255 有效不可用,广播地址
    127.50.60.70 有效不可用,回环地址

      由此可以看出,如果要把测试用例设计好,使测试用例具有典型性和代表性,而且无需使用不可能实现的穷举法,首先要求测试设计人员理解IP地址的分类和IP地址的相关知识,否则是无法做好的。也就是说,作为一个测试人员,需要有比较好的阅历和较广泛的知识面。

    以下是查阅的IP地址分类方面的知识:

     

    IP的分类

      1.A类IP地址

      一个A类IP地址由1字节的网络地址和3字节主机地址组成,网络地址的最高位必须是“0”, 地址范围1.0.0.1-126.255.255.254(二进制表示为:00000001 00000000 00000000 00000001 - 01111110 11111111 11111111 11111110)。可用的A类网络有126个,每个网络能容纳16777214个主机。

      2.B类IP地址

      一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是“10”,地址范围128.1.0.1-191.255.255.254(二进制表示为:10000000 00000001 00000000 00000001 - 10111111 11111111 11111111 11111110)。可用的B类网络有16384个,每个网络能容纳65534主机 。

      3.C类IP地址

      一个C类IP地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围192.0.1.1-223.255.255.254(二进制表示为: 11000000 00000000 00000001 00000001 - 11011111 11111111 11111111 11111110)。C类网络可达2097150个,每个网络能容纳254个主机。

      4.D类地址用于多点广播(Multicast)。

      D类IP地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播(Multicast)中。多点广播地址用来一次寻址一组计算机,它标识共享同一协议的一组计算机。

      地址范围224.0.0.1-239.255.255.254。

      5.E类IP地址

      以“1111”开始,为将来使用保留。

      E类地址保留,仅作实验和开发用。

      全零(“0.0.0.0”)地址指任意网络。全“1”的IP地址(“255.255.255.255”)是当前子网的广播地址。

    • 分配IP的机构  

       所有的IP地址都由国际组织NIC(Network Information Center)负责统一分配,目前全世界共有三个这样的网络信息中心

      InterNIC:负责美国及其他地区;

      ENIC:负责欧洲地区;

      APNIC:负责亚太地区。

      我国申请IP地址要通过APNIC,APNIC的总部设在澳大利亚布里斯班。申请时要考虑申请哪一类的IP地址,然后向国内的代理机构提出。

      PS:1998年

      APNIC从原先位于东京的总部搬迁到澳大利亚布里斯班。

    公有IP和私有IP  公有地址(Public address)由Inter NIC(Internet Network Information Center 因特网信息中心)负责。这些IP地址分配给注册并向Inter NIC提出申请的组织机构。通过它直接访问因特网。

      私有地址(Private address)属于非注册地址,专门为组织机构内部使用。

    •   以下列出留用的内部私有地址

      A类 10.0.0.0--10.255.255.255

      B类 172.16.0.0--172.31.255.255

      C类 192.168.0.0--192.168.255.255

    保留IP段  最初设计互联网络时,为了便于寻址以及层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID。同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上工作站,服务器和路由器等)有一个主机ID与其对应。IP地址根据网络ID的不同分为5种类型,A类地址、B类地址、C类地址、D类地址和E类地址。

    • 查找Ip有个cmd命令:tracert 后面加ip地址,可以查所经过的路由!
    • 局域网中的可用IP  

        在一个局域网中,有两个IP地址比较特殊,一个是网络号,一个是广播地址。网络号是用于三层寻址的地址,它代表了整个网络本身,另一个是广播地址,它代表了网络全部的主机。网络号是网段中的第一个地址,广播地址是网段中的最后一个地址,这两个地址是不能配置在计算机主机上的。例如在192.168.0.0 255.255.255.128这样的网段中,网络号是192.168.0.0,广播地址是192.168.0.127。因此,在一个局域网中,能配置在计算机中的地址比网段内的地址要少两个(网络号、广播地址),这些地址称之为主机地址。

    在上面的例子中,主机地址就只有192.168.0.1至192.168.0.126可以配置在计算机上了。

  • rup学习

    mexia 发布于 2008-05-06 15:06:10

    1、CMM重视过程、XP重视个人、RUP重视项目
    2、CMM文档驱动、XP测试驱动(?)、RUP用例驱动
    3、CMM要求准确设计、XP通过重构来设计、RUP要求核心设计
    4、CMM认为人可以替换、XP认为人很重要,难以替换、RUP在中间
    5、CMM不重视剪裁和重构(?)、XP缺乏重构指南、RUP缺乏剪裁指南
  • 挂接(mount)命令的使用方法

    zhouchunyu163 发布于 2010-05-12 15:32:00

      首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用到的。

      命令格式:

    mount [-t vfstype] [-o options] device dir

      其中:

       1.-t vfstype 指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:

      光盘或光盘镜 像:iso9660
      DOS fat16文件系统:msdos
      Windows 9x fat32文件系统:vfat
      Windows NT ntfs文件系统:ntfs
      Mount Windows文件网络共享:smbfs
      UNIX(LINUX) 文件网络共享:nfs

      2.-o options 主要用来描述设备或档案的挂接方式。常用的参数有:

      loop:用 来把一个文件当成硬盘分区挂接上系统
      ro:采用只读方式挂接设备
      rw:采用读写方式挂接设备
      iocharset:指 定访问文件系统所用字符集

      3.device 要挂接(mount)的设备。

      4.dir设备在系统上的挂接点 (mount point)。

      挂接光盘镜像文件

      由于近年来磁盘技术的巨大进步, 新的电脑系统都配备了大容量的磁盘系统,在Windows下许多人都习惯把软件和资料做成光盘镜像文件通过虚拟光驱来使用。这样做有许多好处:

       一、减轻了光驱的磨损;

      二、现在硬盘容量巨大存放几十个光盘镜像文件不成问题,随用随调十分方便;

      三、硬盘的读取 速度要远远高于光 盘的读取速度,CPU占用率大大降低。其实linux系统下制作和使用光盘镜像比Windows系统更方便,不必借用任何第三方软件包。

       1、从光盘制作光盘镜像文件。将光盘放入光驱,执行下面的命令。

    #cp /dev/cdrom /home/sunky/mydisk.iso 或
    #dd if=/dev/cdrom f=/home/sunky/mydisk.iso

       注:执行上面的任何一条命令都可将当前光驱里的光盘制作成光盘镜像文件/home/sunky/mydisk.iso

      2、将文件和目 录制作成光盘镜像文件,执行下面的命令。

    #mkisofs -r -J -V mydisk -o /home/sunky/mydisk.iso /home/sunky/ mydir

       注:这条命令将/home/sunky/mydir目录下所有的目录和文件制作成光盘镜像文件/home/sunky/mydisk.iso,光盘卷标 为:mydisk

      3、光盘镜像文件的挂接(mount)

    #mkdir /mnt/vcdrom

      注:建立一个目录用来作挂接点(mount point)

    #mount -o loop -t iso9660 /home/sunky/mydisk.iso /mnt/vcdrom

      注:使用/mnt/vcdrom就可以访问盘镜像文件mydisk.iso里的所有文件了。

      挂接移动硬盘

      对linux系统而言,USB接口的移动硬盘是当作SCSI设备对待的。插入移动硬盘之前,应先用fdisk  –l 或more /proc/partitions查看系统的硬盘和硬盘分区情况。

    [root at pldyrouter /]# fdisk -l
    Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes
    255 heads, 63 sectors/track, 8924 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Device Boot Start End Blocks Id System
    /dev/sda1 1 4 32098+ de Dell Utility
    /dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
    /dev/sda3 2555 7904 42973875 83 Linux
    /dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
    /dev/sda5 7905 8924 8193118+ 82 Linux swap

      在这里可以清楚地看到系统有一块SCSI硬盘/dev/sda和它的四个磁盘分区/dev/sda1 -- /dev/sda4, /dev/sda5是分区/dev/sda4的逻辑分区。接好移动硬盘后,再用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。

    [root at pldyrouter /]# fdisk -l
    Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes
    255 heads, 63 sectors/track, 8924 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Device Boot Start End Blocks Id System
    /dev/sda1 1 4 32098+ de Dell Utility
    /dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
    /dev/sda3 2555 7904 42973875 83 Linux
    /dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
    /dev/sda5 7905 8924 8193118+ 82 Linux swap
    Disk /dev/sdc: 40.0 GB, 40007761920 bytes
    255 heads, 63 sectors/track, 4864 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Device Boot Start End Blocks Id System
    /dev/sdc1 1 510 4096543+ 7 HPFS/NTFS
    /dev/sdc2 511 4864 34973505 f Win95 Ext'd (LBA)
    /dev/sdc5 511 4864 34973473+ b Win95 FAT32

      大家应该可以发现多了一个SCSI硬盘/dev/sdc和它的两个磁盘分区/dev/sdc1?、/dev/sdc2,其中/dev/sdc5 是 /dev/sdc2分区的逻辑分区。我们可以使用下面的命令挂接/dev/sdc1和/dev/sdc5。

    #mkdir -p /mnt/usbhd1
    #mkdir -p /mnt/usbhd2

      注:建立目录用来作挂接点(mount point)

    #mount -t ntfs /dev/sdc1 /mnt/usbhd1
    #mount -t vfat /dev/sdc5 /mnt/usbhd2

      注:对ntfs格式的磁盘分区应使用-t ntfs 参数,对fat32格式的磁盘分区应使用-t vfat参数。若汉字文件名显示为乱码或不显示,可以使用下面的命令格式。

    #mount -t ntfs -o iocharset=cp936 /dev/sdc1 /mnt/usbhd1
    #mount -t vfat -o iocharset=cp936 /dev/sdc5 /mnt/usbhd2

      linux系统下使用fdisk分区命令和mkfs文件系统创建命令可以将移动硬盘的分区制作成linux系统所特有的ext2、ext3格 式。这样,在linux下使用就更方便了。使用下面的命令直接挂接即可。

    #mount /dev/sdc1 /mnt/usbhd1

      挂接U盘

      和USB接口的移动硬盘一样对linux系统而言U盘也是当作SCSI设备对待的。使用方法和移动硬盘完全一样。插入U盘之前,应先用 fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。

    [root at pldyrouter root]# fdisk -l
    Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes
    255 heads, 63 sectors/track, 8924 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Device Boot Start End Blocks Id System
    /dev/sda1 1 4 32098+ de Dell Utility
    /dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
    /dev/sda3 2555 7904 42973875 83 Linux
    /dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
    /dev/sda5 7905 8924 8193118+ 82 Linux swap

      插入U盘后,再用fdisk –l 或 more /proc/partitions查看系统的硬盘和硬盘分区情况。

    [root at pldyrouter root]# fdisk -l
    Disk /dev/sda: 73 dot 4 GB, 73407820800 bytes
    255 heads, 63 sectors/track, 8924 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Device Boot Start End Blocks Id System
    /dev/sda1 1 4 32098+ de Dell Utility
    /dev/sda2 * 5 2554 20482875 7 HPFS/NTFS
    /dev/sda3 2555 7904 42973875 83 Linux
    /dev/sda4 7905 8924 8193150 f Win95 Ext'd (LBA)
    /dev/sda5 7905 8924 8193118+ 82 Linux swap
    Disk /dev/sdd: 131 MB, 131072000 bytes
    9 heads, 32 sectors/track, 888 cylinders
    Units = cylinders of 288 * 512 = 147456 bytes
    Device Boot Start End Blocks Id System
    /dev/sdd1 * 1 889 127983+ b Win95 FAT32
    Partition 1 has different physical/logical endings:
    phys=(1000, 8, 32) logical=(888, 7, 31)

      系统多了一个SCSI硬盘/dev/sdd和一个磁盘分区/dev/sdd1,/dev/sdd1就是我们要挂接的U盘。

    #mkdir -p /mnt/usb

      注:建立一个目录用来作挂接点(mount point)

    #mount -t vfat /dev/sdd1 /mnt/usb

      注:现在可以通过/mnt/usb来访问U盘了, 若汉字文件名显示为乱码或不显示,可以使用下面的命令。

    #mount -t vfat -o iocharset=cp936 /dev/sdd1 /mnt/usb

      挂接Windows文件共享

      Windows网络共享的核心是SMB/CIFS,在linux下要挂接(mount)windows的磁盘共享,就必须安装和使用samba 软件包。 现在流行的linux发行版绝大多数已经包含了samba软件包,如果安装linux系统时未安装samba请首先安装samba。当然也可以到www.samba.org网站下载......新的版本是3.0.10版。

      当windows系统共享设置好以后,就可以在linux客户端挂接(mount)了,具体操作如下:

    # mkdir –p /mnt/samba

      注:建立一个目录用来作挂接点(mount point)

    # mount -t smbfs -o username=administrator,password=pldy123 //10.140.133.23/c$ /mnt/samba

      注:administrator 和 pldy123 是ip地址为10.140.133.23 windows计算机的一个用户名和密码,c$是这台计算机的一个磁盘共享

      如此就可以在linux系统上通过/mnt/samba来访问windows系统磁盘上的文件了。以上操作在redhat as server 3、redflag server 4.1、suse server 9以及windows NT 4.0、windows 2000、windows xp、windows 2003环境下测试通过。

      挂接UNIX系统NFS文件共享

      类似于windows的网络共享,UNIX(Linux)系统也有自己的网络共享,那就是NFS(网络文件系统),下面我们就以SUN Solaris2.8和REDHAT as server 3 为例简单介绍一下在linux下如何mount nfs网络共享。

      在linux客户端挂接(mount)NFS磁盘共享之前,必须先配置好NFS服务端。

      1、Solaris系统NFS服务端配置方法如下:

      (1)修改 /etc/dfs/dfstab, 增加共享目录

    share -F nfs -o rw /export/home/sunky

      (2)启动nfs服务

    # /etc/init.d/nfs.server start

      (3)NFS服务启动以后,也可以使用下面的命令增加新的共享

    # share /export/home/sunky1
    # share /export/home/sunky2

      注:/export/home/sunky和/export/home/sunky1是准备共享的目录

      2、linux系统NFS服务端配置方法如下:

      (1)修改 /etc/exports,增加共享目录

    /export/home/sunky 10.140.133.23(rw)
    /export/home/sunky1 *(rw)
    /export/home/sunky2 linux-client(rw)

      注:/export/home/目录下的sunky、sunky1、sunky2是准备共享的目录,10.140.133.23、*、 linux- client是被允许挂接此共享linux客户机的IP地址或主机名。如果要使用主机名linux-client必须在服务端主机/etc/hosts文 件里增加linux-client主机ip定义。格式如下:

    10.140.133.23 linux-client

      (2)启动与停止NFS服务

      /etc/rc.d/init.d/portmap start (在REDHAT中PORTMAP是默认启动的)

      /etc/rc.d/init.d/nfs start 启动NFS服务

      /etc/rc.d/init.d/nfs stop 停止NFS服务

      注:若修改/etc/export文件增加新的共享,应先停止NFS服务,再启动NFS服务方能使新增加的共享起作用。使用命令 exportfs -rv也可以达到同样的效果。

      3、linux客户端挂接(mount)其他linux系统或UNIX系统的NFS共享

    # mkdir –p /mnt/nfs

      注:建立一个目录用来作挂接点(mount point)

    #mount -t nfs -o rw 10.140.133.9:/export/home/sunky /mnt/nfs

      注:这里我们假设10.140.133.9是NFS服务端的主机IP地址,当然这里也可以使用主机名,但必须在本机/etc/hosts文件里 增加服务端ip定义。/export/home/sunky为服务端共享的目录。

      如此就可以在linux客户端通过/mnt/nfs来访问其它linux系统或UNIX系统以NFS方式共享出来的文件了。以上操作在 redhat as server 3、redflag server4.1、suse server 9以及Solaris 7、Solaris 8、Solaris 9 for x86&sparc环境下测试通过。

      另简单用法:

      简单用法:

    • fat32的分区

    mount -o codepage=936,iocharset=cp936 /dev/hda7 /mnt/cdrom (mount -t vfat -o iocharset=cp936 /dev/hda7 /mnt/cdrom)
    • ntfs的分区

    mount -o iocharset=cp936 /dev/hda7 /mnt/cdrom
    • iso文件

    mount -o loop /abc.iso /mnt/cdrom
    • 软盘

    mount /dev/fd0 /mnt/floppy
    • USB闪存

    mount /dev/sda1 /mnt/cdrom

      说明: /mnt/cdrom 目录必须存在,所有/etc/fstab内容 mount -a 可以指定文件格式"-t 格式", 格式可以为vfat, ext2, ext3等。

      镜像文件:

      mount fileName mountPoint -o loop,fileName是镜像文件名(*.iso,*.img),其它的不用说了,跟上面一样。用例:如我有一个a.iso光盘镜像文件,mount a.iso a -o loop,这样进入目录a你就能浏览a.iso的内容了,*.img文件的用法一样。

      显示中文方面,如果是fedora core 1 的话,用utf8更好

    mount -o iocharset=uft8 /dev/hda1 /mnt/c
    mount -o iocharset=uft8 /dev/sda1 /mnt/usb
    mount -t smbfs //ip_addr/share/dir /mnt/smb/share -o iocharset=uft8,username=name, password=passwd

      开机就mount上windows下的分区

      自动将windows的d盘挂到/mnt/d上,用vi打开/etc/fstab,加入以下一行

    /dev/hda5 /mnt/d vfat defaults,codepage=936,iocharset=cp936 0 0

      注意,先得手工建立一个/mnt/d目录

      mount局域网上其他windows机器共享出的目录(bjchenxu)

    mount -t smbfs -o username=guest,password=guest //machine/path /mnt/cdrom
  • JUNIT STUDY

    yaya_free 发布于 2008-10-05 11:28:54

    1. JUnit入門
      http://www.dotspace.twmail.org/Test/JUnit_Primer.htm
    2. 怎样使用Junit Framework进行单元测试的编写
      http://www.chinaunix.net/bbsjh/14/546.html
    3. Ant+Junit+Log4J+CVS进行XP模式开发的建立
      http://ejb.cn/modules/tutorials/printpage.php?tid=4
    4. 用HttpUnit测试Web应用程序
      http://www.zdnet.com.cn/developer/code/story/0,2000081534,39033726,00.htm
    5. 有没有用过Cactus的,Web层的测试是Cactus还是JUnit?
      http://www.jdon.com/jive/thread.jsp?forum=16&thread=9156
    6. Ant+junit的测试自动化 biggie(原作)
      http://www.csdn.net/Develop/article/19%5C19748.shtm
    7. JUnit实施
      http://www.neweasier.com/article/2002-08-07/1028723459.html
    8. JUnitTest Infected: Programmers Love Writing Tests
      http://junit.sourceforge.net/doc/testinfected/testing.htm
    9. JUnit Cookbook
      http://junit.sourceforge.net/doc/cookbook/cookbook.htm
    10. JUnit Primer
      http://www.itu.dk/~lthorup/JUnitPrimer.html
    11. IBM DevelopWorks
      http://www-106.ibm.com/search/searchResults.jsp?query=junit&searchScope=dW&searchType=1&searchSite=dWChina&pageLang=zh&langEncoding=gb2312&Search.x=0&Search.y=0&Search=Search
  • eclipse下junit快速上手

    jackz 发布于 2007-05-29 10:12:41

    step1:

    右键点击java文件A--->new-->junit test case,即可产生一个test case,默认会将A中的非私有方法前都加上test

    step2:

    编写该case,下面是个简单的例子:

    public class AirTest extends TestCase {
        private  Air air;
     /*
      * @see TestCase#setUp()
      */
     protected void setUp() throws Exception {
     
       air = new Air();
     }

     /*
      * @see TestCase#tearDown()
      */
     protected void tearDown() throws Exception {
     
     }

     /*
      * Class under test for double h(double, double)
      */
     public void testH() {
      double result=air.h(0,400);
      assertEquals(400.07,result,400.07*0.01);
     }

     /*
      * Class under test for double cp(double, double)
      */
     public void testCp() {
      double result=air.cp(0,400);
      assertEquals(1.0161,result,1.0161*0.01);
     }

     /*
      * Class under test for double cv(double, double)
      */
     public void testCv() {
      double result=air.cv(0,400);
      assertEquals(0.7291,result,0.7291*0.01);
     }

    }

    很明显,我写了个Air类,有3个函数,分别计算定压比热、焓和定容比热,AirTest 就是来测试这三个函数,注意每个函数内部的assertEquals,参数1时预定的值,参数2是程序算出的值,参数3是允许的误差范围

    step3

    点击Run...按纽----》选择junit--》点击new---》运行就会弹出junit的结果窗口,显示运行结果

    后记:

    完全可以将junit任务集成到ant中,在ant加如下片段即可

    <!-- 测试 -->
     <target name="test" depends="compile" descrīption="run junit test">
      <mkdir dir="${report.dir}" />
      <junit printsummary="on" haltonfailure="false" failureproperty="tests.failed" showoutput="true">
       <classpath refid="master-classpath" />
       <formatter type="xml" />
       <batchtest todir="${report.dir}">
        <fileset dir="${classes.dir}">
         <include name="test/**" />
        </fileset>
       </batchtest>
      </junit>
      <fail if="tests.failed">
    ***********************************************************
    **** One or more tests failed! Check the output ... ****
    ***********************************************************
    </fail>
     </target>

    运行ant即可完成测试,但里面有个恼人的问题,就是ant居然不认junit这个任务,看看ant home 里面确实有ant--junit.jar,就算再将junit.jar放在该目录也不行!郁闷,但可以通过下面的方法解决:window-->preferences-->ant-->runtime-->classpath,到入junit.jar即可,很奇怪的是classpath中ant-junit.jar真不知道是干嘛的,非要放入junit.jar才行

  • JUnit入门

    jackz 发布于 2007-05-29 10:15:52

    一、简介

    JUnit是一个开源的java单元测试框架。在1997年,由 Erich Gamma Kent Beck 开发完成。这两个牛人中 Erich Gamma GOF 之一;Kent Beck 则在 XP 中有重要的贡献(你觉得眼熟一点都不奇怪)。

           正如常言道:麻雀虽小,五脏俱全。” JUnit设计的非常小巧,但是功能却非常强大。

           下面是JUnit一些特性的总结:

    1)         提供的API可以让你写出测试结果明确的可重用单元测试用例

    2)       提供了三种方式来显示你的测试结果,而且还可以扩展

    3)       提供了单元测试用例成批运行的功能

    4)       超轻量级而且使用简单,没有商业性的欺骗和无用的向导

    5)       整个框架设计良好,易扩展

    对不同性质的被测对象,如ClassJspServletEjb等,Junit有不同的使用技巧。由于本文的性质,以下仅以Class测试为例。

    下面我们就叩开JUnit的大门吧!

     

    二、下载

    点击http://www.junit.org可以下载到最新版本的JUnit,本文使用的为3.8.1版。至于安装或者配置之类,你只需要轻松的将下载下来的压缩包中的jar文件,放到你工程的classpath中就可以了。

    这样,你的系统中就可以使用JUnit编写单元测试代码了(是不是很简单)!

     

    三、HelloWorld

    记得在几乎每本语言教学书上都能找到HelloWorld这个入门代码。今天在这里,我们也从一个简单到根本不用单元测试的例子入手。这是一个只会做两数加减的超级简单的计算器(小学一年级必备极品)。代码如下:

    public class SampleCalculator

    {

           public int add(int augend , int addend)

           {

                  return augend + addend ;

           }     

          

           public int subtration(int minuend , int subtrahend)

           {     

                  return minuend - subtrahend ;

           }

    }

    将上面的代码编译通过。下面就是我为上面程序写的一个单元测试用例:

    //请注意这个程序里面类名和方法名的特征

    public class TestSample extends TestCase

    {

           public void testAdd()

           {     

    SampleCalculator calculator = new SampleCalculator();   

                  int result = calculator.add(50 , 20);

                  assertEquals(70 , result);

           }

           public void testSubtration()

           {

                  SampleCalculator calculator = new SampleCalculator();

                  int result = calculator.subtration(50 , 20);

                  assertEquals(30 , result);

           }

    }

           好了,在DOS命令行里面输入javac -classpath .;junit.jar TestSample.java 将测试类编译通过。然后再输入 java -classpath .;junit.jar junit.swingui.TestRunner TestSample 运行测试类,你会看到如下的窗口。

     

     

    上图中,绿色说明单元测试通过,没有错误产生;如果是红色的,则就是说测试失败了。这样一个简单的单元测试就完成了,是不是很容易啊?

           按照框架规定:编写的所有测试类,必须继承自junit.framework.TestCase类;里面的测试方法,命名应该以Test开头,必须是public void 而且不能有参数;而且为了测试查错方便,尽量一个TestXXX方法对一个功能单一的方法进行测试;使用assertEqualsjunit.framework.TestCase中的断言方法来判断测试结果正确与否。

           你可以对比着上面测试类中的实现来体会下规定——很简单!而且你在这个测试类中有加入多少个测试方法,就会运行多少个测试方法。

     

    四、向前一步

    学完了HelloWorld,你已经可以编写标准的单元测试用例了。但是还有一些细节,这里还要说明一下。不要急,很快的!

    你在看上面的代码的时候,是不是注意到每个TestXXX方法中都有一条SampleCalculator初始化语句?这很明显不符合编码规范。你可能正要将它提取出来放到构造函数里面去。且慢!在JUnit中的初始化是建议在Setup方法中作的。JUnit提供了一对方法,一个在运行测试方法前初始化一些必备条件而另一个就是测试完毕后去掉初始化的条件(见下图)。


           另外你是否注意到,上面弹出窗口的一个细节,在绿条下面有ErrorsFailures统计。这两者有何区别呢?

           Failures作为单元测试所期望发生的错误,它预示你的代码有bug,不过也可能是你的单元测试代码有逻辑错误(注意是逻辑错误)。Errors不是你所期待的,发生了Error你可以按照下面的顺序来检查:

           检查测试所需的环境,如:数据库连接

           检查单元测试代码

           检查你的系统代码

     

    五、成批运行test case

    这是前面提到的JUnit特性之一。它方便于系统单元测试的成批运行。使用起来也是非常简单,先看下使用代码:

    import junit.framework.Test;

    import junit.framework.TestSuite;

    public class TestAll{

        public static Test suite(){

            TestSuite suite = new TestSuite("TestSuite Test");

            suite.addTestSuite( TestSample.class);

            return suite;

        }

    }

           这个测试程序的编译、运行,和上面TestSample的方式是一样的。

    javac -classpath .;junit.jar TestAll.java

    java -classpath .;junit.jar junit.swingui.TestRunner TestAll

    怎么样?这样你在suite方法里面添加几个TestCase就会运行几个,而且它也可以添加TestSuite来将小一点的集合加入大的集合中来,方便了对于不断增加的TestCase的管理和维护

    呵呵,你觉得suite方法的作用是不是于java应用程序的main很类似?并且这里的suite必须严格遵守上面的写法!

     

    六、TestRunner

    JUnit中已经给出了三种方式表示的TestRunner。你可以分别运行体验下他们的不同。

    junit.swingui.TestRunner

    junit.awtui.TestRunner

    junit.textui.TestRunner

     

    七、总结

    本文轻松简要的介绍了JUnit使用的入门知识。完全没有涉及到深入的技巧和使用规范。而这些请关注我关于JUnit高级使用、JUnit源代码分析的文章。

  • 测试架构师必须具备的第二个能力:“区分测试重点和测试难点”

    架构师Jack 发布于 2009-10-14 01:02:34

       重点和难点两个词汇有时能代表同样的方向,有时却是相差较远的方向。

    为什么我要把是否有能力区分测试重点和测试难点作为测试架构师必备的第二个基本能力。因为,我曾在某产品线对测试活动的质量进行抽查时,与每个产品的系统测试工程师进行了沟通,发现只有一名有6年经验的系统测试工程师在我的的启发下,分清了自己所负责产品的测试重点和测试难点。而其他的系统测试工程师一直都把测试难点误当成了测试重点,作为他技术攻关工作的主力方向。甚至从来没有真正思考过什么测试技术才是自己所负责产品决定成败的测试重点,只是简单地把自己在工作中碰到的所不具有的测试技术都当成测试重点,其实很多都只是测试难点。的确,在某些产品测试难点和测试重点刚好重合。虽然某些产品测试重点在技术上并不难,但是却需要我们把测试重点部分的工作质量做到最佳,时间和资源投入最多,而不要把有限的资源投入到测试难点的工作中去。我很认同华为任正非对华为工程师的要求“要做工程商人”,我们其他公司的工程师同样应该以商业目标为自己的技术工作目标,不应唯技术论,越新的技术,越难的技术就越愿意投入。测试工程师同样要心中一直有一个目标指引着自己的所有技术工作方向。这个目标就是我测试架构师日记中第一篇谈到的“准确的商业理解力”告诉你的工作目标。

    由于项目中每个人的分工不同,因此不可能每个测试人员一开始就能知道自己工作的商业目标是什么,所以也不用去责怪大家。可是领导产品的测试架构师不能准确的识别或培养其他测试工程师具备识别测试重点和测试难点的能力,那么注定这个测试团队的工作不但质量保障会打折扣,而且会浪费不少组织的资源和成本。

    因为资源和时间是有限的,而完美工作的追求是无限的。因此,我们如何在有限的资源和时间下,保障基本的质量目标,并尽可能提升质量目标。就需要在分清测试重点后,优先针对测试重点目标进行系统地测试技术研究,测试技术攻关,测试资源主要投入。对于非测试重点的测试难点部分就要降低优先级,放在最后考虑。

    测试架构师的工作应该牢牢抓住真正的测试重点来开展,甚至在整个产品测试组都方向错误时,要能从商业角度帮助测试组改变观点。那么当从测试经理到普通工程师都误理解了测试重点时,测试架构师应该如何来启发他们呢?我这里就分享一个案例吧:

      在一次到产品测试组进行测试活动质量抽检时。我们问测试经理,你们产品测试目前最大的需求是什么?他说是如何进行压力测试和性能测试,希望我们测试架构师团队能在此领域多给予支持。我心里知道:他所负责的产品特性核心不是性能和压力测试,但我没有反驳他。而是继续问他下一个问题:“你觉得会让你产品未来应用时商业失败的最大担心是什么?”他想了想说:“不能对客户的生产系统产生破坏,让客户的业务中断。”“依据我们的经验,与客户生产系统交互的模块虽然是个小模块,但是在其他产品上经常出现内存泄露的故障从而破坏了生产系统。那你针对该小模块做过哪些系统地测试?有无专门进行内存泄露的测试,因为内存泄露对客户生产系统的破坏最大。”我问到。这时此测试经理才恍然大悟,这个对生产系统质量影响最大的小模块居然没有系统地进行过深入全面的测试。我这时告诉他“你之所以开始说性能和压力测试是你的重点需求,是因为你们组里没有在性能和压力测试方面的积累,有工作开展的难处,这是困扰你的困惑。但是你的产品形态的质量不是性能或所谓压力测试来保障的,而是需要不对生产系统产生破坏。因此,你唯一能破坏生产系统的那个小模块应该是你整个产品中质量最高的模块,也应该是测试最全面最深入的模块,你的技术力量应该主要投到这个地方”。后来,针对该小模块我们进行专项内存泄露的测试,结果发现了好几个内存泄露的大bug,这些bug每一个都是会导致客户生产系统中断的杀手。

    测试架构师不是团队中专门解决测试难点的专家,而是识别测试重点,并支撑测试重点工作的专家。“区分测试重点和难点的能力”不是测试架构师独有,系统测试工程师和测试工程师一样可以具有。与第一篇“准确的商业理解力”一样,第二篇要做的是:做正确的事。

    请继续关注后续测试架构师应该具备的能力系列:

    第三篇 “全面,多样化的产品经验”

    第四篇 “参与产品架构工作的能力”

    第五篇 “识别产品测试组测试技术需求的能力”

    第六篇 “为产品测试组提供测试技术解决方案的能力”

    第七篇 “测试技术解决方案的推广能力”

    第八篇        “与周边部门沟通配合能力”

    第九篇        “创新解决方案能力”

        第十篇   “领导力和影响力”

  • Loadrunner windows sockets性能测试脚本开发视频完成【下载地址更新】

    云层 发布于 2010-04-07 15:00:10

    由于回到深圳事情颇多,而且又有各种活动,今天花了点时间终于把拖欠多时的视频做出来了。

    这次的工程很大,整个视频长达54分钟,估计看的人都要睡着了,不过我写的时候可是很辛苦的,所以要大家耐心的看调试和分析过程了。

    这个项目是使用的loadrunner8.0自带的flights项目制作的,脚本可以在LR9上运行,但环境无法迁移到其他平台。

    土豆这次就不更新了,太大了。

    下载地址:

    ftp://user1:user1@www.atstudy.com/cloud/sockets.swf

    关键技术:

    sockets协议的录制,请求的分析,如何做参数化,如何做关联

    脚本:

    由于在录制视频的时候不小心写错了几个东西导致有些订单生成和用户信息有问题了,这里再说明一下,视频中的有几个小bug

    1.在插入订单的时候错误的把订单号和航班号写反了,导致订单一直插不进去,郁闷啊

    2.在插入用户时,忘了把关联到得新用户编号写回来,导致用户id一直是261

    3.在查询用户是否存在时,忘了参数化当前用户名,导致该用户一直都是存在的,不会触发新建用户id逻辑

    ---------------------------华丽的分割线,下面是主代码,data.ws文件和完整脚本看附件-------------------------

    splitchartoparamarr(char *x,char *y,char *paramarrname)
    //该函数的作用是将输入的字符串x,通过y符号分割,保存到paramarrname参数数组中
    {
     extern char * strtok(char * string, const char * delimiters );
    char charstring[1000],separators[100],paramname[110];
    //定义输入字符串,字符串长度为1000,分隔符长度为100,参数元素名长度110
    char * token;
     int i=0;//初始化计数器
     char paramcount[10],paramarrcount[110];
    //定义生成参数数组的编号及参数名

     strcpy(charstring,x); 
     strcpy(separators,y);

    token = (char *)strtok(charstring, separators);
    // Get the first token

    if (!token) {
        lr_output_message ("No tokens found in string!");
        return( -1 );
        }

    while (token != NULL ) { // While valid tokens are returned

    //lr_output_message ("%s", token );//输入分割值
      i++;
         sprintf(paramname,"%s_%d",paramarrname,i);
      //lr_output_message ("%s", paramname );//输出参数名
      lr_save_string(token,paramname);

        token = (char *)strtok(NULL, separators); // Get the next token
      
        }
     sprintf(paramarrcount,"%s_count",paramarrname);
     itoa(i,paramcount,10);
     lr_save_string(paramcount,paramarrcount);

    }

     

    /*********************************************************************
     * Created by Mercury Interactive Windows Sockets Recorder
     *
     * Created on: Wed Apr 07 13:23:40
     *********************************************************************/

    #include "lrs.h"


    vuser_init()
    {
     int randno;
     char flystring[100];
        lrs_startup(257);

        lrs_create_socket("socket0", "TCP", "RemoteHost=computer:3456",  LrsLastArg);

        lrs_send("socket0", "buf0", LrsLastArg);

        lrs_receive("socket0", "buf1", LrsLastArg);

        lr_think_time(11);

        lrs_send("socket0", "buf2", LrsLastArg);

        lrs_receive("socket0", "buf3", LrsLastArg);

        lr_think_time(14);

        lrs_send("socket0", "buf4", LrsLastArg);

        lrs_receive("socket0", "buf5", LrsLastArg);

     lrs_save_searched_string ("socket0", LRS_LAST_RECEIVED, "param1", "LB/BIN=##", "RB/BIN=##", 1,0, -1);

     splitchartoparamarr(lr_eval_string("<param1>"),"#","flyno");
    //该函数的作用是将输入的字符串x,通过y符号分割,保存到paramarrname参数数组中

     randno=rand()%atoi(lr_eval_string("<flyno_count>"))+1;
     sprintf(flystring,"<flyno_%d>",randno);
     lr_save_var(lr_eval_string(flystring),4,0,"flysno");
        lr_think_time(23);
     

        lrs_send("socket0", "buf6", LrsLastArg);

        lrs_receive("socket0", "buf7", LrsLastArg);

        lrs_send("socket0", "buf8", LrsLastArg);

        lrs_receive("socket0", "buf9", LrsLastArg);
     lrs_save_searched_string ("socket0", LRS_LAST_RECEIVED, "orderid", "LB/BIN=##", "RB/BIN=##", 1,0, -1);

        lrs_send("socket0", "buf10", LrsLastArg);

        lrs_receive("socket0", "buf11", LrsLastArg);
     lrs_save_searched_string ("socket0", LRS_LAST_RECEIVED, "userid", "LB/BIN=##", "RB/BIN=##", 1,0, -1);
     if(atoi(lr_eval_string("<userid>"))==-1)
     {
          lrs_send("socket0", "buf12", LrsLastArg);
          lrs_receive("socket0", "buf13", LrsLastArg);
          lrs_send("socket0", "buf14", LrsLastArg);
          lrs_receive("socket0", "buf15", LrsLastArg);
       lrs_save_searched_string ("socket0", LRS_LAST_RECEIVED, "userid", "LB/BIN=##", "RB/BIN=##", 1,0, -1);
          lrs_send("socket0", "buf16", LrsLastArg);
          lrs_receive("socket0", "buf17", LrsLastArg); 
    }

        lrs_send("socket0", "buf18", LrsLastArg);

        lrs_receive("socket0", "buf19", LrsLastArg);

        lrs_send("socket0", "buf20", LrsLastArg);

        lrs_receive("socket0", "buf21", LrsLastArg);

        lrs_send("socket0", "buf22", LrsLastArg);

        lrs_receive("socket0", "buf23", LrsLastArg);

        return 0;
    }

     

     

854/5<12345>
Open Toolbar