FDS’s Blog

2011年5月12日

【软考】实例:Servlet处理POST请求

Filed under: 计算机考试 — fangds @ 14:31

  下面介绍一个HTTP Servlet处理POST方式的例子,见示例14-3。
    【程序源代码】

1// ==================== Program Description ==========================2// 程序名称:示例14-3 : SurveyExample.html3// 程序目的:SurveyExample源代码4// ==============================================================5<!DOCTYPE HTML PUBLIC “-//IETF//DTD HTML//EN”>6<html>7  <head>8    <title>JavaUsageSurvey</title>9  </head>1011  <body bgcolor=#ffffff>12  <p><img src=/article/UploadPic/2006-7/2006724132129874.gif align=right>13    <blockquote>14    <font face=”helvetica”>15    <form action=”SurveyServlet” method=POST>16      <input type=hidden name=survey value=Survey01Results>17      <BR><BR>How Many Employees in your Company?<BR>18        <BR>1-100<input type=radio name=employee value=1-100>19        <BR>100-200<input type=radio name=employee value=100-200>20        <BR>200-300<input type=radio name=employee value=200-300>21        <BR>300-400<input type=radio name=employee value=300-400>22        <BR>500-more<input type=radio name=employee value=500-more>23      <BR><BR>General Comments?<BR>24        <BR><input type=text name=comment>25      <BR><BR>What IDEs do you use?<BR>26        <BR>JavaWorkShop<input type=checkbox name=ide value=JavaWorkShop>27        <BR>J++<input type=checkbox name=ide value=J++>28        <BR>Cafe’<input type=checkbox name=ide value=Cafe’>29      <BR><BR><input type=submit><input type=reset>30    </form>31    </font>32    </blockquote>33  </body>34</html>

    【程序输出结果】
    在客户端IE浏览的效果如图14-5所示。


图14-5 客户端浏览效果

    服务器端的Servlet就是要将客户端填写并发送的表单数据写入一个文件,并且用一个”thank you”信息响应用户。示例14-4就是Servlet程序。
    【程序源代码】

1// ==================== Program Description ==========================2// 程序名称:示例14-4 : SurveyServlet.java3// 程序目的:处理Http Post的表单请求4// ==============================================================5package examples.servlets;6import java.io.*;7import java.util.*;8import javax.servlet.*;9import javax.servlet.http.*;1011public class SurveyServlet extends HttpServlet 12{13String resultsDir;14  15  public void init(ServletConfig config)16       throws ServletException17  {18    super.init(config);19    resultsDir = getInitParameter(“resultsDir”);20    if (resultsDir == null) {21      Enumeration initParams = getInitParameterNames();22      System.err.println(“The init parameters were: “);23      while (initParams.hasMoreElements()) {24        System.err.println(initParams.nextElement());25      }26      System.err.println(“Should have seen one parameter name”);27      throw new UnavailableException (this,28                                      “Not given a directory to write survey results!”);29    }30  }31  32  public void doPost(HttpServletRequest req, HttpServletResponse res)33     throws ServletException, IOException34  {35    res.setContentType(“text/html”);   36    PrintWriter toClient = res.getWriter();37    38    try {39      //打开文件将调查结果写入文件40      String surveyName = req.getParameterValues(“survey”)[0];41      FileWriter resultsFile = new FileWriter(resultsDir42                     + System.getProperty(“file.separator”)43                          + surveyName + “.txt”, true);44      PrintWriter toFile = new PrintWriter(resultsFile);45      toFile.println(“<BEGIN>”);46      Enumeration values = req.getParameterNames();47      while(values.hasMoreElements()) {48        String name = (String)values.nextElement();49        String value = req.getParameterValues(name)[0];50        if(name.compareTo(“submit”) != 0) {51          toFile.println(name + “: ” + value);52        }53      }54      toFile.println(“<END>”);  55      //关闭文件56      resultsFile.close();57      58      // 响应客户59      toClient.println(“<html>”);60      toClient.println(“<title>Thank you!</title>”);61      toClient.println(“<body bgcolor=#ffffff><p><img src=images62                    /BEA_Button_Final_web.gif align=right>” +63       “<font face=\”Helvetica\”>” +64                      “Thank you for participating</font></body>”);65      toClient.println(“</html>”);66      67    } 68   catch(IOException e) {69      e.printStackTrace();70      toClient.println(“A problem occured while recording your answers. ” +71                       “Please try again.”);72    }73    74  }75}

    部分配置文件如下所示:

