<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FDS's Blog &#187; 计算机考试</title>
	<atom:link href="http://blog.1xi.net/category/kaoshi/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.1xi.net</link>
	<description>收藏和分享</description>
	<lastBuildDate>Thu, 12 May 2011 06:33:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>[软考]Internet数据库建设方案比较</title>
		<link>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83internet%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bb%ba%e8%ae%be%e6%96%b9%e6%a1%88%e6%af%94%e8%be%83</link>
		<comments>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83internet%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bb%ba%e8%ae%be%e6%96%b9%e6%a1%88%e6%af%94%e8%be%83#comments</comments>
		<pubDate>Thu, 12 May 2011 06:33:30 +0000</pubDate>
		<dc:creator>liaowei</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83internet%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bb%ba%e8%ae%be%e6%96%b9%e6%a1%88%e6%af%94%e8%be%83</guid>
		<description><![CDATA[　　在Internet应用中，除设计静态网页以外，通过数据库进行数据管理和根据查询生成动态网页也是其中极其重要的一部分，一方面，数据库提高了数据管理的能力，使得数据可以重用和进行必要的数据分析;另一方面，通过数据库进行动态网页的生成，大大提高了网页设计和开发的效率，减少了静态网页的设计和开发任务，并保证了Internet应用的数据一致性和设计风格的一致性，同时数据库还大大提高了Internet应用数据维护的方便性和效率。然而，通过数据库建设Internet应用，也存在数据库选型问题，即选用什么数据库，能够对数据库实现什么样的检索能力，具有什么样的检索效率，也是用户必须考虑的问题。　　在90年代初期，用户设计和开发Internet应用时，只有唯一的选择，即必须采用关系数据库，通过应用服务器和各种中间件产品，实现对数据库的数据检索、维护和显示。然而，随着技术的不断发展，这种局面正在改变，用户可以有更多的选择机会，采用不同的数据库产品、不同的查询和检索方式来设计和构造自己的Internet应用。从严格意义上说，传统关系数据库经过了多年的针对Internet应用的发展和完善，具有自己的传统意义上的优势。针对Internet网上应用而设计和开发的产品，则克服了传统关系数据库在Internet应用上的一些局限，大大提高了网上应用的效率。　　下面仅就Internet应用中数据库建设的几种方案进行比较： 一、 关系数据库建设方案　　关系数据库最初设计目标是基于主机/终端方式的大型机上的应用，应用范围较为有限，随着客户机/服务器方式的流行和应用向客户机方的分解，关系数据库又经历了客户机/服务器时代，并获得了极大的发展。随着Internet应用的普及，由于Internet上信息资源的复杂性和不规范性，关系数据库初期在开发各种网上应用时显得力不从心，表现在无法管理各种网上的复杂的文档型和多媒体型数据资源。后来关系数据库对于这些需求作出了一些适应性调整，如增加数据库的面向对象成分以增加处理多种复杂数据类型的能力，增加各种中间件以扩展基于Internet应用能力，通过应用服务器解释执行各种HTML中嵌入脚本来解决Internet应用中数据库数据的显示、维护、输出以及到HTML的格式转换等。此时关系数据库的基于Internet应用的模式典型表现为一种三层或四层的多层结构。　　在这种多层结构体系下，关系数据库解决了数据库的Internet应用的方法问题，使得基于关系数据库能够开发各种网上数据库数据的发布、检索、维护、数据管理等一般性应用。　　但是可以说关系数据库从设计之初并没有也不可能考虑到以HTTP为基础、HTML为文件格式的因特网的需求，只是在因特网出现后才作出相应的调整，因此关系数据库在基于Internet应用时由于结构模型等原因的限制，不能与Internet完全融合，需在Internet与数据库之间加入大量的中间件，从而在无形中加大了数据库基于网络应用的难度。并且对于网络环境下Internet应用，如各种非结构化文档信息、多媒体信息以及全文检索需求显得力不从心。虽然后来关系数据库对于这些需求作出了一些适应性调整，但对于网络环境下Internet应用不可或缺的检索效率、全文检索能力等却无法解决。同时，关系数据库的基于中间件的解决方案又给Internet应用带来了新的网络瓶颈，应用服务器端由于与数据库频繁交互，因其本身的效率和数据库检索的效率造成Internet应用在应用服务器端的阻塞。二、 iBASE非结构化数据库建设方案　　Internet的迅猛发展使数据库应用环境发生了巨大的变化。电子商务、Web 医院、远程教育、移动计算等都需要新的数据库技术支持。因此，对半结构化和无结构数据模型的描述、管理、查询和安全控制等问题的研究已成为新的研究课题，特别是Web数据库发展是新热点和难题。　　从数据库技术发展的角度看，以前通过浏览器访问数据库的唯一渠道是CGI，随后又出现ISAPI、NSAPI和ODBC、JDBC、ASP、PHP、JSP等技术方案，但均没有实现Web服务器和数据库服务器的有机结合，让数据库系统和技术成为Web的重要有机组成部分。　　iBASE非结构化数据库在出现之前经过了近10年的研发，在充分考虑到因特网的实际和需求的前提下,北京国信贝斯软件有限公司(http://www. ibase.com.cn)基于自己的非结构化数据库和全文检索技术，将TCP/IP、HTTP协议、HTML语言等网络技术紧密结合，推出iBASE WEB非结构化网络数据库系统。iBASE WEB非结构化网络数据库系统提供了将iBASE非结构化数据库和各种传统关系数据库方便上网发布的能力，同时对于数据库的网上发布还提供了极高的检索效率和强大的全文检索能力，能够满足网络环境下各种Internet应用的需要。　　针对Internet应用的特殊性，iBASE非结构化网络数据库系统主要解决了Internet数据库应用的几大难点：1、文档型和多媒体数据类型的支持问题　　在Internet应用中，存在大量的复杂数据类型，如各种超文本文档信息，各种图片、声音等多媒体信息资源，如何对这些信息资源进行有效的存储、管理、检索，是Internet数据库必须解决的问题，iBASE非结构化网络数据库系统通过其外部文件数据类型，可以管理各种文档信息、多媒体信息，并且，对于各种具有检索意义的文档信息资源，如HTML、DOC、RTF、TXT等还提供了强大的全文检索能力。2、数据库的全文检索问题　　 在Internet应用中，由于信息资源极其繁多，如何从浩瀚的信息海洋中查找到所需的信息，如何保证所查询信息的全面性和准确性，也是一个Internet数据库应用必须解决的问题。iBASE非结构化网络数据库系统通过其独特的索引技术和基于布尔检索表达式的查询检索算法，解决了基于字段级和数据库级的全文检索问题，用户可以针对数据库中特定的字段也可针对整个数据库进行全文检索，从而从数据库中检索出感兴趣的内容。同时，其强大的索引表达式构造能力和布尔检索表达式解析能力，使用户可以构造极其灵活的Internet数据库全文检索应用。3、Internet数据库应用中的查询和检索效率问题　　作为Internet应用，由于需要面对大量的用户群和大量的瞬时并发数据库查询检索，其数据库查询和检索效率就是一个极其关键的问题。iBASE非结构化网络数据库系统主要通过以下途径来保证数据库查询和检索的效率。　　iBASE非结构化网络数据库系统提供了重复字段和子字段的支持能力，通过这种能力，在构造数据库时，可以实现数据库的一条记录中一维表和二维表嵌套，从而避免了关系数据库在大数据量时由于表连接查询而导致的查询检索性能的急剧降低。　　作为Internet数据库应用，一般采用多层结构，由于多层结构以及各种中间件产品在相互连接和交互时，需要交换大量信息和占用处理器资源，也会导致Internet数据库应用性能的降低。iBASE非结构化网络数据库系统实现了WEB Server、Application Server、DB Server的紧密集成，使数据库系统和技术成为Web的一个重要有机组成部分,实现数据库和Web的有机组合。4、对现有Internet应用的全文检索支持问题　　iBASE非结构化网络数据库系统不仅能够支持iBASE非结构化数据库的直接上网发布和全文检索，对于传统关系型数据库，如Oracle、SYBASE、SQL Server、DB2、Informix等，也提供了导入和链结的支持能力，用户可以采用导入方式，将传统关系数据库转换为iBASE非结构化数据库，再进行网上发布和开发全文检索应用；用户也可采用链结方式，对传统关系数据库构建本地化索引，从而通过本地化索引实现对关系数据库的全文检索支持，iBASE非结构化网络数据库系统充当关系数据库应用服务器，系统的检索效率也将受关系数据库自身检索效率和应用服务器交互效率的影响。三、 Internet数据库方案比较　　Internet数据库建设到底采用何种数据库，摆在用户面前的至少有三种方案：关系数据库建设方案、iBASE非结构化网络数据库建设方案、关系数据库和iBASE非结构化网络数据库共存方案。　　在事务处理和数值计算方面，由于关系数据库经过了多年的发展，其在事务处理、数值计算方面具有强大的能力并已被证实，而iBASE数据库目前在事务处理和对于数值计算方面的支持则相对薄弱，因此，对于偏向事务处理和数值计算方面的Internet数据库建设，关系数据库建设方案应该说更有优势。　　在对于超文本、文档信息管理和数据库全文检索方面，关系数据库通过其MEMO或TEXT字段等也能实现这种信息的存储，而对于这些信息或数据库的全文检索，关系数据库则显得捉襟见肘。虽然一些网站通过关系数据库构造了一些所谓的“全文搜索引擎”，但实质上，只是在关系数据库中进行基于字段的一种字符串匹配检索，检索时需要对数据库进行顺序扫描，效率极其低下，在数据量较少时尚可胜任，但任何一个Internet应用是不但发展的，随着数据量的不但增大，这种检索方式的必将成为Internet应用的效率及发展的致命的瓶颈。而iBASE WEB非结构化网络数据库系统则完全解决了网上数据库的全文检索问题，通过其独特的单汉字、单英文词、英文字母的索引方式及B*树索引算法，能够高效地解决数据库的网上全文检索问题，构造出强大的网上全文搜索引擎。因此，在对于超文本、文档信息管理和数据库全文检索方面，iBASE非结构化网络数据库建设方案应为首选。　　然而，Internet数据库建设并不能从严格意义上按以上两种情况进行区分，但有一点可以肯定的是，大多数Internet应用都会有全文检索或构建搜索引擎的需求，从理论上讲，除事务处理能力外，iBASE非结构化网络数据库能够处理所有关系数据库支持的Internet应用方式，并能对数据库进行全文检索扩展，也就是说，完全可以利用iBASE非结构化网络数据库构建独立的Internet应用。　　对于一些特殊的Internet应用，我们也可以采用关系数据库和iBASE非结构化网络数据库两者共存的建设方案，实现两者的无缝集成，以发挥两者各自的长处。]]></description>
			<content:encoded><![CDATA[<p>　　在Internet应用中，除设计静态网页以外，通过数据库进行数据管理和根据查询生成动态网页也是其中极其重要的一部分，一方面，数据库提高了数据管理的能力，使得数据可以重用和进行必要的数据分析;另一方面，通过数据库进行动态网页的生成，大大提高了网页设计和开发的效率，减少了静态网页的设计和开发任务，并保证了Internet应用的数据一致性和设计风格的一致性，同时数据库还大大提高了Internet应用数据维护的方便性和效率。然而，通过数据库建设Internet应用，也存在数据库选型问题，即选用什么数据库，能够对数据库实现什么样的检索能力，具有什么样的检索效率，也是用户必须考虑的问题。<BR><P>　　在90年代初期，用户设计和开发Internet应用时，只有唯一的选择，即必须采用关系数据库，通过应用服务器和各种中间件产品，实现对数据库的数据检索、维护和显示。然而，随着技术的不断发展，这种局面正在改变，用户可以有更多的选择机会，采用不同的数据库产品、不同的查询和检索方式来设计和构造自己的Internet应用。<BR>从严格意义上说，传统关系数据库经过了多年的针对Internet应用的发展和完善，具有自己的传统意义上的优势。针对Internet网上应用而设计和开发的产品，则克服了传统关系数据库在Internet应用上的一些局限，大大提高了网上应用的效率。</P><P>　　下面仅就Internet应用中数据库建设的几种方案进行比较： </P><P><FONT color=#ff0000>一、 关系数据库建设方案</FONT></P><P>　　关系数据库最初设计目标是基于主机/终端方式的大型机上的应用，应用范围较为有限，随着客户机/服务器方式的流行和应用向客户机方的分解，关系数据库又经历了客户机/服务器时代，并获得了极大的发展。随着Internet应用的普及，由于Internet上信息资源的复杂性和不规范性，关系数据库初期在开发各种网上应用时显得力不从心，表现在无法管理各种网上的复杂的文档型和多媒体型数据资源。后来关系数据库对于这些需求作出了一些适应性调整，如增加数据库的面向对象成分以增加处理多种复杂数据类型的能力，增加各种中间件以扩展基于Internet应用能力，通过应用服务器解释执行各种HTML中嵌入脚本来解决Internet应用中数据库数据的显示、维护、输出以及到HTML的格式转换等。此时关系数据库的基于Internet应用的模式典型表现为一种三层或四层的多层结构。</P><P>　　在这种多层结构体系下，关系数据库解决了数据库的Internet应用的方法问题，使得基于关系数据库能够开发各种网上数据库数据的发布、检索、维护、数据管理等一般性应用。</P><P>　　但是可以说关系数据库从设计之初并没有也不可能考虑到以HTTP为基础、HTML为文件格式的因特网的需求，只是在因特网出现后才作出相应的调整，因此关系数据库在基于Internet应用时由于结构模型等原因的限制，不能与Internet完全融合，需在Internet与数据库之间加入大量的中间件，从而在无形中加大了数据库基于网络应用的难度。并且对于网络环境下Internet应用，如各种非结构化文档信息、多媒体信息以及全文检索需求显得力不从心。虽然后来关系数据库对于这些需求作出了一些适应性调整，但对于网络环境下Internet应用不可或缺的检索效率、全文检索能力等却无法解决。同时，关系数据库的基于中间件的解决方案又给Internet应用带来了新的网络瓶颈，应用服务器端由于与数据库频繁交互，因其本身的效率和数据库检索的效率造成Internet应用在应用服务器端的阻塞。</P><P><FONT color=#ff0000>二、 iBASE非结构化数据库建设方案<BR></FONT><BR>　　Internet的迅猛发展使数据库应用环境发生了巨大的变化。电子商务、Web 医院、远程教育、移动计算等都需要新的数据库技术支持。因此，对半结构化和无结构数据模型的描述、管理、查询和安全控制等问题的研究已成为新的研究课题，特别是Web数据库发展是新热点和难题。<BR><BR>　　从数据库技术发展的角度看，以前通过浏览器访问数据库的唯一渠道是CGI，随后又出现ISAPI、NSAPI和ODBC、JDBC、ASP、PHP、JSP等技术方案，但均没有实现Web服务器和数据库服务器的有机结合，让数据库系统和技术成为Web的重要有机组成部分。<BR><BR>　　iBASE非结构化数据库在出现之前经过了近10年的研发，在充分考虑到因特网的实际和需求的前提下,北京国信贝斯软件有限公司(http://www. ibase.com.cn)基于自己的非结构化数据库和全文检索技术，将TCP/IP、HTTP协议、HTML语言等网络技术紧密结合，推出iBASE WEB非结构化网络数据库系统。iBASE WEB非结构化网络数据库系统提供了将iBASE非结构化数据库和各种传统关系数据库方便上网发布的能力，同时对于数据库的网上发布还提供了极高的检索效率和强大的全文检索能力，能够满足网络环境下各种Internet应用的需要。<BR><BR>　　针对Internet应用的特殊性，iBASE非结构化网络数据库系统主要解决了Internet数据库应用的几大难点：<FONT color=#0000ff><BR><BR>1、文档型和多媒体数据类型的支持问题</FONT><BR><BR>　　在Internet应用中，存在大量的复杂数据类型，如各种超文本文档信息，各种图片、声音等多媒体信息资源，如何对这些信息资源进行有效的存储、管理、检索，是Internet数据库必须解决的问题，iBASE非结构化网络数据库系统通过其外部文件数据类型，可以管理各种文档信息、多媒体信息，并且，对于各种具有检索意义的文档信息资源，如HTML、DOC、RTF、TXT等还提供了强大的全文检索能力。<BR><BR><FONT color=#0000ff>2、数据库的全文检索问题</FONT><BR><BR>　　 在Internet应用中，由于信息资源极其繁多，如何从浩瀚的信息海洋中查找到所需的信息，如何保证所查询信息的全面性和准确性，也是一个Internet数据库应用必须解决的问题。iBASE非结构化网络数据库系统通过其独特的索引技术和基于布尔检索表达式的查询检索算法，解决了基于字段级和数据库级的全文检索问题，用户可以针对数据库中特定的字段也可针对整个数据库进行全文检索，从而从数据库中检索出感兴趣的内容。同时，其强大的索引表达式构造能力和布尔检索表达式解析能力，使用户可以构造极其灵活的Internet数据库全文检索应用。<BR><BR><FONT color=#0000ff>3、Internet数据库应用中的查询和检索效率问题</FONT><BR><BR>　　作为Internet应用，由于需要面对大量的用户群和大量的瞬时并发数据库查询检索，其数据库查询和检索效率就是一个极其关键的问题。iBASE非结构化网络数据库系统主要通过以下途径来保证数据库查询和检索的效率。<BR><BR>　　iBASE非结构化网络数据库系统提供了重复字段和子字段的支持能力，通过这种能力，在构造数据库时，可以实现数据库的一条记录中一维表和二维表嵌套，从而避免了关系数据库在大数据量时由于表连接查询而导致的查询检索性能的急剧降低。<BR><BR>　　作为Internet数据库应用，一般采用多层结构，由于多层结构以及各种中间件产品在相互连接和交互时，需要交换大量信息和占用处理器资源，也会导致Internet数据库应用性能的降低。iBASE非结构化网络数据库系统实现了WEB Server、Application Server、DB Server的紧密集成，使数据库系统和技术成为Web的一个重要有机组成部分,实现数据库和Web的有机组合。<BR><BR><FONT color=#0000ff>4、对现有Internet应用的全文检索支持问题</FONT><BR><BR>　　iBASE非结构化网络数据库系统不仅能够支持iBASE非结构化数据库的直接上网发布和全文检索，对于传统关系型数据库，如Oracle、SYBASE、SQL Server、DB2、Informix等，也提供了导入和链结的支持能力，用户可以采用导入方式，将传统关系数据库转换为iBASE非结构化数据库，再进行网上发布和开发全文检索应用；用户也可采用链结方式，对传统关系数据库构建本地化索引，从而通过本地化索引实现对关系数据库的全文检索支持，iBASE非结构化网络数据库系统充当关系数据库应用服务器，系统的检索效率也将受关系数据库自身检索效率和应用服务器交互效率的影响。</P><P><FONT color=#ff0000>三、 Internet数据库方案比较</FONT><BR><BR>　　Internet数据库建设到底采用何种数据库，摆在用户面前的至少有三种方案：关系数据库建设方案、iBASE非结构化网络数据库建设方案、关系数据库和iBASE非结构化网络数据库共存方案。<BR><BR>　　在事务处理和数值计算方面，由于关系数据库经过了多年的发展，其在事务处理、数值计算方面具有强大的能力并已被证实，而iBASE数据库目前在事务处理和对于数值计算方面的支持则相对薄弱，因此，对于偏向事务处理和数值计算方面的Internet数据库建设，关系数据库建设方案应该说更有优势。<BR><BR>　　在对于超文本、文档信息管理和数据库全文检索方面，关系数据库通过其MEMO或TEXT字段等也能实现这种信息的存储，而对于这些信息或数据库的全文检索，关系数据库则显得捉襟见肘。虽然一些网站通过关系数据库构造了一些所谓的“全文搜索引擎”，但实质上，只是在关系数据库中进行基于字段的一种字符串匹配检索，检索时需要对数据库进行顺序扫描，效率极其低下，在数据量较少时尚可胜任，但任何一个Internet应用是不但发展的，随着数据量的不但增大，这种检索方式的必将成为Internet应用的效率及发展的致命的瓶颈。而iBASE WEB非结构化网络数据库系统则完全解决了网上数据库的全文检索问题，通过其独特的单汉字、单英文词、英文字母的索引方式及B*树索引算法，能够高效地解决数据库的网上全文检索问题，构造出强大的网上全文搜索引擎。因此，在对于超文本、文档信息管理和数据库全文检索方面，iBASE非结构化网络数据库建设方案应为首选。<BR><BR>　　然而，Internet数据库建设并不能从严格意义上按以上两种情况进行区分，但有一点可以肯定的是，大多数Internet应用都会有全文检索或构建搜索引擎的需求，从理论上讲，除事务处理能力外，iBASE非结构化网络数据库能够处理所有关系数据库支持的Internet应用方式，并能对数据库进行全文检索扩展，也就是说，完全可以利用iBASE非结构化网络数据库构建独立的Internet应用。<BR><BR>　　对于一些特殊的Internet应用，我们也可以采用关系数据库和iBASE非结构化网络数据库两者共存的建设方案，实现两者的无缝集成，以发挥两者各自的长处。</P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83internet%e6%95%b0%e6%8d%ae%e5%ba%93%e5%bb%ba%e8%ae%be%e6%96%b9%e6%a1%88%e6%af%94%e8%be%83/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>[软考]数据库为网格设计</title>
		<link>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83%e6%95%b0%e6%8d%ae%e5%ba%93%e4%b8%ba%e7%bd%91%e6%a0%bc%e8%ae%be%e8%ae%a1</link>
		<comments>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83%e6%95%b0%e6%8d%ae%e5%ba%93%e4%b8%ba%e7%bd%91%e6%a0%bc%e8%ae%be%e8%ae%a1#comments</comments>
		<pubDate>Thu, 12 May 2011 06:33:30 +0000</pubDate>
		<dc:creator>liaowei</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83%e6%95%b0%e6%8d%ae%e5%ba%93%e4%b8%ba%e7%bd%91%e6%a0%bc%e8%ae%be%e8%ae%a1</guid>
		<description><![CDATA[作为一名网格用户，您最关心的是什么？ 　　答案是网格计算作为类似于电力网或电话网等公用设施一样的计算模式，用户只需要关心数据及进行计算的位置。因为从服务器端来看，网格与虚拟化和供应有关。将所有的资源集中在一起，然后根据业务需求动态地供应这些资源，从而可以同时实现更好的资源利用率。由此看来，网格计算正在改变着计算经济学。 转向网格计算 　　从IT 行业的趋势来看，企业也正在向网格计算转移，这在很大程度上是由硬件革新——低成本的刀片服务器驱动的。同时，共享存储技术也简化了硬件的虚拟化和供应，硬件供应商也开始提供实现硬件虚拟化和供应的管理软件。而只有当运行在硬件上的软件能够有效利用硬件革新时，这些革新才更有价值。 硬件趋势 　　使网格计算成为可能的主要原因是围绕着硬件的革新。例如:　　· 处理器 新的低成本、高容量的Intel Itanium 2、Sun SPARC 和IBM PowerPC 64 位处理器所提供的性能等于或者优于在高端SMP 服务器中使用的处理器。　　· 服务器 与同类产品相比，刀片服务器技术以其极低的成本提供了较高的密集计算能力。由于这些刀片服务器还自带了远程管理功能，使得数据中心管理员可以较为容易地管理这些系统。　　· 网络化存储 目前，网络附加存储(NAS) 和存储区域网(SAN) 在数据中心中已经得到了广泛的应用，存储已不再局限在单台服务器上。　　· 网络互联 千兆位以太网和无限带宽互联技术正不断降低连接服务器集群的成本。 软件趋势 　　在软件中，Linux 继续保持比其它任何OS 更快的发展势头。今天，尽管Linux 还不能适应大型的SMP，但由于刀片服务器有1～4个CPU，Linux 已经可以在其上很好地运行。刀片服务器优于SMP的经济优势将使得刀片服务器占据市场支配地位。另外，由于Linux 本身所具有的价格优势，随着刀片服务器数量的增多，这将变得更加重要，从而也将加速Linux的普遍采用。因此，标准的低成本刀片服务器集群自然与Linux非常相配。 简化网格管理 　　Oracle数据库10g是第一个为网格计算设计的数据库。它利用了基于网格的硬件革新，并使用户更容易地在这些标准化、模块化的硬件组件上安装和配置Oracle数据库。作为网格资源（服务器和存储器）的消费者以及数据的提供者，Oracle 数据库10g利用了网格计算的三个基本属性（每一层计算堆栈之间的虚拟化、基于企业策略和动态需求的工作和资源供应、集中资源以提高利用率），使Oracle 数据库使用硬件组件（存储器和服务器）的方式虚拟化。它自动地将集群化的存储器和服务器供应给运行在网格中的不同数据库。作为数据的提供者，Oracle数据库10g提供了各种技术，Oracle管理员可以利用这些技术来为网格用户和应用程序集中、虚拟化和供应数据。此外，运行在网格上的企业在安全性、高可用性、自依赖性和可管理性方面还具有严格的操作要求。 　　Oracle数据库10g 自身所具有的技术优势，简化了网格的管理和操作。具体地说，该数据库的特点如下： 自动存储管理 　　自动存储管理(ASM)使存储虚拟化，并且提供了轻松的数据库存储供应。用户可以使用标准、低成本、模块化的组件来存储所有的Oracle 数据，也可以使用单个ASM来为多个Oracle 数据库管理存储。ASM仅要求用户管理少量的磁盘组，而不是管理许多数据库文件。一个磁盘组是一组磁盘设备的集合，ASM将其作为单个逻辑单元来管理。另外，用户可以定义一个特别的磁盘组作为数据库的默认磁盘组，Oracle 自动为该数据库分配存储资源，以及创建或删除与该数据库相关的文件。 　　ASM还提供了一些存储技术方面的功能，如镜像或逻辑卷管理器(LVM)。类似于这些技术，ASM 使用户能够从单独磁盘设备的集合中创建单一磁盘组。它可以跨磁盘组中的所有设备均衡到该磁盘组的I/O，并执行条带划分和镜像存储来改善I/O 性能和数据可靠性。当存储配置发生变化时，ASM 都将自动再均衡数据库的存储资源。 可移植的集群组件 　　集群组件是为集群中服务器间的通信提供集群化服务的软件。在Oracle 数据库10g 之前，用户可以依赖硬件供应商来提供其平台上的集群组件（除了Linux 和Windows 平台）。Oracle只为Linux 和Windows 平台提供集群组件，Oracle [...]]]></description>
			<content:encoded><![CDATA[<p>作为一名网格用户，您最关心的是什么？ <P>　　答案是网格计算作为类似于电力网或电话网等公用设施一样的计算模式，用户只需要关心数据及进行计算的位置。因为从服务器端来看，网格与虚拟化和供应有关。将所有的资源集中在一起，然后根据业务需求动态地供应这些资源，从而可以同时实现更好的资源利用率。由此看来，网格计算正在改变着计算经济学。 </P><P><FONT color=#ff0000>转向网格计算</FONT> </P><P>　　从IT 行业的趋势来看，企业也正在向网格计算转移，这在很大程度上是由硬件革新——低成本的刀片服务器驱动的。同时，共享存储技术也简化了硬件的虚拟化和供应，硬件供应商也开始提供实现硬件虚拟化和供应的管理软件。而只有当运行在硬件上的软件能够有效利用硬件革新时，这些革新才更有价值。 </P><P><FONT color=#ff0000>硬件趋势</FONT> </P><P>　　使网格计算成为可能的主要原因是围绕着硬件的革新。例如:<BR></P><P>　　· 处理器 新的低成本、高容量的Intel Itanium 2、Sun SPARC 和IBM PowerPC 64 位处理器所提供的性能等于或者优于在高端SMP 服务器中使用的处理器。<BR></P><P>　　· 服务器 与同类产品相比，刀片服务器技术以其极低的成本提供了较高的密集计算能力。由于这些刀片服务器还自带了远程管理功能，使得数据中心管理员可以较为容易地管理这些系统。<BR></P><P>　　· 网络化存储 目前，网络附加存储(NAS) 和存储区域网(SAN) 在数据中心中已经得到了广泛的应用，存储已不再局限在单台服务器上。<BR></P><P>　　· 网络互联 千兆位以太网和无限带宽互联技术正不断降低连接服务器集群的成本。 </P><P><FONT color=#ff0000>软件趋势</FONT> </P><P>　　在软件中，Linux 继续保持比其它任何OS 更快的发展势头。今天，尽管Linux 还不能适应大型的SMP，但由于刀片服务器有1～4个CPU，Linux 已经可以在其上很好地运行。刀片服务器优于SMP的经济优势将使得刀片服务器占据市场支配地位。另外，由于Linux 本身所具有的价格优势，随着刀片服务器数量的增多，这将变得更加重要，从而也将加速Linux的普遍采用。因此，标准的低成本刀片服务器集群自然与Linux非常相配。 </P><P><FONT color=#ff0000>简化网格管理</FONT> </P><P>　　Oracle数据库10g是第一个为网格计算设计的数据库。它利用了基于网格的硬件革新，并使用户更容易地在这些标准化、模块化的硬件组件上安装和配置Oracle数据库。作为网格资源（服务器和存储器）的消费者以及数据的提供者，Oracle 数据库10g利用了网格计算的三个基本属性（每一层计算堆栈之间的虚拟化、基于企业策略和动态需求的工作和资源供应、集中资源以提高利用率），使Oracle 数据库使用硬件组件（存储器和服务器）的方式虚拟化。它自动地将集群化的存储器和服务器供应给运行在网格中的不同数据库。作为数据的提供者，Oracle数据库10g提供了各种技术，Oracle管理员可以利用这些技术来为网格用户和应用程序集中、虚拟化和供应数据。此外，运行在网格上的企业在安全性、高可用性、自依赖性和可管理性方面还具有严格的操作要求。 </P><P>　　Oracle数据库10g 自身所具有的技术优势，简化了网格的管理和操作。具体地说，该数据库的特点如下： </P><P><FONT color=#ff0000>自动存储管理</FONT> </P><P>　　自动存储管理(ASM)使存储虚拟化，并且提供了轻松的数据库存储供应。用户可以使用标准、低成本、模块化的组件来存储所有的Oracle 数据，也可以使用单个ASM来为多个Oracle 数据库管理存储。ASM仅要求用户管理少量的磁盘组，而不是管理许多数据库文件。一个磁盘组是一组磁盘设备的集合，ASM将其作为单个逻辑单元来管理。另外，用户可以定义一个特别的磁盘组作为数据库的默认磁盘组，Oracle 自动为该数据库分配存储资源，以及创建或删除与该数据库相关的文件。 </P><P>　　ASM还提供了一些存储技术方面的功能，如镜像或逻辑卷管理器(LVM)。类似于这些技术，ASM 使用户能够从单独磁盘设备的集合中创建单一磁盘组。它可以跨磁盘组中的所有设备均衡到该磁盘组的I/O，并执行条带划分和镜像存储来改善I/O 性能和数据可靠性。当存储配置发生变化时，ASM 都将自动再均衡数据库的存储资源。 </P><P><FONT color=#ff0000>可移植的集群组件 </FONT></P><P>　　集群组件是为集群中服务器间的通信提供集群化服务的软件。在Oracle 数据库10g 之前，用户可以依赖硬件供应商来提供其平台上的集群组件（除了Linux 和Windows 平台）。Oracle只为Linux 和Windows 平台提供集群组件，Oracle 数据库10g 现在提供了可移植的集群组件。也就是说，Oracle 提供了一个可以在所有平台上运行的集群组件，用户不需要依赖供应商提供的集群组件。这也会给他们带来很多好处，如：有单个支持点，不需要依靠多个供应商来解决支持问题；诊断和解决问题变得容易，没有任何由供应商施加的限制，利用可移植的集群组件，即可将集群扩大为任何想要的规模。 </P><P>　　此外，Oracle 也便于用户安装可移植集群。利用单次安装，用户可以确定希望安装可移植集群组件的节点，Oracle Universal Installer 将在所有这些节点上安装可移植集群组件。 </P><P><FONT color=#ff0000>高速无限带宽网络支持 </FONT></P><P>　　Oracle数据库10g利用高速互联技术（如无限带宽）提供更好的性能和可伸缩性。用户可以全面使用无限带宽来进行网络通信。它提供了许多好处，主要表现为：无限带宽提供了超过千兆位以太网的许多性能改善；用户可以使用单个网络基础架构来进行不同服务器之间、以及服务器和存储器之间的通信，简化了数据中心的连接需求；利用简化的网络基础架构，用户可以使用单个网络底板，使得网络供应更加容易。利用Oracle数据库10g，用户现在可以使用无限带宽来进行应用服务器到数据库服务器的通信、集群数据库中服务器到服务器的通信，以及服务器到存储器的通信，从而为企业的数据中心提供了全面的性能改善和灵活性。 </P><P><FONT color=#ff0000>计算资源供应 </FONT></P><P>　　网格计算的宗旨是能够根据不断变化的优先级动态分配资源。Oracle数据库10g 有许多改进和新的功能，便于用户分配计算资源以适应业务需求。 </P><P>　　Oracle Real Application Clister (RAC) 具有标准、低成本、模块化服务器（如刀片服务器）集群的高利用率。用户可以在一个刀片服务器集群上运行单个Oracle 数据库。运行在RAC 上的应用程序，能够动态地利用供应给它们的更多的刀片服务器。同样，当应用程序不再需要这些刀片服务器时，能够容易地释放它们。相反，标准级数据库在标准级组件上具有非常低的利用率。在标准级数据库上，用户需要为高峰负载分配资源并且分配备用资源。只有整个系统停止工作，才能向标准级数据库中添加或删除刀片服务器。由于不进行共享，数据被人为地分区。当增加了更多的刀片服务器时，所有的数据都需要重新分区，并将数据分配给新的刀片服务器。类似地，当需要删除刀片服务器时，在删除前需要重新对数据分区。 </P><P>　　Oracle数据库10g为RAC数据库内的服务提供自动负载管理。当在托管服务的例程间建立连接时，RAC会自动地为这些连接执行负载均衡。此外，利用资源管理器，用户可以制订策略，并给运行在RAC 数据库内的服务分配资源。为了满足这些策略，RAC 将自动向这些服务供应数据库例程。 </P><P><FONT color=#ff0000>共振 </FONT></P><P>　　Oracle数据库10g的最显著特性之一是共振——自己定义集群。集群是一组服务器的集合，这些服务器通过Oracle 可移植集群组件集群在一起。用户可以在相同的集群上运行许多数据库，并且为这些数据库定义服务策略。共振将动态地增加或减少集群中服务器（个人数据库在其上运行）的数量来满足服务级目标。该任务可以自动完成，无需任何用户干预。 </P><P><FONT color=#ff0000>结论</FONT> </P><P>　　由于以上只是Oracle数据库10g的主要技术特色，其它的新增功能在此不再赘述。尽管它还没有网格的统一定义，但网格计算本身所存在一些基本属性，可以让企业享受网格的好处。硬件新的革新和新的经济性，使得网格计算在硬件层成为可能，并且切合实际。 </P><P>　　可以说，Oracle数据库10g 利用其强大的安全性、自依赖性和可管理性产品解决了企业网格的严格操作要求。利用Oracle数据库10g中的网格优势，用户可在Oracle 产品中进行投资，并将它作为未来的网格计算技术。 </P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83%e6%95%b0%e6%8d%ae%e5%ba%93%e4%b8%ba%e7%bd%91%e6%a0%bc%e8%ae%be%e8%ae%a1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】SQL Server中各个系统表的作用</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91sql-server%e4%b8%ad%e5%90%84%e4%b8%aa%e7%b3%bb%e7%bb%9f%e8%a1%a8%e7%9a%84%e4%bd%9c%e7%94%a8</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91sql-server%e4%b8%ad%e5%90%84%e4%b8%aa%e7%b3%bb%e7%bb%9f%e8%a1%a8%e7%9a%84%e4%bd%9c%e7%94%a8#comments</comments>
		<pubDate>Thu, 12 May 2011 06:33:30 +0000</pubDate>
		<dc:creator>liaowei</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91sql-server%e4%b8%ad%e5%90%84%e4%b8%aa%e7%b3%bb%e7%bb%9f%e8%a1%a8%e7%9a%84%e4%bd%9c%e7%94%a8</guid>
		<description><![CDATA[sysaltfiles 主数据库 保存数据库的文件 　　syscharsets 主数据库 字符集与排序顺序 　　sysconfigures 主数据库 配置选项 　　syscurconfigs 主数据库 当前配置选项 　　sysdatabases 主数据库 服务器中的数据库 　　syslanguages 主数据库 语言 　　syslogins 主数据库 登陆帐号信息 　　sysoledbusers 主数据库 链接服务器登陆信息 　　sysprocesses 主数据库 进程 　　sysremotelogins 主数据库 远程登录帐号 　　syscolumns 每个数据库 列 　　sysconstrains 每个数据库 限制 　　sysfilegroups 每个数据库 文件组 　　sysfiles 每个数据库 文件 　　sysforeignkeys 每个数据库 外部关键字 　　sysindexs 每个数据库 索引 　　sysmenbers 每个数据库 角色成员 　　sysobjects 每个数据库 所有数据库对象 　　syspermissions [...]]]></description>
			<content:encoded><![CDATA[<p>sysaltfiles 主数据库 保存数据库的文件 <BR>　　syscharsets 主数据库 字符集与排序顺序 <BR>　　sysconfigures 主数据库 配置选项 <BR>　　syscurconfigs 主数据库 当前配置选项 <BR>　　sysdatabases 主数据库 服务器中的数据库 <BR>　　syslanguages 主数据库 语言 <BR>　　syslogins 主数据库 登陆帐号信息 <BR>　　sysoledbusers 主数据库 链接服务器登陆信息 <BR>　　sysprocesses 主数据库 进程 <BR>　　sysremotelogins 主数据库 远程登录帐号 <BR>　　syscolumns 每个数据库 列 <BR>　　sysconstrains 每个数据库 限制 <BR>　　sysfilegroups 每个数据库 文件组 <BR>　　sysfiles 每个数据库 文件 <BR>　　sysforeignkeys 每个数据库 外部关键字 <BR>　　sysindexs 每个数据库 索引 <BR>　　sysmenbers 每个数据库 角色成员 <BR>　　sysobjects 每个数据库 所有数据库对象 <BR>　　syspermissions 每个数据库 权限 <BR>　　systypes 每个数据库 用户定义数据类型 <BR>　　sysusers 每个数据库 用户</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91sql-server%e4%b8%ad%e5%90%84%e4%b8%aa%e7%b3%bb%e7%bb%9f%e8%a1%a8%e7%9a%84%e4%bd%9c%e7%94%a8/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】MD5算法基础</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91md5%e7%ae%97%e6%b3%95%e5%9f%ba%e7%a1%80</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91md5%e7%ae%97%e6%b3%95%e5%9f%ba%e7%a1%80#comments</comments>
		<pubDate>Thu, 12 May 2011 06:33:29 +0000</pubDate>
		<dc:creator>liaowei</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91md5%e7%ae%97%e6%b3%95%e5%9f%ba%e7%a1%80</guid>
		<description><![CDATA[MD5产生一个128位的HASH值，在经过一写初始树立后，将明文分成了512位的块，再将每一块分成16个32位的子块。算法的输出是4个32位的块，连接起来构成128位的HASH值。 &#160;&#160;&#160; 首先，将消息填充到比512的倍数少64位，填充时先向消息末尾填一个1，然后再填满0，然后后面再加上一个64位的消息长度的表示（不包括填充位）。这两步使消息长度恰好是512的倍数，同时保证不同消息在填充后仍不相同。 &#160;&#160;&#160; 初始化4个32位变量： &#160;&#160;&#160; A=0&#215;01234567 &#160;&#160;&#160; B=0x89abcdef &#160;&#160;&#160; C=0xfedcba98 &#160;&#160;&#160; D=0&#215;76543210 这些变量成为链变量。 然后，开始算法的主循环。这个循环对消息中所有的块都执行一次。将4个变量复制到不同的变量：a值为A，b值为B，c值为C，d值为D。 &#160;&#160;&#160; 主循环有4圈，都很相似。每圈使用一个不同的操作，重复16次。每个操作完成一个a,b,c和d中三个变量的非线性函数。然后，将结果与第四个变量、文本的一个子块和一个常数相加。然后，将结果混换左移一个可变值的位数，再将结果与a,b,c和d之一相加。最后用结果来代替a,b,c和d之一。 &#160;&#160;&#160; 共有4个非线性函数，每次操作使用一个，每圈都不相同。 &#160;&#160;&#160; F(X,Y,Z)=(X∧Y)∨((「X)∧Z) &#160;&#160;&#160; G(X,Y,Z)=(X∧Z)∨(Y∧(「z)) &#160;&#160;&#160; H(X,Y,Z)=X㈩Y㈩Z &#160;&#160;&#160; I(X,Y,Z)=Y㈩(X∧(「z)) &#160;&#160;&#160; ㈩为异或，∧为与，∨为或，「为非 &#160;&#160;&#160; 如果Mi代表消息的第i个子块(0到15),而&#60;&#60;&#60;s代表循环左移s位,则4个操作为: &#160;&#160;&#160; FF(a,b,c,d,Mj,s,ti)代表=a=b((a+F(b,c,d)+Mj+ti)&#60;&#60;&#60;s) &#160;&#160;&#160; GG(a,b,c,d,Mj,s,ti)代表=a=b((a+G(b,c,d)+Mj+ti)&#60;&#60;&#60;s) &#160;&#160;&#160; HH(a,b,c,d,Mj,s,ti)代表=a=b((a+H(b,c,d)+Mj+ti)&#60;&#60;&#60;s) &#160;&#160;&#160; II(a,b,c,d,Mj,s,ti)代表=a=b((a+I(b,c,d)+Mj+ti)&#60;&#60;&#60;s) 本新闻共2页,当前在第1页&#160;&#160;1&#160;&#160;2&#160;&#160;]]></description>
			<content:encoded><![CDATA[<p><P>MD5产生一个128位的HASH值，在经过一写初始树立后，将明文分成了512位的块，再将每一块分成16个32位的子块。算法的输出是4个32位的块，连接起来构成128位的HASH值。 <BR>&nbsp;&nbsp;&nbsp; 首先，将消息填充到比512的倍数少64位，填充时先向消息末尾填一个1，然后再填满0，然后后面再加上一个64位的消息长度的表示（不包括填充位）。这两步使消息长度恰好是512的倍数，同时保证不同消息在填充后仍不相同。 <BR>&nbsp;&nbsp;&nbsp; 初始化4个32位变量： <BR>&nbsp;&nbsp;&nbsp; A=0&#215;01234567 <BR>&nbsp;&nbsp;&nbsp; B=0x89abcdef <BR>&nbsp;&nbsp;&nbsp; C=0xfedcba98 <BR>&nbsp;&nbsp;&nbsp; D=0&#215;76543210 <BR>这些变量成为链变量。 <BR>然后，开始算法的主循环。这个循环对消息中所有的块都执行一次。将4个变量复制到不同的变量：a值为A，b值为B，c值为C，d值为D。 <BR>&nbsp;&nbsp;&nbsp; 主循环有4圈，都很相似。每圈使用一个不同的操作，重复16次。每个操作完成一个a,b,c和d中三个变量的非线性函数。然后，将结果与第四个变量、文本的一个子块和一个常数相加。然后，将结果混换左移一个可变值的位数，再将结果与a,b,c和d之一相加。最后用结果来代替a,b,c和d之一。 </P><P>&nbsp;&nbsp;&nbsp; 共有4个非线性函数，每次操作使用一个，每圈都不相同。 <BR>&nbsp;&nbsp;&nbsp; F(X,Y,Z)=(X∧Y)∨((「X)∧Z) <BR>&nbsp;&nbsp;&nbsp; G(X,Y,Z)=(X∧Z)∨(Y∧(「z)) <BR>&nbsp;&nbsp;&nbsp; H(X,Y,Z)=X㈩Y㈩Z <BR>&nbsp;&nbsp;&nbsp; I(X,Y,Z)=Y㈩(X∧(「z)) <BR>&nbsp;&nbsp;&nbsp; ㈩为异或，∧为与，∨为或，「为非 </P><P>&nbsp;&nbsp;&nbsp; 如果Mi代表消息的第i个子块(0到15),而&lt;&lt;&lt;s代表循环左移s位,则4个操作为: <BR>&nbsp;&nbsp;&nbsp; FF(a,b,c,d,Mj,s,ti)代表=a=b((a+F(b,c,d)+Mj+ti)&lt;&lt;&lt;s) <BR>&nbsp;&nbsp;&nbsp; GG(a,b,c,d,Mj,s,ti)代表=a=b((a+G(b,c,d)+Mj+ti)&lt;&lt;&lt;s) <BR>&nbsp;&nbsp;&nbsp; HH(a,b,c,d,Mj,s,ti)代表=a=b((a+H(b,c,d)+Mj+ti)&lt;&lt;&lt;s) <BR>&nbsp;&nbsp;&nbsp; II(a,b,c,d,Mj,s,ti)代表=a=b((a+I(b,c,d)+Mj+ti)&lt;&lt;&lt;s) </P>
<div align="right">本新闻共<font color=red>2</font>页,当前在第<font color=red>1</font>页&nbsp;&nbsp;<font color="red">1</font>&nbsp;&nbsp;<a href="/CMS/Pub/softlevel/softlevel_networkengineer/2005_09_28_86838_2.htm">2</a>&nbsp;&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91md5%e7%ae%97%e6%b3%95%e5%9f%ba%e7%a1%80/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】异步传输和同步传输的区别</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%bc%82%e6%ad%a5%e4%bc%a0%e8%be%93%e5%92%8c%e5%90%8c%e6%ad%a5%e4%bc%a0%e8%be%93%e7%9a%84%e5%8c%ba%e5%88%ab</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%bc%82%e6%ad%a5%e4%bc%a0%e8%be%93%e5%92%8c%e5%90%8c%e6%ad%a5%e4%bc%a0%e8%be%93%e7%9a%84%e5%8c%ba%e5%88%ab#comments</comments>
		<pubDate>Thu, 12 May 2011 06:33:29 +0000</pubDate>
		<dc:creator>liaowei</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%bc%82%e6%ad%a5%e4%bc%a0%e8%be%93%e5%92%8c%e5%90%8c%e6%ad%a5%e4%bc%a0%e8%be%93%e7%9a%84%e5%8c%ba%e5%88%ab</guid>
		<description><![CDATA[1,异步传输是面向字符的传输，而同步传输是面向比特的传输。 2,异步传输的单位是字符而同步传输的单位是桢。 3,异步传输通过字符起止的开始和停止码抓住再同步的机会，而同步传输则是以数据中抽取同步信息。 4,异步传输对时序的要求较低，同步传输往往通过特定的时钟线路协调时序。 5,异步传输相对于同步传输效率较低。]]></description>
			<content:encoded><![CDATA[<p><SPAN id=yuyuzi>1,异步传输是面向字符的传输，而同步传输是面向比特的传输。 <BR>2,异步传输的单位是字符而同步传输的单位是桢。 <BR>3,异步传输通过字符起止的开始和停止码抓住再同步的机会，而同步传输则是以数据中抽取同步信息。 <BR>4,异步传输对时序的要求较低，同步传输往往通过特定的时钟线路协调时序。 <BR>5,异步传输相对于同步传输效率较低。</SPAN></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%bc%82%e6%ad%a5%e4%bc%a0%e8%be%93%e5%92%8c%e5%90%8c%e6%ad%a5%e4%bc%a0%e8%be%93%e7%9a%84%e5%8c%ba%e5%88%ab/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】联机分析处理（OLAP）</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e8%81%94%e6%9c%ba%e5%88%86%e6%9e%90%e5%a4%84%e7%90%86%ef%bc%88olap%ef%bc%89</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e8%81%94%e6%9c%ba%e5%88%86%e6%9e%90%e5%a4%84%e7%90%86%ef%bc%88olap%ef%bc%89#comments</comments>
		<pubDate>Thu, 12 May 2011 06:33:29 +0000</pubDate>
		<dc:creator>liaowei</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e8%81%94%e6%9c%ba%e5%88%86%e6%9e%90%e5%a4%84%e7%90%86%ef%bc%88olap%ef%bc%89</guid>
		<description><![CDATA[OLAP是使分析人员、管理人员或执行人员能够从多角度对信息进行快速、一致、交互地存取,从而获得对数据的更深入了解的一类软件技术。OLAP的目标是满足决策支持或者满足在多维环境下特定的查询和报表需求,它的技术核心是&#8221;维&#8221;这个概念。“维”是人们观察客观世界的角度,是一种高层次的类型划分。“维”一般包含着层次关系,这种层次关系有时会相当复杂。通过把一个实体的多项重要的属性定义为多个维(dimension)，使用户能对不同维上的数据进行比较。因此OLAP也可以说是多维数据分析工具的集合。OLAP的基本多维分析操作有钻取（roll up和drill down）、切片（slice）和切块（dice）、以及旋转（pivot）、drill across、drill through等。·钻取是改变维的层次，变换分析的粒度。它包括向上钻取（roll up）和向下钻取（drill down）。roll up是在某一维上将低层次的细节数据概括到高层次的汇总数据，或者减少维数；而drilldown则相反，它从汇总数据深入到细节数据进行观察或增加新维。·切片和切块是在一部分维上选定值后，关心度量数据在剩余维上的分布。如果剩余的维只有两个，则是切片；如果有三个，则是切块。·旋转是变换维的方向，即在表格中重新安排维的放置（例如行列互换）。 OLAP有多种实现方法，根据存储数据的方式不同可以分为ROLAP、MOLAP、HOLAP。ROLAP表示基于关系数据库的OLAP实现（Relational OLAP）。以关系数据库为核心,以关系型结构进行多维数据的表示和存储。ROLAP将多维数据库的多维结构划分为两类表:一类是事实表,用来存储数据和维关键字;另一类是维表,即对每个维至少使用一个表来存放维的层次、成员类别等维的描述信息。维表和事实表通过主关键字和外关键字联系在一起,形成了&#8221;星型模式&#8221;。对于层次复杂的维,为避免冗余数据占用过大的存储空间,可以使用多个表来描述,这种星型模式的扩展称为&#8221;雪花模式&#8221;。MOLAP表示基于多维数据组织的OLAP实现（Multidimensional OLAP）。以多维数据组织方式为核心,也就是说,MOLAP使用多维数组存储数据。多维数据在存储中将形成&#8221;立方块（Cube）&#8221;的结构,在MOLAP中对&#8221;立方块&#8221;的&#8221;旋转&#8221;、&#8221;切块&#8221;、&#8221;切片&#8221;是产生多维数据报表的主要技术。HOLAP表示基于混合数据组织的OLAP实现（Hybrid OLAP）。如低层是关系型的，高层是多维矩阵型的。这种方式具有更好的灵活性。还有其他的一些实现OLAP的方法，如提供一个专用的SQL Server，对某些存储模式（如星型、雪片型）提供对SQL查询的特殊支持。OLAP工具是针对特定问题的联机数据访问与分析。它通过多维的方式对数据进行分析、查询和报表。维是人们观察数据的特定角度。例如，一个企业在考虑产品的销售情况时，通常从时间、地区和产品的不同角度来深入观察产品的销售情况。这里的时间、地区和产品就是维。而这些维的不同组合和所考察的度量指标构成的多维数组则是OLAP分析的基础，可形式化表示为（维1，维2，……，维n，度量指标），如（地区、时间、产品、销售额）。多维分析是指对以多维形式组织起来的数据采取切片（Slice）、切块（Dice）、钻取（Drill-down和Roll-up）、旋转（Pivot）等各种分析动作，以求剖析数据，使用户能从多个角度、多侧面地观察数据库中的数据，从而深入理解包含在数据中的信息。根据综合性数据的组织方式的不同，目前常见的OLAP主要有基于多维数据库的MOLAP及基于关系数据库的ROLAP两种。MOLAP是以多维的方式组织和存储数据，ROLAP则利用现有的关系数据库技术来模拟多维数据。在数据仓库应用中，OLAP应用一般是数据仓库应用的前端工具，同时OLAP工具还可以同数据挖掘工具、统计分析工具配合使用，增强决策分析功能。]]></description>
			<content:encoded><![CDATA[<p><P><BR>OLAP是使分析人员、管理人员或执行人员能够从多角度对信息进行快速、一致、交互地存取,从而获得对数据的更深入了解的一类软件技术。OLAP的目标是满足决策支持或者满足在多维环境下特定的查询和报表需求,它<BR>的技术核心是&#8221;维&#8221;这个概念。<BR><BR>“维”是人们观察客观世界的角度,是一种高层次的类型划分。“维”一般包含着层次关系,这种层次关系有时会相当复杂。通过把一个实体的多项重要的属性定义为多个维(dimension)，使用户能对不同维上的数<BR>据进行比较。因此OLAP也可以说是多维数据分析工具的集合。<BR><BR>OLAP的基本多维分析操作有钻取（roll up和drill down）、切片（slice）和切块（dice）、以及旋转（pivot）、drill across、drill through等。<BR><BR>·钻取是改变维的层次，变换分析的粒度。它包括向上钻取（roll up）和向下钻取（drill down）。roll up是在某一维上将低层次的细节数据概括到高层次的汇总数据，或者减少维数；而drill<BR>down则相反，它从汇总数据深入到细节数据进行观察或增加新维。<BR>·切片和切块是在一部分维上选定值后，关心度量数据在剩余维上的分布。如果剩余的维只有两个，则是切片；如果有三个，则是切块。<BR>·旋转是变换维的方向，即在表格中重新安排维的放置（例如行列互换）。 <BR>OLAP有多种实现方法，根据存储数据的方式不同可以分为ROLAP、MOLAP、HOLAP。<BR><BR>ROLAP表示基于关系数据库的OLAP实现（Relational OLAP）。以关系数据库为核心,以关系型结构进行多维数据的表示和存储。ROLAP将多维数据库的多维结构划分为两类表:一类是事实表,用<BR>来存储数据和维关键字;另一类是维表,即对每个维至少使用一个表来存放维的层次、成员类别等维的描述信息。维表和事实表通过主关键字和外关键字联系在一起,形成了&#8221;星型模式&#8221;。对于层次复杂的维,为避免冗余数据占用<BR>过大的存储空间,可以使用多个表来描述,这种星型模式的扩展称为&#8221;雪花模式&#8221;。<BR><BR>MOLAP表示基于多维数据组织的OLAP实现（Multidimensional OLAP）。以多维数据组织方式为核心,也就是说,MOLAP使用多维数组存储数据。多维数据在存储中将形成&#8221;立方块（Cub<BR>e）&#8221;的结构,在MOLAP中对&#8221;立方块&#8221;的&#8221;旋转&#8221;、&#8221;切块&#8221;、&#8221;切片&#8221;是产生多维数据报表的主要技术。<BR><BR>HOLAP表示基于混合数据组织的OLAP实现（Hybrid OLAP）。如低层是关系型的，高层是多维矩阵型的。这种方式具有更好的灵活性。<BR><BR>还有其他的一些实现OLAP的方法，如提供一个专用的SQL Server，对某些存储模式（如星型、雪片型）提供对SQL查询的特殊支持。<BR><BR>OLAP工具是针对特定问题的联机数据访问与分析。它通过多维的方式对数据进行分析、查询和报表。维是人们观察数据的特定角度。例如，一个企业在考虑产品的销售情况时，通常从时间、地区和产品的不同角度来深入观<BR>察产品的销售情况。这里的时间、地区和产品就是维。而这些维的不同组合和所考察的度量指标构成的多维数组则是OLAP分析的基础，可形式化表示为（维1，维2，……，维n，度量指标），如（地区、时间、产品、销售<BR>额）。多维分析是指对以多维形式组织起来的数据采取切片（Slice）、切块（Dice）、钻取（Drill-down和Roll-up）、旋转（Pivot）等各种分析动作，以求剖析数据，使用户能从多个角度、<BR>多侧面地观察数据库中的数据，从而深入理解包含在数据中的信息。<BR><BR>根据综合性数据的组织方式的不同，目前常见的OLAP主要有基于多维数据库的MOLAP及基于关系数据库的ROLAP两种。MOLAP是以多维的方式组织和存储数据，ROLAP则利用现有的关系数据库技术来模拟<BR>多维数据。在数据仓库应用中，OLAP应用一般是数据仓库应用的前端工具，同时OLAP工具还可以同数据挖掘工具、统计分析工具配合使用，增强决策分析功能。</P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e8%81%94%e6%9c%ba%e5%88%86%e6%9e%90%e5%a4%84%e7%90%86%ef%bc%88olap%ef%bc%89/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[软考]数据仓库设计的原则</title>
		<link>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83%e6%95%b0%e6%8d%ae%e4%bb%93%e5%ba%93%e8%ae%be%e8%ae%a1%e7%9a%84%e5%8e%9f%e5%88%99</link>
		<comments>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83%e6%95%b0%e6%8d%ae%e4%bb%93%e5%ba%93%e8%ae%be%e8%ae%a1%e7%9a%84%e5%8e%9f%e5%88%99#comments</comments>
		<pubDate>Thu, 12 May 2011 06:33:29 +0000</pubDate>
		<dc:creator>liaowei</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83%e6%95%b0%e6%8d%ae%e4%bb%93%e5%ba%93%e8%ae%be%e8%ae%a1%e7%9a%84%e5%8e%9f%e5%88%99</guid>
		<description><![CDATA[高效实现数据仓库的七个步骤　　数据仓库和我们常见的RDBMS系统有些亲缘关系，但它又有所不同。如果你没有实施过数据仓库，那么从设定目标到给出设计，从创建数据结构到编写数据分析程序，再到面对挑剔的用户的评估，整个过程都会带给你一种与以往的项目完全不同的体验。一句话，如果你试图以旧有的方式创建数据仓库，那你所面对的不是预算超支就是所建立的数据仓库无法良好运作。 　　在处理一个数据仓库项目时需要注意的问题很多，但同时也有很多有建设性的参考可以帮助你更顺利的完成任务。开放思维，不断尝试新的途径，对于找到一种可行的数据仓库实现方法来说也是必需的。 1. 配备一个全职的项目经理或你自己全面负责项目管理　　在通常情况下，项目经理都会同时负责多个项目的实施。这么做完全是出于资金和IT资源方面的考虑。但是对于数据仓库项目的管理，绝对不能出现一人身兼数个项目的情况。由于你所处的领域是你和你的团队之前没有进入过的领域，有关数据仓库的一切－数据分析、设计、编程、测试、修改、维护－全都是崭新的，因此你或者你指派的项目经理如果能全心投入，对于项目的成功会有很大帮助。 2. 将项目管理职责推给别的项目经理　　由于数据仓库实现过程实在是太困难了，为了避免自虐，你可以在当前阶段的项目完成后就将项目管理职责推给别的项目经理。当然，这个新的项目经理一定要复合第一条所说的具有全职性。为什么要这么做呢？首先，从项目经理的角度看，数据仓库实施过程的任何一个阶段都足以让人身心疲惫。从物理存储设备的开发到Extract-Transform-Load的实现，从设计开发模型到OLAP，所有阶段都明显的比以前接触的项目更加困难。每个阶段不但需要新的处理方法、新的管理方法，还需要创新性的观点。所以将管理职责推给别的项目经理不但不会对项目有损害，还可以起到帮助作用。3.与用户进行沟通　　这里所讲的内容远比一篇文章本身要重要的多。你必须明白，在数据仓库的设计阶段，那些潜在用户自己也不清楚他们到底需要数据仓库为他们做什么。他们在不断的探索和发现自己的需求，而你的开发团队也在和客户的接触中做着同样的事情。更加频繁的与客户接触，多做记录，并让你的团队更关注于项目需求讨论的结果而不是讨论的过程本身。　　既然你和客户的交流是为了了解存储的数据是何种类型以及如何有效存储数据，你也许需要（和你的用户一起）采用一种新的方法观察数据，而不是直接处理数据。你可以尝试从中找出隐藏的信息，比如在一段时期内的数字涨落等。不要试图追寻项目需求的答案，而是要让答案找上门来。4. 以技术/信息库作为领导　　由于数据仓库实施的各个阶段都有很大不同，因此你需要有人能起到维持整个项目的连续进行的作用，不过这个职责并不需要那种全职性。项目实施有三个重要方面：架构、技术和业务。将架构作为重点可以保证在整个项目中，数据仓库的架构从物理层往上，都会受到良好的维护。而我们应该将技术作为重点，因为开发团队和关键用户都在使用他们以前从未用过的工具，必须有人监督开发过程以及工具使用的一致性。　　最后，在数据仓库的应用过程中浮现出来的业务需求必须被详细分析和记录，以促机开发过程持续下去。如果用户不能很好的开发人员以及其它用户沟通，那么数据分析和度量方面的开发进程就会延期，所以必须有人关注业务方面的开发，推动开发进入更高级别。5. 跳出反复修改程序的陷阱　　第一次实现的数据仓库肯定不会是最终交付的版本。为什么呢？实际上在真正见到产品前，你无法确定的知道自己的目标是什么。或者说，最终用户只有在使用数据仓库产品一段时间后，才能明确告诉你这个产品是不是他所希望的。与你以往处理的项目不同，业务智能还处于发展的初期，每个公司对业务智能都有不同的解释，因此你的项目决不会一次成功。　　为了以正确的格式获得数据，你需要在不断变化的状况中摸索前进。BI具有很强的个性，不同的环境、不同的市场以及不同的企业都有不同的BI。这又代表什么呢？这表示你需要把数据库管理员放在一个消息相对封闭的环境中，不要让他知道数据仓库的数据结构以及ETL程序在不断的改变。对此没有别的办法。这样可以减轻你和DBA所承受的压力。6. 对大量的前端资源进行数据源分析　　在数据仓库实现过程中，你不得不在旧有的数据中艰难跋涉，这些数据来自老的数据库、老的磁带机以及远程的数据。它们中的大部分都凌乱不堪，并且难以获取。你要对这些数据进行大量处理，并且还要设计ETL程序来寻找其中的有用信息。如果你希望整个项目做起来比较顺利，并且找到一种方法能够一次成功，那就需要你的开发人员必须花费足够的时间来充分研究这些旧有数据，将凌乱的数据规则化，并尽力设计和实现强壮的数据采集和转换过程。数据仓库的ETL部分会占用整个项目资源的百分之八十，所以一定要确定你的资源都用在刀刃上了。7. 将人际关系处理放在首位　　在数据仓库实现过程中真正的地狱不是来自技术或者开发方面，而是来自你周围的人。你也许会遇到一个对项目并不乐观而又没时间听你陈述的领导。你也许会遇到一些开发人员将进度拖延太长时间还抱怨为什么不能用老方法实施。你也许还会遇到一些抱有不切实际的幻想的用户，他们希望轻点鼠标就能实现想象中的功能，但却不愿在他们那边多做些智力投资，更好的培训他们自己的员工。而你也已经疲惫不堪，鼓励投资，以及在开发团队和用户（甚至老板）中推广新的开发技巧。　　总之你要保持微笑。当一切搞定，你的烦恼也就一扫而空了，笑到最后才笑得最轻松。[page]数据仓库开发过程中的七个禁忌 　　过去我们一直使用的OLTP技术也许隐藏着许多严重的缺陷。数据仓库的实现并不是一个简单的任务，你会发现以前积累下来的丰富经验，并不适合处理每个数据仓库的独特需求。 　　下面列出的条款是你在实现数据仓库过程中一定会面对的问题，其中一些看起来并没有想象中那么严重，但是你还是应该尽量避免出现类似问题。数据仓库并不是一个事务处理系统，它没有一定的标准也不会实现某个特定的应用，但它本质上是非常有组织性的。总之，每个公司所建立的数据仓库都是唯一的，并且每一次数据仓库的实现方法都不是一成不变的。在实现数据仓库时需要注意的不单是&#8221;应该如何作&#8221;，更要注意&#8221;不该如何做&#8221;。下面就是我们总结的七点&#8221;不该如何作&#8221;。 1.不要编写自己无法快速修改的代码　　你所要编写的程序主要用于数据分析，而不是处理事务。而你的用户也并不真正知道他们自己真正想要一个什么样的程序。因此你不得不反复修改代码好几次，才会明白用户到底需要一个什么样的程序。如果你编写的程序具有良好的结构和灵活性，就算需要修改也不会太浪费力气。反之，你会被自己累死。 2. 不要使用无法修改的数据库访问API　　在过去，你的数据库可以为大量的客户提供稳定的数据查询服务。而如今，你的程序必须能够应付更多的数据查询。这使得重新改写程序以使得每个查询请求能得到最大的数据量成为势在必行的工作，而一般来说这种代码修改都不会一次成功，所以只有选择合适的可以修改的API，才能使程序尽快适应新的需求。 3. 不要设计任何无法扩展的东西　　在联机处理过程（OLTP）应用中，数据分析并不是一个真正的应用程序。实际上，数据分析的关键是获取大量旧的数据，从中提取数据模型，并以此模型推断出新的信息。而你所编写的访问潜在信息的代码应该具有可扩展性，可以附加新的数据。千万别在支持数据分析的代码中假定数据都是固定格式的。 4. 不要附加不必要的功能　　一个仓库要做的是恰到好处的服务，用户走进仓库，从货架上取得自己所需得信息，仅此而已。由于业务智能、分析以及规律性的问题都有各自的处理程序，因此你的客户唯一的需要就是获取信息。他们需要一种应用环境，可以让他们快速的从数据仓库中取得分析过程所需的数据，而不论这个数据是什么样子的。也许你想帮助他们精炼一下获得的数据，但最好不要这么做。一定要记住，不要给客户的数据分析程序添加任何会影响数据访问性能的功能。5. 不要简化数据清除和数据源分析的步骤　　在实现数据仓库过程中最应该注意的地方就是为Extract-Transform-Load机制分析数据源，以及为优化负载而清除数据。安全的做法是假设项目经理在这个阶段会需要整个项目资源的一半以上。相反，如果你在这方面进行了简化，稍后肯定会后悔。所以就算系统工作缓慢，也不要简化清理旧的数据的过程。6. 不要避免颗粒度和分区问题　　在数据仓库设计过程中有两个最大的数据存储问题，第一是如何给转换数据定位一个恰当的颗粒度等级，第二是如何将数据绝对的分区。为什么这两点问题如此重要呢？因为整个数据仓库的响应能力受颗粒度影响，并且数据访问的效率直接与数据分区性能有关。因此这是具有关键性的工作，不要试图避免面对这些问题。7. 不要在没考虑业务问题前就使用OLAP　　用户在亲眼见到程序前通常都不知道自己到底想要个什么样的程序。因此他们的观点有不少错误，比如他们希望分析结果会忠实反应性能度量，或者希望程序会使他们部门或公司的业务工作有所不同。而你必须跳出自己的职责范围，从IT管理者的角度考虑用户部门直至整个企业的运行方式，才能在开发过程中避免这类问题。在通常的OLTP开发中，你可以比较方便的理解业务流程。而在联机分析处理（OLAP）领域，任何事情都需要亲自考察，而在你周围工作的人也许并不会发现你对业务方面存在的误解。因此，不要自以为已经了解了足够的信息。不断的询问才能使你真正了解&#8221;业务智能&#8221;中的&#8221;业务&#8221;到底是什么样子的[page]顺利开发数据仓库的七种思路　　对于大多数IT顾问来说，实现一个数据仓库的难度比以前做过的任何项目难度都要大。考虑到不同的数据结构、用途以及应用程序开发方法，以前所积累的经验和技巧大部分都无用武之地了。但是只要在你的前进道路上稍加修正，你就会发现实现一个数据仓库并不是难事，就算你是第一次实现数据仓库也没问题。 　　下面列出了数据仓库实施过程需要考虑的步骤，有一些你可能从来没有意识到，而另一些可能已经在实施过程中使用到了，但是重新思考一番也许你会有更多的领悟。开放思维，不断尝试新的途径，找到一种可行的数据仓库实现方法。 1. 再三考虑应用程序的实现方法　　数据仓库并不涉及事务处理，并且在报表方面也仅占一小部分。而数据仓库应用程序的本质是分析，尤其是针对业务智能的分析。BI并不是通常所说的数据：它是一种从旧有数据中,模型化得到的新的数据。那么如何才能从旧有数据中挖出这些新数据呢？事实上，这个工作不是让你来完成的，而是你的客户所要完成的。从项目主管的角度看，应该有一个经验丰富的数据表格设计师与你合作，进而决定如何将各类程序融合在一起。其中所遇到的最主要的挑战将是如何用新的方法观察数据，这也是你的客户正在试图使用的方法。 2. 创建抽象的、良好部署的数据库访问组件　　在过去你接触过的数据库项目和现在的数据仓库之间，有一点绝对不同，那就是：在Online Transaction Processing （OLTP）环境中，用户数量非常大，但使用到的数据却比较少；而在Online Analytical Processing （OLAP）环境中情况却正好相反，少量的用户在使用大量的数据。而你的工作就是编写一个应用程序来优化这种不同。这里有一个线索：在你所有的分析程序中，都要能抓取连续的数据项，这样在以后建立和访问的数据结构中才能存放与原数据物理结构类似的数据。具体如何实现呢？首先不要规格化数据。第二将其放入数组中最小化读取请求数。按照这种方法，DBA会很乐意与你合作。3. 保持松散　　现在回头看看第一步，你应该可以理解定义一个分析程序不是件简单事了，而且一般情况下，很难在第一次就实现符合要求的最终产品。而在你将要进行分析的数据结构上同样存在这种问题。一句话，实现过程会有很多变数，你需要不断的改动你的程序。通常我们都希望将改动次数降到最低。在一个数据仓库实现过程中，本质是要分析过程毫无差错，这也需要DBA的参与。不要死抓住你的程序设计、代码、框图，或你建立的其它什么东西不放手，要根据这种变化而不断进行调整。4. 将管理放在首位　　在分析数据源方面你做的如何呢？你是否认为清理垃圾数据的工作非常困难？并不是只有你一个人这样想，做过类似工作的人都有这种看法。在一个一般规模的机构中，作为数据仓库实现过程的一部分，会有大量的旧有数据必须进行一致性处理。所以分析数据源并花费数个小时编写转换程序将旧有数据导入数据仓库是整个数据仓库实现过程中最艰难的一部分。并且这也是整个项目中最重要的一环，可以占到整个项目周期和预算的四分之三。所以一定要小心对待。5. 从字里行间发现问题　　与用户交流是个很麻烦的事情，为什么这么说呢？因为很多用户在见到最终产品前都不知道自己想要什么样的产品。定义数据仓库应用程序是一个探索的过程，而且这个过程要反复进行。记住所谓的&#8221;业务智能&#8221;是用户自己定义的，他们按照自己的理解来处理业务流程。因此这些用户就是连接数据和业务处理过程间的桥梁。他们所要的并不是数据本身，而是隐藏在数据后面的智能性。你可以让他们讨论、思考并给出建设性的意见。但千万不要让他们解决或让他们任意想象和发表那些&#8221;有可能&#8221;的观点。最后，一定要随时留意用户得出的结论。6. 保持领先　　数据仓库看起来没有传统的OLTP模式根深蒂固，事实如此。虽然很多人投身数据仓库的开发中，但由于其框架与以前的系统大相径庭，因此在开始的一段时间数据仓库的实现看上去相当混乱。但是坚持下去是很重要的。它具有两方面重要的作用。　　第一，技术的领先性。它可以跟踪项目中任何阶段的软件工具的部署和正确使用，以及开发过程。如果这复合你的背景，你可以对此多加留意。　　第二，体系结构的领先性。它使得项目在各个阶段转换时，数据仓库和它所支持的系统的物理以及逻辑架构都具有持续性，不会发生改变。这也是你能提供的。7. 发出警告　　最后你要记住，你并不是唯一登上新大陆的人。你周围的每一个人都会有下面一点或几点问题：不现实的期望、对技术的误解、旧习惯或坏习惯、竞争行为，或缺乏对项目的信任度。虽然交流沟通等任务应该是项目经理负责的，但实际上你也要担负起相同的责任。那么作为技术总监你该怎么作呢？首先当然是要真诚的对待周围的人，但一定要竖立威信，适当的发出警告。当你发现项目进度缓慢、资源流失，或者员工失去目标，就要直言不讳的说出来。快速明确的给予警告在大部分情况下都是明智之举。匆忙上马的数据仓库项目也许会出轨，但不要让失败的项目把你拉下马。]]></description>
			<content:encoded><![CDATA[<p><P><FONT color=#ff0000>高效实现数据仓库的七个步骤</FONT></P><P>　　数据仓库和我们常见的RDBMS系统有些亲缘关系，但它又有所不同。如果你没有实施过数据仓库，那么从设定目标到给出设计，从创建数据结构到编写数据分析程序，再到面对挑剔的用户的评估，整个过程都会带给你一种与以往的项目完全不同的体验。一句话，如果你试图以旧有的方式创建数据仓库，那你所面对的不是预算超支就是所建立的数据仓库无法良好运作。 </P><P>　　在处理一个数据仓库项目时需要注意的问题很多，但同时也有很多有建设性的参考可以帮助你更顺利的完成任务。开放思维，不断尝试新的途径，对于找到一种可行的数据仓库实现方法来说也是必需的。 </P><P><FONT color=#0000ff>1. 配备一个全职的项目经理或你自己全面负责项目管理</FONT></P><P>　　在通常情况下，项目经理都会同时负责多个项目的实施。这么做完全是出于资金和IT资源方面的考虑。但是对于数据仓库项目的管理，绝对不能出现一人身兼数个项目的情况。由于你所处的领域是你和你的团队之前没有进入过的领域，有关数据仓库的一切－数据分析、设计、编程、测试、修改、维护－全都是崭新的，因此你或者你指派的项目经理如果能全心投入，对于项目的成功会有很大帮助。 </P><P><FONT color=#0000ff>2. 将项目管理职责推给别的项目经理</FONT></P><P>　　由于数据仓库实现过程实在是太困难了，为了避免自虐，你可以在当前阶段的项目完成后就将项目管理职责推给别的项目经理。当然，这个新的项目经理一定要复合第一条所说的具有全职性。为什么要这么做呢？首先，从项目经理的角度看，数据仓库实施过程的任何一个阶段都足以让人身心疲惫。从物理存储设备的开发到Extract-Transform-Load的实现，从设计开发模型到OLAP，所有阶段都明显的比以前接触的项目更加困难。每个阶段不但需要新的处理方法、新的管理方法，还需要创新性的观点。所以将管理职责推给别的项目经理不但不会对项目有损害，还可以起到帮助作用。</P><P><FONT color=#0000ff>3.与用户进行沟通</FONT></P><P>　　这里所讲的内容远比一篇文章本身要重要的多。你必须明白，在数据仓库的设计阶段，那些潜在用户自己也不清楚他们到底需要数据仓库为他们做什么。他们在不断的探索和发现自己的需求，而你的开发团队也在和客户的接触中做着同样的事情。更加频繁的与客户接触，多做记录，并让你的团队更关注于项目需求讨论的结果而不是讨论的过程本身。</P><P>　　既然你和客户的交流是为了了解存储的数据是何种类型以及如何有效存储数据，你也许需要（和你的用户一起）采用一种新的方法观察数据，而不是直接处理数据。你可以尝试从中找出隐藏的信息，比如在一段时期内的数字涨落等。不要试图追寻项目需求的答案，而是要让答案找上门来。</P><P><FONT color=#0000ff>4. 以技术/信息库作为领导</FONT></P><P>　　由于数据仓库实施的各个阶段都有很大不同，因此你需要有人能起到维持整个项目的连续进行的作用，不过这个职责并不需要那种全职性。项目实施有三个重要方面：架构、技术和业务。将架构作为重点可以保证在整个项目中，数据仓库的架构从物理层往上，都会受到良好的维护。而我们应该将技术作为重点，因为开发团队和关键用户都在使用他们以前从未用过的工具，必须有人监督开发过程以及工具使用的一致性。</P><P>　　最后，在数据仓库的应用过程中浮现出来的业务需求必须被详细分析和记录，以促机开发过程持续下去。如果用户不能很好的开发人员以及其它用户沟通，那么数据分析和度量方面的开发进程就会延期，所以必须有人关注业务方面的开发，推动开发进入更高级别。</P><P><FONT color=#0000ff>5. 跳出反复修改程序的陷阱</FONT></P><P>　　第一次实现的数据仓库肯定不会是最终交付的版本。为什么呢？实际上在真正见到产品前，你无法确定的知道自己的目标是什么。或者说，最终用户只有在使用数据仓库产品一段时间后，才能明确告诉你这个产品是不是他所希望的。与你以往处理的项目不同，业务智能还处于发展的初期，每个公司对业务智能都有不同的解释，因此你的项目决不会一次成功。</P><P>　　为了以正确的格式获得数据，你需要在不断变化的状况中摸索前进。BI具有很强的个性，不同的环境、不同的市场以及不同的企业都有不同的BI。这又代表什么呢？这表示你需要把数据库管理员放在一个消息相对封闭的环境中，不要让他知道数据仓库的数据结构以及ETL程序在不断的改变。对此没有别的办法。这样可以减轻你和DBA所承受的压力。</P><P><FONT color=#0000ff>6. 对大量的前端资源进行数据源分析</FONT></P><P>　　在数据仓库实现过程中，你不得不在旧有的数据中艰难跋涉，这些数据来自老的数据库、老的磁带机以及远程的数据。它们中的大部分都凌乱不堪，并且难以获取。你要对这些数据进行大量处理，并且还要设计ETL程序来寻找其中的有用信息。如果你希望整个项目做起来比较顺利，并且找到一种方法能够一次成功，那就需要你的开发人员必须花费足够的时间来充分研究这些旧有数据，将凌乱的数据规则化，并尽力设计和实现强壮的数据采集和转换过程。数据仓库的ETL部分会占用整个项目资源的百分之八十，所以一定要确定你的资源都用在刀刃上了。</P><P><FONT color=#0000ff>7. 将人际关系处理放在首位</FONT></P><P>　　在数据仓库实现过程中真正的地狱不是来自技术或者开发方面，而是来自你周围的人。你也许会遇到一个对项目并不乐观而又没时间听你陈述的领导。你也许会遇到一些开发人员将进度拖延太长时间还抱怨为什么不能用老方法实施。你也许还会遇到一些抱有不切实际的幻想的用户，他们希望轻点鼠标就能实现想象中的功能，但却不愿在他们那边多做些智力投资，更好的培训他们自己的员工。而你也已经疲惫不堪，鼓励投资，以及在开发团队和用户（甚至老板）中推广新的开发技巧。</P><P>　　总之你要保持微笑。当一切搞定，你的烦恼也就一扫而空了，笑到最后才笑得最轻松。</P><P>[page]</P><P></P><P><FONT color=#ff0000>数据仓库开发过程中的七个禁忌</FONT> </P><P>　　过去我们一直使用的OLTP技术也许隐藏着许多严重的缺陷。数据仓库的实现并不是一个简单的任务，你会发现以前积累下来的丰富经验，并不适合处理每个数据仓库的独特需求。 </P><P>　　下面列出的条款是你在实现数据仓库过程中一定会面对的问题，其中一些看起来并没有想象中那么严重，但是你还是应该尽量避免出现类似问题。数据仓库并不是一个事务处理系统，它没有一定的标准也不会实现某个特定的应用，但它本质上是非常有组织性的。总之，每个公司所建立的数据仓库都是唯一的，并且每一次数据仓库的实现方法都不是一成不变的。在实现数据仓库时需要注意的不单是&#8221;应该如何作&#8221;，更要注意&#8221;不该如何做&#8221;。下面就是我们总结的七点&#8221;不该如何作&#8221;。 </P><P><FONT color=#0000ff>1.不要编写自己无法快速修改的代码</FONT></P><P>　　你所要编写的程序主要用于数据分析，而不是处理事务。而你的用户也并不真正知道他们自己真正想要一个什么样的程序。因此你不得不反复修改代码好几次，才会明白用户到底需要一个什么样的程序。如果你编写的程序具有良好的结构和灵活性，就算需要修改也不会太浪费力气。反之，你会被自己累死。 </P><P><FONT color=#0000ff>2. 不要使用无法修改的数据库访问API</FONT></P><P>　　在过去，你的数据库可以为大量的客户提供稳定的数据查询服务。而如今，你的程序必须能够应付更多的数据查询。这使得重新改写程序以使得每个查询请求能得到最大的数据量成为势在必行的工作，而一般来说这种代码修改都不会一次成功，所以只有选择合适的可以修改的API，才能使程序尽快适应新的需求。 </P><P><FONT color=#0000ff>3. 不要设计任何无法扩展的东西</FONT></P><P>　　在联机处理过程（OLTP）应用中，数据分析并不是一个真正的应用程序。实际上，数据分析的关键是获取大量旧的数据，从中提取数据模型，并以此模型推断出新的信息。而你所编写的访问潜在信息的代码应该具有可扩展性，可以附加新的数据。千万别在支持数据分析的代码中假定数据都是固定格式的。 </P><P><FONT color=#0000ff>4. 不要附加不必要的功能</FONT></P><P>　　一个仓库要做的是恰到好处的服务，用户走进仓库，从货架上取得自己所需得信息，仅此而已。由于业务智能、分析以及规律性的问题都有各自的处理程序，因此你的客户唯一的需要就是获取信息。他们需要一种应用环境，可以让他们快速的从数据仓库中取得分析过程所需的数据，而不论这个数据是什么样子的。也许你想帮助他们精炼一下获得的数据，但最好不要这么做。一定要记住，不要给客户的数据分析程序添加任何会影响数据访问性能的功能。</P><P><FONT color=#0000ff>5. 不要简化数据清除和数据源分析的步骤</FONT></P><P>　　在实现数据仓库过程中最应该注意的地方就是为Extract-Transform-Load机制分析数据源，以及为优化负载而清除数据。安全的做法是假设项目经理在这个阶段会需要整个项目资源的一半以上。相反，如果你在这方面进行了简化，稍后肯定会后悔。所以就算系统工作缓慢，也不要简化清理旧的数据的过程。</P><P><FONT color=#0000ff>6. 不要避免颗粒度和分区问题</FONT></P><P>　　在数据仓库设计过程中有两个最大的数据存储问题，第一是如何给转换数据定位一个恰当的颗粒度等级，第二是如何将数据绝对的分区。为什么这两点问题如此重要呢？因为整个数据仓库的响应能力受颗粒度影响，并且数据访问的效率直接与数据分区性能有关。因此这是具有关键性的工作，不要试图避免面对这些问题。</P><P><FONT color=#0000ff>7. 不要在没考虑业务问题前就使用OLAP</FONT></P><P>　　用户在亲眼见到程序前通常都不知道自己到底想要个什么样的程序。因此他们的观点有不少错误，比如他们希望分析结果会忠实反应性能度量，或者希望程序会使他们部门或公司的业务工作有所不同。而你必须跳出自己的职责范围，从IT管理者的角度考虑用户部门直至整个企业的运行方式，才能在开发过程中避免这类问题。在通常的OLTP开发中，你可以比较方便的理解业务流程。而在联机分析处理（OLAP）领域，任何事情都需要亲自考察，而在你周围工作的人也许并不会发现你对业务方面存在的误解。因此，不要自以为已经了解了足够的信息。不断的询问才能使你真正了解&#8221;业务智能&#8221;中的&#8221;业务&#8221;到底是什么样子的</P><P>[page]<BR><FONT color=#ff0000>顺利开发数据仓库的七种思路</FONT></P><P><FONT color=#ff0000>　　</FONT>对于大多数IT顾问来说，实现一个数据仓库的难度比以前做过的任何项目难度都要大。考虑到不同的数据结构、用途以及应用程序开发方法，以前所积累的经验和技巧大部分都无用武之地了。但是只要在你的前进道路上稍加修正，你就会发现实现一个数据仓库并不是难事，就算你是第一次实现数据仓库也没问题。 </P><P>　　下面列出了数据仓库实施过程需要考虑的步骤，有一些你可能从来没有意识到，而另一些可能已经在实施过程中使用到了，但是重新思考一番也许你会有更多的领悟。开放思维，不断尝试新的途径，找到一种可行的数据仓库实现方法。 </P><P><FONT color=#0000ff>1. 再三考虑应用程序的实现方法</FONT></P><P>　　数据仓库并不涉及事务处理，并且在报表方面也仅占一小部分。而数据仓库应用程序的本质是分析，尤其是针对业务智能的分析。BI并不是通常所说的数据：它是一种从旧有数据中,模型化得到的新的数据。那么如何才能从旧有数据中挖出这些新数据呢？事实上，这个工作不是让你来完成的，而是你的客户所要完成的。从项目主管的角度看，应该有一个经验丰富的数据表格设计师与你合作，进而决定如何将各类程序融合在一起。其中所遇到的最主要的挑战将是如何用新的方法观察数据，这也是你的客户正在试图使用的方法。 </P><P><FONT color=#0000ff>2. 创建抽象的、良好部署的数据库访问组件</FONT></P><P>　　在过去你接触过的数据库项目和现在的数据仓库之间，有一点绝对不同，那就是：在Online Transaction Processing （OLTP）环境中，用户数量非常大，但使用到的数据却比较少；而在Online Analytical Processing （OLAP）环境中情况却正好相反，少量的用户在使用大量的数据。而你的工作就是编写一个应用程序来优化这种不同。这里有一个线索：在你所有的分析程序中，都要能抓取连续的数据项，这样在以后建立和访问的数据结构中才能存放与原数据物理结构类似的数据。具体如何实现呢？首先不要规格化数据。第二将其放入数组中最小化读取请求数。按照这种方法，DBA会很乐意与你合作。</P><P><FONT color=#0000ff>3. 保持松散</FONT></P><P>　　现在回头看看第一步，你应该可以理解定义一个分析程序不是件简单事了，而且一般情况下，很难在第一次就实现符合要求的最终产品。而在你将要进行分析的数据结构上同样存在这种问题。一句话，实现过程会有很多变数，你需要不断的改动你的程序。通常我们都希望将改动次数降到最低。在一个数据仓库实现过程中，本质是要分析过程毫无差错，这也需要DBA的参与。不要死抓住你的程序设计、代码、框图，或你建立的其它什么东西不放手，要根据这种变化而不断进行调整。</P><P><FONT color=#0000ff>4. 将管理放在首位</FONT></P><P>　　在分析数据源方面你做的如何呢？你是否认为清理垃圾数据的工作非常困难？并不是只有你一个人这样想，做过类似工作的人都有这种看法。在一个一般规模的机构中，作为数据仓库实现过程的一部分，会有大量的旧有数据必须进行一致性处理。所以分析数据源并花费数个小时编写转换程序将旧有数据导入数据仓库是整个数据仓库实现过程中最艰难的一部分。并且这也是整个项目中最重要的一环，可以占到整个项目周期和预算的四分之三。所以一定要小心对待。</P><P><FONT color=#0000ff>5. 从字里行间发现问题</FONT></P><P>　　与用户交流是个很麻烦的事情，为什么这么说呢？因为很多用户在见到最终产品前都不知道自己想要什么样的产品。定义数据仓库应用程序是一个探索的过程，而且这个过程要反复进行。记住所谓的&#8221;业务智能&#8221;是用户自己定义的，他们按照自己的理解来处理业务流程。因此这些用户就是连接数据和业务处理过程间的桥梁。他们所要的并不是数据本身，而是隐藏在数据后面的智能性。你可以让他们讨论、思考并给出建设性的意见。但千万不要让他们解决或让他们任意想象和发表那些&#8221;有可能&#8221;的观点。最后，一定要随时留意用户得出的结论。</P><P><FONT color=#0000ff>6. 保持领先</FONT></P><P>　　数据仓库看起来没有传统的OLTP模式根深蒂固，事实如此。虽然很多人投身数据仓库的开发中，但由于其框架与以前的系统大相径庭，因此在开始的一段时间数据仓库的实现看上去相当混乱。但是坚持下去是很重要的。它具有两方面重要的作用。</P><P>　　第一，技术的领先性。它可以跟踪项目中任何阶段的软件工具的部署和正确使用，以及开发过程。如果这复合你的背景，你可以对此多加留意。</P><P>　　第二，体系结构的领先性。它使得项目在各个阶段转换时，数据仓库和它所支持的系统的物理以及逻辑架构都具有持续性，不会发生改变。这也是你能提供的。</P><P><FONT color=#0000ff>7. 发出警告</FONT></P><P>　　最后你要记住，你并不是唯一登上新大陆的人。你周围的每一个人都会有下面一点或几点问题：不现实的期望、对技术的误解、旧习惯或坏习惯、竞争行为，或缺乏对项目的信任度。虽然交流沟通等任务应该是项目经理负责的，但实际上你也要担负起相同的责任。那么作为技术总监你该怎么作呢？首先当然是要真诚的对待周围的人，但一定要竖立威信，适当的发出警告。当你发现项目进度缓慢、资源流失，或者员工失去目标，就要直言不讳的说出来。快速明确的给予警告在大部分情况下都是明智之举。匆忙上马的数据仓库项目也许会出轨，但不要让失败的项目把你拉下马。</P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e8%bd%af%e8%80%83%e6%95%b0%e6%8d%ae%e4%bb%93%e5%ba%93%e8%ae%be%e8%ae%a1%e7%9a%84%e5%8e%9f%e5%88%99/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】电子签名基础知识ABC</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%94%b5%e5%ad%90%e7%ad%be%e5%90%8d%e5%9f%ba%e7%a1%80%e7%9f%a5%e8%af%86abc</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%94%b5%e5%ad%90%e7%ad%be%e5%90%8d%e5%9f%ba%e7%a1%80%e7%9f%a5%e8%af%86abc#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:28 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%94%b5%e5%ad%90%e7%ad%be%e5%90%8d%e5%9f%ba%e7%a1%80%e7%9f%a5%e8%af%86abc</guid>
		<description><![CDATA[&#160;&#160;&#160;1) 什么是电子签名?　　电子签名并非是书面签名的数字图像化。它其实是一种电子代码，利用它，收件人便能在网上轻松验证发件人的身份和签名。它还能验证出文件的原文在传输过程中有无变动。　　目前，可以通过多种技术手段实现电子签名，在确认了签署者的确切身份后，电子签名承认人们可以用多种不同的方法签署一份电子记录。方法有：基于PKI的公钥密码技术的数字签名；以生物特征统计学为基础的识别标识；手印、声音印记或视网膜扫描的识别；一个让收件人能识别发件人身份的密码代号、密码或个人识别码PIN；基于量子力学的计算机等等。但比较成熟的，使用方便具有可操作性的，在世界先进国家和我国普遍使用的电子签名技术还是基于PKI（PublicKeyInfrastructino）的数字签名技术。&#160;&#160;&#160;&#160;2) 基于PKI的数字签名技术　　基于ＰＫＩ（公钥基础设施）的电子签名被称作“数字签名”。有人称“电子签名”就是“数字签名”是错误的。数字签名只是电子签名的一种特定形式。因为电子签名虽然获得了技术中立性，但也带来使用的不便，法律上又对电子签名作了进一步规定，如上述联合国贸发会的《电子签名示范法》和欧盟的《电子签名共同框架指令》中就规定了“可靠电子签名”和“高级电子签名”。实际上就是规定了数字签名的功能，这种规定使数字签名获得了更好的应用安全性和可操作性。目前，具有实际意义的电子签名只有公钥密码理论。所以，目前国内外普遍使用的、技术成熟的、可实际使用的还是基于PKI的数字签名技术。作为公钥基础设施ＰＫＩ可提供多种网上安全服务，如认证、数据保密性、数据完整性和不可否认性。其中都用到了数字签名技术。　　PKI的核心执行机构是电子认证服务提供者，即通称为认证机构CA（Certificate Authority），PKI签名的核心元素是由CA签发的数字证书。它所提供的PKI服务就是认证、数据完整性、数据保密性和不可否认性。它的作法就是利用证书公钥和与之对应的私钥进行加/解密，并产生对数字电文的签名及验证签名。数字签名是利用公钥密码技术和其他密码算法生成一系列符号及代码组成电子密码进行签名，来代替书写签名和印章；这种电子式的签名还可进行技术验证，其验证的准确度对手工签名和图章的验证无法比拟的。这种签名方法可在很大的可信PKI域人群中进行认证，或在多个可信的PKI域中进行交叉认证，它特别适用于互联网和广域网上的安全认证和传输。]]></description>
			<content:encoded><![CDATA[<p><P>&nbsp;&nbsp;&nbsp;1) 什么是电子签名?<BR><BR>　　电子签名并非是书面签名的数字图像化。它其实是一种电子代码，利用它，收件人便能在网上轻松验证发件人的身份和签名。它还能验证出文件的原文在传输过程中有无变动。<BR><BR>　　目前，可以通过多种技术手段实现电子签名，在确认了签署者的确切身份后，电子签名承认人们可以用多种不同的方法签署一份电子记录。方法有：基于PKI的公钥密码技术的数字签名；以生物特征统计学为基础的识别标识；手印、声音印记或视网膜扫描的识别；一个让收件人能识别发件人身份的密码代号、密码或个人识别码PIN；基于量子力学的计算机等等。但比较成熟的，使用方便具有可操作性的，在世界先进国家和我国普遍使用的电子签名技术还是基于PKI（PublicKeyInfrastructino）的数字签名技术。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;2) 基于PKI的数字签名技术<BR><BR>　　基于ＰＫＩ（公钥基础设施）的电子签名被称作“数字签名”。有人称“电子签名”就是“数字签名”是错误的。数字签名只是电子签名的一种特定形式。因为电子签名虽然获得了技术中立性，但也带来使用的不便，法律上又对电子签名作了进一步规定，如上述联合国贸发会的《电子签名示范法》和欧盟的《电子签名共同框架指令》中就规定了“可靠电子签名”和“高级电子签名”。实际上就是规定了数字签名的功能，这种规定使数字签名获得了更好的应用安全性和可操作性。目前，具有实际意义的电子签名只有公钥密码理论。所以，目前国内外普遍使用的、技术成熟的、可实际使用的还是基于PKI的数字签名技术。作为公钥基础设施ＰＫＩ可提供多种网上安全服务，如认证、数据保密性、数据完整性和不可否认性。其中都用到了数字签名技术。<BR><BR>　　PKI的核心执行机构是电子认证服务提供者，即通称为认证机构CA（Certificate Authority），PKI签名的核心元素是由CA签发的数字证书。它所提供的PKI服务就是认证、数据完整性、数据保密性和不可否认性。它的作法就是利用证书公钥和与之对应的私钥进行加/解密，并产生对数字电文的签名及验证签名。数字签名是利用公钥密码技术和其他密码算法生成一系列符号及代码组成电子密码进行签名，来代替书写签名和印章；这种电子式的签名还可进行技术验证，其验证的准确度对手工签名和图章的验证无法比拟的。这种签名方法可在很大的可信PKI域人群中进行认证，或在多个可信的PKI域中进行交叉认证，它特别适用于互联网和广域网上的安全认证和传输。 </P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%94%b5%e5%ad%90%e7%ad%be%e5%90%8d%e5%9f%ba%e7%a1%80%e7%9f%a5%e8%af%86abc/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>『软考』接入网的分类</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%8e%e8%bd%af%e8%80%83%e3%80%8f%e6%8e%a5%e5%85%a5%e7%bd%91%e7%9a%84%e5%88%86%e7%b1%bb</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%8e%e8%bd%af%e8%80%83%e3%80%8f%e6%8e%a5%e5%85%a5%e7%bd%91%e7%9a%84%e5%88%86%e7%b1%bb#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:28 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%8e%e8%bd%af%e8%80%83%e3%80%8f%e6%8e%a5%e5%85%a5%e7%bd%91%e7%9a%84%e5%88%86%e7%b1%bb</guid>
		<description><![CDATA[&#160;&#160;&#160; 接入网的分类方法有很多种，例如可以按传输媒介分、按拓扑结构分、按使用技术分、按接口标准分、按业务带宽分、按业务种类分等等。　　接入网的分类方法有很多种，例如可以按传输媒介分、按拓扑结构分、按使用技术分、按接口标准分、按业务带宽分、按业务种类分等等。将这些因素都考虑进去，接入网的花样自然就很多，但常用的主要有下面几大类，它们可单独使用或混合使用：　 　　金属用户线上的XDSL：它又可分为IDSL(ISDN数字用户环路)、HDSL(利用两对线双向对称传输2Mb/s的高速数字用户环路)、SDSL(单线对双向对称传输2Mb/s的数字用户环路，传输距离比HDSL稍短)、VDSL(甚高速数字用户环路)、ADSL(不对称数字用户环路)。上述系统的拓扑结构是点到点。　　同轴电缆上的HFC(双向混合光纤同轴电缆接入传输系统)，SDV(可交换的数字视频接入系统，也基于混合光纤同轴电缆，但同轴缆上只传下行信号)。　　拓扑结构是树型或总线型，下行物理上通常为广播方式。HFC/SDV与其他接入方式相比的特点是下行可以混合传送摸拟与数字信号。　　光纤接入系统：可分为有源与无源系统，有源系统有基于PDH和SDH之分，拓扑结构可以是环型、总线型、星型或它们的混合型，也有点对点的应用。　　无源即PON(无源光网络)，有窄带与宽带之分，目前宽带 PON已经标准化的是基于ATM的 PON，即APON。PON本身下行是点到多点系统，上行为多点到点，上行时需要解决多用户争用问题，目前上行大多用TDMA(时分多址)技术。　　无线接入系统：通常指固定无线接入(FWA)，根据其技术来自无绳电话(如DECT)、集群电话、蜂窝移动通信、微波通信或卫星通信可分为很多类，对应不同的频段，容量、业务带宽和覆盖范围各异。无线接入主要的工作方式是点到多点，上行解决多用户争用的技术有FDMA(频分多址)、TDMA(时分多址)和CDMA(码分多址)，从频谱效率看CDMA最好，TDMA其次。其中CDMA又可有扩谱(DS)、跳频(FH)和同步(S-CDMA)几种。]]></description>
			<content:encoded><![CDATA[<p><P><SPAN class=f14>&nbsp;&nbsp;&nbsp; 接入网的分类方法有很多种，例如可以按传输媒介分、按拓扑结构分、按使用技术分、按接口标准分、按业务带宽分、按业务种类分等等。</SPAN></P><P><SPAN class=f14><FONT size=3>　　接入网的分类方法有很多种，例如可以按传输媒介分、按拓扑结构分、按使用技术分、按接口</FONT><FONT color=blue>标准</FONT><FONT size=3>分、按业务带宽分、按业务种类分等等。将这些因素都考虑进去，接入网的花样自然就很多，但常用的主要有下面几大类，它们可单独使用或混合使用：</FONT></SPAN><SPAN class=f14><FONT size=3>　 </FONT></P><P>　　金属用户线上的XDSL：它又可分为IDSL(ISDN数字用户环路)、HDSL(利用两对线双向对称传输2Mb/s的高速数字用户环路)、SDSL(单线对双向对称传输2Mb/s的数字用户环路，传输距离比HDSL稍短)、VDSL(甚高速数字用户环路)、ADSL(不对称数字用户环路)。上述系统的拓扑结构是点到点。</P><P>　　同轴电缆上的HFC(双向混合光纤同轴电缆接入传输系统)，SDV(可交换的数字视频接入系统，也基于混合光纤同轴电缆，但同轴缆上只传下行信号)。</P><P>　　拓扑结构是树型或总线型，下行物理上通常为广播方式。HFC/SDV与其他接入方式相比的特点是下行可以混合传送摸拟与数字信号。</P><P>　　光纤接入系统：可分为有源与无源系统，有源系统有基于PDH和SDH之分，拓扑结构可以是环型、总线型、星型或它们的混合型，也有点对点的应用。</P><P>　　无源即PON(无源光网络)，有窄带与宽带之分，目前宽带 PON已经标准化的是基于ATM的 PON，即APON。PON本身下行是点到多点系统，上行为多点到点，上行时需要解决多用户争用问题，目前上行大多用TDMA(时分多址)技术。</P><P>　　无线接入系统：通常指固定无线接入(FWA)，根据其技术来自无绳电话(如DECT)、集群电话、蜂窝移动通信、微波通信或卫星通信可分为很多类，对应不同的频段，容量、业务带宽和覆盖范围各异。无线接入主要的工作方式是点到多点，上行解决多用户争用的技术有FDMA(频分多址)、TDMA(时分多址)和CDMA(码分多址)，从频谱效率看CDMA最好，TDMA其次。其中CDMA又可有扩谱(DS)、跳频(FH)和同步(S-CDMA)几种。</P></SPAN></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%8e%e8%bd%af%e8%80%83%e3%80%8f%e6%8e%a5%e5%85%a5%e7%bd%91%e7%9a%84%e5%88%86%e7%b1%bb/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】如何编写HTTP Servlet程序</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%a6%82%e4%bd%95%e7%bc%96%e5%86%99http-servlet%e7%a8%8b%e5%ba%8f</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%a6%82%e4%bd%95%e7%bc%96%e5%86%99http-servlet%e7%a8%8b%e5%ba%8f#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:28 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%a6%82%e4%bd%95%e7%bc%96%e5%86%99http-servlet%e7%a8%8b%e5%ba%8f</guid>
		<description><![CDATA[&#160;&#160;&#160;&#160;在编写Servlet 时需要用到两个用于所有 Servlet 的基本软件包：javax.servlet 和 javax.servlet.http。下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。 &#160;&#160;&#160;&#160;首先介绍一下Java Servlet的基本方法。 init() 方法&#160;&#160;&#160;&#160;在Servlet的生命周期中，仅执行一次 init() 方法，即在服务器装入Servlet时执行。通过配置服务器，可以设定在启动服务器或客户机首次访问Servlet 时装入Servlet。无论有多少客户机访问Servlet，都不会重复执行 init()。 service() 方法 &#160;&#160;&#160;&#160;service()方法是Servlet的主体部分。客户对一个HttpServlet对象的每次请求都会调用该对象的service() 方法，并传递给这个方法一个&#8221;请求&#8221;对象和一个&#8221;响应&#8221;对象作为参数。&#8221;请求&#8221;对象提供有关请求的信息，而&#8221;响应&#8221;对象提供了一个将响应信息返回给浏览器的通信途径。javax.servlet 软件包中的相关类为ServletRequest和ServletResponse，而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用&#8221;请求&#8221;对象的方法获知客户机环境、服务器环境的信息和所有由客户机提供的信息；通过调用&#8221;响应&#8221;对象的方法，Servlet可以向客户机发送响应。 &#160;&#160;&#160;&#160;HttpServlet中的service()方法默认的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如，如果 HTTP 请求方法为 GET，则默认情况下就调用 doGet()。当一个客户通过HTML表单发出一个HTTP POST请求时，doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时，应该使用doPost()方法。 &#160;&#160;&#160;&#160;Servlet的响应可以是下列几种类型： &#160;&#160;&#160;&#160;·一个输出流，浏览器根据它的内容类型（如text/HTML）进行解释。 &#160;&#160;&#160;&#160;·一个HTTP错误响应，重定向到另一个URL、Servlet和JSP。 destroy() 方法 &#160;&#160;&#160;&#160;destroy() 方法仅执行一次，即在服务器停止且卸载Servlet 时执行该方法。当服务器卸载 Servlet 时，将在所有 service() 方法调用完成后，或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其他的线程，因此在调用 destroy() 方法时，必须确认这些线程已终止或完成。 GetServletConfig()方法 [...]]]></description>
			<content:encoded><![CDATA[<p><P></p>
<table class=p14 cellSpacing=0 cellPadding=2 width="96%" border=0>
<tr>
<td style="WORD-WRAP: break-word"><font id=zoom>&nbsp;&nbsp;&nbsp;&nbsp;在编写Servlet 时需要用到两个用于所有 Servlet 的基本软件包：javax.servlet 和 javax.servlet.http。下面主要介绍javax.servlet.http提供的HTTP Servlet应用编程接口。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;首先介绍一下Java Servlet的基本方法。<br />
<UL><br />
<LI>init() 方法<br />&nbsp;&nbsp;&nbsp;&nbsp;在Servlet的生命周期中，仅执行一次 init() 方法，即在服务器装入Servlet时执行。通过配置服务器，可以设定在启动服务器或客户机首次访问Servlet 时装入Servlet。无论有多少客户机访问Servlet，都不会重复执行 init()。<br />
<LI>service() 方法 <br />&nbsp;&nbsp;&nbsp;&nbsp;service()方法是Servlet的主体部分。客户对一个HttpServlet对象的每次请求都会调用该对象的service() 方法，并传递给这个方法一个&#8221;请求&#8221;对象和一个&#8221;响应&#8221;对象作为参数。&#8221;请求&#8221;对象提供有关请求的信息，而&#8221;响应&#8221;对象提供了一个将响应信息返回给浏览器的通信途径。javax.servlet 软件包中的相关类为ServletRequest和ServletResponse，而javax.servlet.http 软件包中的相关类为HttpServletRequest 和 HttpServletResponse。Servlet 通过这些对象与服务器通信并最终与客户机通信。Servlet 能通过调用&#8221;请求&#8221;对象的方法获知客户机环境、服务器环境的信息和所有由客户机提供的信息；通过调用&#8221;响应&#8221;对象的方法，Servlet可以向客户机发送响应。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;HttpServlet中的service()方法默认的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如，如果 HTTP 请求方法为 GET，则默认情况下就调用 doGet()。当一个客户通过HTML表单发出一个HTTP POST请求时，doPost()方法被调用。与POST请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时，应该使用doPost()方法。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Servlet的响应可以是下列几种类型： <br />&nbsp;&nbsp;&nbsp;&nbsp;·一个输出流，浏览器根据它的内容类型（如text/HTML）进行解释。 <br />&nbsp;&nbsp;&nbsp;&nbsp;·一个HTTP错误响应，重定向到另一个URL、Servlet和JSP。 <br />
<LI>destroy() 方法 <br />&nbsp;&nbsp;&nbsp;&nbsp;destroy() 方法仅执行一次，即在服务器停止且卸载Servlet 时执行该方法。当服务器卸载 Servlet 时，将在所有 service() 方法调用完成后，或在指定的时间间隔过后调用 destroy() 方法。一个Servlet 在运行service() 方法时可能会产生其他的线程，因此在调用 destroy() 方法时，必须确认这些线程已终止或完成。 <br />
<LI>GetServletConfig()方法 <br />&nbsp;&nbsp;&nbsp;&nbsp;GetServletConfig()方法返回一个 ServletConfig 对象，该对象用来返回初始化参数和ServletContext。ServletContext 接口提供有关Servlet 的环境信息。<br />
<LI>GetServletInfo()方法 <br />&nbsp;&nbsp;&nbsp;&nbsp;GetServletInfo()方法是一个可选的方法，它提供有关Servlet 的信息，如作者、版本、版权。</LI></UL></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;下面介绍编写一个基本HTTP Servlet的步骤。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;（1）引入相应的包和类，包括： </p>
<p><CCID_NOBR></p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>import javax.servlet.*;import javax.servlet.http.*;import java.io.*;继承javax.servlet.http.HttpServlet public class MyServlet extends HttpServlet&#123;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;（2）实现service方法。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Servlet的主要功能是接受从浏览器发送过来的HTTP请求（request），并返回HTTP响应（response）。这个工作是在service方法中完成的。service方法包括从request对象获得客户端数据和向response对象创建输出。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;如果一个Servlet从javax.servlet.http.HttpServlet继承，实现了doPost或doGet方法，那么这个Servlet只能对POST或GET做出响应。如果开发人员想处理所有类型的请求（request），只要简单地实现service方法即可（但假如选择实现service方法，则不必实现doPost或doGet方法，除非在service方法的开始调用super.service()）。其中的差别如图14-2所示。 </p>
<p><CENTER><img src="/article/UploadPic/2006-7/2006724132150475.jpg"><br />图14-2 doGet、doPost、service的区别</CENTER></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;HTTP Servlet规范描述了用来处理其他请求（request）类型的方法，所有这些方法都可以归属于service方法。所有的service 方法使用一样的参数。HttpServletRequest提供关于请求（request）的信息，Servlet可以使用 HttpServletResponse 对HTTP客户端做出响应。 </p>
<p><CCID_NOBR></p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>public void service(HttpServletRequest req,HttpServletResponse res)throws IOException&#123;// 设置响应内容的类型 res.setContentType(&#8220;text/html&#8221;);// 获得java.io.PrintWriter对象的引用，用来输出 PrintWriter out = res.getWriter();// 使用PrintWriter对象的println()方法创建一些HTML代码，例如 out.println(&#8220;&lt;html&gt;&lt;head&gt;&lt;title&gt;Hello  World!&lt;/title&gt;&lt;/head&gt;&#8221;);out.println(&#8220;&lt;body&gt;&lt;h1&gt;Hello World!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;&#8221;);……&#125;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;（3）编译Servlet。<br />&nbsp;&nbsp;&nbsp;&nbsp;从存放此Servlet源代码文件的目录编译此Servlet到包含此Servlet的应用中的 WEB-INF/classes目录。如：<br />&nbsp;&nbsp;&nbsp;&nbsp;javac -d /your_application_dir/WEB-INF/classes your_servlet.java </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;（4）将此Servlet作为应用的一部分部署。<br />&nbsp;&nbsp;&nbsp;&nbsp;把程序编译到指定目录后还是没有开启这个服务，我们必须对它进行配置，在C:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp\WEB-INF下有一个web.xml文件，这个就是应用程序的配置文件。这个文件的一般形式如下： </p>
<p><CCID_NOBR></p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;?xml version=&#8221;1.0&#8243; ?&gt;&lt;!DOCTYPE web-app PUBLIC &#8220;-//Sun Microsystems, Inc.//DTD Web Application 1.2//EN&#8221; &#8220;http://java.sun.com/j2ee/dtds/web-app_2_2.dtd&#8221;&gt;&lt;web-app&gt;  &lt;!&#8211;chapter 8  java  servlets &#8211;&gt;  &lt;servlet&gt;  &lt;servlet-name&gt;HelloWorld2&lt;/servlet-name&gt;  &lt;servlet-class&gt;examples.servlets.HelloWorld2&lt;/servlet-class&gt;  &lt;init-param&gt;   &lt;param-name&gt;greeting&lt;/param-name&gt;   &lt;param-value&gt;welcome&lt;/param-value&gt;   &lt;/init-param&gt;   &lt;init-param&gt;    &lt;param-name&gt;person&lt;/param-name&gt;    &lt;param-value&gt;weblogic developer&lt;/param-value&gt;    &lt;/init-param&gt;  &lt;/servlet&gt;  &lt;servlet-mapping&gt;  &lt;servlet-name&gt;HelloWorld2&lt;/servlet-name&gt;  &lt;url-pattern&gt;/HelloWorld2/*&lt;/url-pattern&gt;  &lt;/servlet-mapping&gt;    &lt;welcome-file-list&gt;    &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;  &lt;/welcome-file-list&gt;&lt;/web-app&gt;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;其中servlet-name是Servlet的名字，servlet-class是在\WEB-INF\classes下存放class文件的相对路径。我们还可以在此文件中初始化参数，形式如下： </p>
<p><CCID_NOBR></p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;init-param&gt; &lt;param-name&gt;greeting&lt;/param-name&gt; &lt;param-value&gt;welcome&lt;/param-value&gt;&lt;/init-param&gt;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;param-name是参数的名称，在本例中是greeting；param-value是参数的值，在本例是welcome。我们可以以此形式初始化更多的参数。 </p>
<p><CCID_NOBR></p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;servlet-mapping&gt;&lt;servlet-name&gt;HelloWorld2&lt;/servlet-name&gt;&lt;url-pattern&gt;/HelloWorld2/*&lt;/url-pattern&gt;&lt;/servlet-mapping&gt;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;这段代码是Servlet名称与url-pattern路径的映射。根据这段代码，HelloWorld2这个Servlet程序的URL路径就是http://SERVER_ADDRESS:<PORT>/HelloWorld2。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;（5）从浏览器访问Servlet。一般说来，调用Servlet的URL 取决于包含Servlet的Web应用的名字和Web应用部署描述中的Servlet映射的名字。请求（request）参数也可以是调用Servlet的URL的一部分，一般Servlet 的URL如以下模式：<br />&nbsp;&nbsp;&nbsp;&nbsp;http://SERVER_ADDRESS:<PORT>/your_web_application_name/ mapped_servlet_name? Parameter </font></td>
</tr>
</table>
<p></P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%a6%82%e4%bd%95%e7%bc%96%e5%86%99http-servlet%e7%a8%8b%e5%ba%8f/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】实例：Servlet处理POST请求</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%ae%9e%e4%be%8b%ef%bc%9aservlet%e5%a4%84%e7%90%86post%e8%af%b7%e6%b1%82</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%ae%9e%e4%be%8b%ef%bc%9aservlet%e5%a4%84%e7%90%86post%e8%af%b7%e6%b1%82#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:28 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%ae%9e%e4%be%8b%ef%bc%9aservlet%e5%a4%84%e7%90%86post%e8%af%b7%e6%b1%82</guid>
		<description><![CDATA[&#160;&#160;下面介绍一个HTTP Servlet处理POST方式的例子，见示例14-3。&#160;&#160;&#160;&#160;【程序源代码】 1// ==================== Program Description ==========================2// 程序名称：示例14-3 : SurveyExample.html3// 程序目的：SurveyExample源代码4// ==============================================================5&#60;!DOCTYPE HTML PUBLIC &#8220;-//IETF//DTD HTML//EN&#8221;&#62;6&#60;html&#62;7 &#60;head&#62;8 &#60;title&#62;JavaUsageSurvey&#60;/title&#62;9 &#60;/head&#62;1011 &#60;body bgcolor=#ffffff&#62;12 &#60;p&#62;&#60;img src=/article/UploadPic/2006-7/2006724132129874.gif align=right&#62;13 &#60;blockquote&#62;14 &#60;font face=&#8221;helvetica&#8221;&#62;15 &#60;form action=&#8221;SurveyServlet&#8221; method=POST&#62;16 &#60;input type=hidden name=survey value=Survey01Results&#62;17 &#60;BR&#62;&#60;BR&#62;How Many Employees in your Company?&#60;BR&#62;18 &#60;BR&#62;1-100&#60;input type=radio name=employee value=1-100&#62;19 &#60;BR&#62;100-200&#60;input type=radio name=employee value=100-200&#62;20 &#60;BR&#62;200-300&#60;input type=radio name=employee value=200-300&#62;21 &#60;BR&#62;300-400&#60;input type=radio name=employee [...]]]></description>
			<content:encoded><![CDATA[<p><font size=2>&nbsp;&nbsp;下面介绍一个HTTP Servlet处理POST方式的例子，见示例14-3。<br />&nbsp;&nbsp;&nbsp;&nbsp;【程序源代码】 </p>
<p><CCID_NOBR></font></p>
<table style="WIDTH: 387px; HEIGHT: 585px" cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=387 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>1// ==================== Program Description ==========================2// 程序名称：示例14-3 : SurveyExample.html3// 程序目的：SurveyExample源代码4// ==============================================================5&lt;!DOCTYPE HTML PUBLIC &#8220;-//IETF//DTD HTML//EN&#8221;&gt;6&lt;html&gt;7  &lt;head&gt;8    &lt;title&gt;JavaUsageSurvey&lt;/title&gt;9  &lt;/head&gt;1011  &lt;body bgcolor=#ffffff&gt;12  &lt;p&gt;&lt;img src=/article/UploadPic/2006-7/2006724132129874.gif align=right&gt;13    &lt;blockquote&gt;14    &lt;font face=&#8221;helvetica&#8221;&gt;15    &lt;form action=&#8221;SurveyServlet&#8221; method=POST&gt;16      &lt;input type=hidden name=survey value=Survey01Results&gt;17      &lt;BR&gt;&lt;BR&gt;How Many Employees in your Company?&lt;BR&gt;18        &lt;BR&gt;1-100&lt;input type=radio name=employee value=1-100&gt;19        &lt;BR&gt;100-200&lt;input type=radio name=employee value=100-200&gt;20        &lt;BR&gt;200-300&lt;input type=radio name=employee value=200-300&gt;21        &lt;BR&gt;300-400&lt;input type=radio name=employee value=300-400&gt;22        &lt;BR&gt;500-more&lt;input type=radio name=employee value=500-more&gt;23      &lt;BR&gt;&lt;BR&gt;General Comments?&lt;BR&gt;24        &lt;BR&gt;&lt;input type=text name=comment&gt;25      &lt;BR&gt;&lt;BR&gt;What IDEs do you use?&lt;BR&gt;26        &lt;BR&gt;JavaWorkShop&lt;input type=checkbox name=ide value=JavaWorkShop&gt;27        &lt;BR&gt;J++&lt;input type=checkbox name=ide value=J++&gt;28        &lt;BR&gt;Cafe&#8217;&lt;input type=checkbox name=ide value=Cafe&#8217;&gt;29      &lt;BR&gt;&lt;BR&gt;&lt;input type=submit&gt;&lt;input type=reset&gt;30    &lt;/form&gt;31    &lt;/font&gt;32    &lt;/blockquote&gt;33  &lt;/body&gt;34&lt;/html&gt;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;【程序输出结果】<br />&nbsp;&nbsp;&nbsp;&nbsp;在客户端IE浏览的效果如图14-5所示。 </p>
<p><CENTER><img src="/article/UploadPic/2006-7/2006724132129519.jpg"><br />图14-5 客户端浏览效果</CENTER></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;服务器端的Servlet就是要将客户端填写并发送的表单数据写入一个文件，并且用一个&#8221;thank you&#8221;信息响应用户。示例14-4就是Servlet程序。 <br />&nbsp;&nbsp;&nbsp;&nbsp;【程序源代码】 </p>
<p><CCID_NOBR></p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>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&#123;13String resultsDir;14  15  public void init(ServletConfig config)16       throws ServletException17  &#123;18    super.init(config);19    resultsDir = getInitParameter(&#8220;resultsDir&#8221;);20    if (resultsDir == null) &#123;21      Enumeration initParams = getInitParameterNames();22      System.err.println(&#8220;The init parameters were: &#8220;);23      while (initParams.hasMoreElements()) &#123;24        System.err.println(initParams.nextElement());25      &#125;26      System.err.println(&#8220;Should have seen one parameter name&#8221;);27      throw new UnavailableException (this,28                                      &#8220;Not given a directory to write survey results!&#8221;);29    &#125;30  &#125;31  32  public void doPost(HttpServletRequest req, HttpServletResponse res)33     throws ServletException, IOException34  &#123;35    res.setContentType(&#8220;text/html&#8221;);   36    PrintWriter toClient = res.getWriter();37    38    try &#123;39      //打开文件将调查结果写入文件40      String surveyName = req.getParameterValues(&#8220;survey&#8221;)[0];41      FileWriter resultsFile = new FileWriter(resultsDir42                     + System.getProperty(&#8220;file.separator&#8221;)43                          + surveyName + &#8220;.txt&#8221;, true);44      PrintWriter toFile = new PrintWriter(resultsFile);45      toFile.println(&#8220;&lt;BEGIN&gt;&#8221;);46      Enumeration values = req.getParameterNames();47      while(values.hasMoreElements()) &#123;48        String name = (String)values.nextElement();49        String value = req.getParameterValues(name)[0];50        if(name.compareTo(&#8220;submit&#8221;) != 0) &#123;51          toFile.println(name + &#8220;: &#8221; + value);52        &#125;53      &#125;54      toFile.println(&#8220;&lt;END&gt;&#8221;);  55      //关闭文件56      resultsFile.close();57      58      // 响应客户59      toClient.println(&#8220;&lt;html&gt;&#8221;);60      toClient.println(&#8220;&lt;title&gt;Thank you!&lt;/title&gt;&#8221;);61      toClient.println(&#8220;&lt;body bgcolor=#ffffff&gt;&lt;p&gt;&lt;img src=images62                    /BEA_Button_Final_web.gif align=right&gt;&#8221; +63       &#8220;&lt;font face=\&#8221;Helvetica\&#8221;&gt;&#8221; +64                      &#8220;Thank you for participating&lt;/font&gt;&lt;/body&gt;&#8221;);65      toClient.println(&#8220;&lt;/html&gt;&#8221;);66      67    &#125; 68   catch(IOException e) &#123;69      e.printStackTrace();70      toClient.println(&#8220;A problem occured while recording your answers. &#8221; +71                       &#8220;Please try again.&#8221;);72    &#125;73    74  &#125;75&#125;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;部分配置文件如下所示： </p>
<p><CCID_NOBR></p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;servlet&gt;&lt;servlet-name&gt;SurveyServlet&lt;/servlet-name&gt;&lt;servlet-class&gt;examples.servlets.SurveyServlet&lt;/servlet-class&gt;&lt;init-param&gt;&lt;param-name&gt;resultsDir&lt;/param-name&gt; &lt;param-value&gt;c:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp\WEB-INF\classes \examples\servlets&lt;/param-value&gt;&lt;/init-param&gt;&lt;/servlet&gt;&lt;servlet-mapping&gt;&lt;servlet-name&gt;SurveyServlet&lt;/servlet-name&gt;&lt;url-pattern&gt;/SurveyServlet/*&lt;/url-pattern&gt;&lt;/servlet-mapping&gt;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;【程序输出结果】<br />&nbsp;&nbsp;&nbsp;&nbsp;在相同目录下生成了一个Survey01Result的文本文件，里面记录着客户提交的信息： </p>
<p><CCID_NOBR></p>
<table cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<tr>
<td class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;BEGIN&gt;employee: 100-200ide: J++survey: Survey01Resultscomment: &lt;END&gt;</CCID_CODE></PRE></td>
</tr>
</table>
<p></CCID_NOBR></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;同时返回给客户端信息，如图14-6所示。 </p>
<p><CENTER><img src="/article/UploadPic/2006-7/2006724132129997.jpg"><br />图14-6 返回给客户端的信息</CENTER></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;【程序注解】<br />&nbsp;&nbsp;&nbsp;&nbsp;在init()方法中先初始化了resultsDir变量，这个变量是以后保存文件的路径，这个变量的值在web.xml中。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;doPost方法是用getParameterNames和getParameterValues方法从表单中获取数据的，当参数名是submit时，就不对这个参数操作，并将其余客户端的参数名和参数值写入文件中。因为它返回文本给客户端，doPost 调用了 getWriter 方法。在写入响应主体部分之前，它进行了响应头部字段的设置setContentType(&#8220;text/html&#8221;).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%ae%9e%e4%be%8b%ef%bc%9aservlet%e5%a4%84%e7%90%86post%e8%af%b7%e6%b1%82/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】如何处理HTTP POST/GET请求</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%a6%82%e4%bd%95%e5%a4%84%e7%90%86http-postget%e8%af%b7%e6%b1%82</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%a6%82%e4%bd%95%e5%a4%84%e7%90%86http-postget%e8%af%b7%e6%b1%82#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:28 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%a6%82%e4%bd%95%e5%a4%84%e7%90%86http-postget%e8%af%b7%e6%b1%82</guid>
		<description><![CDATA[Servlet通过下面的方法来提供服务： 实现service方法。实现HttpServlet的doMethod方法（doGet、doDelete、doOptions、 doPost、doPut、doTrace）。&#160;&#160;&#160;&#160;通常，service方法用来从客户请求（request）中提取信息，访问扩展资源，并基于上面的信息提供响应（response）。 &#160;&#160;&#160;&#160;对于HTTP Servlets，正确提供响应的过程是首先填写响应（response）的头信息，然后从响应（response）中得到输出流，最后向输出流中写入内容信息。响应（response）头信息必须最先设置。下面将描述如何从请求（request）中获得信息和产生HTTP响应（response）。 &#160;&#160;&#160;&#160; 取得客户端请求 &#160;&#160;&#160;&#160;一个HttpServletRequest对象提供到达HTTP 头部数据，也允许你获取客户端的数据。怎样获取这些数据取决于HTTP端请求方法。不管用任何HTTP方式，你都可以用 getParameterValues方法返回特定名称的参数值。对于用 HTTP GET 请求的方式，这个getQueryString方法将会返回一个可以用来分析的值。 &#160;&#160;&#160;&#160;客户端请求（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() [...]]]></description>
			<content:encoded><![CDATA[<p><FONT size=2>Servlet通过下面的方法来提供服务： </FONT><UL><LI>实现service方法。<BR><LI>实现HttpServlet的doMethod方法（doGet、doDelete、doOptions、 doPost、doPut、doTrace）。</LI></UL>&nbsp;&nbsp;&nbsp;&nbsp;通常，service方法用来从客户请求（request）中提取信息，访问扩展资源，并基于上面的信息提供响应（response）。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;对于HTTP Servlets，正确提供响应的过程是首先填写响应（response）的头信息，然后从响应（response）中得到输出流，最后向输出流中写入内容信息。响应（response）头信息必须最先设置。下面将描述如何从请求（request）中获得信息和产生HTTP响应（response）。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; <LI>取得客户端请求 <BR>&nbsp;&nbsp;&nbsp;&nbsp;一个HttpServletRequest对象提供到达HTTP 头部数据，也允许你获取客户端的数据。怎样获取这些数据取决于HTTP端请求方法。不管用任何HTTP方式，你都可以用 getParameterValues方法返回特定名称的参数值。对于用 HTTP GET 请求的方式，这个getQueryString方法将会返回一个可以用来分析的值。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;客户端请求（request）包含了从客户端传递到Servlet的数据。所有的请求（request）都实现了ServletRequest接口。这个接口定义了一些方法访问下面的信息，如表14-1所示。 <BR><BR><CCID_NOBR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TR><TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>表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)</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;下面的代码段示范了如何使用request中的方法获得客户端信息。 <BR><BR><CCID_NOBR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TR><TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Enumeration params = request.getParameterNames();String paramName = null;String[] paramValues = null; while (params.hasMoreElements()) {    paramName = (String) params.nextElement();    paramValues = request.getParameterValues(paramName);    System.out.println(&#8220;\nParameter name is &#8221; + paramName);    for (int i = 0; i &lt; paramValues.length; i++) {      System.out.println(&#8220;, value &#8221; + i + &#8221; is &#8221; + paramValues[i].toString());    }}</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;HTTP Servlets使用HTTP request对象（HttpServletRequest），它包含了request URL、HTTP头信息、查询字符串，等等。HTTP request URL 包括几个部分：<BR>&nbsp;&nbsp;&nbsp;&nbsp;http://<HOST>:<PORT><REQUEST path>?<QUERY string> <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;一般情况下： <BR><BR><CCID_NOBR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TR><TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>requestURI = contextPath + servletPath + pathInfoContext path：通过getContextPath方法获得。 Servlet Path：通过getServletPath方法获得。 PathInfo：通过getPathInfo方法获得。</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;如表14-2所示。 <BR><BR><CCID_NOBR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TR><TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>表14-2  路径的对应Request Path            Path Elements/catalog/help/feedback.jspContextPath: /catalog ServletPath:                             /help/feedback.jsp PathInfo: null</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; <LI>提供HTTP响应 <BR>&nbsp;&nbsp;&nbsp;&nbsp;响应（response）包含了在服务器和客户端之间传递的数据。所有的响应（response）都实现了ServletResponse接口。这个接口定义了一些方法提供给开发人员使用，如表14-3所示。 <BR><BR><CCID_NOBR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TR><TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>表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)</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;HTTP response类（HttpServletResponse）有一些代表HTTP头信息的域：<BR>&nbsp;&nbsp;&nbsp;&nbsp; <LI>状态码用来指出响应（response）失败的原因。 <BR><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; <LI>Cookies在客户端存储应用相关的信息，有时cookies用来维护和标识用户的session。 <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;Servlet首先设置响应（response）头信息，包括响应（response）的内容类别和缓冲区大小，然后在doGet方法中从响应（response）获得PrintWriter ，最后向输出中写入HTML代码，调用close()方法提交这次对客户端的响应（response）。示范代码如下： <BR><BR><CCID_NOBR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TR><TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>public void doGet (HttpServletRequest request,HttpServletResponse response)    throws ServletException, IOException {    // 设置头信息    response.setContentType(&#8220;text/html&#8221;);    response.setBufferSize(8192);    PrintWriter out = response.getWriter();                             // 向response中输出    out.println(&#8220;&lt;html&gt;&#8221; +       &#8220;&lt;head&gt;&lt;title&gt;+       messages.getString(&#8220;TitleBookDescription&#8221;)       +&lt;/title&gt;&lt;/head&gt;&#8221;);    &#8230;     out.println(&#8220;&lt;/body&gt;&lt;/html&gt;&#8221;);    // 关闭输出流    out.close();}</CCID_CODE></PRE></TD></TR></TABLE></CCID_NOBR></LI></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e5%a6%82%e4%bd%95%e5%a4%84%e7%90%86http-postget%e8%af%b7%e6%b1%82/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】网络工程师的素质</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%bd%91%e7%bb%9c%e5%b7%a5%e7%a8%8b%e5%b8%88%e7%9a%84%e7%b4%a0%e8%b4%a8</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%bd%91%e7%bb%9c%e5%b7%a5%e7%a8%8b%e5%b8%88%e7%9a%84%e7%b4%a0%e8%b4%a8#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:28 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

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

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

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e4%ba%a4%e6%8d%a2%e6%9c%ba%e7%9a%84%e7%a7%8d%e7%b1%bb</guid>
		<description><![CDATA[&#160;&#160;&#160; 随着网络技术的发展，各种各样的通信设备应运而生，交换机就是其中一员。在一些技术类书籍或文章中，我们经常可以看到很多交换机的名词，它们中很多是由英语直接翻译过来，也有一些是厂商为了某种目的命名的。这些形形色色的交换机名很容易让人混淆，以下我们将介绍一下交换机的不同分类情况，并对其中一些常见的名词作一分析。&#160;&#160;交换机包括电话交换机（PBX）、数据交换机（Switch），以下我们所提到的交换机都是指数据交换机，对传统的电话交换机就不作讨论了。&#160;从广义上来看，交换机分为两种：广域网交换机和局域网交换机。广域网交换机主要应用于电信领域，提供通信用的基础平台。而局域网交换机则应用于局域网络，用于连接终端设备，如PC机及网络打印机等。以下内容都是基于局域网交换机来说的。&#160;按照最广泛的普通分类方法，即从规模应用上，局域网交换机可分为企业级交换机、部门级交换机和工作组交换机等。作为骨干交换机时，支持500个信息点以上大型企业应用的交换机为企业级交换机，支持300个信息点以下中型企业的交换机为部门级交换机，而支持100个信息点以内的交换机为工作组级交换机。但这也不是绝对的标准，正是由于没有统一的划分的尺度标准，又出现了桌面型交换机（Desktop&#160;Switch）、校园网交换机（Campus&#160;Switch）等概念。下面对以上几个概念作一简介：&#160;1．&#160;桌面型交换机，这是最常见的一种交换机，它区别于其他交换机的一个特点是支持的每端口MAC地址很少。广泛的使用于一般办公室、小型机房和业务受理较为集中的业务部门、多媒体制作中心、网站管理中心等部门。在传输速度上，现代桌面型交换机大都提供多个具有10/100Mbps自适应能力的端口。&#160;2．工作组交换机，常用来作为扩充设备，在桌面型交换机不能满足需求时，大多直接考虑工作组型交换机。虽然工作组型交换机只有较少的端口数量，但却支持较多的MAC地址，并具有良好的扩充能力，端口的传输速度基本上为100Mbps。&#160;3．&#160;部门交换机，它通常不比工作组交换机更贵，而且与工作组交换机不同的是它们的端口数量和性能级别有所差异。一个部门交换机通常有8～16个端口，通常在所有端口上支持全双工操作。它们的性能要好于一个工作组交换机的性能，而且有一个等于或超过所有端口带宽的半双工汇集带宽。&#160;4．&#160;校园网交换机，这种交换机应用相对较少，仅应用于大型网络，且一般作为网络的骨干交换机，并具有快速数据交换能力和全双工能力，可提供容错等智能特性，还支持扩充选项及第三层交换中的虚拟局域网(VLAN)等多种功能。&#160;5.&#160;企业交换机，虽然非常类似于校园网交换机，但最大的不同是企业交换机还可以接入一个大底盘。这些底盘产品通常支持许多不同类型的组件，比如快速以太网和以大网中继器、FDDI集中器、令牌环MAU和路由器。企业交换机在建设企业级别的网络时非常有用，尤其是对需要支持一些网络技术和以前的系统。基于底盘设备通常有非常强大的管理特征，因此非常适合于企业网络的环境。不过，基于底盘设备的缺点是它们的成本都非常高。&#160;根据架构特点，人们还将局域网交换机分为机架式、带扩展槽固定配置式、不带扩展槽固定配置式3种产品。&#160;1．&#160;机架式交换机&#160;这是一种插槽式的交换机，这种交换机扩展性较好，可支持不同的网络类型，如以太网、快速以太网、千兆以太网、ATM、令牌环及FDDI等，但价格较贵，高端交换机有不少采用机架式结构。&#160;2．&#160;带扩展槽固定配置式交换机&#160;它是一种有固定端口数并带少量扩展槽的交换机，这种交换机在支持固定端口类型网络的基础上，还可以通过扩展其他网络类型模块来支持其他类型网络。这类交换机的价格居中。&#160;3．&#160;不带扩展槽固定配置式交换机&#160;这类交换机仅支持一种类型的网络（一般是以太网），可应用于小型企业或办公室环境下的局域网，价格最便宜，应用也最广泛。&#160;从传输介质和传输速度上看，局域网交换机可以分为以太网交换机、快速以太网交换机、千兆以太网交换机、FDDI交换机、ATM交换机和令牌环交换机等多种，这些交换机分别适用于以太网、快速以太网、FDDI、ATM和令牌环网等环境。&#160;从ISO/OSI的分层结构上说，交换机可分为二层交换机、三层交换机等。二层交换机指的就是传统的工作在OSI参考模型的第二层&#8211;数据链路层上交换机，主要功能包括物理编址、错误校验、帧序列以及流控。&#160;一个纯第二层的解决方案，是最便宜的方案，但它在划分子网和广播限制等方面提供的控制最少。传统的路由器与外部的交换机一起使用也能解决这个问题，但现在路由器的处理速度已跟不上带宽要求。因此三层交换机、Web交换机等应运而生。&#160;三层交换机是一个具有三层交换功能的设备，即带有第三层路由功能的第二层交换机，但它是二者的有机结合，并不是简单地把路由器设备的硬件及软件叠加在局域网交换机上。&#160;Web交换机为数据中心设备（包括Internet服务器、防火墙、高速缓冲服务器和网关等）提供管理、路由和负载均衡传输。不同于传统网络设备的是，传统网络设备注重高速完成单个帧和数据包的交换，而Web交换侧重于跟踪和处理Web会话。除了由传统第二/三层交换机所提供的连接和封包路由外，Web交换机还可提供传统局域网交换机和路由器所缺乏的完备策略，将局部和全球服务器负载均衡、存取控制、服务质量保证（QoS）以及带宽管理等管理能力结合起来。目前，Web交换机已由纯粹的传输层（第四层）设备发展到具有基于内容（第七层）的交换的智能。利用内容或用户分类进行Web请求重定向是Web服务器的一项功能。不过，Internet传输和商业的发展远远超过计算机处理能力的提高。把内容分类卸到Web交换机可平衡整个网站的基础设施。&#160;随着技术的发展，肯定还会有更多的新名词涌现出来，但是只要掌握好原理，有清楚的概念，就不会被它们搞昏头脑。&#160;]]></description>
			<content:encoded><![CDATA[<p><P>&nbsp;&nbsp;&nbsp; 随着网络技术的发展，各种各样的通信设备应运而生，交换机就是其中一员。在一些技术类书籍或文章中，我们经常可以看到很多交换机的名词，它们中很多是由英语直接翻译过来，也有一些是厂商为了某种目的命名的。这些形形色色的交换机名很容易让人混淆，以下我们将介绍一下交换机的不同分类情况，并对其中一些常见的名词作一分析。&nbsp;&nbsp;</P><P></P><P>交换机包括电话交换机（PBX）、数据交换机（Switch），以下我们所提到的交换机都是指数据交换机，对传统的电话交换机就不作讨论了。&nbsp;</P><P>从广义上来看，交换机分为两种：广域网交换机和局域网交换机。广域网交换机主要应用于电信领域，提供通信用的基础平台。而局域网交换机则应用于局域网络，用于连接终端设备，如PC机及网络打印机等。以下内容都是基于局域网交换机来说的。&nbsp;</P><P>按照最广泛的普通分类方法，即从规模应用上，局域网交换机可分为企业级交换机、部门级交换机和工作组交换机等。作为骨干交换机时，支持500个信息点以上大型企业应用的交换机为企业级交换机，支持300个信息点以下中型企业的交换机为部门级交换机，而支持100个信息点以内的交换机为工作组级交换机。但这也不是绝对的标准，正是由于没有统一的划分的尺度标准，又出现了桌面型交换机（Desktop&nbsp;Switch）、校园网交换机（Campus&nbsp;Switch）等概念。下面对以上几个概念作一简介：&nbsp;</P><P>1．&nbsp;桌面型交换机，这是最常见的一种交换机，它区别于其他交换机的一个特点是支持的每端口MAC地址很少。广泛的使用于一般办公室、小型机房和业务受理较为集中的业务部门、多媒体制作中心、网站管理中心等部门。在传输速度上，现代桌面型交换机大都提供多个具有10/100Mbps自适应能力的端口。&nbsp;</P><P>2．工作组交换机，常用来作为扩充设备，在桌面型交换机不能满足需求时，大多直接考虑工作组型交换机。虽然工作组型交换机只有较少的端口数量，但却支持较多的MAC地址，并具有良好的扩充能力，端口的传输速度基本上为100Mbps。&nbsp;</P><P>3．&nbsp;部门交换机，它通常不比工作组交换机更贵，而且与工作组交换机不同的是它们的端口数量和性能级别有所差异。一个部门交换机通常有8～16个端口，通常在所有端口上支持全双工操作。它们的性能要好于一个工作组交换机的性能，而且有一个等于或超过所有端口带宽的半双工汇集带宽。&nbsp;</P><P>4．&nbsp;校园网交换机，这种交换机应用相对较少，仅应用于大型网络，且一般作为网络的骨干交换机，并具有快速数据交换能力和全双工能力，可提供容错等智能特性，还支持扩充选项及第三层交换中的虚拟局域网(VLAN)等多种功能。&nbsp;</P><P>5.&nbsp;企业交换机，虽然非常类似于校园网交换机，但最大的不同是企业交换机还可以接入一个大底盘。这些底盘产品通常支持许多不同类型的组件，比如快速以太网和以大网中继器、FDDI集中器、令牌环MAU和路由器。企业交换机在建设企业级别的网络时非常有用，尤其是对需要支持一些网络技术和以前的系统。基于底盘设备通常有非常强大的管理特征，因此非常适合于企业网络的环境。不过，基于底盘设备的缺点是它们的成本都非常高。&nbsp;</P><P>根据架构特点，人们还将局域网交换机分为机架式、带扩展槽固定配置式、不带扩展槽固定配置式3种产品。&nbsp;</P><P>1．&nbsp;机架式交换机&nbsp;这是一种插槽式的交换机，这种交换机扩展性较好，可支持不同的网络类型，如以太网、快速以太网、千兆以太网、ATM、令牌环及FDDI等，但价格较贵，高端交换机有不少采用机架式结构。&nbsp;</P><P>2．&nbsp;带扩展槽固定配置式交换机&nbsp;它是一种有固定端口数并带少量扩展槽的交换机，这种交换机在支持固定端口类型网络的基础上，还可以通过扩展其他网络类型模块来支持其他类型网络。这类交换机的价格居中。&nbsp;</P><P>3．&nbsp;不带扩展槽固定配置式交换机&nbsp;这类交换机仅支持一种类型的网络（一般是以太网），可应用于小型企业或办公室环境下的局域网，价格最便宜，应用也最广泛。&nbsp;<BR>从传输介质和传输速度上看，局域网交换机可以分为以太网交换机、快速以太网交换机、千兆以太网交换机、FDDI交换机、ATM交换机和令牌环交换机等多种，这些交换机分别适用于以太网、快速以太网、FDDI、ATM和令牌环网等环境。&nbsp;</P><P>从ISO/OSI的分层结构上说，交换机可分为二层交换机、三层交换机等。二层交换机指的就是传统的工作在OSI参考模型的第二层&#8211;数据链路层上交换机，主要功能包括物理编址、错误校验、帧序列以及流控。&nbsp;一个纯第二层的解决方案，是最便宜的方案，但它在划分子网和广播限制等方面提供的控制最少。传统的路由器与外部的交换机一起使用也能解决这个问题，但现在路由器的处理速度已跟不上带宽要求。因此三层交换机、Web交换机等应运而生。&nbsp;</P><P>三层交换机是一个具有三层交换功能的设备，即带有第三层路由功能的第二层交换机，但它是二者的有机结合，并不是简单地把路由器设备的硬件及软件叠加在局域网交换机上。&nbsp;</P><P>Web交换机为数据中心设备（包括Internet服务器、防火墙、高速缓冲服务器和网关等）提供管理、路由和负载均衡传输。不同于传统网络设备的是，传统网络设备注重高速完成单个帧和数据包的交换，而Web交换侧重于跟踪和处理Web会话。除了由传统第二/三层交换机所提供的连接和封包路由外，Web交换机还可提供传统局域网交换机和路由器所缺乏的完备策略，将局部和全球服务器负载均衡、存取控制、服务质量保证（QoS）以及带宽管理等管理能力结合起来。目前，Web交换机已由纯粹的传输层（第四层）设备发展到具有基于内容（第七层）的交换的智能。利用内容或用户分类进行Web请求重定向是Web服务器的一项功能。不过，Internet传输和商业的发展远远超过计算机处理能力的提高。把内容分类卸到Web交换机可平衡整个网站的基础设施。&nbsp;<BR>随着技术的发展，肯定还会有更多的新名词涌现出来，但是只要掌握好原理，有清楚的概念，就不会被它们搞昏头脑。&nbsp;</P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e4%ba%a4%e6%8d%a2%e6%9c%ba%e7%9a%84%e7%a7%8d%e7%b1%bb/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】ping的工作原理</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91ping%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91ping%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:28 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91ping%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86</guid>
		<description><![CDATA[ping的原理就是首先建立通道，然后发送包，对方接受后返回信息，这个包至少包括以下内容，发送的时候，包的内容包括对方的ip地址和自己的地址，还有序列数，回送的时候包括双方地址，还有时间等，主要是接受方在都是在操作系统内核里做好的，时刻在监听，提供一段c程序的代码，希望对大家有用。#include &#60;stdio.h&#62; #include &#60;signal.h&#62; #include &#60;arpa/inet.h&#62; #include &#60;sys/types.h&#62; #include &#60;sys/socket.h&#62; #include &#60;unistd.h&#62; #include &#60;netinet/in.h&#62; #include &#60;netinet/ip.h&#62; #include &#60;netinet/ip_icmp.h&#62; #include &#60;netdb.h&#62; #include &#60;setjmp.h&#62; #include &#60;errno.h&#62; #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); [...]]]></description>
			<content:encoded><![CDATA[<p><P><font size=2>ping的原理就是首先建立通道，然后发送包，对方接受后返回信息，这个包至少包括以下内容，发送的时候，包的内容包括对方的ip地址和自己的地址，还有序列数，回送的时候包括双方地址，还有时间等，主要是接受方在都是在操作系统内核里做好的，时刻在监听，提供</font><font size=2>一段c程序的代码，希望对大家有用。<br />#include &lt;stdio.h&gt; <br />#include &lt;signal.h&gt; <br />#include &lt;arpa/inet.h&gt; <br />#include &lt;sys/types.h&gt; <br />#include &lt;sys/socket.h&gt; <br />#include &lt;unistd.h&gt; <br />#include &lt;netinet/in.h&gt; <br />#include &lt;netinet/ip.h&gt; <br />#include &lt;netinet/ip_icmp.h&gt; <br />#include &lt;netdb.h&gt; <br />#include &lt;setjmp.h&gt; <br />#include &lt;errno.h&gt; </p>
<p>#define PACKET_SIZE 4096 <br />#define MAX_WAIT_TIME 5 <br />#define MAX_NO_PACKETS 3 </p>
<p>char sendpacket[PACKET_SIZE]; <br />char recvpacket[PACKET_SIZE]; <br />int sockfd,datalen=56; <br />int nsend=0,nreceived=0; <br />struct sockaddr_in dest_addr; <br />pid_t pid; <br />struct sockaddr_in from; <br />struct timeval tvrecv; </p>
<p>void statistics(int signo); <br />unsigned short cal_chksum(unsigned short *addr,int len); <br />int pack(int pack_no); <br />void send_packet(void); <br />void recv_packet(void); <br />int unpack(char *buf,int len); <br />void tv_sub(struct timeval *out,struct timeval *in); </p>
<p>void statistics(int signo) <br />&#123; printf(&#8220;\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;PING statistics&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-\n&#8221;); <br />printf(&#8220;%d packets transmitted, %d received , %%%d lost\n&#8221;,nsend,nreceived, <br />(nsend-nreceived)/nsend*100); <br />close(sockfd); <br />exit(1); <br />&#125; <br />/*校验和算法*/ <br />unsigned short cal_chksum(unsigned short *addr,int len) <br />&#123; int nleft=len; <br />int sum=0; <br />unsigned short *w=addr; <br />unsigned short answer=0; </p>
<p>/*把ICMP报头二进制数据以2字节为单位累加起来*/ <br />while(nleft&gt;1) <br />&#123; sum+=*w++; <br />nleft-=2; <br />&#125; <br />/*若ICMP报头为奇数个字节，会剩下最后一字节。把最后一个字节视为一个2字节数据的高字节，这个2字节数据的低字节为0，继续累加*/ <br />if( nleft==1) <br />&#123; *(unsigned char *)(&amp;answer)=*(unsigned char *)w; <br />sum+=answer; <br />&#125; <br />sum=(sum&gt;&gt;16)+(sum&amp;0xffff); <br />sum+=(sum&gt;&gt;16); <br />answer=~sum; <br />return answer; <br />&#125; <br />/*设置ICMP报头*/ <br />int pack(int pack_no) <br />&#123; int i,packsize; <br />struct icmp *icmp; <br />struct timeval *tval; </p>
<p>icmp=(struct icmp*)sendpacket; <br />icmp-&gt;icmp_type=ICMP_ECHO; <br />icmp-&gt;icmp_code=0; <br />icmp-&gt;icmp_cksum=0; <br />icmp-&gt;icmp_seq=pack_no; <br />icmp-&gt;icmp_id=pid; <br />packsize=8+datalen; <br />tval= (struct timeval *)icmp-&gt;icmp_data; <br />gettimeofday(tval,NULL); /*记录发送时间*/ <br />icmp-&gt;icmp_cksum=cal_chksum( (unsigned short *)icmp,packsize); /*校验算法*/ <br />return packsize; <br />&#125; </p>
<p>/*发送三个ICMP报文*/ <br />void send_packet() <br />&#123; int packetsize; <br />while( nsend&lt;MAX_NO_PACKETS) <br />&#123; nsend++; <br />packetsize=pack(nsend); /*设置ICMP报头*/ <br />if( sendto(sockfd,sendpacket,packetsize,0, <br />(struct sockaddr *)&amp;dest_addr,sizeof(dest_addr) )&lt;0 ) <br />&#123; perror(&#8220;sendto error&#8221;); <br />continue; <br />&#125; <br />sleep(1); /*每隔一秒发送一个ICMP报文*/ <br />&#125; <br />&#125; </p>
<p>/*接收所有ICMP报文*/ <br />void recv_packet() <br />&#123; int n,fromlen; <br />extern int errno; </p>
<p>signal(SIGALRM,statistics); <br />fromlen=sizeof(from); <br />while( nreceived&lt;nsend) <br />&#123; alarm(MAX_WAIT_TIME); <br />if( (n=recvfrom(sockfd,recvpacket,sizeof(recvpacket),0, <br />(struct sockaddr *)&amp;from,&amp;fromlen)) &lt;0) <br />&#123; if(errno==EINTR)continue; <br />perror(&#8220;recvfrom error&#8221;); <br />continue; <br />&#125; <br />gettimeofday(&amp;tvrecv,NULL); /*记录接收时间*/ <br />if(unpack(recvpacket,n)==-1)continue; <br />nreceived++; <br />&#125; </p>
<p>&#125; <br />/*剥去ICMP报头*/ <br />int unpack(char *buf,int len) <br />&#123; int i,iphdrlen; <br />struct ip *ip; <br />struct icmp *icmp; <br />struct timeval *tvsend; <br />double rtt; </p>
<p>ip=(struct ip *)buf; <br />iphdrlen=ip-&gt;ip_hl&lt;&lt;2; /*求ip报头长度,即ip报头的长度标志乘4*/ <br />icmp=(struct icmp *)(buf+iphdrlen); /*越过ip报头,指向ICMP报头*/ <br />len-=iphdrlen; /*ICMP报头及ICMP数据报的总长度*/ <br />if( len&lt;<img alt=icon_cool.gif src="/article/UploadPic/2006-7/2006724132057933.gif" border=0> /*小于ICMP报头长度则不合理*/ <br />&#123; printf(&#8220;ICMP packets\&#8217;s length is less than 8\n&#8221;); <br />return -1; <br />&#125; <br />/*确保所接收的是我所发的的ICMP的回应*/ <br />if( (icmp-&gt;icmp_type==ICMP_ECHOREPLY) &amp;&amp; (icmp-&gt;icmp_id==pid) ) <br />&#123; tvsend=(struct timeval *)icmp-&gt;icmp_data; <br />tv_sub(&amp;tvrecv,tvsend); /*接收和发送的时间差*/ <br />rtt=tvrecv.tv_sec*1000+tvrecv.tv_usec/1000; /*以毫秒为单位计算rtt*/ <br />/*显示相关信息*/ <br />printf(&#8220;%d byte from %s: icmp_seq=%u ttl=%d rtt=%.3f ms\n&#8221;, <br />len, <br />inet_ntoa(from.sin_addr), <br />icmp-&gt;icmp_seq, <br />ip-&gt;ip_ttl, <br />rtt); <br />&#125; <br />else return -1; <br />&#125; </p>
<p>main(int argc,char *argv[]) <br />&#123; struct hostent *host; <br />struct protoent *protocol; <br />unsigned long inaddr=0l; <br />int waittime=MAX_WAIT_TIME; <br />int size=50*1024; </p>
<p>if(argc&lt;2) <br />&#123; printf(&#8220;usage:%s hostname/IP address\n&#8221;,argv[0]); <br />exit(1); <br />&#125; </p>
<p>if( (protocol=getprotobyname(&#8220;icmp&#8221;) )==NULL) <br />&#123; perror(&#8220;getprotobyname&#8221;); <br />exit(1); <br />&#125; <br />/*生成使用ICMP的原始套接字,这种套接字只有root才能生成*/ <br />if( (sockfd=socket(AF_INET,SOCK_RAW,protocol-&gt;p_proto) )&lt;0) <br />&#123; perror(&#8220;socket error&#8221;); <br />exit(1); <br />&#125; <br />/* 回收root权限,设置当前用户权限*/ <br />setuid(getuid()); <br />/*扩大套接字接收缓冲区到50K这样做主要为了减小接收缓冲区溢出的 <br />的可能性,若无意中ping一个广播地址或多播地址,将会引来大量应答*/ <br />setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,&amp;size,sizeof(size) ); <br />bzero(&amp;dest_addr,sizeof(dest_addr)); <br />dest_addr.sin_family=AF_INET; </p>
<p>/*判断是主机名还是ip地址*/ <br />if( inaddr=inet_addr(argv[1])==INADDR_NONE) <br />&#123; if((host=gethostbyname(argv[1]) )==NULL) /*是主机名*/ <br />&#123; perror(&#8220;gethostbyname error&#8221;); <br />exit(1); <br />&#125; <br />memcpy( (char *)&amp;dest_addr.sin_addr,host-&gt;h_addr,host-&gt;h_length); <br />&#125; <br />else /*是ip地址*/ <br />memcpy( (char *)&amp;dest_addr,(char *)&amp;inaddr,host-&gt;h_length); <br />/*获取main的进程id,用于设置ICMP的标志符*/ <br />pid=getpid(); <br />printf(&#8220;PING %s(%s): %d bytes data in ICMP packets.\n&#8221;,argv[1], <br />inet_ntoa(dest_addr.sin_addr),datalen); <br />send_packet(); /*发送所有ICMP报文*/ <br />recv_packet(); /*接收所有ICMP报文*/ <br />statistics(SIGALRM); /*进行统计*/ </p>
<p>return 0; </p>
<p>&#125; <br />/*两个timeval结构相减*/ <br />void tv_sub(struct timeval *out,struct timeval *in) <br />&#123; if( (out-&gt;tv_usec-=in-&gt;tv_usec)&lt;0) <br />&#123; &#8211;out-&gt;tv_sec; <br />out-&gt;tv_usec+=1000000; <br />&#125; <br />out-&gt;tv_sec-=in-&gt;tv_sec; <br />&#125; <br />/*&#8212;&#8212;&#8212;&#8212;- The End &#8212;&#8212;&#8212;&#8211;*/</font></P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91ping%e7%9a%84%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】网络攻击技术和PKI技术概述</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%bd%91%e7%bb%9c%e6%94%bb%e5%87%bb%e6%8a%80%e6%9c%af%e5%92%8cpki%e6%8a%80%e6%9c%af%e6%a6%82%e8%bf%b0</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%bd%91%e7%bb%9c%e6%94%bb%e5%87%bb%e6%8a%80%e6%9c%af%e5%92%8cpki%e6%8a%80%e6%9c%af%e6%a6%82%e8%bf%b0#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:28 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%bd%91%e7%bb%9c%e6%94%bb%e5%87%bb%e6%8a%80%e6%9c%af%e5%92%8cpki%e6%8a%80%e6%9c%af%e6%a6%82%e8%bf%b0</guid>
		<description><![CDATA[网络主动攻击和被动攻击　　网络攻击又可分为主动攻击和被动攻击。　　◆ 被动攻击　　被动攻击就是网络窃听，截取数据包并进行分析，从中窃取重要的敏感信息。被动攻击很难被发现，因此预防很重要，防止被动攻击的主要手段是数据加密传输。为了保护网络资源免受威胁和攻击，在密码学及安全协议的基础上发展了网络安全体系中的五类安全服务，它们是：身份认证、访问控制、数据保密、数据完整性和不可否认。对这五类安全服务，国际标准化组织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)，为用户和网络应用提供证书及验证证书状态。]]></description>
			<content:encoded><![CDATA[<p><P><STRONG><FONT color=#330099>网络主动攻击和被动攻击<BR><BR></FONT></STRONG>　　网络攻击又可分为主动攻击和被动攻击。<BR><BR>　　◆ 被动攻击<BR><BR>　　被动攻击就是网络窃听，截取数据包并进行分析，从中窃取重要的敏感信息。被动攻击很难被发现，因此预防很重要，防止被动攻击的主要手段是数据加密传输。为了保护网络资源免受威胁和攻击，在密码学及安全协议的基础上发展了网络安全体系中的五类安全服务，它们是：身份认证、访问控制、数据保密、数据完整性和不可否认。对这五类安全服务，国际标准化组织ISO已经有了明确的定义。<BR><BR>　　◆ 主动攻击包括窃取、篡改、假冒和破坏。<BR><BR>　　主动攻击包括窃取、篡改、假冒和破坏。字典式口令猜测，IP地址欺骗和服务拒绝攻击等等都属于主动攻击。一个好的身份认证系统(包括数据加密、数据完整性校验、数字签名和访问控制等安全机制)可以用于防范主动攻击，但要想杜绝主动攻击很困难，因此对付主动攻击的另一措施是及时发现并及时恢复所造成的破坏，现在有很多实用的攻击检测工具。<BR><BR><B><FONT color=#330099>　　PKI技术<BR><BR></FONT></B>　　PKI（Public Key Infrastructure），即公开密钥体系。它是利用公钥理论和技术建立的提供信息安全服务的基础设施，是国际公认的互联网电子商务的安全认证机制。它利用现代密码学中的公钥密码技术在开放的Internet网络环境中提供数据加密以及数字签名服务的统一的技术框架。<BR><BR>　　公钥是目前应用最广泛的一种加密体制，在此体系中，加密密钥与解密密钥各不相同，发送信息的人利用接收者的公钥发送加密信息，接收者再利用自己专有的私钥进行解密。这种方式既保证了信息的机密性，又能保证信息具有不可抵赖性。<BR><BR>　　PKI是一种遵循标准并利用公钥技术，为电子商务应用的开展提供一套安全基础平台的技术与规范，它能够透明地提供基于公开密钥的加密和数字签名等安全服务。利用PKI可以方便地建立和维护一个可信的网络计算环境，从而使得人们在这个无法直接相互面对的环境中能够确认彼此的身份和所交换的信息。<BR><BR>　　为实现以上目的，典型实用的PKI系统应由以下部分组成：PKI客户端、注册机构(RA)、认证机构(CA)和证书库。<BR><BR>　　◆ PKI客户端 <BR><BR>　　PKI客户端的主要功能是使各种网络应用能够以透明、安全、一致、可信的方式与PKI交互，从而使用户能够方便地使用加密、数字签名等安全服务。<BR><BR>　　◆ 注册机构(RA)<BR><BR>　　RA则是用户与认证中心的接口，其主要功能是核实证书申请者的身份，它所获证书的申请者身份的准确性是CA颁发证书的基础。<BR><BR>　　◆ 认证机构(CA)<BR><BR>　　作为PKI核心的认证中心是证书颁发机构，由CA签发的证书是网上用户的电子身份标识。<BR><BR>　　◆ 证书库<BR><BR>　　证书库用来存放经CA签发的证书和证书注销列表(CRL)，为用户和网络应用提供证书及验证证书状态。</P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e7%bd%91%e7%bb%9c%e6%94%bb%e5%87%bb%e6%8a%80%e6%9c%af%e5%92%8cpki%e6%8a%80%e6%9c%af%e6%a6%82%e8%bf%b0/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】IPSec基础－IPSec服务</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91ipsec%e5%9f%ba%e7%a1%80%ef%bc%8dipsec%e6%9c%8d%e5%8a%a1</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91ipsec%e5%9f%ba%e7%a1%80%ef%bc%8dipsec%e6%9c%8d%e5%8a%a1#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:27 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91ipsec%e5%9f%ba%e7%a1%80%ef%bc%8dipsec%e6%9c%8d%e5%8a%a1</guid>
		<description><![CDATA[IPSec基础－IPSec服务 IPSec 协议不是一个单独的协议，它给出了应用于IP层上网络数据安全的一整套体系结构，包括网络认证协议 Authentication Header（AH）、封装安全载荷协议Encapsulating Security Payload（ESP）、密钥管理协议Internet Key Exchange （IKE）和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换，向上提供了访问控制、数据源认证、数据加密等网络安全服务&#8230;IPSec基础－IPSec服务 IPSec 协议不是一个单独的协议，它给出了应用于IP层上网络数据安全的一整套体系结构，包括网络认证协议 Authentication Header（AH）、封装安全载荷协议Encapsulating Security Payload（ESP）、密钥管理协议Internet Key Exchange （IKE）和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换，向上提供了访问控制、数据源认证、数据加密等网络安全服务。 　　一、安全特性 　　IPSec的安全特性主要有： 　　 ·不可否认性 &#8220;不可否认性&#8221;可以证实消息发送方是唯一可能的发送者，发送者不能否认发送过消息。&#8221;不可否认性&#8221;是采用公钥技术的一个特征，当使用公钥技术时，发送方用私钥产生一个数字签名随消息一起发送，接收方用发送者的公钥来验证数字签名。由于在理论上只有发送者才唯一拥有私钥，也只有发送者才可能产生该数字签名，所以只要数字签名通过验证，发送者就不能否认曾发送过该消息。但&#8221;不可否认性&#8221;不是基于认证的共享密钥技术的特征，因为在基于认证的共享密钥技术中，发送方和接收方掌握相同的密钥。 　　·反重播性 &#8220;反重播&#8221;确保每个IP包的唯一性，保证信息万一被截取复制后，不能再被重新利用、重新传输回目的地址。该特性可以防止攻击者截取破译信息后，再用相同的信息包冒取非法访问权（即使这种冒取行为发生在数月之后）。 　　·数据完整性 防止传输过程中数据被篡改，确保发出数据和接收数据的一致性。IPSec利用Hash函数为每个数据包产生一个加密检查和，接收方在打开包前先计算检查和，若包遭篡改导致检查和不相符，数据包即被丢弃。 　　·数据可靠性（加密） 在传输前，对数据进行加密，可以保证在传输过程中，即使数据包遭截取，信息也无法被读。该特性在IPSec中为可选项，与IPSec策略的具体设置相关。 　　·认证 数据源发送信任状，由接收方验证信任状的合法性，只有通过认证的系统才可以建立通信连接。 　　二、基于电子证书的公钥认证 　　一个架构良好的公钥体系，在信任状的传递中不造成任何信息外泄，能解决很多安全问题。IPSec与特定的公钥体系相结合，可以提供基于电子证书的认证。公钥证书认证在Windows 2000中，适用于对非Windows 2000主机、独立主机，非信任域成员的客户机、或者不运行Kerberos v5认证协议的主机进行身份认证。 　　三、预置共享密钥认证 　　IPSec也可以使用预置共享密钥进行认证。预共享意味着通信双方必须在IPSec策略设置中就共享的密钥达成一致。之后在安全协商过程中，信息在传输前使用共享密钥加密，接收端使用同样的密钥解密，如果接收方能够解密，即被认为可以通过认证。但在Windows 2000 IPSec策略中，这种认证方式被认为不够安全而一般不推荐使用。 　　四、公钥加密 　　IPSec的公钥加密用于身份认证和密钥交换。公钥加密，也被称为&#8221;不对称加密法&#8221;，即加解密过程需要两把不同的密钥，一把用来产生数字签名和加密数据，另一把用来验证数字签名和对数据进行解密。 　　使用公钥加密法，每个用户拥有一个密钥对，其中私钥仅为其个人所知，公钥则可分发给任意需要与之进行加密通信的人。例如：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不一致，接收方丢弃该数据包。 [...]]]></description>
			<content:encoded><![CDATA[<p><P>IPSec基础－IPSec服务 </P><P>IPSec 协议不是一个单独的协议，它给出了应用于IP层上网络数据安全的一整套体系结构，包括网络认证协议 Authentication Header（AH）、封装安全载荷协议Encapsulating Security Payload（ESP）、密钥管理协议Internet Key Exchange （IKE）和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换，向上提供了访问控制、数据源认证、数据加密等网络安全服务&#8230;</P><P>IPSec基础－IPSec服务 </P><P>IPSec 协议不是一个单独的协议，它给出了应用于IP层上网络数据安全的一整套体系结构，包括网络认证协议 Authentication Header（AH）、封装安全载荷协议Encapsulating Security Payload（ESP）、密钥管理协议Internet Key Exchange （IKE）和用于网络认证及加密的一些算法等。IPSec 规定了如何在对等层之间选择安全协议、确定安全算法和密钥交换，向上提供了访问控制、数据源认证、数据加密等网络安全服务。 <BR>　　一、安全特性 </P><P>　　IPSec的安全特性主要有： </P><P>　　 ·不可否认性 &#8220;不可否认性&#8221;可以证实消息发送方是唯一可能的发送者，发送者不能否认发送过消息。&#8221;不可否认性&#8221;是采用公钥技术的一个特征，当使用公钥技术时，发送方用私钥产生一个数字签名随消息一起发送，接收方用发送者的公钥来验证数字签名。由于在理论上只有发送者才唯一拥有私钥，也只有发送者才可能产生该数字签名，所以只要数字签名通过验证，发送者就不能否认曾发送过该消息。但&#8221;不可否认性&#8221;不是基于认证的共享密钥技术的特征，因为在基于认证的共享密钥技术中，发送方和接收方掌握相同的密钥。 <BR>　　·反重播性 &#8220;反重播&#8221;确保每个IP包的唯一性，保证信息万一被截取复制后，不能再被重新利用、重新传输回目的地址。该特性可以防止攻击者截取破译信息后，再用相同的信息包冒取非法访问权（即使这种冒取行为发生在数月之后）。 <BR>　　·数据完整性 防止传输过程中数据被篡改，确保发出数据和接收数据的一致性。IPSec利用Hash函数为每个数据包产生一个加密检查和，接收方在打开包前先计算检查和，若包遭篡改导致检查和不相符，数据包即被丢弃。 <BR>　　·数据可靠性（加密） 在传输前，对数据进行加密，可以保证在传输过程中，即使数据包遭截取，信息也无法被读。该特性在IPSec中为可选项，与IPSec策略的具体设置相关。 <BR>　　·认证 数据源发送信任状，由接收方验证信任状的合法性，只有通过认证的系统才可以建立通信连接。 </P><P>　　二、基于电子证书的公钥认证 </P><P>　　一个架构良好的公钥体系，在信任状的传递中不造成任何信息外泄，能解决很多安全问题。IPSec与特定的公钥体系相结合，可以提供基于电子证书的认证。公钥证书认证在Windows 2000中，适用于对非Windows 2000主机、独立主机，非信任域成员的客户机、或者不运行Kerberos v5认证协议的主机进行身份认证。 </P><P>　　三、预置共享密钥认证 </P><P>　　IPSec也可以使用预置共享密钥进行认证。预共享意味着通信双方必须在IPSec策略设置中就共享的密钥达成一致。之后在安全协商过程中，信息在传输前使用共享密钥加密，接收端使用同样的密钥解密，如果接收方能够解密，即被认为可以通过认证。但在Windows 2000 IPSec策略中，这种认证方式被认为不够安全而一般不推荐使用。 </P><P>　　四、公钥加密 </P><P>　　IPSec的公钥加密用于身份认证和密钥交换。公钥加密，也被称为&#8221;不对称加密法&#8221;，即加解密过程需要两把不同的密钥，一把用来产生数字签名和加密数据，另一把用来验证数字签名和对数据进行解密。 </P><P>　　使用公钥加密法，每个用户拥有一个密钥对，其中私钥仅为其个人所知，公钥则可分发给任意需要与之进行加密通信的人。例如：A想要发送加密信息给B，则A需要用B的公钥加密信息，之后只有B才能用他的私钥对该加密信息进行解密。虽然密钥对中两把钥匙彼此相关，但要想从其中一把来推导出另一把，以目前计算机的运算能力来看，这种做法几乎完全不现实。因此，在这种加密法中，公钥可以广为分发，而私钥则需要仔细地妥善保管。 </P><P>　　五、Hash函数和数据完整性 </P><P>　　Hash信息验证码HMAC（Hash message authentication codes）验证接收消息和发送消息的完全一致性（完整性）。这在数据交换中非常关键，尤其当传输媒介如公共网络中不提供安全保证时更显其重要性。 </P><P>　　HMAC结合hash算法和共享密钥提供完整性。Hash散列通常也被当成是数字签名，但这种说法不够准确，两者的区别在于：Hash散列使用共享密钥，而数字签名基于公钥技术。hash算法也称为消息摘要或单向转换。称它为单向转换是因为：</P><P>　　1）双方必须在通信的两个端头处各自执行Hash函数计算；<BR>　　2）使用Hash函数很容易从消息计算出消息摘要，但其逆向反演过程以目前计算机的运算能力几乎不可实现。 </P><P>　　Hash散列本身就是所谓加密检查和或消息完整性编码MIC（Message Integrity Code），通信双方必须各自执行函数计算来验证消息。举例来说，发送方首先使用HMAC算法和共享密钥计算消息检查和，然后将计算结果A封装进数据包中一起发送；接收方再对所接收的消息执行HMAC计算得出结果B，并将B与A进行比较。如果消息在传输中遭篡改致使B与A不一致，接收方丢弃该数据包。 </P><P>　　有两种最常用的hash函数： </P><P>　　·HMAC-MD5 MD5（消息摘要5）基于RFC1321。MD5对MD4做了改进，计算速度比MD4稍慢，但安全性能得到了进一步改善。MD5在计算中使用了64个32位常数，最终生成一个128位的完整性检查和。 <BR>　　·HMAC-SHA 安全Hash算法定义在NIST FIPS 180-1，其算法以MD5为原型。 SHA在计算中使用了79个32位常数，最终产生一个160位完整性检查和。SHA检查和长度比MD5更长，因此安全性也更高。 </P><P>　　六、加密和数据可靠性 </P><P>　　IPSec使用的数据加密算法是DES&#8211;Data Encryption Standard（数据加密标准）。DES密钥长度为56位，在形式上是一个64位数。DES以64位（8字节）为分组对数据加密，每64位明文，经过16轮置换生成64位密文，其中每字节有1位用于奇偶校验，所以实际有效密钥长度是56位。 IPSec还支持3DES算法，3DES可提供更高的安全性，但相应地，计算速度更慢。 </P><P>　　七、密钥管理 </P><P>　　·动态密钥更新 </P><P>　　IPSec策略使用&#8221;动态密钥更新&#8221;法来决定在一次通信中，新密钥产生的频率。动态密钥指在通信过程中，数据流被划分成一个个&#8221;数据块&#8221;，每一个&#8221;数据块&#8221;都使用不同的密钥加密，这可以保证万一攻击者中途截取了部分通信数据流和相应的密钥后，也不会危及到所有其余的通信信息的安全。动态密钥更新服务由Internet密钥交换IKE（Internet Key Exchange）提供，详见IKE介绍部分。 </P><P>　　IPSec策略允许专家级用户自定义密钥生命周期。如果该值没有设置，则按缺省时间间隔自动生成新密钥。 </P><P>　　·密钥长度 </P><P>　　密钥长度每增加一位，可能的密钥数就会增加一倍，相应地，破解密钥的难度也会随之成指数级加大。IPSec策略提供多种加密算法，可生成多种长度不等的密钥，用户可根据不同的安全需求加以选择。 </P><P>　　·Diffie-Hellman算法 </P><P>　　要启动安全通讯，通信两端必须首先得到相同的共享密钥（主密钥），但共享密钥不能通过网络相互发送，因为这种做法极易泄密。 </P><P>　　Diffie-Hellman算法是用于密钥交换的最早最安全的算法之一。DH算法的基本工作原理是：通信双方公开或半公开交换一些准备用来生成密钥的&#8221;材料数据&#8221;，在彼此交换过密钥生成&#8221;材料&#8221;后，两端可以各自生成出完全一样的共享密钥。在任何时候，双方都绝不交换真正的密钥。 </P><P>　　通信双方交换的密钥生成&#8221;材料&#8221;，长度不等，&#8221;材料&#8221;长度越长，所生成的密钥强度也就越高，密钥破译就越困难。 除进行密钥交换外，IPSec还使用DH算法生成所有其他加密密钥。</P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91ipsec%e5%9f%ba%e7%a1%80%ef%bc%8dipsec%e6%9c%8d%e5%8a%a1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】LINUX操作系统的概念和特点</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91linux%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e7%9a%84%e6%a6%82%e5%bf%b5%e5%92%8c%e7%89%b9%e7%82%b9</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91linux%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e7%9a%84%e6%a6%82%e5%bf%b5%e5%92%8c%e7%89%b9%e7%82%b9#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:27 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91linux%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e7%9a%84%e6%a6%82%e5%bf%b5%e5%92%8c%e7%89%b9%e7%82%b9</guid>
		<description><![CDATA[以应用为中心，以计算机技术为基础，软件、硬件可裁剪，适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统，称为嵌入式系统。一个最小的嵌入式系统的基本组成为：① 一个用作引导的可用设施（工具）；② 一个具备内存管理，进程管理和定时器服务的LINUX微内核；③ 一个初始进程；④ 硬件的驱动程序；⑤ 一个或几个应用进程以提供必要的应用功效。嵌入式LINUX操作系统的特点&#8226;&#160; 比较有人认为LINUX由于太大而不宜用作嵌入式系统，这种观点不正确。面向PC机的LINUX型发布版有很多，功能根本用不上，甚至超出了一个PC用户的需求。因此，对LINUX进行合理的裁减，可以形成一个很具有实用性的嵌入式操作系统。下面对嵌入式LINUX操作系统与专用嵌入式实时操作系统的比较如下。&#8226;&#160; 嵌入式LINUX的内存使用&#160;&#160;&#160; 在一个简单的系统中，当系统启动后，内核和各种应用进程均驻留在内存中，这是大多数传统嵌入式系统的工作方式，当然也包括LINUX。但它还可以使用另外一种方式：LINUX有装载和卸载程序的能力，所有应用程序以文件的形式被存放在闪存文件系统中并在必要的时候被装载到内存中，以节省RAM。&#8226;&#160; 开发嵌入式LINUX的调试方法当为一个新硬件开发相应的嵌入式LINUX系统时，要用到的典型调试工具的序列和步骤是：①&#160; 修改代码使之能读写串口，并使用gdb运行该程序。这将允许它向另一台正运行着gdb程序的LINUX主机通信；gdb通过串口与测试计算机上的gdb目标码会话并给出全部C源码级的调试信息；②&#160; 借助gdb执行余下的，直到LINUX内核开始接管之前的所有硬件和软件的初始化代码；③&#160; 一旦LINUX内核启动后，上述的串口就成为LINUX的控制台端口，可以利用它的便利来进行后继开发过程，并可以使用gdb的内核调试版本kgdb。&#8226;&#160; 嵌入式LINUX的可移植性将LINUX移植到新的微处理器体系非常快捷，一般是将其移植到一种新型的目标板，其中包含有独特的外设。大部分的内核代码都是相同的，因为它们与微处理器无关，所以，移植的工作多集中在一些存储器管理及中断处理程序上。一旦完成，它们将非常稳定。嵌入式LINUX的应用嵌入式系统的涵盖面是非常广泛的，其中，家电市场包括机顶盒、数字电视、可视电话、家庭网络等信息家电；工业市场包括工业控制设备、仪器；商用市场包括掌上电脑、瘦客户机、POS终端等；通信市场包括WAP手机、无线PDA等。目前被广泛看好的是信息家电市场，国内有很多开发厂商正加大投入、开发和研制新的产品，嵌入式LINUX将是他们首选的操作系统。]]></description>
			<content:encoded><![CDATA[<p><P>以应用为中心，以计算机技术为基础，软件、硬件可裁剪，适应应用系统对功能、可靠性、成本、体积、功耗要求严格的专用计算机系统，称为嵌入式系统。一个最小的嵌入式系统的基本组成为：① 一个用作引导的可用设施（工具）；② 一个具备内存管理，进程管理和定时器服务的LINUX微内核；③ 一个初始进程；④ 硬件的驱动程序；⑤ 一个或几个应用进程以提供必要的应用功效。<BR><BR><STRONG>嵌入式LINUX操作系统的特点</STRONG><BR><BR>&#8226;&nbsp; 比较<BR><BR>有人认为LINUX由于太大而不宜用作嵌入式系统，这种观点不正确。面向PC机的LINUX型发布版有很多，功能根本用不上，甚至超出了一个PC用户的需求。因此，对LINUX进行合理的裁减，可以形成一个很具有实用性的嵌入式操作系统。下面对嵌入式LINUX操作系统与专用嵌入式实时操作系统的比较如下。<BR><BR>&#8226;&nbsp; 嵌入式LINUX的内存使用<BR><BR>&nbsp;&nbsp;&nbsp; 在一个简单的系统中，当系统启动后，内核和各种应用进程均驻留在内存中，这是大多数传统嵌入式系统的工作方式，当然也包括LINUX。但它还可以使用另外一种方式：LINUX有装载和卸载程序的能力，所有应用程序以文件的形式被存放在闪存文件系统中并在必要的时候被装载到内存中，以节省RAM。<BR><BR>&#8226;&nbsp; 开发嵌入式LINUX的调试方法<BR><BR>当为一个新硬件开发相应的嵌入式LINUX系统时，要用到的典型调试工具的序列和步骤是：<BR><BR>①&nbsp; 修改代码使之能读写串口，并使用gdb运行该程序。这将允许它向另一台正运行着gdb程序的LINUX主机通信；gdb通过串口与测试计算机上的gdb目标码会话并给出全部C源码级的调试信息；<BR><BR>②&nbsp; 借助gdb执行余下的，直到LINUX内核开始接管之前的所有硬件和软件的初始化代码；<BR><BR>③&nbsp; 一旦LINUX内核启动后，上述的串口就成为LINUX的控制台端口，可以利用它的便利来进行后继开发过程，并可以使用gdb的内核调试版本kgdb。<BR><BR>&#8226;&nbsp; 嵌入式LINUX的可移植性<BR><BR>将LINUX移植到新的微处理器体系非常快捷，一般是将其移植到一种新型的目标板，其中包含有独特的外设。大部分的内核代码都是相同的，因为它们与微处理器无关，所以，移植的工作多集中在一些存储器管理及中断处理程序上。一旦完成，它们将非常稳定。<BR><BR><STRONG>嵌入式LINUX的应用</STRONG><BR><BR>嵌入式系统的涵盖面是非常广泛的，其中，家电市场包括机顶盒、数字电视、可视电话、家庭网络等信息家电；工业市场包括工业控制设备、仪器；商用市场包括掌上电脑、瘦客户机、POS终端等；通信市场包括WAP手机、无线PDA等。目前被广泛看好的是信息家电市场，国内有很多开发厂商正加大投入、开发和研制新的产品，嵌入式LINUX将是他们首选的操作系统。 </P></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91linux%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e7%9a%84%e6%a6%82%e5%bf%b5%e5%92%8c%e7%89%b9%e7%82%b9/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【软考】传输系统中的时钟同步技术</title>
		<link>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e4%bc%a0%e8%be%93%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e6%97%b6%e9%92%9f%e5%90%8c%e6%ad%a5%e6%8a%80%e6%9c%af</link>
		<comments>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e4%bc%a0%e8%be%93%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e6%97%b6%e9%92%9f%e5%90%8c%e6%ad%a5%e6%8a%80%e6%9c%af#comments</comments>
		<pubDate>Thu, 12 May 2011 06:31:27 +0000</pubDate>
		<dc:creator>fangds</dc:creator>
				<category><![CDATA[计算机考试]]></category>

		<guid isPermaLink="false">http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e4%bc%a0%e8%be%93%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e6%97%b6%e9%92%9f%e5%90%8c%e6%ad%a5%e6%8a%80%e6%9c%af</guid>
		<description><![CDATA[摘要基本概念两种主要抖动类型抖动测量 — TIE、MITE 和 TEDV高速传输系统中抖动和漂移的原因抖动对收发器的影响漂移对收发器的影响结论 同步模块是每个系统的心脏，它为系统中的其他每个模块馈送正确的时钟信号。因此需要对同步模块的设计和实现给予特别关注。本文对影响系统设计的时钟特性进行了考察，并对信号恶化的原因进行了评估。本文还分析了同步恶化的影响，并对标准化组织为确保传输质量和各种传输设备的互操作性而制定的标准要求进行了探讨。 摘要: 网络同步和时钟产生是高速传输系统设计的重要方面。为了通过降低发射和接收错误来提高网络效率，必须使系统的各个阶段都要使用的时钟的质量保持特定的等级。网络标准定义同步网络的体系结构及其在标准接口上的预期性能，以保证传输质量和传输设备的无缝集成。有大量的同步问题，系统设计人员在建立系统体系结构时必须十分清楚。本文论述了时钟恶化的各种来源，如抖动和漂移。本文还讨论了传输系统中时钟恶化的原因和影响，并分析了标准要求，提出了各种实现技巧。 基本概念: 抖动和漂移抖动的一般定义可以是“一个事件对其理想出现的短暂偏离”。在数字传输系统中，抖动被定义为数字信号的重要时刻在时间上偏离其理想位置的短暂变动。重要时刻可以是一个周期为 T1 的位流的最佳采样时刻。虽然希望各个位在 T 的整数倍位置出现，但实际上会有所不同。这种脉冲位置调制被认为是一种抖动。这也被称为数字信号的相位噪声。在下图中，实际信号边沿在理想信号边沿附近作周期性移动，演示了周期性抖动的概念。]]></description>
			<content:encoded><![CDATA[<p><P>摘要<br />基本概念<br />两种主要抖动类型<br />抖动测量 — TIE、MITE 和 TEDV<br />高速传输系统中抖动和漂移的原因<br />抖动对收发器的影响<br />漂移对收发器的影响<br />结论</P><br />
<P>同步模块是每个系统的心脏，它为系统中的其他每个模块馈送正确的时钟信号。因此需要对同步模块的设计和实现给予特别关注。本文对影响系统设计的时钟特性进行了考察，并对信号恶化的原因进行了评估。本文还分析了同步恶化的影响，并对标准化组织为确保传输质量和各种传输设备的互操作性而制定的标准要求进行了探讨。 </p>
<p><a id=1 name=1><B>摘要:</B></a> </p>
<p>网络同步和时钟产生是高速传输系统设计的重要方面。为了通过降低发射和接收错误来提高网络效率，必须使系统的各个阶段都要使用的时钟的质量保持特定的等级。网络标准定义同步网络的体系结构及其在标准接口上的预期性能，以保证传输质量和传输设备的无缝集成。有大量的同步问题，系统设计人员在建立系统体系结构时必须十分清楚。本文论述了时钟恶化的各种来源，如抖动和漂移。本文还讨论了传输系统中时钟恶化的原因和影响，并分析了标准要求，提出了各种实现技巧。 </p>
<p><a id=2 name=2><B>基本概念:</B></a> </p>
<p>抖动和漂移抖动的一般定义可以是“一个事件对其理想出现的短暂偏离”。在数字传输系统中，抖动被定义为数字信号的重要时刻在时间上偏离其理想位置的短暂变动。重要时刻可以是一个周期为 T1 的位流的最佳采样时刻。虽然希望各个位在 T 的整数倍位置出现，但实际上会有所不同。这种脉冲位置调制被认为是一种抖动。这也被称为数字信号的相位噪声。在下图中，实际信号边沿在理想信号边沿附近作周期性移动，演示了周期性抖动的概念。 </p>
<p></P><br />
<CENTER><img src="/article/UploadPic/2006-7/2006724132338222.jpg"><br /><DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;<font color=#990000>图 1.抖动示意</font></DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;</CENTER><br />
<P></p>
<p>抖动，不同于相位噪声，它以单位间隔(UI)为单位来表示。一个单位间隔相当于一个信号周期(T)，等于360度。假设事件为E，第n次出现表示为tE[n]。则瞬时抖动可以表示为： </p>
<p></P><br />
<CENTER><img src="/article/UploadPic/2006-7/2006724132338880.jpg"></CENTER><br />
<P></p>
<p>一组包括 N 个抖动测量的峰到峰抖动值使用最小和最大瞬时抖动测量计算如下： </p>
<p></P><br />
<CENTER><img src="/article/UploadPic/2006-7/2006724132338880.jpg"></CENTER><br />
<P></p>
<p>漂移是低频抖动。两者之间的典型划分点为10Hz。抖动和漂移所导致的影响会显现在传输系统的不同但特定的区域。 </p>
<p><a id=3 name=3><B>两种主要抖动类型:</B></a> </p>
<p>根据产生原因，抖动可分成两种主要类型：随机抖动和确定性抖动。随机抖动，正如其名，是不可预测的，由随机的噪声影响如热噪声等引起。随机抖动通常发生在数字信号的边沿转换期间，造成随机的区间交叉。毫无疑问，随机抖动具有高斯概率密度函数 (PDF)，由其均值 (μ) 和均方根值 (rms) (σ) 决定。由于高斯函数的尾在均值的两侧无限延伸，瞬时抖动和峰到峰抖动可以是无限值。因此随机抖动通常采用其均方根值来表示和测量。 </p>
<p></P><br />
<CENTER><img src="/article/UploadPic/2006-7/2006724132338880.jpg"> </p>
<p><DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;<font color=#990000>图 2.以高斯概率密度函数表示的随机抖动</font></DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;</CENTER><br />
<P></p>
<p>对抖动余量来讲，峰到峰抖动比均方根抖动更为有用，因此需要把随机抖动的均方根值转换成峰到峰值。为将均方根抖动转换成峰到峰抖动，定义了随机抖动高斯函数的任意极限 (arbitrary　limit)。误码率(BER)是这种转换中的一个有用参数，其假设高斯函数中的瞬时抖动一旦落在其强制极限之外即出现误码。通过下面两个公式，就可以得到均方根抖动到峰到峰抖动的换算。 </p>
<p></P><br />
<CENTER><img src="/article/UploadPic/2006-7/2006724132338564.jpg"></CENTER><br />
<P>由公式可得到下表，表中峰到峰抖动对应不同的 BER 值。 </p>
<p></P><br />
<CENTER><img src="/article/UploadPic/2006-7/2006724132338564.jpg"></CENTER><br />
<P>确定性抖动是有界的，因此可以预测，且具有确定的幅度极限。考虑集成电路 (IC) 系统，有大量的工艺、器件和系统级因素将会影响确定性抖动。占空比失真 (DCD) 和脉冲宽度失真 (PWD) 会造成数字信号的失真，使过零区间偏离理想位置，向上或向下移动。这些失真通常是由信号的上升沿和下降沿之间时序不同而造成。如果非平衡系统中存在地电位漂移、差分输入之间存在电压偏移、信号的上升和下降时间出现变化等，也可能造成这种失真。 </p>
<p></P><br />
<CENTER><img src="/article/UploadPic/2006-7/2006724132338807.jpg"> </p>
<p><DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;<font color=#990000>图3，总抖动的双模表示</font></DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;</CENTER><br />
<P></p>
<p>　数据相关抖动(DDJ)和符号间干扰(ISI)致使信号具有不同的过零区间电平，导致每种唯一的位型出现不同的信号转换。这也称为模式相关抖动(PDJ)。信号路径的低频截止点和高频带宽将影响DDJ。当信号路径的带宽可与信号的带宽进行比较时，位就会延伸到相邻位时间内，造成符号间干扰(ISI)。低频截止点会使低频器件的信号出现失真，而系统的高频带宽限制将使高频器件性能下降。正弦抖动以正弦模式调制信号边沿。这可能是由于供给整个系统的电源或者甚至系统中的其他振荡造成。接地反弹和其他电源变动也可能造成正弦抖动。正弦抖动广泛用于抖动环境的测试和仿真。不相关抖动可能由电源噪声或串扰和其他电磁干扰造成。 </p>
<p>考虑抖动对数字信号的影响时，需要将整个确定性抖动和随机抖动考虑在内。确定性抖动和随机抖动的总计结果将产生另外一种概率分布4：双模响应，其中部表示确定性抖动，尾部为高斯响应，表示随机抖动分量。 </p>
<p><a id=4 name=4><B>抖动测量 — TIE、MITE 和 TEDV</B></a> </p>
<p>时间间隔误差(TIE)是通过对实际时钟间隔的测量和对理想参考时钟同一间隔的测量得到的。在给定时间t，以一个称为观测间隔的时间间隔产生时间T(t)的时钟，其相对于时钟 Tref(t) 的TIE可通过下面公式表示。（x(t)称为误差函数。） </p>
<p>TIE表示信号中的高频相位噪声，提供了实际时钟的每个周期偏离理想情况的直接信息。TIE 用于计算大量统计派生函数如 MTIE、TDEV 等。 </p>
<p>最大时间间隔误差(MTIE)定义为，在一个观测时间(t=nt0)内，一个给定时钟信号相对于一个理想时钟信号的最大峰到峰延迟变化，其中该长度的所有观测时间均在测量周期 (T) 之内。使用下面公式进行估计： </p>
<p></P><br />
<CENTER><img src="/article/UploadPic/2006-7/2006724132338807.jpg"></CENTER><br />
<P>　MTIE是针对时间的缓变或漂移而定义的。当需要分析时钟的长期特性时，就需要对MTIE进行测量。MTIE 值是对一个时钟信号的长期稳定性的一种衡量。 </p>
<p></P></p>
<div><img src="/article/UploadPic/2006-7/2006724132338528.jpg"><br /><DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;<font color=#990000>图 4.TIE 的图形表示</font></div>
<div><font color=#990000></font>&nbsp;</div>
<div><font color=#990000>[page]<br /><font color=#000000>TDEV 是另外一个统计参数，作为集成时间的函数对一个信号的预期时间变化的测量。DEV 也能提供有关信号相位（时间）噪声频谱分量的信息。TIE 图中每个点的标准偏差是对一个观测间隔计算的，该观测间隔滑过整个测量时间。该值在整个上述测量时间内进行平均以得到该特定间隔的 TDEV 值。增大观测间隔，重复测量过程。TDEV 是对短期稳定性的一种衡量，在评估时钟振荡器性能时有用。TDEV 属于时间单位。 </p>
<p></font><a id=5 name=5><B><font color=#000000>高速传输系统中抖动和漂移的原因 </font></B></a></p>
<p><font color=#000000>最常用的一种时钟体系结构是，在备板上运行一个低频时钟，在每个传输卡上产生同步的高频时钟。低频时钟在集成电路内或通过分立PLL实现进行倍频以产生高频时钟。通过典型的PLL倍频，倍频后时钟上的相位噪声增大为原来时钟相位噪声的20*log(N)次方，其中N为倍频系数。此外，PLL参考时钟输入上的抖动将延长锁定时间，且当输入抖动过大时高速PLL甚至无法实现锁定。在备板上采用一种更高速的差分时钟将比采用低速单端时钟具有更好的抖动性能。 </p>
<p>由于VCO对输入电压变化较为敏感，因此电源噪声是增大时钟抖动的一个主要因素。输出时钟抖动幅度与电源噪声幅度、VCO增益成正比，与噪声频率成反比。因导线电阻形成的电阻下降和因导线电感形成的电感噪声而造成的电源或接地反弹，会对上述输出时钟抖动产生相似的影响。在系统板上对电源进行充分过滤，靠近集成电路电源引脚提供去耦电容，可以确保 PLL 获得更高的抖动性能。 </p>
<p>在系统板内，时钟和数据相互独立，发射和接收端在启动、保持和延迟时间方面的变化对高速率非常关键。因数据和时钟路径中存在不同有源元件而使数据和时钟路径之间出现传播延迟差异，时钟路径之间的接线延迟差异，数据位之间的接线延迟差异，数据和时钟路径之间不同的负载情况，分组长度差异等等，均可能造成上述变化。在规划系统抖动余量时，必须将不同信号路径的变化考虑在内。 </p>
<p>当在一段距离上进行传输时，在发射机和接收机中的很多点上存在抖动累积。在发射机物理层实现中，DAC非线性或激光非线性等非线性特性会加重信号失真。在传输介质和接收机中，除了外部乱真源（大多在铜导线中）之外，因不同频率和调制效应而导致的光纤失真、因接收机实现（主要与带宽有关）和时钟提取电路实现而导致的信号相关相位偏离，会加重信号流的抖动。 </p>
<p></font><br />
<CENTER><font color=#000000><img src="/article/UploadPic/2006-7/2006724132338312.jpg"><br /><DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;</font><font color=#990000>图 5.来自 TIE 图的 MTIE 偏差</font></DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;</CENTER></p>
<p>具体到 SDH（同步数字系列）传输，有大量的系统级事件会导致抖动。在将 PDH（准同步数字系列）支路映射为SDH帧并通过SDHNE（网络组件）进行传输的典型传输系统中，在 PDH 支路于 SDH 的终端多路分配器解映射之前，将在每个中间节点处出现 VC（虚拟容器）的重新同步。有间隙的时钟用于将各个支路映射到 STM-N 帧和从 STM-N帧解映射，发出与开销、固定填充和调整位相应的脉冲，因而造成映射抖动。采用调整机会位补偿PDF支路中频率偏移的方法会造成等待时间抖动。还有指针调整机制，用于对来自初始NE的输入VC与本地产生的输出STM-N帧之间的相位波动进行补偿。根据频率偏离，VC在STM-N帧中前后移动。这将使VC提取点看到位流中的突然变化，导致称为指针抖动的类型抖动。所有上述系统级抖动都将加重总的确定性抖动。 </p>
<p>尽管所有上述因素都会加重从源到目的地之间信号传播的抖动，标准要求仍然规定在传输点需具有比理论值更低的抖动数值。这样，考虑到时钟倍频、电源变化、电-光-电转换、发射和接收影响以及其他致使实际信号恶化的失真信号的影响，在源处驱动信号的时钟将具有一个相对很低的抖动数值。 </p>
<p><a id=6 name=6><B>抖动对收发器的影响</B></a> </p>
<p>理想情况下，数字信号是在两个相邻电平转换点的中点进行采样的。抖动之所以会造成误码，是由于相对于理想中点，它改变了信号的边沿转换点。误码可能由于信号流边沿变化太晚（在时间上比理想中点晚0.5UI（单位间隔相当于信号的一个周期））或太早（在时间上比理想中点早0.5UI）所致。当时钟采样边沿在信号流的任何一侧错过0.5UI时，将出现50%的误码概率，假设平均转换密度为0.5。7如果分别知道确定性抖动和随机抖动，可通过上述两个数字和将峰到峰抖动值与均方根抖动值联系在一起的表，来估计误码率。校准抖动，定义为数字信号的最佳采样时刻与从其提取出来的采样时钟之间的短期变化，可以造成上述误码。对于商业应用，源时钟和源发射接口抖动规范将远远低于 1UI。 </p>
<p>发射接口抖动规范通常与接收端的输入抖动容限相匹配。对于抖动测量回路滤波器截止频率，尤其如此。例如，在SDH系统中，有两种抖动测量带宽，分别规定：一个用于宽带测量滤波器（f1到f4），一个用于高频带测量滤波器（f3到f4）。数值f1指可在线路系统的PLL中使用的输出时钟信号的最窄时钟截止频率。低于此带宽的频率的抖动将通过系统，而较高频率的抖动则被部分吸收。数值f3表示输入时钟捕获电路的带宽。高于此频率的抖动将导致校准抖动。校准抖动造成光功率损失，需要额外光功率以防各种恶化。因此限制发射机端高频带频谱的抖动十分重要。 </p>
<p><a id=7 name=7><B>漂移对收发器的影响 </B></a></p>
<p>市场上销售的大多数电信接收机都使用了一个缓冲器，以适应线路信号中存在的随机波动。下面框图6详细表示出这一概念。恢复时钟将数据送入富有弹性的缓冲器，而系统时钟则将数据送出到设备的核心部位。 </p>
<p>在准同步传输系统中，发射机和接收机工作在相互独立而又极为接近的频率上，fL和 Fs分别表示发射机和接收机的频率。当两者之间存在相位或频率差异时，弹性存储会将其消除，否则缓冲器将出现欠载或溢出（取决于差异的幅度和弹性缓冲器的大小），造成一次可控的帧滑动（基本速率传输）或一次位调整（高阶异步多路复用器）。 </p>
<p>在准同步应用中，根据可接受的缓冲滑动对频率变化和缓冲器深度进行了标准化。最初的网络主要用于语音传输，在一定的频率门限之下不会造成语音质量下降。ITU-T规范规定该变化为+/-50ppm。但是随着网络开始传送压缩语音、传真格式的数据、视频以及其他种类的媒体应用，对于差错和重传以及刚刚兴起的同步网络，滑动使效率严重下降。 </p>
<p>在同步传输系统中，系统时钟通常同步到用于接收更高时钟等级信号的接口的恢复时钟上。恢复时钟和系统时钟之间相位和频率的瞬时和累积差异将被弹性缓冲器吸收，否则将导致弹性存储器溢出/欠载（取决于缓冲器大小和变化的幅度），造成指针调整而延迟或提前帧传输、帧滑动或系统中某处出现位调整。 </p>
<p>在同步系统中，所有网络组件工作在同一平均频率，可以通过指针机制消除帧恶化。这些指针机制将提前或延迟有效载荷在传输帧中的位置，从而调整接收和系统时钟中存在的频率和相位变化。SDH 收发器中的缓冲器比 PDH 收发器中的要小，而且对于 SDH 系统中可能导致的指针移动等不规则性有限制。因此，与 PDH 系统相比，同步系统的要求更为严格。由于网络发展的历史和不同网络之间的互操作连接，在某些阶段或其他阶段，这些同步网络会通过准同步网络来连接。因此 PDH 网络的时钟体系结构也要考虑在内。 </p>
<p>MTIE提供了时钟相对于已知理想参考时钟的峰值时间变化。在同步传输和交换设备的弹性缓冲器的设计中将用到MTIE值。在弹性存储中，缓冲器填充水平与输入数字信号和本地系统时钟之间的TIE成正比。确保时钟符合有关MTIE的时钟规范，将保证不会超过一定的缓冲器门限。因此，在缓冲器设计中，其大小取决于 MTIE 的规定极限。 </p>
<p><CENTER><img src="/article/UploadPic/2006-7/2006724132338384.jpg"><DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;<br /><font color=#990000>图6，典型传输系统的接收机接口</font></DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;</CENTER></p>
<p>系统时钟输出相位扰动对收发器的影响一个时钟的输出相位变化可以通过分析其 MTIE 信息获得。漂移产生（在自由振荡模式和同步模式中）主要指系统中所用时钟振荡器的长期稳定性，在自由振荡模式中系统的稳定性仅受振荡器的稳定性影响。除了漂移产生之外，输出时钟相位还受到大量系统不规则特性的影响。 </p>
<p>特别是对一个系统同步器而言，将参考源从一个不良或恶化参考时钟转换到一个正常参考时钟可能会导致输出相位扰动。传输用高速PLL中使用的传统VCO（压控振荡器）在改变参考时钟时采用了切换电容器组的方法。这种切换转换会对输出时钟造成暂时的相位偏移。采用超低抖动时钟倍频器电路可以解决这个问题。 </p>
<p>高性能网络时钟在系统的所有参考时钟都失去时采用一种称为“保持”的机制。这是通过记忆存储技术产生系统最后一个已知良好参考时钟来实现的。进入和退出保持模式可能会对输出造成相位扰动。当处于保持模式中时，由于准确频率的再生不够精确，因此会继续产生输出相位误差。集成电路技术的进步已使保持精度达到了0.01ppb。输入参考时钟恶化和对系统的维护测试（不会导致参考时钟切换）过少，也会造成输出相位扰动。 </p>
<p>系统输出扰动是有限的，取决于系统在较低层次可以接受的输入容限。例如，符合G.813 选项1的时钟，其相位扰动中所允许的相位斜率和最大相位误差被限制为1μS，最大相位斜率为7.5ppm，两个120ns相位误差段，其余部分的相位斜率为0.05ppm。这些数字对应于 G.825 标准规定的输入抖动容限，该标准描述了在 SDH网络内对抖动和漂移的控制。 </p>
<p>当输出相位被扰动时，将相位误差的幅度和速率保持在标准组织所建议的极限之内，可确保在端到端系统中对信号恶化进行妥善处理，从而避免数据损坏或丢失。例如，当系统同步器进行参考时钟切换时，如果输出相位误差位于规范要求之内，同步器就可实现“无间断”参考时钟切换，指示存在缓冲器溢出或欠载，造成指针移动、位调整或滑动。 </p>
<p><a id=8 name=8><B>结论</B></a> </p>
<p>网络同步和时钟产生是所有高速传输网络系统中最重要的部分。本文论述了时钟恶化的不同类型，主要是抖动和漂移。文章还详细论述了造成上述恶化的原因，以及它们如何影响传输系统。对时钟子系统进行系统性设计和实现，将提高整个系统的性能，降低误码率，易于集成，提供更高的传输质量和效率。 </font></DESC<a target="_blank" href="http://www.net130.com/CMS/Pub/network/network_protocal/04937.htm">RIP</a>T&gt;</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.1xi.net/kaoshi/%e3%80%90%e8%bd%af%e8%80%83%e3%80%91%e4%bc%a0%e8%be%93%e7%b3%bb%e7%bb%9f%e4%b8%ad%e7%9a%84%e6%97%b6%e9%92%9f%e5%90%8c%e6%ad%a5%e6%8a%80%e6%9c%af/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