<servlet><servlet-name>SurveyServlet</servlet-name><servlet-class>examples.servlets.SurveyServlet</servlet-class><init-param><param-name>resultsDir</param-name> <param-value>c:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp\WEB-INF\classes \examples\servlets</param-value></init-param></servlet><servlet-mapping><servlet-name>SurveyServlet</servlet-name><url-pattern>/SurveyServlet/*</url-pattern></servlet-mapping>

    【程序输出结果】
    在相同目录下生成了一个Survey01Result的文本文件,里面记录着客户提交的信息:

<BEGIN>employee: 100-200ide: J++survey: Survey01Resultscomment: <END>

    同时返回给客户端信息,如图14-6所示。


图14-6 返回给客户端的信息

    【程序注解】
    在init()方法中先初始化了resultsDir变量,这个变量是以后保存文件的路径,这个变量的值在web.xml中。

    doPost方法是用getParameterNames和getParameterValues方法从表单中获取数据的,当参数名是submit时,就不对这个参数操作,并将其余客户端的参数名和参数值写入文件中。因为它返回文本给客户端,doPost 调用了 getWriter 方法。在写入响应主体部分之前,它进行了响应头部字段的设置setContentType(“text/html”).

【软考】如何处理HTTP POST/GET请求

Filed under: 计算机考试 — fangds @ 14:31

Servlet通过下面的方法来提供服务:

  • 实现service方法。
  • 实现HttpServlet的doMethod方法(doGet、doDelete、doOptions、 doPost、doPut、doTrace)。
    通常,service方法用来从客户请求(request)中提取信息,访问扩展资源,并基于上面的信息提供响应(response)。

    对于HTTP Servlets,正确提供响应的过程是首先填写响应(response)的头信息,然后从响应(response)中得到输出流,最后向输出流中写入内容信息。响应(response)头信息必须最先设置。下面将描述如何从请求(request)中获得信息和产生HTTP响应(response)。

    
  • 取得客户端请求
        一个HttpServletRequest对象提供到达HTTP 头部数据,也允许你获取客户端的数据。怎样获取这些数据取决于HTTP端请求方法。不管用任何HTTP方式,你都可以用 getParameterValues方法返回特定名称的参数值。对于用 HTTP GET 请求的方式,这个getQueryString方法将会返回一个可以用来分析的值。

        客户端请求(request)包含了从客户端传递到Servlet的数据。所有的请求(request)都实现了ServletRequest接口。这个接口定义了一些方法访问下面的信息,如表14-1所示。

    表14-1  ServletRequest接口方法类 型 描 述                         对 应 方 法参数,用来在客户端和Servlet之间传送信息 getAttribute(String name)                                         getAttributeNames()    getInputStream()   getParameter(String name) getParameterMap() getParameterNames() getParameterValues(String name)对象值属性,用来在Servlet容器和Servlet之间,或者协作的Servlet之间传递信息    removeAttribute(String name)                                   setAttribute(String name, Object o)有关请求使用的协议信息,客户端和服务器在请求中的调用   getContentLength()                                        getContentType()   getProtocol()  getReader()  getRealPath(String path)  getRemoteAddr() getRemoteHost()                                getRequestDispatcher(String path) 有关请求使用的协议信息,客户端和服务器在请求中的调用       getScheme()                                    getServerName()       getServerPort()        isSecure()有关localization的信息       getCharacterEncoding()                                   getLocale()       getLocales()      setCharacterEncoding(String env)


        下面的代码段示范了如何使用request中的方法获得客户端信息。

    Enumeration params = request.getParameterNames();String paramName = null;String[] paramValues = null; while (params.hasMoreElements()) {    paramName = (String) params.nextElement();    paramValues = request.getParameterValues(paramName);    System.out.println(“\nParameter name is ” + paramName);    for (int i = 0; i < paramValues.length; i++) {      System.out.println(“, value ” + i + ” is ” + paramValues[i].toString());    }}


        HTTP Servlets使用HTTP request对象(HttpServletRequest),它包含了request URL、HTTP头信息、查询字符串,等等。HTTP request URL 包括几个部分:
        http://:?

        一般情况下:

    requestURI = contextPath + servletPath + pathInfoContext path:通过getContextPath方法获得。 Servlet Path:通过getServletPath方法获得。 PathInfo:通过getPathInfo方法获得。


        如表14-2所示。

    表14-2  路径的对应Request Path            Path Elements/catalog/help/feedback.jspContextPath: /catalog ServletPath:                             /help/feedback.jsp PathInfo: null


        
  • 提供HTTP响应
        响应(response)包含了在服务器和客户端之间传递的数据。所有的响应(response)都实现了ServletResponse接口。这个接口定义了一些方法提供给开发人员使用,如表14-3所示。

    表14-3  ServletResponse接口方法类 型 描 述                          对 应 方 法获得向客户端发送数据的输出流 发送字符流:getWriter()                                      发送字节流:getOutputStream()指示响应返回的内容类型(例如:text/html)已经注册的内容类型名称保存在IANA(Internet Assigned Numbers Authority) setContentType(java.lang.String type)指出是否是缓冲输出。默认情况下写入输出的内容被立即发送到客户端。使用缓冲后写入输出的内容先不发送到客户端,这样Servlet有更多的时间设置相应的状态码和头信息,或者转移到其他的Web资源 flushBuffer()                                               getBufferSize()                                               isCommitted()                                     reset()                                              resetBuffer()                                 setBufferSize(int size)                                         setContentLength(int len)设置localization信息            getCharacterEncoding()                                         getLocale()                       setLocale(java.util.Locale loc)


        HTTP response类(HttpServletResponse)有一些代表HTTP头信息的域:
        
  • 状态码用来指出响应(response)失败的原因。


        
  • Cookies在客户端存储应用相关的信息,有时cookies用来维护和标识用户的session。

        Servlet首先设置响应(response)头信息,包括响应(response)的内容类别和缓冲区大小,然后在doGet方法中从响应(response)获得PrintWriter ,最后向输出中写入HTML代码,调用close()方法提交这次对客户端的响应(response)。示范代码如下:

    public void doGet (HttpServletRequest request,HttpServletResponse response)    throws ServletException, IOException {    // 设置头信息    response.setContentType(“text/html”);    response.setBufferSize(8192);    PrintWriter out = response.getWriter();                             // 向response中输出    out.println(“<html>” +       “<head><title>+       messages.getString(“TitleBookDescription”)       +</title></head>”);    …     out.println(“</body></html>”);    // 关闭输出流    out.close();}
  • 【软考】网络工程师的素质

    Filed under: 计算机考试 — fangds @ 14:31

        网络时代已经来临。我们都知道,社会生活高度电子化,使网络已经成为人们生活不可或缺的一部分。电子商务、电子政务、远程教育已充斥着人们的生活、工作、学习中的每一个环节。而这一切,都需要大量的网络人才来支撑,可以说,网络人才是当今的宠儿。网络工程师已成为现在最热门的职业之一,那么,具备什么样的素质才能称之为真正的工程师呢?
      从知识结构的角度看,网络工程师必须有比较全面的理论架构。网络工程与网络维护者是两个完全不同的概念,后者只要求对某个操作系统,或某个基于网络的软件熟悉,并能够处理这方面的问题就可以了。而网络工程师则要求对网络整体有清晰的把握,能够处理随时可能发生的问题。网络是复杂的,可能出现的问题涉及到方方面面,没有较完整的知识结构是不可能胜任这方面的工作的。举个简单的例子,网络由于调整或升级突然出现局域断网的情况,这其中的原因可能是路由模块配置问题,也可能是光纤收发故障,或者又是某个代理服务器停止服务……网络工程师只有掌握这些软硬件知识,才可能在很短的时间内找出问题所在,顺利解决问题。网络工程师分很多种,我们就以一般的局域网设计与管理员来举例,一个合格的网络工程师,应具备如下知识:首先,要有扎实的硬件基础,包括服务器及路由、交换设备等硬件的结构、性能指标等。进行系统设计时,硬件的性能指标都是网络工程师要充分考虑的因素。进行维护就更不用讲了。其次,要掌握最常用的网络操作系统,如Win2000和Linux。现在架构一个局域网可能会用到多种操作系统,多掌握一些毕竟可以更好地处理问题。其三,要掌握路由交换设备的配置方法。可以说,Internet就是由路由器和交换机搭建而成的,合格的网络工程师必须能够单独完成局域网的架构工作,如果没有相关的知识是不敢想象的。其四,还要掌握综合布线和网络集成的相关知识。在做项目计划时,要充分考虑到设备的选型和拓朴的设计,必须对综合布线有所了解,才可能做到网络畅通,硬件匹配,不产生网络瓶颈。对这一点,有的人可能不以为然,举个实际的例子吧。前段时间,有个公司要组建一个局域网,中心骨干设备选择了Cisco的6509千兆交换机,而接入层则为了省钱,选择使用百兆的单模收发器。结果,设备买回后却怎么也调不通。原因很简单,就是因为单模收发器的光纤无法和Cisco的千兆模块相匹配。最后只能全部改用了Cisco3500系列做为接入层交换设备,实际比多投入了近20万,造成了巨大浪费。当然,以上的知识结构只是针对网络管理和维护的工程师而言,如果是专业的数据库管理员,精通SQL语句,熟悉某种数据库则是必须的了。
      再者,网络工程师需要在实践中培养一种创新能力。网络需求是千变万化的,必须以不变应万变。同样一个网络设计需求,对于不同层次的网络工程师,其制作的解决方案也不尽相同。可以说,水平越高的越能通过特定的设计最贴切地体现用户的需求。而相反,有的网络工程师将网络设计当作了一种固定模式。笔者认识几位工程师,其中有的就已习惯了照搬方案,对于自己的发展是相当不利的,对于用户而言,也是一种浪费。所以,在工作和学习中多思考,才可能走上更高的台阶。
      最后,就是良好的英语水平,毕竟计算机是由美国人发明的,它的母语是英语。对于半路出家的工程师而言,可能英语是个弱项,在起初可能不会对你造成太大的障碍。网络技术发展太快,最新最好的资料往往是英文的。有时,我们对一个设备的配置不熟的话,都要去翻阅它的使用说明书或看帮助文件,那可全是英文的,没有扎实的英语水平,根本是不可想象的。所以要想进一步提升自己,学好英文是基础,也是关键所在。

    【软考】网络工程师考试常用的socket程序

    Filed under: 计算机考试 — fangds @ 14:31

    Hey! Socket 编程让你沮丧吗?从 man pages 中很难得到有用的信息吗?你想 跟上时代去做一做 
                Internet 程序,但是为你在调用 connect() 前的 bind() 的结构而愁眉不展?…
                好了,我现在已经来了,我将和所有人共享我的知识了。如果你了解 C 语言并想穿过 网络编程的沼泽,那么你来对地方了。
                ——————————————————————————–
                读者
                这个文档是写成一个指南,而不是参考书。如果你刚开始 socket 编程并想找一本
                入门书,那么你是我的读者。这可不是一本完全的 socket 编程书。
                ——————————————————————————–
                平台和编译器
                这篇文章中的大多数代码都在一台 Linux PC 上用 GNU 的 gcc 成功编译过。 而且他们在一台 HPUX 上用
                gcc 也成功编译过。但是注意,并不是每个代码 片段都独立测试过。
                ——————————————————————————–
                目录:
                什么是套接口?
                Internet 套接口的两种类型
                网络理论
                struct–要么了解他们,要么等异形入侵地球
                Convert the Natives!
                IP 地址和如何处理他们
                socket()–得到文件描述符!
                bind()–我们在哪个端口?
                connect()–Hello!
                listen()–有人给我打电话吗?
                accept()–”Thank you for calling port 3490.”
                send() 和 recv()–Talk to me, baby!
                sendto() 和 recvfrom()–Talk to me, DGRAM-style
                close() 和 shutdown()–滚开!
                getpeername()–你是谁?
                gethostname()–我是谁?
                DNS–你说“白宫”,我说 “198.137.240.100″
                客户-服务器背景知识
                简单的服务器
                简单的客户端
                数据报 Socket
                阻塞
                select()–多路同步 I/O,酷!
                参考资料
                Disclaimer and Call for Help
                ——————————————————————————–
                什么是 socket?
                你始终听到人们谈论着 “socket”,而你不知道他的确切含义。那么,现在我告诉你: 他是使用 Unix 文件描述符
                (fiel descriptor) 和其他程序通讯的方式。
                什么?
                Ok–你也许听到一些 Unix 高手 (hacker) 这样说:“呀,Unix 中所有的东西
                就是文件!”那个家伙也许正在说到一个事实:Unix 程序在执行任何形式的 I/O 的时候,
                程序是在读或者写一个文件描述符。一个文件描述符只是一个和打开的文件相关联的整数。
                但是(注意后面的话),这个文件可能是一个网络连接,FIFO,管道,终端,磁盘上的文件 或者什么其他的东西。Unix
                中所有的东西是文件!因此,你想和 Internet 上别 的程序通讯的时候,你将要通过文件描述符。最好相信刚才的话。
                现在你脑海中或许冒出这样的念头:“那么我从哪里得到网络通讯的文件描述符呢,聪明
                人?”无论如何,我要回答这个问题:你利用系统调用 socket()。他返回套接口描 述符 (socket
                descriptor),然后你再通过他来调用 send() 和 recv()。
                “但是…”,你可能现在叫起来,“如果他是个文件描述符,那么为什么不用一般的调用 read() 和 write()
                来通过套接口通讯?”简单的答案是:“你可以使用 一般的函数!”。详细的答案是:“你可以,但是使用 send() 和
                recv() 让你更好的控制数据传输。”
                有这样一个事实:在我们的世界上,有很多种套接口。有 DARPA Internet 地址 (Internet
                套接口),本地节点的路径名 (Unix 套接口),CCITT X.25 地址 (你可以完全忽略 X.25 套接口)。
                也许在你的 Unix 机器上还有其他的。我们在这里只讲第一种:Internet 套接口。
                ——————————————————————————–
                Internet 套接口的两种类型
                什么意思?有两种 Internet 套接口?是的。不,我在撒谎。其实还有很多,但是我可不想 吓着你。我们这里只讲两种。
                Except for this sentence, where I’m going to tell you that
                “Raw Sockets” are also very powerful and you should look them
                up.
                好了,好了。那两种类型是什么呢?一种是 “Stream Sockets”,另外一种是 “Datagram
                Sockets”。我们以后谈到他们的时候也会用到 “SOCK_STREAM” 和 “SOCK_DGRAM”。
                数据报套接口有时也叫“无连接套接口”(如果你确实要连接的时候用 connect()。)
                流式套接口是可靠的双向通讯的数据流。如果你向套接口安顺序输出“1,2”,那么他们
                将安顺序“1,2”到达另一边。他们也是无错误的传递的,有自己的错误控制。
                有谁在使用流式套接口?你可能听说过 telnet,不是吗?他就使用流式套接口。你需要你所输入的字符按顺序到达,不是
                吗?同样,WWW 浏览器使用的 HTTP 协议也使用他们。实际上,当你通过端口80 telnet 到一个 WWW
                站点,然后输入 “GET pagename” 的时候,你也可以得到 HTML 的内容。
                为什么流式套接口可以达到高质量的数据传输?他使用了“传输控制协议 (The Transmission Control
                Protocol)”,也叫 “TCP” (请参考 RFC-793 获得详细资料。)TCP 控制你的数据
                按顺序到达并且没有错误。你也许听到 “TCP” 是因为听到过 “TCP/IP”。这里的 IP 是指 “Internet
                协议”(请参考 RFC-791.) IP 只是处理 Internet 路由而已。
                那么数据报套接口呢?为什么他叫无连接呢?为什么他是不可靠的呢?恩,有这样的事实:如果你发送一个数据报,他可能到达,他可能次序颠倒了。如果他到达,那么在这个包的内部是无错误的。
                数据报也使用 IP 作路由,但是他不选择 TCP。他使用“用户数据报协议 (User Datagram
                Protocol)”,也叫 “UDP” (请参考 RFC-768.)
                为什么他们是无连接的呢?主要原因是因为他并不象流式套接口那样维持一个连接。 你只要建立一个包,在目标信息中构造一个 IP
                头,然后发出去。不需要连接。应用程序有: tftp, bootp 等等。
                “够了!”你也许会想,“如果数据丢失了这些程序如何正常工作?”我的朋友,每个程序在 UDP 上有自己的协议。例如,tftp
                协议每发出一个包,收到者发回一个包来说“我收到了!” (一个“命令正确应答”也叫“ACK”
                包)。如果在一定时间内(例如5秒),发送方没有收到应答, 他将重新发送,直到得到 ACK。这一点在实现 SOCK_DGRAM
                应用程序的时候非常重要。
                ——————————————————————————–
                网络理论
                既然我刚才提到了协议层,那么现在是讨论网络究竟如何工作和演示 SOCK_DGRAM
                的工作。当然,你也可以跳过这一段,如果你认为 已经熟悉的话。
                朋友们,现在是学习 数据封装 (Data Encapsulation) 的时候了! 这非常非常重要。It’s so
                important that you might just learn about it if you take the
                networks course here at Chico State ;-).
                主要的内容是:一个包,先是被第一个协议(在这里是 TFTP )包装(“封装”), 然后,整个数据(包括 TFTP
                头)被另外一个协议(在这里是 UDP )封装,然后下 一个( IP ),一直重复下去,直到硬件(物理)层( Ethernet
                )。
                当另外一台机器接收到包,硬件先剥去 Ethernet 头,内核剥去 IP 和 UDP 头,TFTP 程序再剥去 TFTP
                头,最后得到数据。
                现在我们终于讲到臭名远播的 网络分层模型 (Layered Network Model)。
                这种网络模型在描述网络系统上相对其他模型有很多优点。例如,你可以写一个套接口
                程序而不用关心数据的物理传输(串行口,以太网,连接单元接口 (AUI) 还是其他介质。
                因为底层的程序为你处理他们。实际的网络硬件和拓扑对于程序员来说是透明的。
                不说其他废话了,我现在列出整个层次模型。如果你要参加网络考试,可一定要记住:
                应用层 (Application)
                表示层 (Presentation)
                会话层 (Session)
                传输层 (Transport)
                网络层 (Network)
                数据链路层 (Data Link)
                物理层 (Physical)
                物理层是硬件(串口,以太网等等)。应用层是和硬件层相隔最远的–他是用户和网络 交互的地方。
                这个模型如此通用,如果你想,你可以把他作为修车指南。把他应用到 Unix,结果是:
                应用层 (Application Layer) (telnet, ftp, 等等)
                传输层 (Host-to-Host Transport Layer) (TCP, UDP)
                Internet 层 (Internet Layer) (IP 和路由)
                网络访问层 (Network Access Layer) (网络层,数据链路层和物理层)
                现在,你可能看到这些层次如何协调来封装原始的数据了。
                看看建立一个简单的数据包有多少工作?哎呀,你将不得不使用 “cat” 来完成 他们!简直是笑话。对于流式套接口你要作的是
                send() 发送数据。对于数据报 式套接口你按照你选择的方式封装数据然后用 sendto()。内核将为你建立传输 层和
                Internet 层,硬件完成网络访问层。这就是现代科技。
                现在结束我们的网络理论速成班。哦,忘记告诉你关于路由的事情了。但是我不准备谈他。 如果你真的想知道,那么参考 IP
                RFC。如果你从来不曾了解他,也没有 关系,你还活着不是吗。
                ——————————————————————————–
                structs
                终于到达这里了,终于谈到编程了。在这章,我将谈到被套接口用到的各种数据类型。因为 他们中的一些太重要了。
                首先是简单的一个:socket descriptor。他是下面的类型:
                  int
                仅仅是一个常见的 int。
                从现在起,事情变得不可思议了。请跟我一起忍受苦恼吧。注意这样的事实: 有两种字节排列顺序:重要的字节在前面(有时叫
                “octet”),或者不重要的字节在前面。 前一种叫“网络字节顺序 (Network Byte
                Order)”。有些机器在内部是按照这个顺序储 存数据,而另外一些则不然。当我说某数据必须按照 NBO
                顺序,那么你要调用函数(例 如 htons() )来将他从本机字节顺序 (Host Byte Order) 转换过来。如果我
                没有提到 NBO, 那么就让他是本机字节顺序吧。
                我的第一个结构(TM)–struct sockaddr. 这个数据结构 为许多类型的套接口储存套接口地址信息:
                struct sockaddr {
                    unsigned short   sa_family;   /* address family,
                AF_xxx     */
                    char         sa_data[14]; /* 14 bytes of protocol
                address */
                };
                sa_family 能够是各种各样的事情,但是在这篇文章中是 “AF_INET”。 sa_data
                为套接口储存目标地址和端口信息。看上去很笨拙,不是吗。
                为了对付 struct sockaddr,程序员创造了一个并列的结构: struct sockaddr_in (“in”
                代表 “Internet”.)
                struct sockaddr_in {
                    short int       sin_family; /* Address family    
                    */
                    unsigned short int sin_port;   /* Port number      
                    */
                    struct in_addr   sin_addr;   /* Internet address  
                    */
                    unsigned char     sin_zero[8]; /* Same size as struct
                sockaddr */
                };
                这个数据结构让可以轻松处理套接口地址的基本元素。注意 sin_zero (他 被加入到这个结构,并且长度和 struct
                sockaddr 一样) 应该使用函数 bzero() 或 memset() 来全部置零。 Also, and this
                is the important bit, a pointer to a struct sockaddr_in can be
                cast to a pointer to a struct sockaddr and vice-versa. 这样的话 即使
                socket() 想要的是 struct sockaddr *, 你仍然可以使用 struct
                sockaddr_in,and cast it at the last minute! 同时,注意 sin_family 和
                struct sockaddr 中的 sa_family 一致并能够设置为 “AF_INET”。最后, sin_port 和
                sin_addr 必须是网络字节顺序 (Network Byte Order)!
                你也许会反对道:”但是,怎么让整个数据结构 struct in_addr sin_addr 按照网络字节顺序呢?”
                要知道这个问题的答案,我们就要仔细的看一 看这个数据结构: struct in_addr, 有这样一个联合
    (unions):
                /* Internet address (a structure for historical reasons) */
                  struct in_addr {
                    unsigned long s_addr;
                  };
                他曾经是个最坏的联合,但是现在那些日子过去了。如果你声明 “ina” 是 数据结构 struct sockaddr_in
                的实例,那么 “ina.sin_addr.s_addr” 就储存4字节的 IP 地址(网络字节顺序)。如果你不幸的
                系统使用的还是恐怖的联合 struct in_addr ,你还是可以放心4字 节的 IP 地址是和上面我说的一样(这是因为
                #define。)
                ——————————————————————————–
                Convert the Natives!
                我们现在到达下个章节。我们曾经讲了很多网络到本机字节顺序,现在是采取行动的时刻了!
                你能够转换两种类型: short (两个字节)和 long (四个字节)。这个 函数对于变量类型 unsigned
                也适用。假设你想将 short 从本机字节顺序 转换为网络字节顺序。用 “h” 表示 “本机 (host)”,接着是
                “to”,然后用 “n” 表示 “网络 (network)”,最后用 “s” 表示 “short”: h-to-n-s,
                或者 htons() (“Host to Network Short”)。
                太简单了…
                如果不是太傻的话,你一定想到了组合 “n”,”h”,”s”,和 “l”。但是这里没有 stolh() (“Short to
                Long Host”) 函数,但是这里有:
                htons()–”Host to Network Short”
                htonl()–”Host to Network Long”
                ntohs()–”Network to Host Short”
                ntohl()–”Network to Host Long”
                现在,你可能想你已经知道他们了。你也可能想:”如果我改变 char 的顺序会 怎么样呢? 我的 68000
                机器已经使用了网络字节顺序,我没有必要去调用 htonl() 转换 IP 地址。”
                你可能是对的,但是当你移植你的程序到别的机器上的时候,你的程序将 失败。可移植性!这里是 Unix
                世界!记住:在你将数据放到网络上的时候,确信他们是网络字 节顺序。
                最后一点:为什么在数据结构 struct sockaddr_in 中, sin_addr 和 sin_port
                需要转换为网络字节顺序,而 sin_family 不需要呢? 答案是:sin_addr 和 sin_port 分别封装在包的
                IP 和 UDP 层。因此,他们必须要是网络字节顺序。 但是 sin_family 域只是被内核 (kernel)
                使用来决定在数据结构中包含什么 类型的地址,所以他应该是本机字节顺序。也即 sin_family 没有 发
                送到网络上,他们可以是本机字节顺序。
                ——————————————————————————–
                IP 地址和如何处理他们
                现在我们很幸运,因为我们有很多的函数来方便地操作 IP 地址。没有必要用手工计算 他们,也没有必要用 << 操作符来操作
                long。
                首先,假设你用 struct sockaddr_in ina,你想将 IP 地址 “132.241.5.10″
                储存到其中。你要用的函数是 inet_addr(),转换 numbers-and-dots 格式的 IP 地址到
                unsigned long。这个工作可以这样来做:
                  ina.sin_addr.s_addr = inet_addr(“132.241.5.10″);
                注意:inet_addr() 返回的地址已经是按照网络字节顺序的,你没有必要再去调用 htonl()。
                上面的代码可不是很健壮 (robust),因为没有错误检查。inet_addr() 在发生错误
                的时候返回-1。记得二进制数吗? 在 IP 地址为 255.255.255.255 的时候返回的是
                (unsigned)-1!这是个广播地址!记住正确的使用错误检查。
                好了,你现在可以转换字符串形式的 IP 地址为 long 了。那么你有一个数据结构 struct in_addr,该如何按照
                numbers-and-dots 格式打印呢? 在这个 时候,也许你要用函数 inet_ntoa() (“ntoa” 意思是
                “network to ascii”):
                  printf(“%s”,inet_ntoa(ina.sin_addr));
                他将打印 IP 地址。注意的是:函数 inet_ntoa() 的参数是 struct in_addr,而不是
                long。同时要注意的是他返回的是一个指向字符的指针。 在 inet_ntoa 内部的指针静态地储存字符数组,因此每次你调用
                inet_ntoa() 的时候他将覆盖以前的内容。例如:
                  char *a1, *a2;
                  .
                  .
                  a1 = inet_ntoa(ina1.sin_addr); /* this is 198.92.129.1 */
                  a2 = inet_ntoa(ina2.sin_addr); /* this is 132.241.5.10 */
                  printf(“address 1: %s\n”,a1);
                  printf(“address 2: %s\n”,a2);
                运行结果是:
                  address 1: 132.241.5.10
                  address 2: 132.241.5.10
                如果你想保存地址,那么用 strcpy() 保存到自己的字符数组中。
                这就是这章的内容了。以后,我们将学习转换 “whitehouse.gov” 形式的字符串到正确 的 IP 地址

    【软考】交换机的种类

    Filed under: 计算机考试 — fangds @ 14:31

        随着网络技术的发展,各种各样的通信设备应运而生,交换机就是其中一员。在一些技术类书籍或文章中,我们经常可以看到很多交换机的名词,它们中很多是由英语直接翻译过来,也有一些是厂商为了某种目的命名的。这些形形色色的交换机名很容易让人混淆,以下我们将介绍一下交换机的不同分类情况,并对其中一些常见的名词作一分析。  

    交换机包括电话交换机(PBX)、数据交换机(Switch),以下我们所提到的交换机都是指数据交换机,对传统的电话交换机就不作讨论了。 

    从广义上来看,交换机分为两种:广域网交换机和局域网交换机。广域网交换机主要应用于电信领域,提供通信用的基础平台。而局域网交换机则应用于局域网络,用于连接终端设备,如PC机及网络打印机等。以下内容都是基于局域网交换机来说的。 

    按照最广泛的普通分类方法,即从规模应用上,局域网交换机可分为企业级交换机、部门级交换机和工作组交换机等。作为骨干交换机时,支持500个信息点以上大型企业应用的交换机为企业级交换机,支持300个信息点以下中型企业的交换机为部门级交换机,而支持100个信息点以内的交换机为工作组级交换机。但这也不是绝对的标准,正是由于没有统一的划分的尺度标准,又出现了桌面型交换机(Desktop Switch)、校园网交换机(Campus Switch)等概念。下面对以上几个概念作一简介: 

    1. 桌面型交换机,这是最常见的一种交换机,它区别于其他交换机的一个特点是支持的每端口MAC地址很少。广泛的使用于一般办公室、小型机房和业务受理较为集中的业务部门、多媒体制作中心、网站管理中心等部门。在传输速度上,现代桌面型交换机大都提供多个具有10/100Mbps自适应能力的端口。 

    2.工作组交换机,常用来作为扩充设备,在桌面型交换机不能满足需求时,大多直接考虑工作组型交换机。虽然工作组型交换机只有较少的端口数量,但却支持较多的MAC地址,并具有良好的扩充能力,端口的传输速度基本上为100Mbps。 

    3. 部门交换机,它通常不比工作组交换机更贵,而且与工作组交换机不同的是它们的端口数量和性能级别有所差异。一个部门交换机通常有8~16个端口,通常在所有端口上支持全双工操作。它们的性能要好于一个工作组交换机的性能,而且有一个等于或超过所有端口带宽的半双工汇集带宽。 

    4. 校园网交换机,这种交换机应用相对较少,仅应用于大型网络,且一般作为网络的骨干交换机,并具有快速数据交换能力和全双工能力,可提供容错等智能特性,还支持扩充选项及第三层交换中的虚拟局域网(VLAN)等多种功能。 

    5. 企业交换机,虽然非常类似于校园网交换机,但最大的不同是企业交换机还可以接入一个大底盘。这些底盘产品通常支持许多不同类型的组件,比如快速以太网和以大网中继器、FDDI集中器、令牌环MAU和路由器。企业交换机在建设企业级别的网络时非常有用,尤其是对需要支持一些网络技术和以前的系统。基于底盘设备通常有非常强大的管理特征,因此非常适合于企业网络的环境。不过,基于底盘设备的缺点是它们的成本都非常高。 

    根据架构特点,人们还将局域网交换机分为机架式、带扩展槽固定配置式、不带扩展槽固定配置式3种产品。 

    1. 机架式交换机 这是一种插槽式的交换机,这种交换机扩展性较好,可支持不同的网络类型,如以太网、快速以太网、千兆以太网、ATM、令牌环及FDDI等,但价格较贵,高端交换机有不少采用机架式结构。 

    2. 带扩展槽固定配置式交换机 它是一种有固定端口数并带少量扩展槽的交换机,这种交换机在支持固定端口类型网络的基础上,还可以通过扩展其他网络类型模块来支持其他类型网络。这类交换机的价格居中。 

    3. 不带扩展槽固定配置式交换机 这类交换机仅支持一种类型的网络(一般是以太网),可应用于小型企业或办公室环境下的局域网,价格最便宜,应用也最广泛。 
    从传输介质和传输速度上看,局域网交换机可以分为以太网交换机、快速以太网交换机、千兆以太网交换机、FDDI交换机、ATM交换机和令牌环交换机等多种,这些交换机分别适用于以太网、快速以太网、FDDI、ATM和令牌环网等环境。 

    从ISO/OSI的分层结构上说,交换机可分为二层交换机、三层交换机等。二层交换机指的就是传统的工作在OSI参考模型的第二层–数据链路层上交换机,主要功能包括物理编址、错误校验、帧序列以及流控。 一个纯第二层的解决方案,是最便宜的方案,但它在划分子网和广播限制等方面提供的控制最少。传统的路由器与外部的交换机一起使用也能解决这个问题,但现在路由器的处理速度已跟不上带宽要求。因此三层交换机、Web交换机等应运而生。 

    三层交换机是一个具有三层交换功能的设备,即带有第三层路由功能的第二层交换机,但它是二者的有机结合,并不是简单地把路由器设备的硬件及软件叠加在局域网交换机上。 

    Web交换机为数据中心设备(包括Internet服务器、防火墙、高速缓冲服务器和网关等)提供管理、路由和负载均衡传输。不同于传统网络设备的是,传统网络设备注重高速完成单个帧和数据包的交换,而Web交换侧重于跟踪和处理Web会话。除了由传统第二/三层交换机所提供的连接和封包路由外,Web交换机还可提供传统局域网交换机和路由器所缺乏的完备策略,将局部和全球服务器负载均衡、存取控制、服务质量保证(QoS)以及带宽管理等管理能力结合起来。目前,Web交换机已由纯粹的传输层(第四层)设备发展到具有基于内容(第七层)的交换的智能。利用内容或用户分类进行Web请求重定向是Web服务器的一项功能。不过,Internet传输和商业的发展远远超过计算机处理能力的提高。把内容分类卸到Web交换机可平衡整个网站的基础设施。 
    随着技术的发展,肯定还会有更多的新名词涌现出来,但是只要掌握好原理,有清楚的概念,就不会被它们搞昏头脑。 

    【软考】ping的工作原理

    Filed under: 计算机考试 — fangds @ 14:31

    ping的原理就是首先建立通道,然后发送包,对方接受后返回信息,这个包至少包括以下内容,发送的时候,包的内容包括对方的ip地址和自己的地址,还有序列数,回送的时候包括双方地址,还有时间等,主要是接受方在都是在操作系统内核里做好的,时刻在监听,提供一段c程序的代码,希望对大家有用。
    #include <stdio.h>
    #include <signal.h>
    #include <arpa/inet.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <netinet/ip.h>
    #include <netinet/ip_icmp.h>
    #include <netdb.h>
    #include <setjmp.h>
    #include <errno.h>

    #define PACKET_SIZE 4096
    #define MAX_WAIT_TIME 5
    #define MAX_NO_PACKETS 3

    char sendpacket[PACKET_SIZE];
    char recvpacket[PACKET_SIZE];
    int sockfd,datalen=56;
    int nsend=0,nreceived=0;
    struct sockaddr_in dest_addr;
    pid_t pid;
    struct sockaddr_in from;
    struct timeval tvrecv;

    void statistics(int signo);
    unsigned short cal_chksum(unsigned short *addr,int len);
    int pack(int pack_no);
    void send_packet(void);
    void recv_packet(void);
    int unpack(char *buf,int len);
    void tv_sub(struct timeval *out,struct timeval *in);

    void statistics(int signo)
    { printf(“\n——————–PING statistics——————-\n”);
    printf(“%d packets transmitted, %d received , %%%d lost\n”,nsend,nreceived,
    (nsend-nreceived)/nsend*100);
    close(sockfd);
    exit(1);
    }
    /*校验和算法*/
    unsigned short cal_chksum(unsigned short *addr,int len)
    { int nleft=len;
    int sum=0;
    unsigned short *w=addr;
    unsigned short answer=0;

    /*把ICMP报头二进制数据以2字节为单位累加起来*/
    while(nleft>1)
    { sum+=*w++;
    nleft-=2;
    }
    /*若ICMP报头为奇数个字节,会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/
    if( nleft==1)
    { *(unsigned char *)(&answer)=*(unsigned char *)w;
    sum+=answer;
    }
    sum=(sum>>16)+(sum&0xffff);
    sum+=(sum>>16);
    answer=~sum;
    return answer;
    }
    /*设置ICMP报头*/
    int pack(int pack_no)
    { int i,packsize;
    struct icmp *icmp;
    struct timeval *tval;

    icmp=(struct icmp*)sendpacket;
    icmp->icmp_type=ICMP_ECHO;
    icmp->icmp_code=0;
    icmp->icmp_cksum=0;
    icmp->icmp_seq=pack_no;
    icmp->icmp_id=pid;
    packsize=8+datalen;
    tval= (struct timeval *)icmp->icmp_data;
    gettimeofday(tval,NULL); /*记录发送时间*/
    icmp->icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校验算法*/
    return packsize;
    }

    /*发送三个ICMP报文*/
    void send_packet()
    { int packetsize;
    while( nsend<MAX_NO_PACKETS)
    { nsend++;
    packetsize=pack(nsend); /*设置ICMP报头*/
    if( sendto(sockfd,sendpacket,packetsize,0,
    (struct sockaddr *)&dest_addr,sizeof(dest_addr) )<0 )
    { perror(“sendto error”);
    continue;
    }
    sleep(1); /*每隔一秒发送一个ICMP报文*/
    }
    }

    /*接收所有ICMP报文*/
    void recv_packet()
    { int n,fromlen;
    extern int errno;

    signal(SIGALRM,statistics);
    fromlen=sizeof(from);
    while( nreceived<nsend)
    { alarm(MAX_WAIT_TIME);
    if( (n=recvfrom(sockfd,recvpacket,sizeof(recvpacket),0,
    (struct sockaddr *)&from,&fromlen)) <0)
    { if(errno==EINTR)continue;
    perror(“recvfrom error”);
    continue;
    }
    gettimeofday(&tvrecv,NULL); /*记录接收时间*/
    if(unpack(recvpacket,n)==-1)continue;
    nreceived++;
    }

    }
    /*剥去ICMP报头*/
    int unpack(char *buf,int len)
    { int i,iphdrlen;
    struct ip *ip;
    struct icmp *icmp;
    struct timeval *tvsend;
    double rtt;

    ip=(struct ip *)buf;
    iphdrlen=ip->ip_hl<<2; /*求ip报头长度,即ip报头的长度标志乘4*/
    icmp=(struct icmp *)(buf+iphdrlen); /*越过ip报头,指向ICMP报头*/
    len-=iphdrlen; /*ICMP报头及ICMP数据报的总长度*/
    if( len<icon_cool.gif /*小于ICMP报头长度则不合理*/
    { printf(“ICMP packets\’s length is less than 8\n”);
    return -1;
    }
    /*确保所接收的是我所发的的ICMP的回应*/
    if( (icmp->icmp_type==ICMP_ECHOREPLY) && (icmp->icmp_id==pid) )
    { tvsend=(struct timeval *)icmp->icmp_data;
    tv_sub(&tvrecv,tvsend); /*接收和发送的时间差*/
    rtt=tvrecv.tv_sec*1000+tvrecv.tv_usec/1000; /*以毫秒为单位计算rtt*/
    /*显示相关信息*/
    printf(“%d byte from %s: icmp_seq=%u ttl=%d rtt=%.3f ms\n”,
    len,
    inet_ntoa(from.sin_addr),
    icmp->icmp_seq,
    ip->ip_ttl,
    rtt);
    }
    else return -1;
    }

    main(int argc,char *argv[])
    { struct hostent *host;
    struct protoent *protocol;
    unsigned long inaddr=0l;
    int waittime=MAX_WAIT_TIME;
    int size=50*1024;

    if(argc<2)
    { printf(“usage:%s hostname/IP address\n”,argv[0]);
    exit(1);
    }

    if( (protocol=getprotobyname(“icmp”) )==NULL)
    { perror(“getprotobyname”);
    exit(1);
    }
    /*生成使用ICMP的原始套接字,这种套接字只有root才能生成*/
    if( (sockfd=socket(AF_INET,SOCK_RAW,protocol->p_proto) )<0)
    { perror(“socket error”);
    exit(1);
    }
    /* 回收root权限,设置当前用户权限*/
    setuid(getuid());
    /*扩大套接字接收缓冲区到50K这样做主要为了减小接收缓冲区溢出的
    的可能性,若无意中ping一个广播地址或多播地址,将会引来大量应答*/
    setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&size,sizeof(size) );
    bzero(&dest_addr,sizeof(dest_addr));
    dest_addr.sin_family=AF_INET;

    /*判断是主机名还是ip地址*/
    if( inaddr=inet_addr(argv[1])==INADDR_NONE)
    { if((host=gethostbyname(argv[1]) )==NULL) /*是主机名*/
    { perror(“gethostbyname error”);
    exit(1);
    }
    memcpy( (char *)&dest_addr.sin_addr,host->h_addr,host->h_length);
    }
    else /*是ip地址*/
    memcpy( (char *)&dest_addr,(char *)&inaddr,host->h_length);
    /*获取main的进程id,用于设置ICMP的标志符*/
    pid=getpid();
    printf(“PING %s(%s): %d bytes data in ICMP packets.\n”,argv[1],
    inet_ntoa(dest_addr.sin_addr),datalen);
    send_packet(); /*发送所有ICMP报文*/
    recv_packet(); /*接收所有ICMP报文*/
    statistics(SIGALRM); /*进行统计*/

    return 0;

    }
    /*两个timeval结构相减*/
    void tv_sub(struct timeval *out,struct timeval *in)
    { if( (out->tv_usec-=in->tv_usec)<0)
    { –out->tv_sec;
    out->tv_usec+=1000000;
    }
    out->tv_sec-=in->tv_sec;
    }
    /*————- The End ———–*/

    【软考】网络攻击技术和PKI技术概述

    Filed under: 计算机考试 — fangds @ 14:31

    网络主动攻击和被动攻击

      网络攻击又可分为主动攻击和被动攻击。

      ◆ 被动攻击

      被动攻击就是网络窃听,截取数据包并进行分析,从中窃取重要的敏感信息。被动攻击很难被发现,因此预防很重要,防止被动攻击的主要手段是数据加密传输。为了保护网络资源免受威胁和攻击,在密码学及安全协议的基础上发展了网络安全体系中的五类安全服务,它们是:身份认证、访问控制、数据保密、数据完整性和不可否认。对这五类安全服务,国际标准化组织ISO已经有了明确的定义。

      ◆ 主动攻击包括窃取、篡改、假冒和破坏。

      主动攻击包括窃取、篡改、假冒和破坏。字典式口令猜测,IP地址欺骗和服务拒绝攻击等等都属于主动攻击。一个好的身份认证系统(包括数据加密、数据完整性校验、数字签名和访问控制等安全机制)可以用于防范主动攻击,但要想杜绝主动攻击很困难,因此对付主动攻击的另一措施是及时发现并及时恢复所造成的破坏,现在有很多实用的攻击检测工具。

      PKI技术

      PKI(Public Key Infrastructure),即公开密钥体系。它是利用公钥理论和技术建立的提供信息安全服务的基础设施,是国际公认的互联网电子商务的安全认证机制。它利用现代密码学中的公钥密码技术在开放的Internet网络环境中提供数据加密以及数字签名服务的统一的技术框架。

      公钥是目前应用最广泛的一种加密体制,在此体系中,加密密钥与解密密钥各不相同,发送信息的人利用接收者的公钥发送加密信息,接收者再利用自己专有的私钥进行解密。这种方式既保证了信息的机密性,又能保证信息具有不可抵赖性。

      PKI是一种遵循标准并利用公钥技术,为电子商务应用的开展提供一套安全基础平台的技术与规范,它能够透明地提供基于公开密钥的加密和数字签名等安全服务。利用PKI可以方便地建立和维护一个可信的网络计算环境,从而使得人们在这个无法直接相互面对的环境中能够确认彼此的身份和所交换的信息。

      为实现以上目的,典型实用的PKI系统应由以下部分组成:PKI客户端、注册机构(RA)、认证机构(CA)和证书库。

      ◆ PKI客户端

      PKI客户端的主要功能是使各种网络应用能够以透明、安全、一致、可信的方式与PKI交互,从而使用户能够方便地使用加密、数字签名等安全服务。

      ◆ 注册机构(RA)

      RA则是用户与认证中心的接口,其主要功能是核实证书申请者的身份,它所获证书的申请者身份的准确性是CA颁发证书的基础。

      ◆ 认证机构(CA)

      作为PKI核心的认证中心是证书颁发机构,由CA签发的证书是网上用户的电子身份标识。

      ◆ 证书库

      证书库用来存放经CA签发的证书和证书注销列表(CRL),为用户和网络应用提供证书及验证证书状态。

    【软考】IPSec基础-IPSec服务

    Filed under: 计算机考试 — fangds @ 14:31

    IPSec基础-IPSec服务

    IPSec 协议不是一个单独的协议,它给出了应用于IP层上网络数据安全的一整套体系结构,包括网络认证协议 Authentication Header(AH)、封装安全载荷协议Encapsulating Security Payload(ESP)、密钥管理协议Internet Key Exchange (IKE)和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换,向上提供了访问控制、数据源认证、数据加密等网络安全服务…

    IPSec基础-IPSec服务

    IPSec 协议不是一个单独的协议,它给出了应用于IP层上网络数据安全的一整套体系结构,包括网络认证协议 Authentication Header(AH)、封装安全载荷协议Encapsulating Security Payload(ESP)、密钥管理协议Internet Key Exchange (IKE)和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换,向上提供了访问控制、数据源认证、数据加密等网络安全服务。
      一、安全特性

      IPSec的安全特性主要有:

       ·不可否认性 “不可否认性”可以证实消息发送方是唯一可能的发送者,发送者不能否认发送过消息。”不可否认性”是采用公钥技术的一个特征,当使用公钥技术时,发送方用私钥产生一个数字签名随消息一起发送,接收方用发送者的公钥来验证数字签名。由于在理论上只有发送者才唯一拥有私钥,也只有发送者才可能产生该数字签名,所以只要数字签名通过验证,发送者就不能否认曾发送过该消息。但”不可否认性”不是基于认证的共享密钥技术的特征,因为在基于认证的共享密钥技术中,发送方和接收方掌握相同的密钥。
      ·反重播性 “反重播”确保每个IP包的唯一性,保证信息万一被截取复制后,不能再被重新利用、重新传输回目的地址。该特性可以防止攻击者截取破译信息后,再用相同的信息包冒取非法访问权(即使这种冒取行为发生在数月之后)。
      ·数据完整性 防止传输过程中数据被篡改,确保发出数据和接收数据的一致性。IPSec利用Hash函数为每个数据包产生一个加密检查和,接收方在打开包前先计算检查和,若包遭篡改导致检查和不相符,数据包即被丢弃。
      ·数据可靠性(加密) 在传输前,对数据进行加密,可以保证在传输过程中,即使数据包遭截取,信息也无法被读。该特性在IPSec中为可选项,与IPSec策略的具体设置相关。
      ·认证 数据源发送信任状,由接收方验证信任状的合法性,只有通过认证的系统才可以建立通信连接。

      二、基于电子证书的公钥认证

      一个架构良好的公钥体系,在信任状的传递中不造成任何信息外泄,能解决很多安全问题。IPSec与特定的公钥体系相结合,可以提供基于电子证书的认证。公钥证书认证在Windows 2000中,适用于对非Windows 2000主机、独立主机,非信任域成员的客户机、或者不运行Kerberos v5认证协议的主机进行身份认证。

      三、预置共享密钥认证

      IPSec也可以使用预置共享密钥进行认证。预共享意味着通信双方必须在IPSec策略设置中就共享的密钥达成一致。之后在安全协商过程中,信息在传输前使用共享密钥加密,接收端使用同样的密钥解密,如果接收方能够解密,即被认为可以通过认证。但在Windows 2000 IPSec策略中,这种认证方式被认为不够安全而一般不推荐使用。

      四、公钥加密

      IPSec的公钥加密用于身份认证和密钥交换。公钥加密,也被称为”不对称加密法”,即加解密过程需要两把不同的密钥,一把用来产生数字签名和加密数据,另一把用来验证数字签名和对数据进行解密。

      使用公钥加密法,每个用户拥有一个密钥对,其中私钥仅为其个人所知,公钥则可分发给任意需要与之进行加密通信的人。例如:A想要发送加密信息给B,则A需要用B的公钥加密信息,之后只有B才能用他的私钥对该加密信息进行解密。虽然密钥对中两把钥匙彼此相关,但要想从其中一把来推导出另一把,以目前计算机的运算能力来看,这种做法几乎完全不现实。因此,在这种加密法中,公钥可以广为分发,而私钥则需要仔细地妥善保管。

      五、Hash函数和数据完整性

      Hash信息验证码HMAC(Hash message authentication codes)验证接收消息和发送消息的完全一致性(完整性)。这在数据交换中非常关键,尤其当传输媒介如公共网络中不提供安全保证时更显其重要性。

      HMAC结合hash算法和共享密钥提供完整性。Hash散列通常也被当成是数字签名,但这种说法不够准确,两者的区别在于:Hash散列使用共享密钥,而数字签名基于公钥技术。hash算法也称为消息摘要或单向转换。称它为单向转换是因为:

      1)双方必须在通信的两个端头处各自执行Hash函数计算;
      2)使用Hash函数很容易从消息计算出消息摘要,但其逆向反演过程以目前计算机的运算能力几乎不可实现。

      Hash散列本身就是所谓加密检查和或消息完整性编码MIC(Message Integrity Code),通信双方必须各自执行函数计算来验证消息。举例来说,发送方首先使用HMAC算法和共享密钥计算消息检查和,然后将计算结果A封装进数据包中一起发送;接收方再对所接收的消息执行HMAC计算得出结果B,并将B与A进行比较。如果消息在传输中遭篡改致使B与A不一致,接收方丢弃该数据包。

      有两种最常用的hash函数:

      ·HMAC-MD5 MD5(消息摘要5)基于RFC1321。MD5对MD4做了改进,计算速度比MD4稍慢,但安全性能得到了进一步改善。MD5在计算中使用了64个32位常数,最终生成一个128位的完整性检查和。
      ·HMAC-SHA 安全Hash算法定义在NIST FIPS 180-1,其算法以MD5为原型。 SHA在计算中使用了79个32位常数,最终产生一个160位完整性检查和。SHA检查和长度比MD5更长,因此安全性也更高。

      六、加密和数据可靠性

      IPSec使用的数据加密算法是DES–Data Encryption Standard(数据加密标准)。DES密钥长度为56位,在形式上是一个64位数。DES以64位(8字节)为分组对数据加密,每64位明文,经过16轮置换生成64位密文,其中每字节有1位用于奇偶校验,所以实际有效密钥长度是56位。 IPSec还支持3DES算法,3DES可提供更高的安全性,但相应地,计算速度更慢。

      七、密钥管理

      ·动态密钥更新

      IPSec策略使用”动态密钥更新”法来决定在一次通信中,新密钥产生的频率。动态密钥指在通信过程中,数据流被划分成一个个”数据块”,每一个”数据块”都使用不同的密钥加密,这可以保证万一攻击者中途截取了部分通信数据流和相应的密钥后,也不会危及到所有其余的通信信息的安全。动态密钥更新服务由Internet密钥交换IKE(Internet Key Exchange)提供,详见IKE介绍部分。

      IPSec策略允许专家级用户自定义密钥生命周期。如果该值没有设置,则按缺省时间间隔自动生成新密钥。

      ·密钥长度

      密钥长度每增加一位,可能的密钥数就会增加一倍,相应地,破解密钥的难度也会随之成指数级加大。IPSec策略提供多种加密算法,可生成多种长度不等的密钥,用户可根据不同的安全需求加以选择。

      ·Diffie-Hellman算法

      要启动安全通讯,通信两端必须首先得到相同的共享密钥(主密钥),但共享密钥不能通过网络相互发送,因为这种做法极易泄密。

      Diffie-Hellman算法是用于密钥交换的最早最安全的算法之一。DH算法的基本工作原理是:通信双方公开或半公开交换一些准备用来生成密钥的”材料数据”,在彼此交换过密钥生成”材料”后,两端可以各自生成出完全一样的共享密钥。在任何时候,双方都绝不交换真正的密钥。

      通信双方交换的密钥生成”材料”,长度不等,”材料”长度越长,所生成的密钥强度也就越高,密钥破译就越困难。 除进行密钥交换外,IPSec还使用DH算法生成所有其他加密密钥。

    【软考】LINUX操作系统的概念和特点

    Filed under: 计算机考试 — fangds @ 14:31

    以应用为中心,以计算机技术为基础,软件、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统,称为嵌入式系统。一个最小的嵌入式系统的基本组成为:① 一个用作引导的可用设施(工具);② 一个具备内存管理,进程管理和定时器服务的LINUX微内核;③ 一个初始进程;④ 硬件的驱动程序;⑤ 一个或几个应用进程以提供必要的应用功效。

    嵌入式LINUX操作系统的特点

    •  比较

    有人认为LINUX由于太大而不宜用作嵌入式系统,这种观点不正确。面向PC机的LINUX型发布版有很多,功能根本用不上,甚至超出了一个PC用户的需求。因此,对LINUX进行合理的裁减,可以形成一个很具有实用性的嵌入式操作系统。下面对嵌入式LINUX操作系统与专用嵌入式实时操作系统的比较如下。

    •  嵌入式LINUX的内存使用

        在一个简单的系统中,当系统启动后,内核和各种应用进程均驻留在内存中,这是大多数传统嵌入式系统的工作方式,当然也包括LINUX。但它还可以使用另外一种方式:LINUX有装载和卸载程序的能力,所有应用程序以文件的形式被存放在闪存文件系统中并在必要的时候被装载到内存中,以节省RAM。

    •  开发嵌入式LINUX的调试方法

    当为一个新硬件开发相应的嵌入式LINUX系统时,要用到的典型调试工具的序列和步骤是:

    ①  修改代码使之能读写串口,并使用gdb运行该程序。这将允许它向另一台正运行着gdb程序的LINUX主机通信;gdb通过串口与测试计算机上的gdb目标码会话并给出全部C源码级的调试信息;

    ②  借助gdb执行余下的,直到LINUX内核开始接管之前的所有硬件和软件的初始化代码;

    ③  一旦LINUX内核启动后,上述的串口就成为LINUX的控制台端口,可以利用它的便利来进行后继开发过程,并可以使用gdb的内核调试版本kgdb。

    •  嵌入式LINUX的可移植性

    将LINUX移植到新的微处理器体系非常快捷,一般是将其移植到一种新型的目标板,其中包含有独特的外设。大部分的内核代码都是相同的,因为它们与微处理器无关,所以,移植的工作多集中在一些存储器管理及中断处理程序上。一旦完成,它们将非常稳定。

    嵌入式LINUX的应用

    嵌入式系统的涵盖面是非常广泛的,其中,家电市场包括机顶盒、数字电视、可视电话、家庭网络等信息家电;工业市场包括工业控制设备、仪器;商用市场包括掌上电脑、瘦客户机、POS终端等;通信市场包括WAP手机、无线PDA等。目前被广泛看好的是信息家电市场,国内有很多开发厂商正加大投入、开发和研制新的产品,嵌入式LINUX将是他们首选的操作系统。

    【软考】传输系统中的时钟同步技术

    Filed under: 计算机考试 — fangds @ 14:31

    摘要
    基本概念
    两种主要抖动类型
    抖动测量 — TIE、MITE 和 TEDV
    高速传输系统中抖动和漂移的原因
    抖动对收发器的影响
    漂移对收发器的影响
    结论


    同步模块是每个系统的心脏,它为系统中的其他每个模块馈送正确的时钟信号。因此需要对同步模块的设计和实现给予特别关注。本文对影响系统设计的时钟特性进行了考察,并对信号恶化的原因进行了评估。本文还分析了同步恶化的影响,并对标准化组织为确保传输质量和各种传输设备的互操作性而制定的标准要求进行了探讨。

    摘要:

    网络同步和时钟产生是高速传输系统设计的重要方面。为了通过降低发射和接收错误来提高网络效率,必须使系统的各个阶段都要使用的时钟的质量保持特定的等级。网络标准定义同步网络的体系结构及其在标准接口上的预期性能,以保证传输质量和传输设备的无缝集成。有大量的同步问题,系统设计人员在建立系统体系结构时必须十分清楚。本文论述了时钟恶化的各种来源,如抖动和漂移。本文还讨论了传输系统中时钟恶化的原因和影响,并分析了标准要求,提出了各种实现技巧。

    基本概念:

    抖动和漂移抖动的一般定义可以是“一个事件对其理想出现的短暂偏离”。在数字传输系统中,抖动被定义为数字信号的重要时刻在时间上偏离其理想位置的短暂变动。重要时刻可以是一个周期为 T1 的位流的最佳采样时刻。虽然希望各个位在 T 的整数倍位置出现,但实际上会有所不同。这种脉冲位置调制被认为是一种抖动。这也被称为数字信号的相位噪声。在下图中,实际信号边沿在理想信号边沿附近作周期性移动,演示了周期性抖动的概念。



    RIPT>图 1.抖动示意RIPT>

    抖动,不同于相位噪声,它以单位间隔(UI)为单位来表示。一个单位间隔相当于一个信号周期(T),等于360度。假设事件为E,第n次出现表示为tE[n]。则瞬时抖动可以表示为:



    一组包括 N 个抖动测量的峰到峰抖动值使用最小和最大瞬时抖动测量计算如下:



    漂移是低频抖动。两者之间的典型划分点为10Hz。抖动和漂移所导致的影响会显现在传输系统的不同但特定的区域。

    两种主要抖动类型:

    根据产生原因,抖动可分成两种主要类型:随机抖动和确定性抖动。随机抖动,正如其名,是不可预测的,由随机的噪声影响如热噪声等引起。随机抖动通常发生在数字信号的边沿转换期间,造成随机的区间交叉。毫无疑问,随机抖动具有高斯概率密度函数 (PDF),由其均值 (μ) 和均方根值 (rms) (σ) 决定。由于高斯函数的尾在均值的两侧无限延伸,瞬时抖动和峰到峰抖动可以是无限值。因此随机抖动通常采用其均方根值来表示和测量。


    RIPT>图 2.以高斯概率密度函数表示的随机抖动RIPT>


    对抖动余量来讲,峰到峰抖动比均方根抖动更为有用,因此需要把随机抖动的均方根值转换成峰到峰值。为将均方根抖动转换成峰到峰抖动,定义了随机抖动高斯函数的任意极限 (arbitrary limit)。误码率(BER)是这种转换中的一个有用参数,其假设高斯函数中的瞬时抖动一旦落在其强制极限之外即出现误码。通过下面两个公式,就可以得到均方根抖动到峰到峰抖动的换算。



    由公式可得到下表,表中峰到峰抖动对应不同的 BER 值。



    确定性抖动是有界的,因此可以预测,且具有确定的幅度极限。考虑集成电路 (IC) 系统,有大量的工艺、器件和系统级因素将会影响确定性抖动。占空比失真 (DCD) 和脉冲宽度失真 (PWD) 会造成数字信号的失真,使过零区间偏离理想位置,向上或向下移动。这些失真通常是由信号的上升沿和下降沿之间时序不同而造成。如果非平衡系统中存在地电位漂移、差分输入之间存在电压偏移、信号的上升和下降时间出现变化等,也可能造成这种失真。


    RIPT>图3,总抖动的双模表示RIPT>


     数据相关抖动(DDJ)和符号间干扰(ISI)致使信号具有不同的过零区间电平,导致每种唯一的位型出现不同的信号转换。这也称为模式相关抖动(PDJ)。信号路径的低频截止点和高频带宽将影响DDJ。当信号路径的带宽可与信号的带宽进行比较时,位就会延伸到相邻位时间内,造成符号间干扰(ISI)。低频截止点会使低频器件的信号出现失真,而系统的高频带宽限制将使高频器件性能下降。正弦抖动以正弦模式调制信号边沿。这可能是由于供给整个系统的电源或者甚至系统中的其他振荡造成。接地反弹和其他电源变动也可能造成正弦抖动。正弦抖动广泛用于抖动环境的测试和仿真。不相关抖动可能由电源噪声或串扰和其他电磁干扰造成。

    考虑抖动对数字信号的影响时,需要将整个确定性抖动和随机抖动考虑在内。确定性抖动和随机抖动的总计结果将产生另外一种概率分布4:双模响应,其中部表示确定性抖动,尾部为高斯响应,表示随机抖动分量。

    抖动测量 — TIE、MITE 和 TEDV

    时间间隔误差(TIE)是通过对实际时钟间隔的测量和对理想参考时钟同一间隔的测量得到的。在给定时间t,以一个称为观测间隔的时间间隔产生时间T(t)的时钟,其相对于时钟 Tref(t) 的TIE可通过下面公式表示。(x(t)称为误差函数。)

    TIE表示信号中的高频相位噪声,提供了实际时钟的每个周期偏离理想情况的直接信息。TIE 用于计算大量统计派生函数如 MTIE、TDEV 等。

    最大时间间隔误差(MTIE)定义为,在一个观测时间(t=nt0)内,一个给定时钟信号相对于一个理想时钟信号的最大峰到峰延迟变化,其中该长度的所有观测时间均在测量周期 (T) 之内。使用下面公式进行估计:



     MTIE是针对时间的缓变或漂移而定义的。当需要分析时钟的长期特性时,就需要对MTIE进行测量。MTIE 值是对一个时钟信号的长期稳定性的一种衡量。


    RIPT>图 4.TIE 的图形表示
     
    [page]
    TDEV 是另外一个统计参数,作为集成时间的函数对一个信号的预期时间变化的测量。DEV 也能提供有关信号相位(时间)噪声频谱分量的信息。TIE 图中每个点的标准偏差是对一个观测间隔计算的,该观测间隔滑过整个测量时间。该值在整个上述测量时间内进行平均以得到该特定间隔的 TDEV 值。增大观测间隔,重复测量过程。TDEV 是对短期稳定性的一种衡量,在评估时钟振荡器性能时有用。TDEV 属于时间单位。

    高速传输系统中抖动和漂移的原因

    最常用的一种时钟体系结构是,在备板上运行一个低频时钟,在每个传输卡上产生同步的高频时钟。低频时钟在集成电路内或通过分立PLL实现进行倍频以产生高频时钟。通过典型的PLL倍频,倍频后时钟上的相位噪声增大为原来时钟相位噪声的20*log(N)次方,其中N为倍频系数。此外,PLL参考时钟输入上的抖动将延长锁定时间,且当输入抖动过大时高速PLL甚至无法实现锁定。在备板上采用一种更高速的差分时钟将比采用低速单端时钟具有更好的抖动性能。

    由于VCO对输入电压变化较为敏感,因此电源噪声是增大时钟抖动的一个主要因素。输出时钟抖动幅度与电源噪声幅度、VCO增益成正比,与噪声频率成反比。因导线电阻形成的电阻下降和因导线电感形成的电感噪声而造成的电源或接地反弹,会对上述输出时钟抖动产生相似的影响。在系统板上对电源进行充分过滤,靠近集成电路电源引脚提供去耦电容,可以确保 PLL 获得更高的抖动性能。

    在系统板内,时钟和数据相互独立,发射和接收端在启动、保持和延迟时间方面的变化对高速率非常关键。因数据和时钟路径中存在不同有源元件而使数据和时钟路径之间出现传播延迟差异,时钟路径之间的接线延迟差异,数据位之间的接线延迟差异,数据和时钟路径之间不同的负载情况,分组长度差异等等,均可能造成上述变化。在规划系统抖动余量时,必须将不同信号路径的变化考虑在内。

    当在一段距离上进行传输时,在发射机和接收机中的很多点上存在抖动累积。在发射机物理层实现中,DAC非线性或激光非线性等非线性特性会加重信号失真。在传输介质和接收机中,除了外部乱真源(大多在铜导线中)之外,因不同频率和调制效应而导致的光纤失真、因接收机实现(主要与带宽有关)和时钟提取电路实现而导致的信号相关相位偏离,会加重信号流的抖动。



    RIPT>
    图 5.来自 TIE 图的 MTIE 偏差RIPT>

    具体到 SDH(同步数字系列)传输,有大量的系统级事件会导致抖动。在将 PDH(准同步数字系列)支路映射为SDH帧并通过SDHNE(网络组件)进行传输的典型传输系统中,在 PDH 支路于 SDH 的终端多路分配器解映射之前,将在每个中间节点处出现 VC(虚拟容器)的重新同步。有间隙的时钟用于将各个支路映射到 STM-N 帧和从 STM-N帧解映射,发出与开销、固定填充和调整位相应的脉冲,因而造成映射抖动。采用调整机会位补偿PDF支路中频率偏移的方法会造成等待时间抖动。还有指针调整机制,用于对来自初始NE的输入VC与本地产生的输出STM-N帧之间的相位波动进行补偿。根据频率偏离,VC在STM-N帧中前后移动。这将使VC提取点看到位流中的突然变化,导致称为指针抖动的类型抖动。所有上述系统级抖动都将加重总的确定性抖动。

    尽管所有上述因素都会加重从源到目的地之间信号传播的抖动,标准要求仍然规定在传输点需具有比理论值更低的抖动数值。这样,考虑到时钟倍频、电源变化、电-光-电转换、发射和接收影响以及其他致使实际信号恶化的失真信号的影响,在源处驱动信号的时钟将具有一个相对很低的抖动数值。

    抖动对收发器的影响

    理想情况下,数字信号是在两个相邻电平转换点的中点进行采样的。抖动之所以会造成误码,是由于相对于理想中点,它改变了信号的边沿转换点。误码可能由于信号流边沿变化太晚(在时间上比理想中点晚0.5UI(单位间隔相当于信号的一个周期))或太早(在时间上比理想中点早0.5UI)所致。当时钟采样边沿在信号流的任何一侧错过0.5UI时,将出现50%的误码概率,假设平均转换密度为0.5。7如果分别知道确定性抖动和随机抖动,可通过上述两个数字和将峰到峰抖动值与均方根抖动值联系在一起的表,来估计误码率。校准抖动,定义为数字信号的最佳采样时刻与从其提取出来的采样时钟之间的短期变化,可以造成上述误码。对于商业应用,源时钟和源发射接口抖动规范将远远低于 1UI。

    发射接口抖动规范通常与接收端的输入抖动容限相匹配。对于抖动测量回路滤波器截止频率,尤其如此。例如,在SDH系统中,有两种抖动测量带宽,分别规定:一个用于宽带测量滤波器(f1到f4),一个用于高频带测量滤波器(f3到f4)。数值f1指可在线路系统的PLL中使用的输出时钟信号的最窄时钟截止频率。低于此带宽的频率的抖动将通过系统,而较高频率的抖动则被部分吸收。数值f3表示输入时钟捕获电路的带宽。高于此频率的抖动将导致校准抖动。校准抖动造成光功率损失,需要额外光功率以防各种恶化。因此限制发射机端高频带频谱的抖动十分重要。

    漂移对收发器的影响

    市场上销售的大多数电信接收机都使用了一个缓冲器,以适应线路信号中存在的随机波动。下面框图6详细表示出这一概念。恢复时钟将数据送入富有弹性的缓冲器,而系统时钟则将数据送出到设备的核心部位。

    在准同步传输系统中,发射机和接收机工作在相互独立而又极为接近的频率上,fL和 Fs分别表示发射机和接收机的频率。当两者之间存在相位或频率差异时,弹性存储会将其消除,否则缓冲器将出现欠载或溢出(取决于差异的幅度和弹性缓冲器的大小),造成一次可控的帧滑动(基本速率传输)或一次位调整(高阶异步多路复用器)。

    在准同步应用中,根据可接受的缓冲滑动对频率变化和缓冲器深度进行了标准化。最初的网络主要用于语音传输,在一定的频率门限之下不会造成语音质量下降。ITU-T规范规定该变化为+/-50ppm。但是随着网络开始传送压缩语音、传真格式的数据、视频以及其他种类的媒体应用,对于差错和重传以及刚刚兴起的同步网络,滑动使效率严重下降。

    在同步传输系统中,系统时钟通常同步到用于接收更高时钟等级信号的接口的恢复时钟上。恢复时钟和系统时钟之间相位和频率的瞬时和累积差异将被弹性缓冲器吸收,否则将导致弹性存储器溢出/欠载(取决于缓冲器大小和变化的幅度),造成指针调整而延迟或提前帧传输、帧滑动或系统中某处出现位调整。

    在同步系统中,所有网络组件工作在同一平均频率,可以通过指针机制消除帧恶化。这些指针机制将提前或延迟有效载荷在传输帧中的位置,从而调整接收和系统时钟中存在的频率和相位变化。SDH 收发器中的缓冲器比 PDH 收发器中的要小,而且对于 SDH 系统中可能导致的指针移动等不规则性有限制。因此,与 PDH 系统相比,同步系统的要求更为严格。由于网络发展的历史和不同网络之间的互操作连接,在某些阶段或其他阶段,这些同步网络会通过准同步网络来连接。因此 PDH 网络的时钟体系结构也要考虑在内。

    MTIE提供了时钟相对于已知理想参考时钟的峰值时间变化。在同步传输和交换设备的弹性缓冲器的设计中将用到MTIE值。在弹性存储中,缓冲器填充水平与输入数字信号和本地系统时钟之间的TIE成正比。确保时钟符合有关MTIE的时钟规范,将保证不会超过一定的缓冲器门限。因此,在缓冲器设计中,其大小取决于 MTIE 的规定极限。

    RIPT>
    图6,典型传输系统的接收机接口
    RIPT>

    系统时钟输出相位扰动对收发器的影响一个时钟的输出相位变化可以通过分析其 MTIE 信息获得。漂移产生(在自由振荡模式和同步模式中)主要指系统中所用时钟振荡器的长期稳定性,在自由振荡模式中系统的稳定性仅受振荡器的稳定性影响。除了漂移产生之外,输出时钟相位还受到大量系统不规则特性的影响。

    特别是对一个系统同步器而言,将参考源从一个不良或恶化参考时钟转换到一个正常参考时钟可能会导致输出相位扰动。传输用高速PLL中使用的传统VCO(压控振荡器)在改变参考时钟时采用了切换电容器组的方法。这种切换转换会对输出时钟造成暂时的相位偏移。采用超低抖动时钟倍频器电路可以解决这个问题。

    高性能网络时钟在系统的所有参考时钟都失去时采用一种称为“保持”的机制。这是通过记忆存储技术产生系统最后一个已知良好参考时钟来实现的。进入和退出保持模式可能会对输出造成相位扰动。当处于保持模式中时,由于准确频率的再生不够精确,因此会继续产生输出相位误差。集成电路技术的进步已使保持精度达到了0.01ppb。输入参考时钟恶化和对系统的维护测试(不会导致参考时钟切换)过少,也会造成输出相位扰动。

    系统输出扰动是有限的,取决于系统在较低层次可以接受的输入容限。例如,符合G.813 选项1的时钟,其相位扰动中所允许的相位斜率和最大相位误差被限制为1μS,最大相位斜率为7.5ppm,两个120ns相位误差段,其余部分的相位斜率为0.05ppm。这些数字对应于 G.825 标准规定的输入抖动容限,该标准描述了在 SDH网络内对抖动和漂移的控制。

    当输出相位被扰动时,将相位误差的幅度和速率保持在标准组织所建议的极限之内,可确保在端到端系统中对信号恶化进行妥善处理,从而避免数据损坏或丢失。例如,当系统同步器进行参考时钟切换时,如果输出相位误差位于规范要求之内,同步器就可实现“无间断”参考时钟切换,指示存在缓冲器溢出或欠载,造成指针移动、位调整或滑动。

    结论

    网络同步和时钟产生是所有高速传输网络系统中最重要的部分。本文论述了时钟恶化的不同类型,主要是抖动和漂移。文章还详细论述了造成上述恶化的原因,以及它们如何影响传输系统。对时钟子系统进行系统性设计和实现,将提高整个系统的性能,降低误码率,易于集成,提供更高的传输质量和效率。 RIPT>

    Powered by WordPress