﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-Everything is not fine-文章分类-Published</title><link>http://www.cnitblog.com/windforce/category/89.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 26 Jul 2012 18:53:02 GMT</lastBuildDate><pubDate>Thu, 26 Jul 2012 18:53:02 GMT</pubDate><ttl>60</ttl><item><title>暗黑3秘术师护盾效果不显示解决</title><link>http://www.cnitblog.com/windforce/articles/83440.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Tue, 24 Jul 2012 03:01:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/83440.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/83440.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/83440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/83440.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/83440.html</trackback:ping><description><![CDATA[玩了暗黑3有段日子，要不是偶然看到朋友的秘术师护盾效果，我还一直在诟病咱的护体神功竟然那么难看。。。话说有多少兄弟姐妹不知道秘术师的护盾是有一圈水波纹的效果的。。。。。。。。网上搜了很久也没找到解决办法，自己捉摸了半天终于找到解决方法。。。原因在于暗黑3的环境配置文件设定，有问题的同学看看游戏界面中的视频设定，阴影下面是不是只有无低中高。。。其实还有平顺的低中高。哈哈。。解决方法如下：<br />到自己的我的文档下面，DIABLO3文件夹内的D3prefs.txt文件内，找到HardwareClass这行，后面的数字改成 &nbsp;"3" 就OK了。。。同样能够解决无敌怪物和护盾怪物身上的护盾效果。。。<img src ="http://www.cnitblog.com/windforce/aggbug/83440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2012-07-24 11:01 <a href="http://www.cnitblog.com/windforce/articles/83440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)  STP和Loopbak-detection      拓扑环和端口环</title><link>http://www.cnitblog.com/windforce/articles/74805.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Fri, 22 Jul 2011 07:54:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/74805.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/74805.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/74805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/74805.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/74805.html</trackback:ping><description><![CDATA[<p align="right">&nbsp;</p><span style="widows: 2; text-transform: none; text-indent: 0px; letter-spacing: normal; border-collapse: separate; font: medium Simsun; white-space: normal; orphans: 2; color: rgb(0,0,0); word-spacing: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span"><span style="text-align: left; line-height: 19px; border-collapse: collapse; font-family: Helvetica, Arial, sans-serif; font-size: 12px" class="Apple-style-span"> 
<h2 style="padding-bottom: 0px; line-height: normal; margin: 0px 0px 0.5em; padding-left: 0px; padding-right: 0px; word-wrap: break-word; float: left; font-size: 1.17em; padding-top: 0px">关于stp与环路检测小知识点很多人搞不清楚</h2>
<div style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; clear: both; font-size: 14px; padding-top: 0px" id="postmessage_4187121" class="t_msgfont">最近看到一个贴子争论<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />"一台三层交换机例如6509下面挂了一台2层交换机例如3500XL. 二层交换机下面 有一个 傻瓜交换机而且.傻瓜交换机存在一环路"&nbsp;&nbsp;<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />很多人回答有很多种答案<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />1.将一根网线连接在两台3500XL上，STP会起作用，根据STP的判定条件，将其中一个端口BLOCKING，使得网络呈现无环路状态。<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" /><font style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" color="red">又有实例我下属的一个分公司所有的交换机都是使用HUAWEI-3COM的，核心采用HUAWEI S6506，二层采用HUAWEI S3026。双核心做VRRP，每一台S3026都采用双链路上连到两台S6506上，但是我的同事在布一个教室的网线的时候，不小心将S3026下面接一个傻交换机（HUB），HUB上面一跟网线的两头都接到傻交换机上了，但是此时出现的问题是两台S6506上面所有的VLAN都UP DOWN UP DOWN。造成全网瘫痪，HUAWEI的现场工程师对此现象的解释是，STP不能BLOCKING二层交换机的那个端口，因为STP用在双连路上造成的环路的现象上。而不是用在此故障的现象上。此时，STP是不会起作用的，S3036会将这个环路一直上缴到双核心，因此，两台S6506就UP DOWN UP DOWN 。我打电话给HUWEI的800，800的工程师解释的与HUAWEI的现场工程师一致。<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" /></font>stp生成树有什么作用不用多说大家都是高手<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />开启stp就ok了吗&nbsp;&nbsp;效果有可能如红色所示<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />我要说的是一个书上没有网络上也很难找到的一个细节<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />拓扑环和端口环<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />stp只是检测拓扑环&nbsp;&nbsp;不能检测端口环&nbsp;&nbsp;解释下两种环以3500为例吧 拓扑环:两个3500都开启stp互相之产有多条网线互联&nbsp;&nbsp;端口环:3500下面的端口接一傻瓜交换机并且这个交换机存在环路&nbsp;&nbsp;那么3500那个端口就有端口环 端口环当然也可以解决 不然为什么思科会在边缘端口上用BPDU GUARD命令&nbsp;&nbsp;华为有loopback-detection 不是多此一举?&nbsp; &nbsp; 分清端口环和拓扑环<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />我看过很多书没找到这一知识点网上也是说东说西的都有&nbsp; &nbsp;此是我自己思考和实验得来&nbsp;&nbsp;<br style="padding-bottom: 0px; line-height: 1.6em; margin: 0px; padding-left: 0px; padding-right: 0px; word-wrap: break-word; padding-top: 0px" />新出来的交换机可能默认支持检测端口环路了吧以上结果在老设备得到</div></span></span> <img src ="http://www.cnitblog.com/windforce/aggbug/74805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2011-07-22 15:54 <a href="http://www.cnitblog.com/windforce/articles/74805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于部分程序无法识别USB转LPT线缆问题</title><link>http://www.cnitblog.com/windforce/articles/72234.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Mon, 13 Dec 2010 06:04:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/72234.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/72234.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/72234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/72234.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/72234.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span>新学到的一招，朋友的店里需要用热敏的小票机，都是LPT接口的，现在新出的主板都已经不支持了，用USB转LPT线连接之后，系统中识别为USB设备，但是这涉及到并口中断识别的问题，不少软件都会无法使用，朋友的那个就不行，经过一段时间的研究，包括考虑了关闭LPT端口更改USB资源中断均不成功，最后。。。。。。发现一个非常简单的办法，在此记录一下：
<div style="BORDER-BOTTOM: rgb(187,187,187) 1px solid; BORDER-LEFT: rgb(187,187,187) 1px solid; PADDING-BOTTOM: 32px; BACKGROUND-COLOR: rgb(255,255,255); PADDING-LEFT: 32px; PADDING-RIGHT: 32px; BORDER-TOP: rgb(187,187,187) 1px solid; BORDER-RIGHT: rgb(187,187,187) 1px solid; PADDING-TOP: 32px; background-origin: initial; background-clip: initial">首先将打印机共享，假定共享名为a，在CMD中执行下面。。。。。</div>
<div style="BORDER-BOTTOM: rgb(187,187,187) 1px solid; BORDER-LEFT: rgb(187,187,187) 1px solid; PADDING-BOTTOM: 32px; BACKGROUND-COLOR: rgb(255,255,255); PADDING-LEFT: 32px; PADDING-RIGHT: 32px; BORDER-TOP: rgb(187,187,187) 1px solid; BORDER-RIGHT: rgb(187,187,187) 1px solid; PADDING-TOP: 32px; background-origin: initial; background-clip: initial">net use LPT1 \\127.0.0.1\a</div>
<div style="BORDER-BOTTOM: rgb(187,187,187) 1px solid; BORDER-LEFT: rgb(187,187,187) 1px solid; PADDING-BOTTOM: 32px; BACKGROUND-COLOR: rgb(255,255,255); PADDING-LEFT: 32px; PADDING-RIGHT: 32px; BORDER-TOP: rgb(187,187,187) 1px solid; BORDER-RIGHT: rgb(187,187,187) 1px solid; PADDING-TOP: 32px; background-origin: initial; background-clip: initial">。。。。最后完美解决。。。虽然系统设备里面看不到。。但是很好用。。。</div>
</span>
<img src ="http://www.cnitblog.com/windforce/aggbug/72234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2010-12-13 14:04 <a href="http://www.cnitblog.com/windforce/articles/72234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c#实现ftp功能 (转载)</title><link>http://www.cnitblog.com/windforce/articles/49479.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Tue, 23 Sep 2008 14:12:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/49479.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/49479.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/49479.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/49479.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/49479.html</trackback:ping><description><![CDATA[(转载自<a href="http://www.cnblogs.com/kerryking/archive/2007/07/10/813079.aspx">http://www.cnblogs.com/kerryking/archive/2007/07/10/813079.aspx</a>)<br><br><br><strong>介绍 <br></strong>&nbsp;&nbsp;微软的.net framework 2.0相对于1.x来说增加了对FTP的支持。以前为了符合我的需求，我不等不使用第三方类库来实现FTP功能，但是为了可靠，还是使用.net framework的类比较好。我的这段代码没有做成可重复使用的类库的形式，但它却是比较容易理解的并能满足你的需求。它可以实现上传，下载，删除等任意功能。在这篇文章的后面将给大家出示.net 2.0下实现ftp的简单代码，使用的语言是c#。或许是因为这是.net新增的类，又或许是第三方类库已经能很好的实现你的需求，.net 2.0的这部分类库并没有得到足够的关注。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;<strong>背景</strong> <br>&nbsp;&nbsp;作为我的工作的一部分，我已经使用了ftp模块，但是我只能在.net 1.1中去使用它，所以我不能深入的研究.net 2.0下ftp的实现。但是我相信，.ne 2.0下对ftp的支持是非常好的。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;<strong>代码 <br></strong>&nbsp;&nbsp;不要忘记引入命名空间 <br>&nbsp;&nbsp;using System.Net; <br>&nbsp;&nbsp;using System.IO; <br>&nbsp;&nbsp;下面的几个步骤包括了使用FtpWebRequest类实现ftp功能的一般过程 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;1、创建一个FtpWebRequest对象，指向ftp服务器的uri <br>&nbsp;&nbsp;2、设置ftp的执行方法（上传，下载等） <br>&nbsp;&nbsp;3、给FtpWebRequest对象设置属性（是否支持ssl，是否使用二进制传输等） <br>&nbsp;&nbsp;4、设置登录验证（用户名，密码） <br>&nbsp;&nbsp;5、执行请求 <br>&nbsp;&nbsp;6、接收相应流（如果需要的话） <br>&nbsp;&nbsp;7、如果没有打开的流，则关闭ftp请求 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;开发任何ftp应用程序都需要一个相关的ftp服务器及它的配置信息。FtpWebRequest暴露了一些属性来设置这些信息。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;<strong>接下来的代码示例了上传功能</strong> <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;首先设置一个uri地址，包括路径和文件名。这个uri被使用在FtpWebRequest实例中。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;然后根据ftp请求设置FtpWebRequest对象的属性 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;其中一些重要的属性如下： <br>&nbsp;&nbsp; &#183;Credentials - 指定登录ftp服务器的用户名和密码。 <br>&nbsp;&nbsp; &#183;KeepAlive - 指定连接是应该关闭还是在请求完成之后关闭，默认为true <br>&nbsp;&nbsp; &#183;UseBinary - 指定文件传输的类型。有两种文件传输模式，一种是Binary，另一种是ASCII。两种方法在传输时，字节的第8位是不同的。ASCII使用第8位作为错误控制，而Binary的8位都是有意义的。所以当你使用ASCII传输时要小心一些。简单的说，如果能用记事本读和写的文件用ASCII传输就是安全的，而其他的则必须使用Binary模式。当然使用Binary模式发送ASCII文件也是非常好的。 <br>&nbsp;&nbsp; &#183;UsePassive - 指定使用主动模式还是被动模式。早先所有客户端都使用主动模式，而且工作的很好，而现在因为客户端防火墙的存在，将会关闭一些端口，这样主动模式将会失败。在这种情况下就要使用被动模式，但是一些端口也可能被服务器的防火墙封掉。不过因为ftp服务器需要它的ftp服务连接到一定数量的客户端，所以他们总是支持被动模式的。这就是我们为什么要使用被动模式的原意，为了确保数据可以正确的传输，使用被动模式要明显优于主动模式。（译者注：主动（PORT）模式建立数据传输通道是由服务器端发起的，服务器使用20端口连接客户端的某一个大于1024的端口；在被动（PASV）模式中，数据传输的通道的建立是由FTP客户端发起的，他使用一个大于1024的端口连接服务器的1024以上的某一个端口） <br>&nbsp;&nbsp; &#183;ContentLength - 设置这个属性对于ftp服务器是有用的，但是客户端不使用它，因为FtpWebRequest忽略这个属性，所以在这种情况下，该属性是无效的。但是如果我们设置了这个属性，ftp服务器将会提前预知文件的大小（在upload时会有这种情况） <br>&nbsp;&nbsp; &#183;Method - 指定当前请求是什么命令（upload，download，filelist等）。这个值定义在结构体WebRequestMethods.Ftp中。
<p>
<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" borderColor=#cccccc cellSpacing=0 cellPadding=3 width=500 align=center bgColor=#f3f3f3 border=1 heihgt="">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;private void Upload(string filename) <br>&nbsp;&nbsp;{ <br>&nbsp;&nbsp; FileInfo fileInf = new FileInfo(filename); <br>&nbsp;&nbsp; string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name; <br>&nbsp;&nbsp; FtpWebRequest reqFTP; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 根据uri创建FtpWebRequest对象 <br>&nbsp;&nbsp; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileInf.Name)); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // ftp用户名和密码 <br>&nbsp;&nbsp; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 默认为true，连接不会被关闭 <br>&nbsp;&nbsp; // 在一个命令之后被执行 <br>&nbsp;&nbsp; reqFTP.KeepAlive = false; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 指定执行什么命令 <br>&nbsp;&nbsp; reqFTP.Method = WebRequestMethods.Ftp.UploadFile; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 指定数据传输类型 <br>&nbsp;&nbsp; reqFTP.UseBinary = true; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 上传文件时通知服务器文件的大小 <br>&nbsp;&nbsp; reqFTP.ContentLength = fileInf.Length; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 缓冲大小设置为2kb <br>&nbsp;&nbsp; int buffLength = 2048; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; byte[] buff = new byte[buffLength]; <br>&nbsp;&nbsp; int contentLen; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 打开一个文件流 (System.IO.FileStream) 去读上传的文件 <br>&nbsp;&nbsp; FileStream fs = fileInf.OpenRead(); <br>&nbsp;&nbsp; try <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; // 把上传的文件写入流 <br>&nbsp;&nbsp; Stream strm = reqFTP.GetRequestStream(); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 每次读文件流的2kb <br>&nbsp;&nbsp; contentLen = fs.Read(buff, 0, buffLength); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 流内容没有结束 <br>&nbsp;&nbsp; while (contentLen != 0) <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; // 把内容从file stream 写入 upload stream <br>&nbsp;&nbsp; strm.Write(buff, 0, contentLen); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; contentLen = fs.Read(buff, 0, buffLength); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; // 关闭两个流 <br>&nbsp;&nbsp; strm.Close(); <br>&nbsp;&nbsp; fs.Close(); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp; catch (Exception ex) <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; MessageBox.Show(ex.Message, "Upload Error"); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp;}&nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;以上代码简单的示例了ftp的上传功能。创建一个指向某ftp服务器的FtpWebRequest对象，然后设置其不同的属性Credentials，KeepAlive，Method，UseBinary，ContentLength。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;打开本地机器上的文件，把其内容写入ftp请求流。缓冲的大小为2kb，无论上传大文件还是小文件，这都是一个合适的大小。</p>
<br clear=all>
<p>
<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" borderColor=#cccccc cellSpacing=0 cellPadding=3 width=500 align=center bgColor=#f3f3f3 border=1 heihgt="">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;private void Download(string filePath, string fileName) <br>&nbsp;&nbsp;{ <br>&nbsp;&nbsp; FtpWebRequest reqFTP; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; try <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; FileStream outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName)); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; reqFTP.Method = WebRequestMethods.Ftp.DownloadFile; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; reqFTP.UseBinary = true; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse(); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; Stream ftpStream = response.GetResponseStream(); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; long cl = response.ContentLength; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; int bufferSize = 2048; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; int readCount; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; byte[] buffer = new byte[bufferSize]; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; readCount = ftpStream.Read(buffer, 0, bufferSize); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; while (readCount &gt; 0) <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; outputStream.Write(buffer, 0, readCount); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; readCount = ftpStream.Read(buffer, 0, bufferSize); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; ftpStream.Close(); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; outputStream.Close(); <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; response.Close(); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp; catch (Exception ex) <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; MessageBox.Show(ex.Message); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp;}&nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面的代码实现了从ftp服务器上下载文件的功能。这不同于之前所提到的上传功能，下载需要一个响应流，它包含着下载文件的内容。这个下载的文件是在FtpWebRequest对象中的uri指定的。在得到所请求的文件后，通过FtpWebRequest对象的 GetResponse()方法下载文件。它将把文件作为一个流下载到你的客户端的机器上。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;注意：我们可以设置文件在我们本地机器上的存放路径和名称。</p>
<p>&nbsp;
<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" borderColor=#cccccc cellSpacing=0 cellPadding=3 width=500 align=center bgColor=#f3f3f3 border=1 heihgt="">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;public string[] GetFileList() <br>&nbsp;&nbsp;{ <br>&nbsp;&nbsp; string[] downloadFiles; <br>&nbsp;&nbsp; StringBuilder result = new StringBuilder(); <br>&nbsp;&nbsp; FtpWebRequest reqFTP; <br>&nbsp;&nbsp; try <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/")); <br>&nbsp;&nbsp; reqFTP.UseBinary = true; <br>&nbsp;&nbsp; reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword); <br>&nbsp;&nbsp; reqFTP.Method = WebRequestMethods.Ftp.ListDirectory; <br>&nbsp;&nbsp; WebResponse response = reqFTP.GetResponse(); <br>&nbsp;&nbsp; StreamReader reader = new StreamReader(response.GetResponseStream()); <br>&nbsp;&nbsp; string line = reader.ReadLine(); <br>&nbsp;&nbsp; while (line != null) <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; result.Append(line); <br>&nbsp;&nbsp; result.Append("\n"); <br>&nbsp;&nbsp; line = reader.ReadLine(); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp; // to remove the trailing '\n' <br>&nbsp;&nbsp; result.Remove(result.ToString().LastIndexOf('\n'), 1); <br>&nbsp;&nbsp; reader.Close(); <br>&nbsp;&nbsp; response.Close(); <br>&nbsp;&nbsp; return result.ToString().Split('\n'); <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp; catch (Exception ex) <br>&nbsp;&nbsp; { <br>&nbsp;&nbsp; System.Windows.Forms.MessageBox.Show(ex.Message); <br>&nbsp;&nbsp; downloadFiles = null; <br>&nbsp;&nbsp; return downloadFiles; <br>&nbsp;&nbsp; } <br>&nbsp;&nbsp;}&nbsp;</td>
        </tr>
    </tbody>
</table>
<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;上面的代码示例了如何从ftp服务器上获得文件列表。uri指向ftp服务器的地址。我们使用StreamReader对象来存储一个流，文件名称列表通过&#8220;\r\n&#8221;分隔开，也就是说每一个文件名称都占一行。你可以使用StreamReader对象的ReadToEnd() 方法来得到文件列表。上面的代码中我们用一个StringBuilder对象来保存文件名称，然后把结果通过分隔符分开后作为一个数组返回。我确定只是一个比较好的方法。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;其他的实现如Rename，Delete，GetFileSize，FileListDetails，MakeDir等与上面的几段代码类似，就不多说了。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;注意：实现重命名的功能时，要把新的名字设置给FtpWebRequest对象的RenameTo属性。连接指定目录的时候，需要在FtpWebRequest对象所使用的uri中指明。 <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;需要注意的地方 <br>&nbsp;&nbsp;你在编码时需要注意以下几点： <br>&nbsp;&nbsp; &#183;除非EnableSsl属性被设置成true，否作所有数据，包括你的用户名和密码都将明文发给服务器，任何监视网络的人都可以获取到你连接服务器的验证信息。如果你连接的ftp服务器提供了SSL，你就应当把EnableSsl属性设置为true。 <br>&nbsp;&nbsp; &#183;如果你没有访问ftp服务器的权限，将会抛出SecurityException错误 <br>&nbsp;&nbsp; &#183;发送请求到ftp服务器需要调用GetResponse方法。当请求的操作完成后，一个FtpWebResponse对象将返回。这个 FtpWebResponse对象提供了操作的状态和已经从ftp服务器上下载的数据。FtpWebResponse对象的StatusCode属性提供了ftp服务器返回的最后的状态代码。FtpWebResponse对象的StatusDescription属性为这个状态代码的描述。</p>
<img src ="http://www.cnitblog.com/windforce/aggbug/49479.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2008-09-23 22:12 <a href="http://www.cnitblog.com/windforce/articles/49479.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于网关的精典描述（转载）</title><link>http://www.cnitblog.com/windforce/articles/41105.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Tue, 18 Mar 2008 07:52:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/41105.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/41105.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/41105.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/41105.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/41105.html</trackback:ping><description><![CDATA[<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;假设你的名字叫小不点，你住在一个大院子里，你的邻居有很多小伙伴，在门口传达室还有个看大门的李大爷，李大爷就是你的网关。当你想跟院子里的某个小伙伴玩，只要你在院子里大喊一声他的名字，他听到了就会回应你，并且跑出来跟你玩。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;但是你不被允许走出大门，你想与外界发生的一切联系，都必须由门口的李大爷（网关）用电话帮助你联系。假如你想找你的同学小明聊天，小明家住在很远的另外一个院子里，他家的院子里也有一个看门的王大爷（小明的网关）。但是你不知道小明家的电话号码，不过你的班主任老师有一份你们班全体同学的名单和电话号码对照表，你的老师就是你的DNS服务器。于是你在家里拨通了门口李大爷的电话，有了下面的对话：&nbsp;<br><br>小不点：李大爷，我想找班主任查一下小明的电话号码行吗？&nbsp;<br><br>李大爷：好，你等着。（接着李大爷给你的班主任挂了一个电话，问清楚&nbsp;<br>了小明的电话）问到了，他家的号码是211.99.99.99&nbsp;<br><br>小不点：太好了！李大爷，我想找小明，你再帮我联系一下小明吧。&nbsp;<br><br>李大爷：没问题。（接着李大爷向电话局发出了请求接通小明家电话的请&nbsp;<br>求，最后一关当然是被转接到了小明家那个院子的王大爷那里，然后王大&nbsp;<br>爷把电话给转到小明家）&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;就这样你和小明取得了联系。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;至于DHCP服务器嘛，可以这样比喻：&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;你家院子里的居民越来越多了，传达室李大爷那里的电话交换机已经不能满足这么多居民的需求了，所以只好采用了一种新技术叫做DHCP，居民们开机的时候随机得到一个电话号码，每一次得到的号码都可能会不同。&nbsp;<br><br>你家门口的李大爷：就是你的网关&nbsp;<br>你的班主任：就是你的DNS服务器&nbsp;<br>传达室的电话交换机：就是你的DHCP服务器&nbsp;<br><br>同上，李大爷和王大爷之间的对话就叫做路由。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;另：如果还有个小朋友叫做小暗，他住的院子看门的是孙大爷，因为小暗的院子刚盖好，孙大爷刚来不久，他没有李大爷和王大爷办公室的电话（李大爷和王大爷当然也没有他的电话），这时会有两种情况：&nbsp;<br>1、居委会的赵大妈告诉了孙大爷关于李、王两位大爷的电话（同时赵大妈也告诉了李、王关于孙的电话），这就叫静态设定路由&nbsp;<br>2、赵大妈病了，孙大爷自己到处打电话，见人就说：&#8220;我是小暗他们院子管电话的&#8221;，结果被李、王二位听到了，就记在了他们的通讯录上，然后李、王就给孙大爷回了个电话说：&#8220;我是小明（小不点）他们院子管电话的&#8221;，这就叫动态设定路由&nbsp;<br>&nbsp;&nbsp;<br>然后有一天小不点要找小暗，结果自然是小不点给李大爷打电话说：&#8220;大爷，我找小暗&#8221;（这里省略了李大爷去查小暗电话的过程，假设他知道小暗的电话），李大爷一找通讯录：&#8220;哦，小暗的院子的电话是孙大爷管着的，要找小暗自然先要通知孙大爷，我可以通知王大爷让他去找孙大爷，也可以自己直接找孙，那当然是自己直接找孙方便了&#8221;，于是李大爷给孙大爷打了电话，然后孙大爷又把电话转到了小暗家。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;这里李大爷的通讯录叫做路由表。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;李大爷选择是自己直接找孙大爷还是让王大爷帮忙转接叫做路由选择。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;李大爷之所以选择直接找孙大爷是有依据的，因为他直接找孙大爷就能一步到位，如果要王大爷转接就需要两步才能完成，这里的&#8220;步&#8221;叫做&#8220;跳数&#8221;，李大爷的选择遵循的是最少步骤（跳数）原则（如果他不遵守这个原则，小不点可能就会多等些时间才能找到小暗，最终结果可能导致李大爷因工作不力被炒鱿鱼，这叫做&#8220;延时太长，选路原则不合理，换了一个路由器&#8221;）&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;当然，事情总是变化的，小不点和小明吵架了，这些天小不点老是给小暗打电话，小明心里想：&#8220;操，他是不是在说我坏话啊？&#8221;于是小明决定偷听小不点和小暗的通话，但是他又不能出院子，怎么办呢？小明做了这样一个决定：&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;首先他告诉自己院里管电话的王大爷说：&#8220;你给李大爷打个电话说小暗搬到咱们院子了，以后凡是打给他的电话我来接&#8221;，王大爷没反映过来（毕竟年纪大了啊！）就给李大爷打了电话，说：&#8220;现在我来管理小暗的电话了，孙已经不管了&#8221;，结果李大爷就把他的通讯录改了，这叫做路由欺骗。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;以后小不点再找小暗，李大爷就转给王大爷了（其实应该转给孙大爷的），王大爷收到了这个电话就转给了小明（因为他之前已经和小明说好了），小明收到这个电话就假装小暗和小不点通信。因为小明作贼心虚，害怕明天小不点和小暗见面后当面问他，于是通信断了之后，又自己以小不点的名义给小暗通了个电话复述了一遍刚才的话，有这就叫数据窃听&nbsp;<br><br>再后来，小不点还是不断的和小暗联系，而零落了小明，小明心里嘀咕啊：&#8220;我不能总是这样以小暗的身份和小不点通话啊，外一有一天露馅了怎么办！&#8221;于是他想了一个更阴险的招数：&#8220;干脆我也不偷听你们的电话了，你小不点不是不给我打电话吗！那我让你也给小暗打不了，哼哼！&#8221;，他怎么做的呢？我们来看：&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;他联系了一批狐朋狗友，和他们串通好，每天固定一个时间大家一起给小暗院子传达室打电话，内容什么都有，只要传达室的孙爷爷接电话，就会听到&#8220;打雷啦，下雨收衣服啊！&#8221;、&#8220;人是人他妈生的，妖是妖他妈生的&#8221;、&#8220;你妈贵姓&#8221;等等，听的脑袋都大了，不听又不行，电话不停的响啊！终于有一天，孙爷爷忍不住了，大喊一声：&#8220;我受不了拉！！！！&#8221;，于是上吊自杀了！&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;这就是最简单的DDOS攻击，孙爷爷心理承受能力弱的现象叫做&#8220;数据报处理模块有BUG&#8221;，孙爷爷的自杀叫做&#8220;路由器瘫痪&#8221;。如果是我，就会微笑着和他们拉家常，例如告诉他们&#8220;我早就听了天气预报，衣服10分钟前已经收好了&#8221;或者&#8220;那你妈是人还是妖&#8221;或者&#8220;和你奶奶一个姓&#8221;等等，我这种健全的心理叫做&#8220;健壮的数据报处理，能够抵御任何攻击&#8221;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;孙爷爷瘫了之后，小不点终于不再给小暗打电话了，因为无论他怎么打对方都是忙音，这种现象叫做&#8220;拒绝服务&#8221;，所以小明的做法还有一个名字叫做&#8220;拒绝服务攻击&#8221;。&nbsp;<br><br>小明终于安静了几天，...&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;几天后，小明的院子来了一个美丽的女孩，名字叫做小丽，小明很喜欢她（小小年纪玩什么早恋！）可是小丽有个很帅的男朋友，小明干瞪眼没办法。当然这里还是要遵循上面的原则：小丽是不能出院子的。那个男的想泡小丽自然只能打电话，于是小明又蠢蠢欲动了：&nbsp;<br>还记得王爷爷是院子的电话总管吗？他之所以能管理电话是因为他有一个通讯录，因为同一个院子可能有2个孩子都叫小明，靠名字无法区分，所以通讯录上每一行只有两项：&nbsp;<br><br>门牌&nbsp;&nbsp;&nbsp;&nbsp;电话&nbsp;<br>一号门&nbsp;&nbsp;&nbsp;&nbsp;1234567&nbsp;&nbsp;（这个是小明的）&nbsp;<br>二号门&nbsp;&nbsp;&nbsp;&nbsp;7654321&nbsp;&nbsp;（这个是小丽的）&nbsp;<br>......&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;王爷爷记性不好，但这总不会错了吧（同一个院子不会有2个&#8220;二号门&#8221;吧）？每次打电话人家都要说出要找的电话号码，然后通过通讯录去院子里面敲门，比如人家说我找&#8220;1234567&#8221;，于是王爷爷一比较，哦，是一号门的，他就去敲一号门&#8220;听电话&#8221;，如果是找&#8220;7654321&#8221;，那他就找二号门&#8220;听电话&#8221;。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;这里的电话号码就是传说中的&#8220;IP地址&#8221;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;这里的门牌号就是传说中的网卡的&#8217;MAC&#8216;地址（每一块网卡的MAC地址都是不一样的，这是网卡的制造商写死在网卡的芯片中的）&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;小明心里想&#8220;奶奶的，老子泡不到你也别想泡&#8221;，于是他打起了王爷爷通讯录的主意，经过细心的观察，周密的准备，他终于发现王爷爷有尿频的毛病（毕竟是老人啊...），终于在一个月黑风高的白天，王爷爷去上厕所了，小明偷偷的摸进传达室，小心翼翼的改了王爷爷的通讯录......&nbsp;</font></p>
<p><font size=2>过了几天，小丽的男朋友又给小丽打来了电话，对方报的电话是&#8220;7654321&#8221;，王爷爷一看通讯录，靠：&nbsp;<br><br>门牌&nbsp;&nbsp;&nbsp;&nbsp;电话&nbsp;<br>一号门&nbsp;&nbsp;&nbsp;&nbsp;1234567&nbsp;&nbsp;（这个是小明的）&nbsp;<br>一号门&nbsp;&nbsp;&nbsp;&nbsp;7654321&nbsp;&nbsp;（注意：这个原来是小丽的，但是被小明改了）&nbsp;<br>......&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;王爷爷不知道改了啊，于是就去找一号门的小明了，小明心里这个美啊，他以小丽父亲的口吻严厉的教训了那个男的和小丽之间不正当的男女关系，结果那个男的恭恭敬敬的挂了电话。当然小丽并不知道整个事情的发生...&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;这里小明的行为叫做&#8220;ARP欺骗&#8221;（因为在实际的网络上是通过发送ARP数据包来实现的，所以叫做&#8220;ARP欺骗&#8221;），王爷爷的通讯录叫做&#8220;ARP表&#8221;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;这里要注意：王爷爷现在有两个通讯录了，一个是记录每个院子传达室电话的本本，叫做&#8220;路由表&#8221;，一个是现在说的记录院子里面详细信息的本本，叫做&#8220;ARP表&#8221;。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;有句命言是&#8220;人们总是在追求完美的，尽管永远也做不到&#8221;（请记住这句话，因为这是一个大名人--也就是我，说的）&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;王爷爷的制度中有一条是这么写的&#8220;每个月要重新检查一下门牌号和电话的对应本（也就是ARP表）&#8221;，这个动作叫做&#8220;刷新ARP表&#8221;，每个月的时间限制叫做&#8220;刷新ARP表的周期&#8221;。这样小明为了让那个男的永远不能找到小丽，之后每个月都要偷偷改一次那个通讯录，不过这样也是不得不做的事啊！&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;补充一点，小明是很聪明的，如果通讯录（ARP表）被改成了这样：&nbsp;<br><br>门牌（MAC）&nbsp;&nbsp;&nbsp;&nbsp;电话（IP）&nbsp;<br>一号门&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1234567&nbsp;&nbsp;（这个是小明的）&nbsp;<br>二号门&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1234567&nbsp;&nbsp;（注意：这个被小明改了，但是他一时头晕改错了）&nbsp;<br>......&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;就会是计算机就会弹出一个对话框提示&#8220;出现重复的IP地址&#8221;，最终会导致王爷爷不知所措，于是通知一号门和二号门，你们的电话重复了。这样小丽就知道有人在破坏她的好事，这个现象叫做&#8220;骗局被揭穿了&#8221;&nbsp;<br><br>小不点知道了小明偷听他和小暗的电话，于是就和小暗约定好了密码。小不点在家里把要说的加密了之后告诉小暗。土豆－〉星期三，地瓜－〉请客，笨蛋－〉小不点家。于是小不点告诉小暗：土豆笨蛋地瓜。小明听了？？？不懂。。。。郁闷了。。。这是加密。&nbsp;<br>除此之外，小丽也知道了小明改他家的电话号码了。于是王爷爷就登门一个一个把电话和门牌号记下来。并且藏起来不允许外人修改，只能自己有钥匙（密码）。这是ip地址和MAC地址绑定。当有人改了电话号码的时候，就得找王爷爷改。麻烦是麻烦了，但是安全了。不过小明偷偷的把王爷爷的钥匙偷配了一把（盗窃密码成功），于是他还可以修改。这样么，就这样了。</font></p>
<img src ="http://www.cnitblog.com/windforce/aggbug/41105.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2008-03-18 15:52 <a href="http://www.cnitblog.com/windforce/articles/41105.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ASP.NET 中数据库操作初步[转载]</title><link>http://www.cnitblog.com/windforce/articles/39260.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Wed, 23 Jan 2008 15:54:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/39260.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/39260.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/39260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/39260.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/39260.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/jhmjhm/archive/2004/08/08/68723.aspx">http://blog.csdn.net/jhmjhm/archive/2004/08/08/68723.aspx<br></a><br><br><br><strong>ASP.NET 中数据库操作初步</strong>
<table class=docParameter cellSpacing=6 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td>
            <p>作者：幻想曲　　时间：2003-11-9　　文档类型：原创　　来自：<a href="http://www.blueidea.com/" target=_blank><u><font color=#0000ff>蓝色理想</font></u></a><br>浏览统计 year:4632 | Quarter:854 | Month:185 | Week:11 | today:11</p>
            <p class=list></p>
            </td>
        </tr>
    </tbody>
</table>
<table class=border cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=6 src="http://www.blueidea.com/img/spacer.gif" width=6></td>
        </tr>
    </tbody>
</table>
<table class=pageLighter cellSpacing=11 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=content>
            <p>　　这篇文章暂不提如何显示数据库中的数据，只提出如何增加、删除、修改数据，关于如何显示数据，会在以后的文章中提出。</p>
            <p><strong>一、定义OleDbCommand类型变量：MyCommand</strong></p>
            <p>　　要对数据库进行增加、删除、修改的操作我们还需要根据MyConnectio的类型定义一个OleDbCommand或者SqlCommand对象（请注意如果MyConnection是OleDbConnection类型，那么只能用OleDbCommand；如果MyConnection是SqlConnection类型，那么那么只能用SqlCommand。这里假设MyConnection是OleDbConnection类）。</p>
            <p><em>方法一<br>　　</em>你可以象拖放MyConnection一样拖放一个OleDbCommand，并命名为 MyCommand。<br><em>方法二<br>　　</em>在(关联文件).CS文件中protected System.Data.OleDb.OleDbConnection MyConnection;下面手动添加：<br>protected System.Data.OleDb.OleDbCommand MyCommand;<br>在private void InitializeComponent()中this.MyConnection =newSystem.Data.OleDb.OleDbConnection();的下一行下面手动添加：<br>this.MyCommand = new System.Data.OleDb.OleDbCommand();<br>即可完成对MyCommand的定义<br>说明：MyCommand的作用是用来执行SQL命令<br><strong>二、利用定义的MyConnectio和MyCommand对数据库进行增加、删除、修改</strong></p>
            <p>　　首先我们需要连接并打开一个数据库（关于数据库的连接和打开的操作请察看我们以前的文章）。打开数据库：MyConnectio.Open();<br>然后我们需要给MyCommand指定要执行的SQL命令 : <br>MyCommand.CommandText = "delete from admin";<br>接着我们需要给MyCommand指定数据源（对那个数据库执行SQL命令）：MyCommand.Connection = MyConnection;然后我们执行MyCommand命令即可: MyCommand. ExecuteNonQuery();如果我们在执行还有"delete from admin";<br>后需要接着执行 &#8220;insert into admin (Admin_Code,Admin_Pwd) values(&#8216;aa&#8217;,&#8217;bb&#8217;)&#8221;，则我们只要再次指定MyCommand指定要执行的SQL命令 : MyCommand.CommandText =&#8220;insert into admin (Admin_Code,Admin_Pwd) values(&#8216;aa&#8217;,&#8217;bb&#8217;)&#8221;，然后执行MyCommand. ExecuteNonQuery();即可。（由于数据库未关闭，所以我们不需要也不可以再次MyConnectio.Open();，同理由于没有改变MyCommand的数据源所以我们也没有必要再次指定MyCommand.Connection = MyConnection;）</p>
            <p>下面我们将详细讲解如何在Page_Load()中对数据库的增加、删除、修改，最后我们再来总结一下ExecuteNonQuery(),ExecuteScalar(),ExecuteReader的用法<br>1、 增加新的记录<br>private void Page_Load(object sender, System.EventArgs e)<br>{<br>MyConnection.Open();&#8217;打开数据库<br>MyCommand1.CommandText = "insert into admin values(&#8216;aaddq&#8216;,&#8216;as&#8216;,&#8216;ss&#8216;)";<br>MyCommand1.Connection = MyConnection;<br>MyCommand1.ExecuteNonQuery();&#8217;由于增加了一条记录，所以返回1<br>//或者MyCommand1.ExecuteReader();先增加一条记录，然后返回一个System.Data.OleDb.OleDbDataReader类型的对象，该对象为:EOF<br>//或者MyCommand1. ExecuteScalar();先增加一条记录，返回未实列化的对象<br>MyConnection.Close();<br>}</p>
            <p>2、 删除现有数据<br>private void Page_Load(object sender, System.EventArgs e)<br>{<br>MyConnection.Open();&#8217;打开数据库<br>MyCommand1.CommandText = "delete * from admin";<br>MyCommand1.Connection = MyConnection;<br>MyCommand1.ExecuteNonQuery();&#8217;由于删除了n条记录，所以返回n<br>//或者MyCommand1.ExecuteReader();先删除n条记录，然后返回一个System.Data.OleDb.OleDbDataReader类型的对象，该对象为:EOF<br>//或者MyCommand1. ExecuteScalar();先删除n条记录，返回未实列化的对象<br>MyConnection.Close();<br>}<br><br>3、 修改现有数据<br>private void Page_Load(object sender, System.EventArgs e)<br>{<br>MyConnection.Open();&#8217;打开数据库<br>MyCommand1.CommandText = "update admin set admin_code=&#8217;212&#8217;,Admin_pwd=&#8217;43&#8217; where admin_code=&#8217;23&#8217;";<br>MyCommand1.Connection = MyConnection;<br>MyCommand1.ExecuteNonQuery();&#8217;由于修改了1条记录，所以返回n<br>//或者MyCommand1.ExecuteReader();先修改了1条记录，然后返回一个System.Data.OleDb.OleDbDataReader类型的对象，该对象为:EOF<br>//或者MyCommand1. ExecuteScalar();先修改了1条记录，返回未实列化的对象<br>MyConnection.Close();<br>}</p>
            <p><br><strong>三、关于MyCommand的ExecuteNonQuery(),ExecuteScalar(),ExecuteReader方法的区别:</strong><br>1、ExecuteNonQuery():执行SQL，返回一个整型变量，如果SQL是对数据库的记录进行操作，那么返回操作影响的记录条数，如果是SQL="CREATE TABLE LookupCodes (code_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, code_desc varchar(50) NOT NULL)"那么在表创建成功后该方法返回 &#8211;1。<br>例如：<br>private void Page_Load(object sender, System.EventArgs e)<br>{<br>MyConnection.Open();&#8217;打开数据库<br>MyCommand1.CommandText = "CREATE TABLE LookupCodes (code_id smallint IDENTITY(1,1) PRIMARY KEY CLUSTERED, code_desc varchar(50) NOT NULL)"； MyCommand1.Connection = MyConnection;<br>MyCommand1.ExecuteNonQuery();&#8217;首先建立一个LookupCodes表，然后返回-1<br>//或者MyCommand1.ExecuteReader();首先建立一个LookupCodes表，然后返回一个System.Data.OleDb.OleDbDataReader类型的对象，该对象为:EOF<br>//或者MyCommand1. ExecuteScalar();首先建立一个LookupCodes表，返回未实列化的对象<br>MyConnection.Close();<br>}</p>
            <p><br>2、 ExecuteScalar()：执行SQL，（如果SQL是查询Select）返回查询结果的第一行第一列，如果（如果SQL不是查询Select）那么返回未实列化的对象，因为对象未实列化，所以返回结果不能ToString(),不能Equals(null)，也就是说返回结果没有任何作用</p>
            <p>3、 executeReader方法执行SQL，（如果SQL是查询Select）返回查询结果的集合，类型是System.Data.OleDb.OleDbDataReader，你可以通过此结果，获取查询的数据。如果（如果SQL不是查询Select）那么返回一个没有任何数据的System.Data.OleDb.OleDbDataReader类型的集合(EOF)</p>
            <p><br><strong>四、总结：</strong><br>ASP.Net中对于数据库的操作方法很多，要实现统一个目标不同的人可能会采取不同的方法，就好像在ASP中有的人喜欢用RS.ADDNEW，有的人喜欢用&#8221;Insert Into&#8221;，主要是看个人的习惯，当然在性能上不同的方法可能会存在较大的差别，这个只能靠我们在平常的学习中一点一滴的积累经验的。另外顺便说一下ASP.Net页提供类似如下方式的操作方法：<br>OleDbCommand2.Parameters("au_id").Value = TextBox1.Text<br>OleDbCommand2.Parameters("au_lname").Value = TextBox2.Text<br>OleDbCommand2.Parameters("au_fname").Value = TextBox3.Text<br>OleDbCommand2.Parameters("phone").Value = TextBox4.Text<br>OleDbCommand2.Parameters("address").Value = TextBox5.Text<br>OleDbCommand2.Parameters("city").Value = TextBox6.Text<br>OleDbCommand2.Parameters("st").Value = TextBox7.Text<br>OleDbCommand2.Parameters("zip").Value = TextBox8.Text<br>OleDbCommand2.Parameters("contract").Value = CheckBox1.Checked<br>cmdresults = OleDbcommand2.ExecuteNonQuery()<br></p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/windforce/aggbug/39260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2008-01-23 23:54 <a href="http://www.cnitblog.com/windforce/articles/39260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>华为Vlan QinQ(转载)</title><link>http://www.cnitblog.com/windforce/articles/32935.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Tue, 04 Sep 2007 07:24:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/32935.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/32935.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/32935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/32935.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/32935.html</trackback:ping><description><![CDATA[<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt>
            <div>QinQ是指将用户私网VLAN TAG封装在公网vlan tag中，使报文带着两层vlan tag穿越运营商的骨干网络（公网）。在公网中报文只根据外层vlan tag（即公网vlan tag）传播，用户的私网vlan tag被屏蔽。</div>
            <div></div>
            <div>带单层vlan tag的报文结构如下所示：</div>
            <div>
            <table style="WIDTH: 495px; HEIGHT: 83px" cellSpacing=1 cellPadding=1 width=495 border=1>
                <tbody>
                    <tr>
                        <td>DA（6B）</td>
                        <td>SA（6B） </td>
                        <td>ETYPE（8100）（2B）</td>
                        <td>用户vlan tag(2B)</td>
                        <td>ETYPE(2B)</td>
                        <td>DATA(0-1500B)</td>
                        <td>FCS(4B)</td>
                    </tr>
                </tbody>
            </table>
            </div>
            <p>&#160;</p>
            <p>带双层vlan tag的报文结构如下：
            <table cellSpacing=1 cellPadding=1 width=200 border=1>
                <tbody>
                    <tr>
                        <td>DA</td>
                        <td>SA</td>
                        <td>ETYPE</td>
                        <td>Nested vlan tag</td>
                        <td>ETYPE</td>
                        <td>user vlan tag</td>
                        <td>ETYPE</td>
                        <td>DATA</td>
                        <td>FCS</td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p>相对基于MPLS的二层VPN，QinQ具有如下特点：</p>
            <p>。为用户提供了一种更为简单的二层VPN隧道。</p>
            <p>。不需要信令协议的支持，可以通过纯静态配置实现。</p>
            <p>由于QinQ的实现是基于802.1Q协议中的Trunk端口概念，要求隧道上的设备都必须支持802.1Q协议，所以QinQ只适用于小型的，以三层交换机为骨干的企业网或小规模的城域网。<br><br></p>
            <p>QinQ主要可以解决如下几个问题：</p>
            <p>。缓解日益紧缺的公网vlan id资源问题。</p>
            <p>。用户可以规划自己的私网vlan id，不会导致和公网vlan id冲突。</p>
            <p>。为小型城域网或企业网提供一种较为简单的二层vpn解决方案。</p>
            <p>&#160;</p>
            <p>QinQ的实现方式</p>
            <p>S8500系列路由交换机通过以下两种方式实现QinQ：</p>
            <p>1、开启端口的vlan vpn特性功能</p>
            <p>开启端口的vlan vpn功能后，当该端口接收到报文，无论报文是否带有vlan tag，交换机都会为该报文打上本端口缺省vlan的vlan tag。这样，如果接收到的是已经带有vlan tag的报文，该报文就成为双tag的报文；如果接收到的是untagged的报文，该报文就成为带有端口缺省vlan tag的报文。</p>
            <p>2、配置基于流分类的nested vlan</p>
            <p>基于流分类的nested vlan特性是对QinQ的一种更灵活的实现。用户可以对端口下匹配特定ACL流规则的报文进行如下操作。</p>
            <p>。设置报文的外层vlan tag</p>
            <p>。修改报文的外层vlan tag</p>
            <p>&#160;</p>
            <p>QinQ报文的TPID值可调功能</p>
            <p>TPID（tag protocol identifier，标签协议标识）是vlan tag中的一个字段，IEEE　802.1Q协议规定该字段的取值为0X8100。</p>
            <p>IEEE　802.1Q协议定义的以太网帧的TAG报文结构如下：</p>
            <p>
            <table cellSpacing=1 cellPadding=1 width=200 border=1>
                <tbody>
                    <tr>
                        <td>DA</td>
                        <td>SA</td>
                        <td>TAG</td>
                        <td>Frame Load</td>
                        <td>FCS</td>
                    </tr>
                    <tr>
                        <td></td>
                        <td>TPID</td>
                        <td>User Priority</td>
                        <td>CFI</td>
                        <td>VLAN ID</td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p>S8500系列交换机缺省采用协议规定的TPID值（0x8100）。某些厂商的设备将QinQ报文外层TAG的TPID值设置为0x9100或0x9200。为了和这些设备兼容，S8500系列交换机提供了基于端口的QinQ报文TPID值可调功能。</p>
            <p>用户可以将连接公网侧的端口设置为vlan-vpn uplink端口，这些端口的TPID值可以由用户自行配置。vlan-vpn uplink端口收到报文时会将报文外层vlan tag中的TPID值替换为用户设定值再进行发送，从而使发送到公网中的QinQ报文可以被其他厂商的设备识别。</p>
            <p>&#160;</p>
            <p>配置端口的vlan vpn特性功能</p>
            <p>配置准备</p>
            <p>。端口的GVRP、STP或802.1x协议均未启动</p>
            <p>。端口所属的VLAN关闭了IGMP　Snooping</p>
            <p>。端口所属的VLAN接口上未开启IGMP</p>
            <p>。此端口必须为Access端口</p>
            <p>&#160;</p>
            <p>配置过程</p>
            <p>system-view</p>
            <p>interface ethernet2/1/1</p>
            <p>vlan-vpn enable&nbsp;&nbsp; 缺省，端口vlan-vpn特性是关闭的。此端口应为access端口</p>
            <p>display port vlan-vpn　　显示当前TPID值、vlan-vpn端口信息、uplink信息</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnitblog.com/windforce/aggbug/32935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2007-09-04 15:24 <a href="http://www.cnitblog.com/windforce/articles/32935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iis6.0配置PHP 环境</title><link>http://www.cnitblog.com/windforce/articles/29429.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Tue, 03 Jul 2007 14:42:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/29429.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/29429.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/29429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/29429.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/29429.html</trackback:ping><description><![CDATA[最简单的办法是下载个安装版的PHP 跟着安装向导一步步的就可以。这里略过不述。<br>着重说一下手动配置IIS以ISAPI执行PHP文件。<br><br><br>1. 下载解压缩版PHP之后解压到任何目录，将PHP.INI-DIST 文件复制到windows目录中。<br>2. 安装好IIS后主要有4个部分需要更改<br>&nbsp; 1&gt;建立新网站的主目录中应用程序后面的配置-在映射中添加应用程序扩展名映射，可执行文件 浏览选择PHP文件夹中的php5isapi.dll&nbsp; （php5.2.3为例） 扩展名添 .php&nbsp; 动作 选全部 或填写 GET,POST&nbsp; 注意中间用 逗号区分。一路确定。<br>&nbsp; 2&gt;&nbsp;&nbsp; ISAPI 筛选器中添加 名字 php&nbsp; 可执行文件 同样选择 php5isapi.dll <br>&nbsp; 3&gt;&nbsp;&nbsp; 启用默认内容文档 添加 index.php <br>&nbsp; 4&gt;&nbsp;&nbsp; web服务扩展，添加一个新的web服务扩展 扩展名 *.php&nbsp; 要求的文件 添加 php5isapi.dll<br><br>OK..<br><br>&lt;? phpinfo(); ?&gt; 查看运行状态&nbsp;
<td class=e>ServerAPI&nbsp;&nbsp; </td>
<td class=v>ISAPI&nbsp; 模式</td>
<img src ="http://www.cnitblog.com/windforce/aggbug/29429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2007-07-03 22:42 <a href="http://www.cnitblog.com/windforce/articles/29429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTTP错误401 - 您未被授权查看该页(转载)</title><link>http://www.cnitblog.com/windforce/articles/29428.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Tue, 03 Jul 2007 14:07:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/29428.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/29428.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/29428.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/29428.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/29428.html</trackback:ping><description><![CDATA[HTTP错误401 - 您未被授权查看该页
<div>&nbsp;</div>
<div>　在配置IIS的时候，如果安全稍微做的好一些。就会出现各式各样的问题。比如，常见的访问网页会弹出用户名密码的登陆界面，或者是访问某种页面比如html,asp没事情，但是访问jsp或者php就有问题，显示401.3　ACL 禁止访问资源等　　通常的解决办法是。</div>
<div>&nbsp;</div>
<div>1、错误号401.1<br>症状：HTTP 错误 401.1 - 未经授权：访问由于凭据无效被拒绝。<br>分析：<br>由于用户匿名访问使用的账号(默认是IUSR_机器名)被禁用，或者没有权限访问计算机，将造成用户无法访问。<br>解决方案：<br>（1）查看IIS管理器中站点安全设置的匿名帐户是否被禁用，如果是，请尝试用以下办法启用：<br>控制面板-&gt;管理工具-&gt;计算机管理-&gt;本地用户和组，将IUSR_机器名账号启用。如果还没有解决，请继续下一步。<br>（2）查看本地安全策略中，IIS管理器中站点的默认匿名访问帐号或者其所属的组是否有通过网络访问服务器的权限，如果没有尝试用以下步骤赋予权限：<br>开始-&gt;程序-&gt;管理工具-&gt;本地安全策略-&gt;安全策略-&gt;本地策略-&gt;用户权限分配，双击&#8220;从网络访问此计算机&#8221;，添加IIS默认用户或者其所属的组。<br>注意：一般自定义 IIS默认匿名访问帐号都属于组，为了安全，没有特殊需要，请遵循此规则。<br><br>2、错误号401.2<br>症状：HTTP 错误 401.2 - 未经授权：访问由于服务器配置被拒绝。<br>原因：关闭了匿名身份验证<br>解决方案：<br>运行inetmgr，打开站点属性-&gt;目录安全性-&gt;身份验证和访问控制-&gt;选中&#8220;启用匿名访问&#8221;，输入用户名，或者点击&#8220;浏览&#8221;选择合法的用户，并两次输入密码后确定。<br><br>3、错误号：401.3<br>症状：HTTP 错误 401.3 - 未经授权：访问由于 ACL 对所请求资源的设置被拒绝。<br>原因：IIS匿名用户一般属于Guests组，而我们一般把存放网站的硬盘的权限只分配给administrators组，这时候按照继承原则，网站文件夹也只有administrators组的成员才能访问，导致IIS匿名用户访问该文件的NTFS权限不足，从而导致页面无法访问。<br>解决方案：<br>给IIS匿名用户访问网站文件夹的权限，方法：进入该文件夹的安全选项，添加IIS匿名用户，并赋予相应权限，一般是读、写。</div>
<img src ="http://www.cnitblog.com/windforce/aggbug/29428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2007-07-03 22:07 <a href="http://www.cnitblog.com/windforce/articles/29428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分析众多不同VPN产品的安全功能[转载]</title><link>http://www.cnitblog.com/windforce/articles/9470.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Fri, 21 Apr 2006 11:39:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/9470.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/9470.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/9470.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/9470.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/9470.html</trackback:ping><description><![CDATA[
		<p>短短两三年时间，VPN已从初出茅庐的业界新人迅速窜升为当红小生，除其自然状态下的茁壮成长外，市场的需求以及技术和产品的定向刺激，都使得如今的IT市场上VPN产品真可谓各有来头、琳琅满目。 </p>
		<p>VPN实现的是一块更为广袤的“私密空间”和一条更为隐秘的“安全通道”。 </p>
		<p>随着网络应用的遍地开花，安全技术逐渐成为VPN产品的一个拳头支撑，基于IPSec和SSL协议的不同VPN产品也正表现着VPN的不同安全特色…… </p>
		<p>在如今的网络时代，信息共享正在被赋予越来越丰富的外延，诸如本地信息的远程化、远程资源的本地化等，但凡能通过网络方式实现的，人们都乐此不疲地琢磨并尝试着。 </p>
		<p>VPN（虚拟专用网络）作为一种虚拟通道技术，其最初的设想只是为了满足远程访问的专用接入需求，并且能够避开IP地址资源有限的尴尬，而最终大量产品的市场需求以及后续VPN技术的不断延伸发展，也足以说明网络信息化对这一专用通道技术的强烈呼唤。 </p>
		<p>伴随着社会本身的进步以及信息化进程的大副进展，各种网络应用随即接踵而至，越来越多的安全需求成为VPN技术的关键。 </p>
		<p>
				<strong>总览VPN的安全实现</strong>
		</p>
		<p>在原先维持网络更多虚拟空间的前提下，如何保证接入用户的合法性、保证网络访问的安全性以及系统本身的安全可靠性等等，都成为VPN需要面对的问题。 </p>
		<p>首先，VPN能保障哪些安全呢？很容易想象，VPN的实现技术和方式有很多，但是所有的VPN产品都应该保证通过公用网络平台传输数据的专用性和安全性。如在非面向连接的公用IP网络上建立一个隧道，利用加密技术对经过隧道传输的数据进行加密，以保证数据的私有性和安全性。此外，还需要防止非法用户对网络资源或私有信息的访问。 </p>
		<p>其次，VPN还应当为不同网络的数据提供不同等级的服务质量保证（QoS）。如对移动办公的用户，随意自主的连接性和信号的覆盖性就是VPN服务质量保证的一个主要因素；而当分支机构某用户通过VPN专有网对总部系统网络进行访问的话，整个总部系统的网络需要保持良好的稳定性。 </p>
		<p>此外，对于带宽和流量的控制，则是对网络优化的一个重要方面。充分有效地利用有限的广域网资源，保证重要数据的有效且可靠的带宽，将是关系网络整体稳定性的一个重要指标。通过流量预测与流量控制策略，可以按照优先级实现带宽资源的合理配置和管理，从而净化所处的网络。 </p>
		<p>
				<strong>IPSec VPN：端对端的安全</strong>
		</p>
		<p>隧道技术是最典型、也是应用最为广泛的VPN技术，通过匹配四层网络模型中的不同层协议，可以生成不同的VPN技术及产品，如<font style="BACKGROUND-COLOR: #ffffff" color="#0000ff">IPSec VPN就是第三层隧道协议匹配IP层（第三层）的IPSec协议生成的，而SSL VPN则是第四层隧道协议匹配应用层（第四层）的SSL协议生成的</font>，这两种VPN也是当前业内最为流行的VPN技术及产品。 </p>
		<p>
				<font color="#0000ff">IPSec工作于网络层，是一个开放的结构，定义在IP数据包格式中，不同的加密算法都可以利用IPSec定义的体系结构在网络数据传输过程中实施。IPSec协议可以设置成在两种模式下运行：一种是隧道（tunnel）模式，一种是（transport）模式。隧道模式下，IPSec把IPv4数据包封装在安全的IP帧中。传输模式是为了保护端到端的安全性，即在这种模式下不会隐藏路由信息。IPSec几乎可以为所有的应用提供访问，包括客户端/服务器模式和某些传统的应用，但是由于基于网络层，不能穿越通常的NAT、防火墙。</font>
		</p>
		<p>
				<font color="#0000ff">IPSec为Internet业务提供最强的安全功能，与其他隧道和安全技术相比，其优越性在于它的安全性和互操作性，但是管理相对复杂</font>。IPSec得到各厂商广泛支持，非常适合于组建远程网络互联VPN。如果需要<font color="#ff0000">相对安全、保密的通道、网络流量有限、对业务实时性要求不高，应首选IPSec建立VPN</font>。 </p>
		<p>IPSec VPN是基于IPSec协议的VPN产品，<font color="#0000ff">由IPSec协议提供隧道安全保障。IPSec是一种由IETF设计的端到端的确保基于IP通讯的数据安全性的机制。IPSec隧道模式具有以下特点：只能支持IP数据流；工作在IP栈的底层，因此，应用程序和高层协议可以继承IPSEC的行为；由一个安全策略（一整套过滤机制）进行控制。安全策略按照优先级的先后顺序创建可供使用的加密和隧道机制以及验证方式。当需要建立通讯时，双方机器执行相互验证，然后协商使用何种加密方式。此后的所有数据流都将使用双方协商的加密机制进行加密，然后封装在隧道包头内</font>。 </p>
		<p>目前防火墙产品中集成的VPN使用较多的是IPSec 协议，在中国其发展处于蓬勃状态。<br /></p>
<img src ="http://www.cnitblog.com/windforce/aggbug/9470.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-04-21 19:39 <a href="http://www.cnitblog.com/windforce/articles/9470.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP/IP协议基础之一[转载]</title><link>http://www.cnitblog.com/windforce/articles/8468.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Sat, 01 Apr 2006 06:31:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/8468.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/8468.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/8468.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/8468.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/8468.html</trackback:ping><description><![CDATA[1、TCP/IP协议栈 <br /><br />四层模型 <br />TCP/IP这个协议遵守一个四层的模型概念：应用层、传输层、互联层和网络接口层。 <br /><br />网络接口层 <br />模型的基层是网络接口层。负责数据帧的发送和接收，帧是独立的网络信息传输单元。网络接口层将帧放在网上，或从网上把帧取下来。 <br /><br />互联层 <br />互联协议将数据包封装成internet数据报，并运行必要的路由算法。 <br />这里有四个互联
<script language="javascript" src="/CMS/JS/newsad.js"></script>
协议： <br />网际协议IP：负责在主机和网络之间寻址和路由数据包。 <br />地址解析协议ARP：获得同一物理网络中的硬件主机地址。 <br />网际控制消息协议ICMP：发送消息，并报告有关数据包的传送错误。 <br />互联组管理协议IGMP：被IP主机拿来向本地多路广播路由器报告主机组成员。 <br /><br />传输层 <br />传输协议在计算机之间提供通信会话。传输协议的选择根据数据传输方式而定。 <br />两个传输协议： <br />传输控制协议TCP：为应用程序提供可靠的通信连接。适合于一次传输大批数据的情况。并适用于要求得到响应的应用程序。 <br />用户数据报协议UDP：提供了无连接通信，且不对传送包进行可靠的保证。适合于一次传输小量数据，可靠性则由应用层来负责。 <br /><br />应用层 <br />应用程序通过这一层访问网络。 <br /><br />网络接口技术 <br />IP使用网络设备接口规范NDIS向网络接口层提交帧。IP支持广域网和本地网接口技术。 <br /><br />串行线路协议 <br />TCP/IPG一般通过internet串行线路协议SLIP或点对点协议<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>在串行线上进行数据传送。(是不是我们平时把它称之为异步通信，对于要拿LINUX提供建立远程连接的朋友应该多研究一下这方面的知识)? <br /><br /><br />2、ARP <br /><br />要在网络上通信，主机就必须知道对方主机的硬件地址(我们不是老遇到网卡的物理地址嘛)。地址解析就是将主机IP地址映射为硬件地址的过程。地址解析协议ARP用于获得在同一物理网络中的主机的硬件地址。 <br /><br />解释本地IP地址(要了解地址解析工作过程的朋友看好了) <br />主机IP地址解析为硬件地址： <br />(1)当一台主机要与别的主机通信时，初始化ARP请求。当该IP断定IP地址是本地时，源主机在ARP缓存中查找目标主机的硬件地址。 <br />(2)要是找不到映射的话，ARP建立一个请求，源主机IP地址和硬件地址会被包括在请求中，该请求通过广播，使所有本地主机均能接收并处理。 <br />(3)本地网上的每个主机都收到广播并寻找相符的IP地址。 <br />(4)当目标主机断定请求中的IP地址与自己的相符时，直接发送一个ARP答复，将自己的硬件地址传给源主机。以源主机的IP地址和硬件地址更新它的ARP缓存。源主机收到回答后便建立起了通信。 <br /><br />解析远程IP地址 <br />不同网络中的主机互相通信，ARP广播的是源主机的缺省网关。 <br />目标IP地址是一个远程网络主机的话，ARP将广播一个路由器的地址。 <br />(1)通信请求初始化时，得知目标IP地址为远程地址。源主机在本地路由表中查找，若无，源主机认为是缺省网关的IP地址。在ARP缓存中查找符合该网关记录的IP地址(硬件地址)。 <br />(2)若没找到该网关的记录，ARP将广播请求网关地址而不是目标主机的地址。路由器用自己的硬件地址响应源主机的ARP请求。源主机则将数据包送到路由器以传送到目标主机的网络，最终达到目标主机。 <br />(3)在路由器上，由IP决定目标IP地址是本地还是远程。如果是本地，路由器用ARP(缓存或广播)获得硬件地址。如果是远程，路由器在其路由表中查找该网关，然后运用ARP获得此网关的硬件地址。数据包被直接发送到下一个目标主机。 <br />(4)目标主机收到请求后，形成ICMP响应。因源主机在远程网上，将在本地路由表中查找源主机网的网关。找到网关后，ARP即获取它的硬件地址。 <br />(5)如果此网关的硬件地址不在ARP缓存中，通过ARP广播获得。一旦它获得硬件地址，ICMP响应就送到路由器上，然后传到源主机。 <br /><br />ARP缓存 <br />为减少广播量，ARP在缓存中保存地址映射以备用。ARP缓存保存有动态项和静态项。动态项是自动添加和删除的，静态项则保留在CACHE中直到计算 <br />机重新启动。 <br /><br />ARP缓存总是为本地子网保留硬件广播地址(0xffffffffffffh)作为一个永久项。 <br />此项使主机能够接受ARP广播。当查看缓存时，该项不会显示。 <br />每条ARP缓存记录的生命周期为10分钟，2分钟内未用则删除。缓存容量满时，删除最老的记录。 <br /><br />加入静态(永久)记录 <br />通过添加静态ARP项可减少ARP请求访问主机的次数。 <br /><br />ARP包的结构 <br />ARP结构的字段如下： <br />硬件类型--使用的硬件(网络访问层)类型。 <br />协议类型--解析过程中的协议使用以太类型的值。 <br />硬件地址长度--硬件地址的字节长度，对于以太网和令牌环来说，其长度为6字节。 <br />协议地址长度--协议地址字节的长度，IP的长度是4字节。 <br />操作号--指定当前执行操作的字段。 <br />发送者的硬件地址--发送者的硬件地址。 <br />发送者的协议地址--发送者的协议地址。 <br />目的站硬件地址--目标者的硬件地址。 <br />目的站协议地址--目标者的协议地址。 <br /><br /><br />3、ICMP和IGMP <br /><br />internet控制消息协议ICMP是用于报告错误并代表IP对消息进行控制。 <br />IP运用互联组管理协议IGMP来告诉路由器，某一网络上指导组中的可用主机。 <br /><br />ICMP <br />ICMP源抑制消息：当TCP/IP主机发送数据到另一主机时，如果速度达到路由器或者链路的饱和状态，路由器发出一个ICMP源抑制消息。 <br /><br />ICMP数据包结构 <br />类型：一个8位类型字段，表示ICMP数据包类型。 <br />代码：一个8位代码域，表示指定类型中的一个功能。如果一个类型中只有一种功能，代码域置为0。 <br />检验和：数据包中ICMP部分上的一个16位检验和。 <br />指定类型的数据随每个ICMP类型变化的一个附加数据。 <br /><br />IGMP <br />IGMP信息传给别的路由器以使每个支持多路广播的路由器获知哪个主机组和哪个网络中。 <br /><br />IGMP包结构 <br />版本：IGMP的版本，值一般为0x1h。 <br />类型：IGMP消息的类型。0x1h类型称为主机成员请求，在多路广播路由器上用于指定多级组中的任何成员轮询一个网络。0x2h类型称为主机成员报告，在主机上用于发布指定组中的成员情况或对一个路由器的主机成员请求进行回答。 <br />未用：未用的域名被发送者置零且被接收者忽略。 <br />检验和：IGMP头的一个16位检验和。 <br />组地址：主机用该组地址在一个主机成员请求中存储IP多路广播地址。在主机成员请求中，组地址被全置零，而且硬件级的多路广播地址被用来标示主机组。 <br /><br />4、IP <br /><br />IP是一个无连接的协议，主要就是负责在主机间寻址并为数据包设定路由，在交换数据前它并不建立会话。因为它不保证正确传递，另一方面，数据在被收到时，IP不需要收到确认，所以它是不可靠的。 <br />有一些字段，在当数据从传输层传下来时，会被附加在数据包中，我们来看一下这些字段： <br />源IP地址：用IP地址确定数据报发送者。 <br />目标IP地址：用IP地址确定数据报目标。 <br />协议：告知目的机的IP是否将包传给TCP或UDP。 <br />检查和：一个简单的数学计算，用来证实收到的包的完整性。 <br />TTL生存有效时间：指定一个数据报被丢弃之前，在网络上能停留多少时间(以秒计)。它避免了包在网络中无休止循环。路由器会根据数据在路由器中驻留的时间来递减TTL。其中数据报通过一次路由器，TTL至少减少一秒。 <br />根据我们前面提到关于ARP的知识，如果IP地址目标为本地地址时，IP将数据包直接传给那个主机；如果目标地址为远程地址的话，IP在本地的路由表中查找远程主机的路由(看来好象我们平时拨114一样)。如果找到一个路由，IP用它传送数据包。如果没找到呢，就会将数据包发送到源主机的缺省网关，也称之为路由器。(很多时候一直在搞网关和路由器的定义，其实我觉得在学的时候不一定死抠概念，现在硬件和软件结合的产品越来越多了，一时很分清的，只要我们运用的时候可以解决实际问题嘛。) <br />这样当路由器收到一个包后，该包向上传给IP： <br />(1)如果交通阻塞(听起来蛮可怕的)，包在路由器中停滞，TTL至少减1或更多。要是它降到0的话，包就会被抛弃。 <br />(2)如果对于下一网络来说包太大的话，IP会将它分割成若干个小包。 <br />(3)如果包被分解，IP为每个新包制造一个新头，其中包括：一个标志，用来显示其它小包在其后；一个小包ID，用来确定所有小包是一起的；一个小包偏移，用来告诉接收主机怎么重新组合它们。 <br />(4)IP计算一个新的检验和。 <br />(5)IP获取一个路由的目标硬件地址。 <br />(6)IP转发包。 <br />在下一主机，包被发送到TCP或UDP。每个路由器都要重复该过程。直到包到达最终目的地。当包到达最终目的地后，IP将小包组装成原来的包。 <br /><br /><br />5、TCP <br /><br />TCP是一种可靠的面向连接的传送服务。它在传送数据时是分段进行的，主机交换数据必须建立一个会话。它用比特流通信，即数据被作为无结构的字节流。 <br />通过每个TCP传输的字段指定顺序号，以获得可靠性。如果一个分段被分解成几个小段，接收主机会知道是否所有小段都已收到。通过发送应答，用以确认别的主机收到了数据。对于发送的每一个小段，接收主机必须在一个指定的时间返回一个确认。如果发送者未收到确认，数据会被重新发送；如果收到的数据包损坏，接收主机会舍弃它，因为确认未被发送，发送者会重新发送分段。 <br /><br />端口 <br />SOCKETS实用程序使用一个协议端口号来标明自己应用的唯一性。端口可以使用0到65536之间的任何数字。在服务请求时，操作系统动态地为客户端的应用程序分配端口号。 <br /><br />套接字 <br />套接字在要领上与文件句柄类似，因为其功能是作为网络通信的终结点。一个应用程序通过定义三部分来产生一个套接字：主机IP地址、服务类型(面向连接的服务是TCP，无连接服务是UDP)、应用程序所用的端口。 <br /><br />TCP端口 <br />TCP端口为信息的传送提供定地点，端口号小于256的定义为常用端口。 <br /><br />TCP的三次握手 <br />TCP对话通过三次握手来初始化。三次握手的目的是使数据段的发送和接收同步；告诉其它主机其一次可接收的数据量，并建立虚连接。 <br />我们来看看这三次握手的简单过程： <br />(1)初始化主机通过一个同步标志置位的数据段发出会话请求。 <br />(2)接收主机通过发回具有以下项目的数据段表示回复：同步标志置位、即将发送的数据段的起始字节的顺序号、应答并带有将收到的下一个数据段的字节顺序号。 <br />(3)请求主机再回送一个数据段，并带有确认顺序号和确认号。 <br /><br />TCP滑动窗口 <br />TCP滑动窗口用来暂存两台主机间要传送的数据，有点类似CACHE。 <br />每个TCP/IP主机有两个滑动窗口：一个用于接收数据，另一个用于发送数据。 <br /><br />6、UDP <br /><br />用户数据报协议UDP提供了无连接的数据报服务。它适用于无须应答并且通常一次只传送少量数据的应用软件。 <br /><br />UDP端口 <br />端口作为多路复用的消息队列使用。 <br />15 NETSTAT 网络状态 <br />53 DOMAIN 域名服务器 <br />69 TFTP 平凡文件传送协议 <br />137 NETBIOS-NS NETBIOS命令服务 <br />138 NETBIOS-DGM NETBIOS数据报服务 <br />161 SNMP SNMP网络监视器 <br /><br /><br />IP地址分配 <br /><br />1、IP地址 <br /><br />IP地址标识着网络中一个系统的位置。我们知道每个IP地址都是由两部分组成的：网络号和主机号。其中网络号标识一个物理的网络，同一个网络上所有主机需要同一个网络号，该号在互联网中是唯一的；而主机号确定网络中的一个工作端、服务器、路由器其它TCP/IP主机。对于同一个网络号来说，主机号是唯一的。每个TCP/IP主机由一个逻辑IP地址确定。 <br /><br />网络号和主机号 <br />IP地址有两种表示形式：二进制表示(1和0太多了就搞不清)和点分十进制表示。每个IP地址的长度为4字节，由四个8位域组成，我们通常称之为八位体。八位体由句点.分开，表示为一个0-255之间的十进制数。一个IP地址的4个域分别标明了网络号和主机号。 <br /><br />2、地址类型 <br /><br />为适应不同大小的网络，internet定义了5种IP地址类型。 <br />可以通过IP地址的前八位来确定地址的类型： <br />类型 IP形式 网络号 主机号 <br />A类 w.x.y.z w x.y.z <br />B类 w.x.y.z w.x y.z <br />C类 w.x.y.z w.x.y z <br />我们来看一下这5类地址： <br />A类地址：可以拥有很大数量的主机，最高位为0，紧跟的7位表示网络号，余24位表示主机号，总共允许有126个网络。 <br />B类地址：被分配到中等规模和大规模的网络中，最高两位总被置于二进制的10，允许有16384个网络。 <br />C类地址：被用于局域网。高三位被置为二进制的110，允许大约200万个网络。 <br />D类地址：被用于多路广播组用户，高四位总被置为1110，余下的位用于标明客户机所属的组。 <br />E类地址是一种仅供试验的地址。 <br /><br />3、地址分配指南 <br /><br />在分配网络号和主机号时应遵守以下几条准则： <br />(1)网络号不能为127。大家知道该标识号被保留作回路及诊断功能，还记得平时ping <br />127.0.0.1？ <br />(2)不能将网络号和主机号的各位均置1。如果每一位都是1的话，该地址会被解释为网内 <br />广播而不是一个主机号。(TCP/IP是一个可广播的协议嘛) <br />(3)相应于上面一条，各位均不能置0，否则该地址被解释为“就是本网络”。 <br />(4)对于本网络来说，主机号应该是唯一。(否则会出现IP地址已分配或有冲突之类的错误) <br /><br />分配网络号 <br />对于每个网络以及广域连接，必须有唯一的网络号，主机号用于区分同一物理网络中的不同主机。如果网络由路由器连接，则每个广域连接都需要唯一的网络号。 <br /><br />分配主机号 <br />主机号用于区分同一网络中不同的主机，并且主机号应该是唯一的。所有的主机包括路由器间的接口，都应该有唯一的网络号。路由器的主机号，要配置成工作站的缺省网关地址。 <br /><br />有效的主机号 <br />A类：w.0.0.1--w.255.255.254 <br />B类：w.x.0.1--w.x.255.254 <br />C类：w.x.y.1--w.x.y.254 <br /><br /><br />4、子网屏蔽和IP地址 <br /><br />TCP/IP上的每台主机都需要用一个子网屏蔽号。它是一个4字节的地址，用来封装或“屏蔽”IP地址的一部分，以区分网络号和主机号。当网络还没有划分为子网时，可以使用缺省的子网屏蔽；当网络被划分为若干个子网时，就要使用自定义的子网屏蔽了。 <br /><br />缺省值 <br />我们来看看缺省的子网屏蔽值，它用于一个还没有划分子网的网络。即使是在一个单段网络上，每台主机也都需要这样的缺省值。 <br />它的形式依赖于网络的地址类型。在它的4个字节里，所有对应网络号的位都被置为1，于是每个八位体的十进制值都是255；所有对就主机号的位都置为0。例如：C类网地址192.168.0.1和相应的缺省屏蔽值255.255.255.0。 <br /><br />确定数据包的目的地址 <br />我们说把屏蔽值和IP地址值做“与”的操作其实是一个内部过程，它用来确定一个数据包是传给本地还是远程网络上的主机。其相应的操作过程是这样的：当TCP/IP初始化时，主机的IP地址和子网屏蔽值相“与”。在数据包被发送之前，再把目的地址也和屏蔽值作“与”，这样如果发现源IP地址和目的IP地址相匹配，IP协议就知道数据包属于本地网上的某台主机；否则数据包将被送到路由器上。 <br />注：我们知道“与”操作是将IP地址中的每一位与子网屏蔽中相应的位按逻辑与作比较。 <br /><br />建立子网 <br /><br />1、 子网简介 <br /><br /><br />一个网络实际上可能会有多个物理网段，我们把这些网段称之为子网，其使用的IP地址是由某个网络号派生而得到的。 <br />将一个网络划分成若干个子网，需要使用不同的网络号或子网号。当然了，划分子网有它的优点，通过划分子网，每个单位可以将复杂的物理网段连接成一个网络，并且可以： <br />(1) 混合使用多种技术，比如以太网和令牌环网。(最流行的两种接口都支持了哦) <br /><br />(2) 克服当前技术的限制，比如突破每段主机的最大数量限制。 <br />(3) 通过重定向传输以及减少广播等传输方式以减轻网络的拥挤。 <br /><br />实现子网划分 <br />在动手划分子网之前，我们一定要先分析一下自己的需求以及将来的规划。一般情况下我们遵循这样的准则： <br />(1) 确定网络中的物理段数量。(就是子网个数嘛) <br />(2) 确定每个子网需要的主机数。注意一个主机至少一个IP地址。 <br />(3) 基于此需求，定义：整个网络的子网屏蔽、每个子网唯一的子网号和每个子网的主机号范围。 <br /><br />子网屏蔽位 <br />在定义一个子网屏蔽之前，确定一下将来需要的子网数量及每子网的主机数是必不可少的一步。因为当更多的位用于子网屏蔽时，就有更多的可用子网了，但每个子网中的主机数将减少。(这和定义IP地址的概念正好相反) <br /><br /><br /><br />2、定义子网屏蔽 <br />将网络划分成若干个子网时，必须要定义好子网屏蔽。我们来看看定义的步骤： <br />(1)确定物理网段也就是子网的个数，并将这个数字转换成二进制数。比如B类地址，分6个子网就是110。 <br />(2)计算物理网段数(子网数)的二进制位数，这里是110，所以需要3位。 <br />(3)以高位顺序(从左到右)将这个反码转换成相应的十进制值，因为需要3位，就将主机号前3位作为子网号，这里是11100000，所以屏蔽就是255.255.254.0。 <br /><br />3、定义子网号 <br />子网号与子网屏蔽的位数相同。 <br />(1)列出子网号按高到低的顺序使用的位数。例如子网屏蔽使用了3位，二进制值是11100000。 <br />(2)将最低的一位1转换成十进制，用这个值来定义子网的增量。这个例子中是1110，所以增量是32。 <br />(3)用这个增量迭加从0开始的子网号，直到下一个值为256。这个例子中就是w.x.32.1-w.x.63.254、w.x.64.1-w.x.127.254等。 <br /><br />4、定义子网中的主机号 <br />从上面的例子看出，一旦定义了子网号，就已经确定了每个子网的主机号了。我们在做每次增量后得出的值表明了子网中主机号范围的起始值。 <br />确定每个子网中的主机数目 <br />(1)计算主机号可用的位数。例如在B类网中用3位定义了网络号，那么余下的13位定义了主机号。 <br />(2)将这个余下的位数也就是主机号转换为十进制，再减去1。例如13位值1111111111111转换为十进制的话就是8191，所以这个网络中每个子网的主机数就是8190了。 <br /><br />-------------------------------------------------------------------------------- <br /><br />实现IP路由 <br /><br />1、IP路由简介 <br /><br />路由就是选择一条数据包传输路径的过程。当TCP/IP主机发送IP数据包时，便出现了路由，且当到达IP路由器还会再次出现。路由器是从一个物理网向另一个物理网发送数据包的装置，路由器通常被称为网关。对于发送的主机和路由器而言，必须决定向哪里转发数据包。在决定路由时，IP层查询位于内存中的路由表。 <br />(1)当一个主机试图与另一个主机通信时，IP首先决定目的主机是一个本地网还是远程网。 <br />(2)如果目的主机是远程网，IP将查询路由表来为远程主机或远程网选择一个路由。 <br />(3)若未找到明确的路由，IP用缺省的网关地址将一个数据传送给另一个路由器。 <br />(4)在该路由器中，路由表再次为远程主机或网络查询路由，若还未找到路由，该数据包将发送到该路由器的缺省网关地址。 <br />每发现一条路由，数据包被转送下一级路由器，称为一次“跳步”，并最终发送至目的主机。 <br />若未发现任何一个路由，源主机将收到一个出错信息。 <br /><img src ="http://www.cnitblog.com/windforce/aggbug/8468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-04-01 14:31 <a href="http://www.cnitblog.com/windforce/articles/8468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PPP协议[转载]</title><link>http://www.cnitblog.com/windforce/articles/8466.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Sat, 01 Apr 2006 05:14:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/8466.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/8466.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/8466.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/8466.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/8466.html</trackback:ping><description><![CDATA[
		<p>一、介绍</p>
		<p>　　<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>（Point-to-Point Protocol点到点协议）是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这种链路提供全双工操作，并按照顺序传递数据包。设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据，使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。</p>
		<p>　　二、 <a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>链路建立过程</p>
		<p>　　<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>协议中提供了一整套方案来解决链路建立、维护、拆除、上层协议协商、认证等问题。<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>协议包含这样几个部分：链路控制协议LCP（Link Control Protocol）；网络控制协议NCP（Network Control Protocol）；认证协议，最常用的包括口令验证协议PAP（Password Authentication Protocol）和挑战握手验证协议CHAP（Challenge-Handshake Authentication Protocol）。</p>
		<p>　　LCP负责创建，维护或终止一次物理连接。NCP是一族协议，负责解决物理连接上运行什么网络协议，以及解决上层网络协议发生的问题。</p>
		<p>　　下面介绍<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>链路建立的过程：</p>
		<p> </p>
		<p>　　<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>链路状态机如图1所示。一个典型的链路建立过程分为三个阶段：创建阶段、认证阶段和网络协商阶段。</p>
		<p>　　阶段1：创建<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>链路</p>
		<p>　　LCP负责创建链路。在这个阶段，将对基本的通讯方式进行选择。链路两端设备通过LCP向对方发送配置信息报文（Configure Packets）。一旦一个配置成功信息包（Configure-Ack packet）被发送且被接收，就完成了交换，进入了LCP开启状态。</p>
		<p>　　应当注意，在链路创建阶段，只是对验证协议进行选择，用户验证将在第2阶段实现。</p>
		<p>
				<br />　　阶段2：用户验证</p>
		<p>　　在这个阶段，客户端会将自己的身份发送给远端的接入服务器。该阶段使用一种安全验证方式避免第三方窃取数据或冒充远程客户接管与客户端的连接。在认证完成之前，禁止从认证阶段前进到网络层协议阶段。如果认证失败，认证者应该跃迁到链路终止阶段。</p>
		<p>　　在这一阶段里，只有链路控制协议、认证协议，和链路质量监视协议的packets是被允许的。在该阶段里接收到的其他的packets必须被静静的丢弃。</p>
		<p>　　最常用的认证协议有口令验证协议（PAP）和挑战握手验证协议（CHAP）。 认证方式介绍在第三部分中介绍。 </p>
		<p>　　阶段3：调用网络层协议</p>
		<p>
				<br />　　认证阶段完成之后，<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>将调用在链路创建阶段（阶段1）选定的各种网络控制协议（NCP）。选定的NCP解决<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>链路之上的高层协议问题，例如，在该阶段IP控制协议（IPCP）可以向拨入用户分配动态地址。</p>
		<p>　　这样，经过三个阶段以后，一条完整的<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>链路就建立起来了。</p>
		<p>　　三、 认证方式</p>
		<p>　　1）口令验证协议（PAP） </p>
		<p>　　PAP是一种简单的明文验证方式。NAS（网络接入服务器，Network Access Server）要求用户提供用户名和口令，PAP以明文方式返回用户信息。很明显，这种验证方式的安全性较差，第三方可以很容易的获取被传送的用户名和口令，并利用这些信息与NAS建立连接获取NAS提供的所有资源。所以，一旦用户密码被第三方窃取，PAP无法提供避免受到第三方攻击的保障措施。</p>
		<p>　　2）挑战-握手验证协议（CHAP） </p>
		<p>　　CHAP是一种加密的验证方式，能够避免建立连接时传送用户的真实密码。NAS向远程用户发送一个挑战口令（challenge），其中包括会话ID和一个任意生成的挑战字串（arbitrary challengestring）。远程客户必须使用MD5单向哈希算法（one-way hashing algorithm）返回用户名和加密的挑战口令，会话ID以及用户口令，其中用户名以非哈希方式发送。</p>
		<p>　　CHAP对PAP进行了改进，不再直接通过链路发送明文口令，而是使用挑战口令以哈希算法对口令进行加密。因为服务器端存有客户的明文口令，所以服务器可以重复客户端进行的操作，并将结果与用户返回的口令进行对照。CHAP为每一次验证任意生成一个挑战字串来防止受到再现攻击（replay attack）。在整个连接过程中，CHAP将不定时的向客户端重复发送挑战口令，从而避免第3方冒充远程客户（remote client impersonation）进行攻击。</p>
		<p>　　四、<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>协议的应用</p>
		<p>　　<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>协议是目前广域网上应用最广泛的协议之一，它的优点在于简单、具备用户验证能力、可以解决IP分配等。 </p>
		<p>　　家庭拨号上网就是通过<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>在用户端和运营商的接入服务器之间建立通信链路。 目前，宽带接入正在成为取代拨号上网的趋势，在宽带接入技术日新月异的今天，<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>也衍生出新的应用。典型的应用是在ADSL（非对称数据用户环线，Asymmetrical Digital Subscriber Loop）接入方式当中，<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>与其他的协议共同派生出了符合宽带接入要求的新的协议，如<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>oE（<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a> over Ethernet），<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>oA（<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a> over ATM）。 </p>
		<p>　　利用以太网（Ethernet）资源，在以太网上运行<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>来进行用户认证接入的方式称为<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>oE。<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>oE即保护了用户方的以太网资源，又完成了ADSL的接入要求，是目前ADSL接入方式中应用最广泛的技术标准。 </p>
		<p>　　同样，在ATM（异步传输模式，Asynchronous Transfer Mode）网络上运行<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>协议来管理用户认证的方式称为<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>oA。它与<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>oE的原理相同，作用相同；不同的是它是在ATM网络上，而<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>oE是在以太网网络上运行，所以要分别适应ATM标准和以太网标准。 </p>
		<p>　　<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>协议的简单完整使它得到了广泛的应用，相信在未来的网络技术发展中，它还可以发挥更大的作用。</p>
		<p>
				<a href="http://www.net130.com/uptech/ppp.doc">
						<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>协议文档</a>
		</p>
		<div>
		</div>
<img src ="http://www.cnitblog.com/windforce/aggbug/8466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-04-01 13:14 <a href="http://www.cnitblog.com/windforce/articles/8466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VLAN的资料,从入门到精通[转载]</title><link>http://www.cnitblog.com/windforce/articles/8435.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Fri, 31 Mar 2006 07:16:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/8435.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/8435.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/8435.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/8435.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/8435.html</trackback:ping><description><![CDATA[
		<strong>
				<span class="tpc_title">VLAN的资料,从入门到精通</span>
				<br />
				<br />
		</strong>
		<span class="tpc_content">
				<font size="2">局域网实现VLAN实例 <br /><br />局域网实现VLAN实例计算机网络技术的发展犹如戏剧舞台，你方唱罢我登台。从传统的以太网（10Mb/s）发展到快速以太网（100Mb/s）和千兆以太网（1000Mb/s）也不过几年的时间，其迅猛的势头实在令人吃惊。而现在中大型规模网络建设中，以千兆三层交换机为核心的所谓“千兆主干跑、百兆到桌面”的主流网络模型已不胜枚举。 现在，网络业界对“三层交换”和VLAN这两词已经不感到陌生了。 <br /><br />一、什么是三层交换和VLAN要回答这个问题我们还是先看看以太网的工作原理。以太网的工作原理是利用二进制位形成的一个个字节组合成一帧帧的数据（其实是一些电脉冲）在导线中进行传播。 <br /><br />首先，以太网网段上需要进行数据传送的节点对导线进行监听，这个过程称为CSMA/CD（Carrier Sense Multiple Access with Collision Detection带有冲突监测的载波侦听多址访问）的载波侦听。如果，这时有另外的节点正在传送数据，监听节点将不得不等待，直到传送节点的传送任务结束。如果某时恰好有两个工作站同时准备传送数据，以太网网段将发出“冲突”信号。这时，节点上所有的工作站都将检测到冲突信号，因为这时导线上的电压超出了标准电压。这时以太网网段上的任何节点都要等冲突结束后才能够传送数据。也就是说在CSMA/CD方式下，在一个时间段，只有一个节点能够在导线上传送数据。而转发以太网数据帧的联网设备是集线器,它是一层设备，传输效率比较低。冲突的产生降低了以太网的带宽，而且这种情况又是不可避免的。所以，当导线上的节点越来越多后，冲突的数量将会增加。显而易见的解决方法是限制以太网导线上的节点，需要对网络进行物理分段。将网络进行物理分段的网络设备用到了网桥与交换机。网桥和交换机的基本作用是只发送去往其他物理网段的信息。所以，如果所有的信息都只发往本地的物理网段，那么网桥和交换机上就没有信息通过。这样可以有效减少网络上的冲突。网桥和交换机是基于目标MAC（介质访问控制）地址做出转发决定的，它们是二层设备。 <br /><br />我们已经知道了以太网的缺点及物理网段中冲突的影响，现在，我们来看看另外一种导致网络降低运行速度的原因：广播。广播存在于所有的网络上，如果不对它们进行适当的控制，它们便会充斥于整个网络，产生大量的网络通信。广播不仅消耗了带宽，而且也降低了用户工作站的处理效率。由于各种各样的原因，网络操作系统（NOS）使用了广播，TCP/IP使用广播从IP地址中解析MAC地址，还使用广播通过RIP和IGRP协议进行宣告，所以，广播也是不可避免的。网桥和交换机将对所有的广播信息进行转发，而路由器不会。所以，为了对广播进行控制，就必须使用路由器。路由器是基于第3层报头、目标IP寻址、目标IPX寻址或目标Appletalk寻址做出转发决定。路由器是3层设备。 <br /><br />在这里，我们就容易理解三层交换技术了，通俗地讲，就是将路由与交换合二为一的技术。路由器在对第一个数据流进行路由后，将会产生一个MAC地址与IP地址的映射表，当同样的数据流再次通过时，将根据此映射表直接从二层进行交换而不是再次路由，提供线速性能，从而消除了路由器进行路由选择而造成网络的延迟，提高了数据包转发的效率。采用此技术的交换机我们常称为三层交换机。 <br /><br />那么，什么是VLAN呢？VLAN（Virtual Local Area Network）就是虚拟局域网的意思。VLAN可以不考虑用户的物理位置，而根据功能、应用等因素将用户从逻辑上划分为一个个功能相对独立的工作组，每个用户主机都连接在一个支持VLAN的交换机端口上并属于一个VLAN。同一个VLAN中的成员都共享广播，形成一个广播域，而不同VLAN之间广播信息是相互隔离的。这样，将整个网络分割成多个不同的广播域（VLAN）。一般来说，如果一个VLAN里面的工作站发送一个广播，那么这个VLAN里面所有的工作站都接收到这个广播，但是交换机不会将广播发送至其他VLAN上的任何一个端口。如果要将广播发送到其它的VLAN端口，就要用到三层交换机。 <br /><br />二、如何配置三层交换机创建VLAN <br /><br />以下的介绍都是基于Cisco交换机的VLAN。Cisco的VLAN实现通常是以端口为中心的,与节点相连的端口将确定它所驻留的VLAN。将端口分配给VLAN的方式有两种，分别是静态的和动态的. <br /><br />形成静态VLAN的过程是将端口强制性地分配给VLAN的过程。即我们先在VTP （VLAN Trunking Protocol）Server上建立VLAN，然后将每个端口分配给相应的VLAN的过程。这是我们创建VLAN最常用的方法。 <br /><br />动态VLAN形成很简单，由具体的机器决定自己属于哪个VLAN。即我们先建立一个VMPS（VLAN Membership Policy Server）VLAN管理策略服务器，里面包含一个文本文件，文件中存有与VLAN映射的MAC地址表。交换机根据这个映射表决定将端口分配给何种VLAN。这种方法有很大的优势，但创建数据库是一项非常艰苦而且非常繁琐的工作。 <br /><br />下面以实例说明如何在一个典型的快速以太局域网中实现VLAN。 <br /><br />所谓典型局域网就是指由一台具备三层交换功能的核心交换机接几台分支交换机（不一定具备三层交换能力）。我们假设核心交换机名称为：COM；分支交换机分别为：PAR1、PAR2、PAR3，分别通过Port 1的光线模块与核心交换机相连；并且假设VLAN名称分别为COUNTER、MARKET、MANAGING…… <br /><br />需要做的工作： <br />1、设置VTP DOMAIN（核心、分支交换机上都设置） <br />2、配置中继（核心、分支交换机上都设置） <br />3、创建VLAN（在server上设置） <br />4、将交换机端口划入VLAN <br />5、配置三层交换 <br /><br />1、设置VTP DOMAIN。 VTP DOMAIN 称为管理域。 <br /><br />交换VTP更新信息的所有交换机必须配置为相同的管理域。如果所有的交换机都以中继线相连，那么只要在核心交换机上设置一个管理域，网络上所有的交换机都加入该域，这样管理域里所有的交换机就能够了解彼此的VLAN列表。 <br /><br />COM#vlan database 进入VLAN配置模式 <br />COM(vlan)#vtp domain COM 设置VTP管理域名称 COM <br />COM(vlan)#vtp server 设置交换机为服务器模式 <br /><br />PAR1#vlan database 进入VLAN配置模式 <br />PAR1(vlan)#vtp domain COM 设置VTP管理域名称COM <br />PAR1(vlan)#vtp Client 设置交换机为客户端模式 <br /><br />PAR2#vlan database 进入VLAN配置模式 <br />PAR2(vlan)#vtp domain COM 设置VTP管理域名称COM <br />PAR2(vlan)#vtp Client 设置交换机为客户端模式 <br /><br />PAR3#vlan database 进入VLAN配置模式 <br />PAR3(vlan)#vtp domain COM 设置VTP管理域名称COM <br />PAR3(vlan)#vtp Client 设置交换机为客户端模式 <br /><br />注意：这里设置核心交换机为Server模式是指允许在该交换机上创建、修改、删除VLAN及其他一些对整个VTP域的配置参数，同步本VTP域中其他交换机传递来的最新的VLAN信息；Client模式是指本交换机不能创建、删除、修改VLAN配置，也不能在NVRAM中存储VLAN配置，但可同步由本VTP域中其他交换机传递来的VLAN信息。 <br /><br />2、配置中继为了保证管理域能够覆盖所有的分支交换机，必须配置中继。 <br /><br />Cisco交换机能够支持任何介质作为中继线，为了实现中继可使用其特有的ISL标签。ISL（Inter－Switch Link）是一个在交换机之间、交换机与路由器之间及交换机与服务器之间传递多个VLAN信息及VLAN数据流的协议，通过在交换机直接相连的端口配置ISL封装，即可跨越交换机进行整个网络的VLAN分配和进行配置。 <br /><br />在核心交换机端配置如下： <br /><br />COM(config)#interface gigabitEthernet 2/1 <br />COM(config-if)#switchport <br />COM(config-if)#switchport trunk encapsulation isl 配置中继协议 <br />COM(config-if)#switchport mode trunk <br /><br />COM(config)#interface gigabitEthernet 2/2 <br />COM(config-if)#switchport <br />COM(config-if)#switchport trunk encapsulation isl 配置中继协议 <br />COM(config-if)#switchport mode trunk <br /><br />COM(config)#interface gigabitEthernet 2/3 <br />COM(config-if)#switchport <br />COM(config-if)#switchport trunk encapsulation isl 配置中继协议 <br />COM(config-if)#switchport mode trunk <br /><br />在分支交换机端配置如下： <br /><br />PAR1(config)#interface gigabitEthernet 0/1 <br />PAR1(config-if)#switchport mode trunk <br /><br />PAR2(config)#interface gigabitEthernet 0/1 <br />PAR2(config-if)#switchport mode trunk <br /><br />PAR3(config)#interface gigabitEthernet 0/1 <br />PAR3(config-if)#switchport mode trunk <br /><br />…… <br /><br />此时，管理域算是设置完毕了。 <br /><br />3、创建VLAN一旦建立了管理域，就可以创建VLAN了。 <br /><br />COM(vlan)#Vlan 10 name COUNTER 创建了一个编号为10 名字为COUNTER的 VLAN <br />COM(vlan)#Vlan 11 name MARKET 创建了一个编号为11 名字为MARKET的 VLAN <br />COM(vlan)#Vlan 12 name MANAGING 创建了一个编号为12 名字为MANAGING的 VLAN <br /><br />…… <br /><br />注意，这里的VLAN是在核心交换机上建立的，其实，只要是在管理域中的任何一台VTP 属性为Server的交换机上建立VLAN，它就会通过VTP通告整个管理域中的所有的交换机。但如果要将具体的交换机端口划入某个VLAN，就必须在该端口所属的交换机上进行设置。 <br /><br />4、将交换机端口划入VLAN. <br /><br />例如，要将PAR1、PAR2、PAR3……分支交换机的端口1划入COUNTER VLAN，端口2划入MARKET VLAN，端口3划入MANAGING VLAN…… <br /><br />PAR1(config)#interface fastEthernet 0/1 配置端口1 <br />PAR1(config-if)#switchport access vlan 10 归属COUNTER VLAN <br /><br />PAR1(config)#interface fastEthernet 0/2 配置端口2 <br />PAR1(config-if)#switchport access vlan 11 归属MARKET VLAN <br /><br />PAR1(config)#interface fastEthernet 0/3 配置端口3 <br />PAR1(config-if)#switchport access vlan 12 归属MANAGING VLAN <br /><br />PAR2(config)#interface fastEthernet 0/1 配置端口1 <br />PAR2(config-if)#switchport access vlan 10 归属COUNTER VLAN <br /><br />PAR2(config)#interface fastEthernet 0/2 配置端口2 <br />PAR2(config-if)#switchport access vlan 11 归属MARKET VLAN <br /><br />PAR2(config)#interface fastEthernet 0/3 配置端口3 <br />PAR2(config-if)#switchport access vlan 12 归属MANAGING VLAN <br /><br />PAR3(config)#interface fastEthernet 0/1 配置端口1 <br />PAR3(config-if)#switchport access vlan 10 归属COUNTER VLAN <br /><br />PAR3(config)#interface fastEthernet 0/2 配置端口2 <br />PAR3(config-if)#switchport access vlan 11 归属MARKET VLAN <br /><br />PAR3(config)#interface fastEthernet 0/3 配置端口3 <br />PAR3(config-if)#switchport access vlan 12 归属MANAGING VLAN <br /><br />…… <br /><br />5、配置三层交换. <br /><br />到这里，VLAN已经基本划分完毕。但是，VLAN间如何实现三层（网络层）交换呢？这时就要给各VLAN分配网络（IP）地址了。给VLAN分配IP地址分两种情况，其一，给VLAN所有的节点分配静态IP地址；其二，给VLAN所有的节点分配动态IP地址。下面就这两种情况分别介绍。 <br /><br />假设给VLAN COUNTER分配的接口Ip地址为172.16.58.1/24，网络地址为：172.16.58.0， <br />VLAN MARKET 分配的接口Ip地址为172.16.59.1/24，网络地址为：172.16.59.0， <br />VLAN MANAGING分配接口Ip地址为172.16.60.1/24， 网络地址为172.16.60.0 <br />…… <br />如果动态分配IP地址，则设网络上的DHCP服务器IP地址为172.16.1.11。 <br /><br />(1)给VLAN所有的节点分配静态IP地址。 <br /><br />首先在核心交换机上分别设置各VLAN的接口IP地址。核心交换机将vlan做为一种接口对待，就象路由器上的一样，如下所示： <br /><br />COM(config)#interface vlan 10 <br />COM(config-if)#ip address 172.16.58.1 255.255.255.0 VLAN10接口IP <br /><br />COM(config)#interface vlan 11 <br />COM(config-if)#ip address 172.16.59.1 255.255.255.0 VLAN11接口IP <br /><br />COM(config)#interface vlan 12 <br />COM(config-if)#ip address 172.16.60.1 255.255.255.0 VLAN12接口IP <br /><br />…… <br /><br />再在各接入VLAN的计算机上设置与所属VLAN的网络地址一致的IP地址，并且把默认网关设置为该VLAN的接口地址。这样，所有的VLAN也可以互访了。 <br /><br />(2)给VLAN所有的节点分配动态IP地址。 <br /><br />首先在核心交换机上分别设置各VLAN的接口IP地址和同样的DHCP服务器的IP地址，如下所示： <br /><br />COM(config)#interface vlan 10 <br />COM(config-if)#ip address 172.16.58.1 255.255.255.0 VLAN10接口IP <br />COM(config-if)#ip helper-address 172.16.1.11 DHCP Server IP <br /><br />COM(config)#interface vlan 11 <br />COM(config-if)#ip address 172.16.59.1 255.255.255.0 VLAN11接口IP <br />COM(config-if)#ip helper-address 172.16.1.11 DHCP Server IP <br /><br />COM(config)#interface vlan 12 <br />COM(config-if)#ip address 172.16.60.1 255.255.255.0 VLAN12接口IP <br />COM(config-if)#ip helper-address 172.16.1.11 DHCP Server IP <br /><br />…… <br /><br />再在DHCP服务器上设置网络地址分别为172.16.58.0，172.16.59.0，172.16.60.0的作用域，并将这些作用域的“路由器”选项设置为对应VLAN的接口IP地址。这样，可以保证所有的VLAN也可以互访了。 <br /><br />最后在各接入VLAN的计算机进行网络设置，将IP地址选项设置为自动获得IP地址即可。 <br /><br />三、总结 <br /><br />本文是笔者在实际工作中的一些总结。笔者力图用通俗易懂的文字来阐述创建VLAN的全过程。并且给出了详细的设置步骤，只要你对Cisco交换机的IOS有所了解，看懂本文并不难。按照本文所示的步骤一步一步地做，你完全可以给一个典型的快速以太网络建立多个VLAN。</font>
		</span>
		<br />
<img src ="http://www.cnitblog.com/windforce/aggbug/8435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-03-31 15:16 <a href="http://www.cnitblog.com/windforce/articles/8435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP-传输控制协议 [转载]</title><link>http://www.cnitblog.com/windforce/articles/8037.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Thu, 23 Mar 2006 16:08:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/8037.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/8037.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/8037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/8037.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/8037.html</trackback:ping><description><![CDATA[
		<div class="prod-news-content-text">
				<p>传输控制协议（Transmission Control Protocol，TCP）是一种面向连接的、可靠的、基于字节流的运输层通信协议，通常由IETF的RFC 793说明。在简化的计算机网络OSI模型中，它完成运输层所指定的功能。</p>
				<p>在因特网协议族中，TCP层是位于IP层之上，应用层之下的中间层。不同主机的应用层之间经常需要可靠的、像管道一样的连接，但是IP层不提供这样的流机制，而是提供不可靠的包交换。</p>
				<p>应用层向TCP层发送用于网间传输的、用8位字节表示的数据流，然后TCP把数据流分割成适当长度的报文段（通常受该计算机连接的网络的数据链路层的最大传送单元(MTU)的限制）。之后TCP把结果包传给IP层，由它来通过网络将包传送给接收端实体的TCP层。TCP为了保证不发生丢包，就给每个字节一个序号，同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认(ACK)；如果发送端实体在合理的往返时延(RTT)内未收到确认，那么对应的数据（假设丢失了）将会被重传。TCP用一个校验和函数来检验数据是否有错误；在发送和接收时都要计算校验和。</p>
				<p>
						<strong>TCP通路的建立和终结</strong>
						<br />TCP连接包括三个状态：连接建立、数据传送和连接终止。TCP用三路握手过程建立一个连接，用四路握手过程建立来拆除一个连接。在连接建立过程中，很多参数要被初始化，例如序号被初始化以保证按序传输和连接的强壮性。</p>
				<p>
						<br />连接建立（三路握手）<br />一对终端同时初始化一个它们之间的连接是可能的。但通常是由一端打开一个套接字(socket)然后监听来自另一方的连接，这就是通常所指的被动打开。被动打开的一端就是服务器端。而客户端通过向服务器端发送一个SYN来建立一个主动打开，作为三路握手的一部分。服务器端应当为一个合法的SYN回送一个SYN/ACK。最后，客户端再发送一个ACK。这样就完成了三路握手并进入了连接建立状态。</p>
				<p>
						<br />数据传输<br />在TCP的数据传送状态，很多重要的机制保证了TCP的可靠性和强壮性。它们包括：使用序号对收到的TCP报文段进行排序以及检测重复的数据；使用校验和来检测报文段的错误；使用确认和计时器来检测和纠正丢包或延时。</p>
				<p>在TCP的连接建立状态，两个主机的TCP层间要交换初始序号 (ISN)。这些序号用于标识字节流中的数据，并且还是对应用层的数据字节进行记数的整数。通常在每个TCP报文段中都有一对序号和确认号。TCP报文发送者认为自己的字节编号为序号，而认为接收者的字节编号为确认号。TCP报文的接收者为了确保可靠性，在接收到一定数量的连续字节流后才发送确认。这是对TCP的一种扩展，通常称为选择确认(SACK)。选择确认使得TCP接收者可以对乱序到达的数据块进行确认。</p>
				<p>通过使用序号和确认号，TCP层可以把收到的报文段中的字节按正确的顺序交付给应用层。序号是32位的无符号数，在它增大到232-1时便会回绕到0。对于ISN的选择是TCP中关键的一个操作，它可以确保强壮性和安全性。</p>
				<p>TCP的16位的校验和的计算和检验过程如下：发送者将TCP报文段的头部和数据部分的反码和计算出来，再对其求反码，就得到了校验和，然后将结果装入报文中传输。（这里用反码和的原因是这种方法的循环进位使校验和可以在16位、32位、64位等情况下的计算结果在叠加后相同）接收者在收到报文后再按相同的算法计算一次校验和。这里使用的反码使得接收者不用再将校验和字段保存起来后清零，而可以直接将报文段连同校验和一起计算。如果计算结果是-0，那么就表示了报文的完整性和正确性。</p>
				<p>注意：TCP校验和也包括了96位的伪头部，其中有源地址、目的地址、协议以及TCP的长度。这可以避免报文被错误地路由。</p>
				<p>按现在的标准，TCP的校验和是一个比较脆弱的校验。具有高出错率的数据链路层需要额外的连接错误纠正和探测能力。如果TCP是在今天被设计，它很可能有一个32位的CRC校验来纠错，而不是使用校验和。但是通过在第二层使用通常的CRC或更完全一点的校验可以部分地弥补这种脆弱的校验。第二层是在TCP层和IP层之下的，比如<a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>或以太网，它们使用了这些校验。但是这也并不意味着TCP的16位校验和是冗余的，对于因特网传输的观察表明在受CRC保护的各跳之间，软件和硬件的错误通常也会在报文中引入错误，而端到端的TCP校验能够捕捉到很多的这种错误。这就是应用中的端到端原则。</p>
				<p>数据发送者之间用对接收数据的确认或不予确认来显式的表示TCP发送者和接收者之间的网络状态。再加上计时器，TCP发送者和接收者就可以改变数据的流动情况。这就是通常所指的流量控制，拥塞控制/或拥塞避免。TCP使用大量的机制来同时获得强壮性和高可靠性。这些机制包括：滑动窗口、慢启动算法、拥塞避免算法、快速重启和快速恢复算法等等。对于TCP的可靠的丢包处理、错误最小化、拥塞管理以及高速运行环境等机制的优化的研究和标准制定，正在进行之中。</p>
				<p>
						<br />连接终止<br />连接终止状态使用了四路握手过程，在这个过程中每个终端的连接都能独立地被终止。因此，一个典型的拆接过程需要每个终端都提供一对FIN和ACK。<br /><br /><strong>TCP的端口</strong><br />TCP使用了端口号的概念来标识发送方和接收方的应用层。对每个TCP连接的一端都有一个相关的16位的无符号端口号分配给它们。端口被分为三类：众所周知的、注册的和动态/私有的。众所周知的端口号是由因特网赋号管理局(IANA)来分配的，并且通常被用于系统一级或根进程。众所周知的应用程序作为服务器程序来运行，并被动地侦听经常使用这些端口的连接。例如：FTP、TELNET、SMTP、HTTP等。注册的端口号通常被用来作为终端用户连接服务器时短暂地使用的源端口号，但它们也可以用来标识已被第三方注册了的、被命名的服务。动态/私有的端口号在任何特定的TCP连接外不具有任何意义。可能的、被正式承认的端口号有65535个。<br /><br /><strong>TCP的发展历程</strong><br />TCP是一个复杂的但同时又是在发展之中的协议。尽管许多重要的改进被提出和实施，发表于1981年的RFC793中说明的TCP的许多基本操作还是未作多大改动。RFC1122：《因特网对主机的要求》阐明了许多TCP协议的实现要求。RFC2581：《TCP的拥塞控制》是一篇近年来关于TCP的很重要的RFC，描述了更新后的避免过度拥塞的算法。写于2001年的RFC3168描述了对明显拥塞的报告，这是一种拥塞避免的信号量机制。在21世纪早期，在所有因特网的数据包中，通常有大约95%的包使用了TCP协议。常见的使用TCP的应用层有HTTP/HTTPS（万维网协议），SMTP/POP3/IMAP（电子邮件协议）以及FTP（文件传输协议）。这些协议在今天被广泛地使用，这证明了它们的原作者的创造是卓越的。</p>
				<p>最近，一个新协议已经被加州理工学院的科研人员开发出来，命名为FAST TCP（基于快速活动队列管理的规模可变的传输控制协议）。它使用排队延迟作为拥塞控制信号；但是因为端到端的延迟通常不仅仅包括排队延迟，所以FAST TCP (或更一般地，所有基于排队延迟的算法) 在实际互联网中的能否工作仍然是一个没有解决的问题。<br /><br /><strong>对TCP的选用情况</strong><br />TCP并不是对所有的应用都适合，一些新的带有一些内在的脆弱性的运输层协议也被设计出来。比如，实时应用并不需要甚至无法忍受TCP的可靠传输机制。在这种类型的应用中，通常允许一些丢包、出错或拥塞，而不是去校正它们。例如通常不使用TCP的应用有：实时流多媒体（如因特网广播）、实时多媒体播放器和游戏、IP电话（VoIP）等等。任何不是很需要可靠性或者是想将功能减到最少的应用可以避免使用TCP。在很多情况下，当只需要多路复用应用服务时，用户数据报协议（UDP）可以代替TCP为应用提供服务。</p>
		</div>
<img src ="http://www.cnitblog.com/windforce/aggbug/8037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-03-24 00:08 <a href="http://www.cnitblog.com/windforce/articles/8037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP/IP协议 </title><link>http://www.cnitblog.com/windforce/articles/8036.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Thu, 23 Mar 2006 15:50:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/8036.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/8036.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/8036.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/8036.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/8036.html</trackback:ping><description><![CDATA[
		<p>
				<b>TCP/IP协议</b>，或称为<b>TCP/IP协议栈</b>，或互联网协议系列。</p>
		<div align="left">
				<p>
						<b>TCP/IP协议栈</b>
						<br />(按<i>TCP/IP参考模型</i>划分)<br /></p>
				<table cellspacing="3" border="0">
						<tbody>
								<tr>
										<td align="middle" bgcolor="#ffcc99">应用层</td>
										<td align="middle" bgcolor="#9999ff">FTP</td>
										<td align="middle" bgcolor="#9999ff">SMTP</td>
										<td align="middle" bgcolor="#9999ff">HTTP</td>
										<td align="middle" bgcolor="#9999ff">...</td>
								</tr>
								<tr>
										<td align="middle" bgcolor="#ffcc99">传输层</td>
										<td align="middle" bgcolor="#9999ff" colspan="2">TCP</td>
										<td align="middle" bgcolor="#9999ff" colspan="2">UDP</td>
								</tr>
								<tr>
										<td align="middle">网络层</td>
										<td align="middle" bgcolor="#9999ff" colspan="3">IP ICMP</td>
										<td align="middle" bgcolor="#9999ff">ARP</td>
								</tr>
								<tr>
										<td align="middle" bgcolor="#ffeebb" rowspan="2">链路层</td>
										<td align="middle" bgcolor="#eeeeee" rowspan="2">以太网</td>
										<td align="middle" bgcolor="#eeeeee" rowspan="2">令牌环</td>
										<td align="middle" bgcolor="#eeeeee" rowspan="2">FDDI</td>
										<td align="middle" bgcolor="#eeeeee" rowspan="2">...</td>
								</tr>
						</tbody>
				</table>
				<p>
						<br />包含了一系列构成互联网基础的网络协议。这些协议最早发源于美国国防部的DARPA互联网项目。TCP/IP字面上代表了两个协议:TCP传输控制协议和IP互联网协议。<br /><br />时间回放到1983年1月1日，在这天，互联网的前身Arpanet中，TCP/IP协议取代了旧的网络核心协议NCP(Network Core Protocol)，从而成为今天的互联网的基石。最早的的TCP/IP由Vinton Cerf和Robert Kahn两位开发，慢慢地通过竞争战胜了其它一些网络协议的方案，比如国际标准化组织ISO的OSI模型。TCP/IP的蓬勃发展发生在上世纪的90年代中期。当时一些重要而可靠的工具的出世，例如页面描述语言HTML和浏览器Mosaic，导致了互联网应用的飞速发展。</p>
				<p>随着互联网的发展，目前流行的IPv4协议(IP Version 4，IP版本四)已经接近它的功能上限。IPv4最致命的两个缺陷在与:</p>
				<p>地址只有32位，IP地址空间有限; <br />不支持服务等级(Quality of Service, Qos)的想法，无法管理带宽和优先级，故而不能很好的支持现今越来越多的实时的语音和视频应用。因此IPv6 (IP Version 6, IP版本六) 浮出海面，用以取代IPv4。 <br />TCP/IP成功的另一个因素在与对为数众多的低层协议的支持。这些低层协议对应与OSI模型 中的第一层(物理层)和第二层(数据链路层)。每层的所有协议几乎都有一半数量的支持TCP/IP，例如: 以太网(Ethernet)，令牌环(Token Ring)，光纤数据分布接口(FDDI)，端对端协议( <a href="http://www.net130.com/CMS/Pub/network/network_protocal/04314.htm" target="_blank">PPP</a>)，X.25，帧中继(Frame Relay)，ATM，Sonet, SDH等。</p>
				<p>
						<strong>TCP/IP协议栈组成</strong>
						<br />整个通信网络的任务，可以划分成不同的功能块，即抽象成所谓的 ” 层” 。用于互联网的协议可以比照TCP/IP参考模型进行分类。TCP/IP协议栈起始于第三层协议IP(互联网协议) 。所有这些协议都在相应的RFC文档中讨论及标准化。重要的协议在相应的RFC文档中均标记了状态: “必须“ (required) ，“推荐“ (recommended) ，“可选“ (elective) 。其它的协议还可能有“ 试验“(experimental) 或“ 历史“(historic) 的状态。</p>
				<p>
						<strong>必须协议<br /></strong>所有的TCP/IP应用都必须实现IP和ICMP。对于一个路由器(router) 而言，有这两个协议就可以运作了，虽然从应用的角度来看，这样一个路由器 意义不大。实际的路由器一般还需要运行许多“推荐“使用的协议，以及一些其它的协议。</p>
				<p>在几乎所有连接到互联网上的计算机上都存在的IPv4 协议出生在1981年，今天的版本和最早的版本并没有多少改变。升级版IPv6 的工作始于1995年，目的在与取代IPv4。ICMP 协议主要用于收集有关网络的信息查找错误等工作。</p>
				<p>
						<strong>推荐协议<br /></strong>每一个应用层(TCP/IP参考模型 的最高层) 一般都会使用到两个传输层协议之一: 面向连接的TCP传输控制协议和无连接的包传输的UDP用户数据报文协议 。 其它的一些推荐协议有:</p>
				<ul>
						<li>TELNET (Teletype over the Network, 网络电传) ，通过一个终端(terminal)登陆到网络(运行在TCP协议上)。 
</li>
						<li>FTP (File Transfer Protocol, 文件传输协议) ，由名知义(运行在TCP协议上) 。 
</li>
						<li>SMTP (Simple Mail Transfer Protocol，简单邮件传输协议) ，用来发送电子邮件(运行在TCP协议上) 。 
</li>
						<li>DNS (Domain Name Service，域名服务) ，用于完成地址查找，邮件转发等工作(运行在TCP和UDP协议上) 。 
</li>
						<li>ECHO (Echo Protocol, 回绕协议) ，用于查错及测量应答时间(运行在TCP和UDP协议上) 。 
</li>
						<li>NTP (Network Time Protocol，网络时间协议) ，用于网络同步(运行在UDP协议上) 。 
</li>
						<li>SNMP (Simple Network Management Protocol, 简单网络管理协议) ，用于网络信息的收集和网络管理。 
</li>
						<li>BOOTP (Boot Protocol，启动协议) ，应用于无盘设备(运行在UDP协议上)。 </li>
				</ul>
				<p>
						<strong>可选协议</strong>
						<br />最常用的一些有            </p>
				<ul>
						<li>动态配置IP地址的DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)， 
</li>
						<li>支撑万维网WWW的超文本传输协议HTTP， 
</li>
						<li>收邮件用的POP3 (Post Office Protocol, version 3, 邮局协议) ， 
</li>
						<li>用于加密安全登陆用的SSH (Secure Shell，用于替代安全性差的TELNET) ， 
</li>
						<li>用于动态解析以太网硬件地址的ARP (Address Resolution Protocol，地址解析协议) 。 </li>
				</ul>
				<p>
						<strong>参考文献<br /></strong>RFC 1180 - TCP/IP tutorial <br /></p>
		</div>
<img src ="http://www.cnitblog.com/windforce/aggbug/8036.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-03-23 23:50 <a href="http://www.cnitblog.com/windforce/articles/8036.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[原创]ROS2.9x，电信+网通双线接入策略路由+自动切换图文教程</title><link>http://www.cnitblog.com/windforce/articles/7697.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Thu, 16 Mar 2006 22:07:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/7697.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/7697.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/7697.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/7697.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/7697.html</trackback:ping><description><![CDATA[
		<span class="tpc_content">
				<font size="2">从开始学习ROS到现在也没有几天，在routerbbs里学到了不少东西，回想初学的时候四处找教程的日子，也很是有点不好过。。其实已经有很多人写具体教程了，包括2.9版本的，例如winxp2000的教程--我还是参考着他的教程写的备份脚本--只是没有图，不是很直观。来到routerbbs也不能只索取不付出不是，就算是对他们教程的图片补充也好。。。。下面开始<br />1、安装ROS<br />除了自己学习和测试用ROS外，最好还是单独用一台机器，相信这也不用多说，安装的时候要注意的是硬盘<font color="red">一定</font>要接在IDE0上面，并且作为主盘MASTER，光驱随便，很多安装之后不能正常启动的都是这个问题、用安装光盘启动后，如图1<br /><b>图1</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_03f5477e519d1af.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_03f5477e519d1af.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />选择 i 进入安装界面选择需要安装的package，图2 <br /><b>图2</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_6ccfa1499ce47e3.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_6ccfa1499ce47e3.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />选择完后，再按i安装，y确定，再按n不保存旧配置。最后回车重新启动，这时进入ROS是未注册的版本，如图4<br /><b>图4</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_b9d037fafa62c95.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_b9d037fafa62c95.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />用光驱启动，在启动菜单按c破解，图5 <br /><b>图5</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_70b01f85dbc5c0d.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_70b01f85dbc5c0d.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />破解之后进入已经没有了未注册提示。。。见图6<br /><b>图3</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_e5adbbde2039a49.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_e5adbbde2039a49.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />2、服务端配置<br />/interface pri   能显示出你现在可用的网卡。如图6 <br /><b>图6</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_a489ab2f43188ac.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_a489ab2f43188ac.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />/ip address <br />add address=192.168.1.1/24 interface=ether1   <br />设置ether1为内网IP，其中192.168.1.1/24添自己的内网IP ，设置成功没有提示，可以用pri查看<br />见图7 <br /><b>图7</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_125b6717961160c.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_125b6717961160c.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />3、winbox配置（所有配置都在这里进行）<br />在局域网其他机器IE浏览器192.168.1.1 进入WEBBOX，左边可以下载WINBOX，当然如果你已经有WINBOX可以省略这步。打开WINBOX输入IP和用户名连接（图8） <br /><b>图8</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_b4bf8d07a583d14.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_b4bf8d07a583d14.jpg" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />进入配置界面<br />(1)点左侧INTERFACE，双击ether1将name改为lan，同样将另两个改为cnc和tel。图9 <br /><b>图9</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_7c4a59c9489fb4b.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_7c4a59c9489fb4b.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />(2)左侧IP-&gt;ADDRESS ,+号,分别设置CNC和TEL的IP地址,添网通和电信给的IP/子网掩码(不要和我的一样...),红叉部分是自动添加的.图10<br /><b>图10</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_518b0962cc82599.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_518b0962cc82599.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />(3)IP-&gt;ROUTE,+号添加默认的网关,默认网通就添网通网关，默认电信就添电信的网关，这里默认电信.<br />如图11,正常下黑圈处为AS,黄圈出为TEL.comment设注释为tel<br /><b>图11</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_c6a5b13d8262d2a.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_c6a5b13d8262d2a.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />(4)IP-&gt;FIREWALL,NAT选项卡,+号添加chain:srcnat,src.addr:192.168.1.0/24,ACTION选项卡里为masquerade.OK,现在可以通过电信上网了.图12<br /><b>图12</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_23ddd4d3e2b45a4.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_23ddd4d3e2b45a4.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />(5)</font>
				<a href="ftp://admin:@192.168.1.1/" target="_blank">
						<font size="2">FTP://admin:@192.168.1.1</font>
				</a>
				<font size="2">上传路由表文件cnc.rsc,如图13<br /><b>图13</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_6358477a4a06c86.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_6358477a4a06c86.jpg" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />在WINBOX中，NEW TERMINAL,输入import cnc完成.如图14 <br /><b>图14</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_4a9cd9dd4ef6971.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_4a9cd9dd4ef6971.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />现在已经可以电信网通自动切换了.<br />(6)只是切换也不太安全,一定要配制一下防火墙么，同5一样,上传防火墙的RSC文件到192.168.1.1,在NEW TERMINAL里执行import firewall,整体和第5步相近.<br />(7)配置的差不多了,该改管理员账号了,左侧USERS,双击ADMIN改个名字和右下脚的password,如果不需要远程修改ROS的话,可以设定访问IP,192.168.1.0/24之类的~~~<br /><b>图16</b><br /><img onclick="if(this.width&gt;screen.width-461) window.open('../../../attachment/Mon_0602/59_22957_546161ea61a98ec.jpg');" src="http://www.routerbbs.com/attachment/Mon_0602/59_22957_546161ea61a98ec.jpg" width="564" onload="if(this.width&gt;screen.width-460)this.width=screen.width-460;" border="0" /><br />至此,基本OK了.<br />第一次写教程用了2个多小时呵呵..有什么不完整的地方欢迎大家补充.<br />本文完全是面对新手的,还希望个位大人砖头不要扔的太狠~</font>
				<br />
		</span>
<img src ="http://www.cnitblog.com/windforce/aggbug/7697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-03-17 06:07 <a href="http://www.cnitblog.com/windforce/articles/7697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>子网掩码及主机段的算法[转载自中国路由论坛]</title><link>http://www.cnitblog.com/windforce/articles/7078.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Thu, 02 Mar 2006 07:01:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/7078.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/7078.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/7078.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/7078.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/7078.html</trackback:ping><description><![CDATA[<FONT color=#000000><SPAN class=tpc_title><FONT size=2>1． A类IP地址 <BR><BR>一个A类IP地址由1字节的网络地址和3字节主机地址组成，网络地址的最高位必须是“0”， 地址范围从1.0.0.0 到126.0.0.0。可用的A类网络有126个，每个网络能容纳1亿多个主机。 <BR><BR>2． B类IP地址 <BR><BR>一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成，网络地址的最高位必须是“10”，地址范围从128.0.0.0到191.255.255.255。可用的B类网络有16382个，每个网络能容纳6万多个主机 。 <BR><BR>3． C类IP地址 <BR><BR>一个C类IP地址由3字节的网络地址和1字节的主机地址组成，网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255。C类网络可达209万余个，每个网络能容纳254个主机。 <BR><BR>4． D类地址用于多点广播（Multicast）。 <BR><BR>D类IP地址第一个字节以“lll0”开始，它是一个专门保留的地址。它并不指向特定的网络，目前这一类地址被用在多点广播（Multicast）中。多点广播地址用来一次寻址一组计算机，它标识共享同一协议的一组计算机。 <BR><BR>5． E类IP地址 <BR><BR>以“llll0”开始，为将来使用保留。 <BR>全零（“0．0．0．0”）地址对应于当前主机。全“1”的IP地址（“255．255．255．255”）是当前子网的广播地址。 <BR><BR><FONT color=#0000ff>在IP地址3种主要类型里，各保留了3个区域作为私有地址，其地址范围如下： <BR><BR>A类地址：10.0.0.0～10.255.255.255 <BR><BR>B类地址：172.16.0.0～172.31.255.255 <BR><BR>C类地址：192.168.0.0～192.168.255.255</FONT></FONT><BR><BR><STRONG>子网掩码及主机段的算法</STRONG></SPAN><BR><BR></FONT><FONT color=#000000><SPAN class=tpc_content><FONT size=2>作者：浪子 来源：InterNet 加入时间：2004-11-23 <BR>类范围:IP地址常采用点分十进制表示方法:X.Y.Y.Y,在这里,X=1--126时称为A类地址;X=128--191时成为B类地址;X=192--223时称为C类地址;如10.202.52.130,因为X=10在1--126范围内所以称为A类地址,默认子网掩码:A类为255.0.0.0;B类为255.255.0.0;C类为255.255.255.0<BR><BR>当我们要划分子网用到子网掩码M时,类子网掩码的格式应为:A类为255.M.0.0;B类为255.255.M.0;C类为255.255.255.M. M是相应的子网掩码,如255.255.255.240<BR><BR>十进制计算基数:256.等一下我们所有的十进制计算都要用256来进行<BR><BR>几个公式变量的说明:<BR><BR>Subnet_block:可分配子网块的大小,指在某一子网掩码下的子网的块数.<BR><BR>Subnet_num:实际可分配子网数,指可分配子网块中要剔除首,尾两块,这是某一子网掩码下可分配的实际子网数量,它等于Subnet_block-2<BR><BR>IP_block:每个子网可分配的IP地址块大小<BR><BR>IP_num:每个子网实际可分配的IP地址数,因为每个子网的首,尾IP地址必须保留(一个为网络地址,一个为广播地址),所以它等于IP_block-2.IP_num也用于计算主机段<BR><BR>M:子网掩码(net maask)<BR><BR>他们之间的公式如下:<BR><BR>M=256-IP_block<BR><BR>IP_block=256/Subnet_block,反之Subnet_block=256/IP_block<BR><BR>IP_num=IP_block-2<BR><BR>Subnet_num=Subnet_block-2<BR><BR>2的冥数:要熟练掌握2^8(256)以内的2的冥数的十进制数,如128=2^7,64=2^6....,这可使我们立即推算出Subnet_block和IP_block数.<BR><BR>现在我们举一些例子:<BR><BR>一,已知所需子网数12,求实际子网数<BR><BR>解:这里实际子网数指Subnet_num,由于12最接近2的冥数为16(2^4),既Subnet_block=16,那么Subnet_num=16-2=14,故实际子网数为14.<BR><BR>二,已知一个B类子网每个子网主机数要达到60X255(约相当于X.Y.0.1--X.Y.59.254的数量)个,求子网掩码<BR><BR>解:1. 60接近2的冥数为64(2^6),即IP_block=64<BR><BR>2. 子网掩码M=256-IP_block=256-64=192<BR><BR>3. 子网掩码格式B类是:255.255.M.0,所以子网掩码为:255.255.192.0<BR><BR>三.如果所需子网数为7,求子网掩码<BR><BR>解:1. 7最接近2的冥为8,但8个Subnet_block因为要保留首,尾2个子网块,即8-2=6&lt;7,并不能达到所需子网数,所以应该取2的冥为16,即Subnet_block=16<BR><BR>2. IP_block=256/Subnet_block=256/16=16<BR><BR>3. 子网掩码M=256-IP_block=256-16=240<BR><BR>四.已知网络地址为211.134.12.0,要有4个子网,求子网掩码及主机段<BR><BR>解:1. 211.Y.Y.Y是一个C类网,子网掩码格式为255.255.255.M<BR><BR>2. 4个子网,4接近2的冥是8(2^3),所以Subnet_block=8,Subnet_num=8-2=6<BR><BR>3. IP_block=256/Subnet_block=256/8=32<BR><BR>4. 子网掩码M=256-IP_block=256-32=224<BR><BR>5. 所以子网掩码表示为255.255.255.224<BR><BR>6. 因为子网块中的可分配主机又有首,尾两个不能使用,所以可分配6个子网块(Subnet_num),每块32个可分配主机块(IP_block) 即:32-63,64-95,96-127,128-159,160-191,192-223<BR><BR>首块(0-31)和尾块(224-255)不能使用<BR><BR>7. 每个子网块中的可分配主机块又有首,尾两个不能使用(一个是子网网络地址,一个是子网广播地址),所以主机段分别为:33-62,65-94,97-126,129-158,161-190,193-222<BR><BR>8. 所以子网掩码为255.255.255.224 &nbsp; 主机段共6段为:211.134.12.33--211.134.12.62;<BR><BR>211.134.12.65--311.134.12.94;211.134.12.97--211.134.12.126;211.134.12.129--211.134.12.158;<BR><BR>211.134.12.161--211.134.12.190;211.134.12.193--211.134.12.222 &nbsp; 可以任选其中的4段作为4个子网.<BR><BR>介绍子网掩码的两种简便算法<BR><BR><BR>IP地址是32位的二进制数值，用于在TCP/IP通讯协议中标记每台计算机的地址。通常我们使用点式十进制来表示，如192.168.0.5等等。<BR>每个IP地址又可分为两部分。即网络号部分和主机号部分：网络号表示其所属的网络段编号，主机号则表示该网段中该主机的地址编号。按照网络规模的大小，IP地址可以分为A、B、C、D、E五类，其中A、B、C类是三种主要的类型地址，D类专供多目传送用的多目地址，E类用于扩展备用地址。A、B、C三类IP地址有效范围如下表：<BR><BR>类别 网络号 /占位数 主机号 /占位数 用途<BR>A 1～126 / 8 0～255 0～255 1～254 / 24 国家级<BR>B 128～191 0～255 / 16 0～255 1～254 / 16 跨过组织<BR>C 192～223 0～255 0～255 / 24 1～254 / 8 企业组织<BR><BR>随着互连网应用的不断扩大，原先的IPv4的弊端也逐渐暴露出来，即网络号占位太多，而主机号位太少，所以其能提供的主机地址也越来越稀缺，目前除了使用NAT在企业内部利用保留地址自行分配以外，通常都对一个高类别的IP地址进行再划分，以形成多个子网，提供给不同规模的用户群使用。<BR><BR>这里主要是为了在网络分段情况下有效地利用IP地址，通过对主机号的高位部分取作为子网号，从通常的网络位界限中扩展或压缩子网掩码，用来创建某类地址的更多子网。但创建更多的子网时，在每个子网上的可用主机地址数目会比原先减少。<BR>子网掩码是标志两个IP地址是否同属于一个子网的，也是32位二进制地址，其每一个为1代表该位是网络位，为0代表主机位。它和IP地址一样也是使用点式十进制来表示的。如果两个IP地址在子网掩码的按位与的计算下所得结果相同，即表明它们共属于同一子网中。<BR><BR>在计算子网掩码时，我们要注意IP地址中的保留地址，即“ 0”地址和广播地址，它们是指主机地址或网络地址全为“ 0”或“ 1”时的IP地址，它们代表着本网络地址和广播地址，一般是不能被计算在内的。<BR><BR>下面就来以实例来说明子网掩码的算法：<BR><BR>对于无须再划分成子网的IP地址来说，其子网掩码非常简单，即按照其定义即可写出：如某B类IP地址为 10.12.3.0，无须再分割子网，则该IP地址的子网掩码为255.255.0.0。如果它是一个C类地址，则其子网掩码为 255.255.255.0。其它类推，不再详述。下面我们关键要介绍的是一个IP地址，还需要将其高位主机位再作为划分出的子网网络号，剩下的是每个子网的主机号，这时该如何进行每个子网的掩码计算。<BR><BR>一、利用子网数来计算<BR><BR>在求子网掩码之前必须先搞清楚要划分的子网数目，以及每个子网内的所需主机数目。<BR>1)将子网数目转化为二进制来表示<BR>2)取得该二进制的位数，为 N<BR>3)取得该IP地址的类子网掩码，将其主机地址部分的的前N位置 1 即得出该IP地址划分子网的子网掩码。<BR>如欲将B类IP地址168.195.0.0划分成27个子网：3)将B类地址的子网掩码255.255.0.0的主机地址前5位置 1，得到 255.255.248.0<BR>即为划分成 27个子网的B类IP地址 168.195.0.0的子网掩码。<BR>1)27=11011<BR>2)该二进制为五位数，N = 5<BR><BR><BR><BR><BR>二、利用主机数来计算<BR><BR>1)将主机数目转化为二进制来表示<BR>2)如果主机数小于或等于254（注意去掉保留的两个IP地址），则取得该主机的二进制位数，为 N，这里肯定 N&lt;8。如果大于254，则 N&gt;8，这就是说主机地址将占据不止8位。<BR>3)使用255.255.255.255来将该类IP地址的主机地址位数全部置1，然后从后向前的将N位全部置为 0，即为子网掩码值。<BR>如欲将B类IP地址168.195.0.0划分成若干子网，每个子网内有主机700台：<BR>1) 700=1010111100<BR>2)该二进制为十位数，N = 10<BR>3)将该B类地址的子网掩码255.255.0.0的主机地址全部置 1，得到255.255.255.255<BR>然后再从后向前将后 10位置0,即为： 11111111.11111111.11111100.00000000<BR>即255.255.252.0。这就是该欲划分成主机为700台的B类IP地址 168.195.0.0的子网掩码。<BR>下面列出各类IP地址所能划分出的所有子网，其划分后的主机和子网占位数，以及主机和子网的（最大）数目，注意要去掉保留的IP地址(即划分后有主机位或子网位全为“0”或全为“1”的)：<BR><BR>A类IP地址：<BR><BR>子网位 /主机位 子网掩码 子网最大数 /主机最大数<BR>2/22 255.192.0.0 2/4194302 <BR>3/21 255.224.0.0 6/2097150 <BR>4/20 255.240.0.0 14/1048574 <BR>5/19 255.248.0.0 30/524286 <BR>6/18 255.252.0.0 62/262142 <BR>7/17 255.254.0.0 126/131070 <BR>8/16 255.255.0.0 254/65536 <BR>9/15 255.255.128.0 510/32766 <BR>10/14 255.255.192.0 1022/16382 <BR>11/13 255.255.224.0 2046/8190 <BR>12/12 255.255.240.0 4094/4094 <BR>13/11 255.255.248.0 8190/2046 <BR>14/10 255.255.252.0 16382/1022 <BR>15/9 255.255.254.0 32766/510 <BR>16/8 255.255.255.0 65536/254 <BR>17/7 255.255.255.128 131070/126 <BR>18/6 255.255.255.192 262142/62 <BR>19/5 255.255.255.224 524286/30 <BR>20/4 255.255.255.240 1048574/14 <BR>21/3 255.255.255.248 2097150/6 <BR>22/2 255.255.255.252 4194302/2 <BR><BR>B类IP地址：<BR><BR>子网位 /主机位 子网掩码 子网最大数 /主机最大数<BR>2/14 255.255.192.0 2/16382 <BR>3/13 255.255.224.0 6/8190 <BR>4/12 255.255.240.0 14/4094 <BR>5/11 255.255.248.0 30/2046 <BR>6/10 255.255.252.0 62/1022 <BR>7/9 255.255.254.0 126/510 <BR>8/8 255.255.255.0 254/254 <BR>9/7 255.255.255.128 510/126 <BR>10/6 255.255.255.192 1022/62 <BR>11/5 255.255.255.224 2046/30 <BR>12/4 255.255.255.240 4094/14 <BR>13/3 255.255.255.248 8190/6 <BR>14/2 255.255.255.252 16382/2 <BR><BR>C类IP地址：<BR><BR>子网位 /主机位 子网掩码 子网最大数 /主机最大数<BR>2/6 255.255.255.192 2/62 <BR>3/5 255.255.255.224 6/30 <BR>4/4 255.255.255.240 14/14 <BR>5/3 255.255.255.248 30/6 <BR>6/2 255.255.255.252 62/2</FONT></SPAN><BR></FONT><img src ="http://www.cnitblog.com/windforce/aggbug/7078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-03-02 15:01 <a href="http://www.cnitblog.com/windforce/articles/7078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小议TCP的MSS以及MTU[转载自20CN]</title><link>http://www.cnitblog.com/windforce/articles/7041.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Tue, 28 Feb 2006 15:19:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/7041.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/7041.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/7041.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/7041.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/7041.html</trackback:ping><description><![CDATA[小议TCP的MSS以及MTU <BR><BR><BR>[前言]<BR>漫漫51长假，没有好的去处，只能每日上网消遣，某日逛到NBO灌水，见一帖<BR>曰：无法通过2514路由器上MSN（出口为ADSL线路，通过PPPoE）<BR>吾心想，ADSL---PPPoE，那肯定就是MTU之问题。回帖告之：改PC之MTU。<BR><BR>过数日，又逛到NBO，又见这帖，后有人回曰：ip tcp adjust-mss 1452<BR>后帖主又跟：问题解决。<BR><BR>吾纳闷之，后百思而得其解，So决定将自己所得写出来，分享给大家。<BR><BR>[背景知识]<BR>MTU: Maxitum Transmission Unit 最大传输单元<BR><BR>MSS: Maxitum Segment Size 最大分段大小（偶是直译，翻译的不好，不要打<BR>俺PP）<BR><BR>PPPoE: PPP Over Ethernet（在以太网上承载PPP协议）<BR><BR>[分析过程]<BR>先说说这MTU最大传输单元，这个最大传输单元实际上和链路层协议有着密切<BR>的关系，让我们先仔细回忆一下EthernetII帧的结构<BR>DMAC+SMAC+Type+Data+CRC<BR>由于以太网传输电气方面的限制，每个以太网帧都有最小的大小64bytes<BR>最大不能超过1518bytes，对于小于或者大于这个限制的以太网帧我们都可以<BR>视之为错误的数据帧，一般的以太网转发设备会丢弃这些数据帧。<BR>（注：小于64Bytes的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰<BR>或者坏的以太网接口产生的，对于大于1518Bytes的数据帧我们一般把它叫做<BR>Giant帧，这种一般是由于线路干扰或者坏的以太网口产生）<BR><BR>由于以太网EthernetII最大的数据帧是1518Bytes这样，刨去以太网帧的帧头<BR>（DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域<BR>2bytes）14Bytes和帧尾CRC校验部分4Bytes（这个部门有时候大家也把它叫做<BR>FCS），那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes<BR>这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方，因为网络<BR>层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好<BR>比一个盒子没法装下一大块面包，我们需要把面包切成片，装在多个盒子里面一<BR>样的道理。<BR><BR>当两台远程PC互联的时候，它们的数据需要穿过很多的路由器和各种各样的网络<BR>媒介才能到达对端，网络中不同媒介的MTU各不相同，就好比一长段的水管，由<BR>不同粗细的水管组成（MTU不同 :)）通过这段水管最大水量就要由中间最细的水管决定。<BR><BR>对于网络层的上层协议而言（我们以TCP/IP协议族为例）它们对水管粗细不在意<BR>它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据<BR>包的大小，并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是<BR>降低了传输性能，本来一次可以搞定的事情，分成多次搞定，所以在网络层更高<BR>一层（就是传输层）的实现中往往会对此加以注意！有些高层因为某些原因就会<BR>要求我这个面包不能切片，我要完整地面包，所以会在IP数据包包头里面加上一<BR>个标签：DF（Donot Fragment）。这样当这个IP数据包在一大段网络（水管里<BR>面）传输的时候，如果遇到MTU小于IP数据包的情况，转发设备就会根据要求<BR>丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上<BR>的问题，不过幸运的是大部分网络链路都是MTU1500或者大于1500。<BR><BR>对于UDP协议而言，这个协议本身是无连接的协议，对数据包的到达顺序以及是<BR>否正确到达不甚关心，所以一般UDP应用对分片没有特殊要求。<BR><BR>对于TCP协议而言就不一样了，这个协议是面向连接的协议，对于TCP协议而言<BR>它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对<BR>分片有要求---不能分片（DF）。<BR><BR>花开两朵，各表一枝，说完MTU的故事我们该讲讲今天的第二个猪脚---PPPoE<BR>所谓PPPoE就是在以太网上面跑PPP协议，有人奇怪了，PPP协议和Ethernet不<BR>都是链路层协议吗？怎么一个链路层跑到另外一个链路层上面去了，难道升级<BR>成网络层协议了不成。其实这是个误区：就是某层协议只能承载更上一层协议。<BR>为什么会产生这种奇怪的需求呢？这是因为随着宽带接入（这种宽带接入一般<BR>为Cable Modem或者xDSL或者以太网的接入）由于以太网缺乏认证计费机制<BR>而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的，所以就<BR>出了这么一个怪胎：PPPoE。（有关PPPoE的详细介绍参见V大以及本站其他成<BR>员的一些介绍文章，我就不啰里啰唆的了）<BR><BR>PPPoE带来了好处，也带来了一些坏处，比如：二次封装耗费资源，降低了传输<BR>效能等等，这些坏处俺也不多说了，最大的坏处就是PPPoE导致MTU变小了<BR>以太网的MTU是1500，再减去PPP的包头包尾的开销（8Bytes），就变成<BR>1492。<BR><BR>如果两台主机之间的某段网络使用了PPPoE那么就会导致某些不能分片的应用<BR>无法通讯。<BR><BR>这个时候就需要我们调整一下主机的MTU，通过降低主机的MTU，这样我们<BR>就能够顺利地进行通讯了。<BR><BR>当然对于TCP应用而言还有另外的解决方案。<BR>马上请出今天第三位猪脚：MSS。<BR>MSS最大传输大小的缩写，是TCP协议里面的一个概念。<BR>MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能<BR>TCP协议在建立连接的时候通常要协商双方的MSS值，这个值TCP协议在实现的<BR>时候往往用MTU值代替（需要减去IP数据包包头的大小20Bytes和TCP数据段的<BR>包头20Bytes）所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小<BR>值确定为这次连接的最大MSS值。<BR><BR>介绍完这三位猪脚s<BR>我们回过头来看前言里面的那个问题，我们试想一下，如果我们在中间路由器上<BR>把每次TCP连接的最大MSS进行调整这样使得通过PPPoE链路的最大MSS值加上<BR>数据包头包尾不会超过PPPoE的MTU大小1492这样就不会造成无法通讯的问题<BR><BR>所以上面的问题可以通过ip tcp adjust-mss 1452来解决。<BR><BR>当然问题也可以通过修改PC机的MTU来解决。<BR><BR>[后记]<BR>Cisco在IOS 12.2(4)T及以后的版本支持修改MSS大小的特性<BR><BR>Cisco的TCP Adjust MSS Feature：<BR><BR>The TCP MSS Adjustment feature enables the configuration of the <BR>maximum segment size (MSS) for transient packets that traverse a router, <BR>specifically TCP segments in the SYN bit set, when Point to Point Protocol <BR>over Ethernet (PPPoE) is being used in the network. PPPoE truncates the <BR>Ethernet maximum transmission unit (MTU) 1492, and if the effective MTU <BR>on the hosts (PCs) is not changed, the router in between the host and the <BR>server can terminate the TCP sessions. The ip tcp adjust-mss command <BR>specifies the MSS value on the intermediate router of the SYN packets to <BR>avoid truncation. <BR>俺太懒了就不翻译了。。自己慢慢看<BR><img src ="http://www.cnitblog.com/windforce/aggbug/7041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-02-28 23:19 <a href="http://www.cnitblog.com/windforce/articles/7041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅谈回流[转载自天下网盟]</title><link>http://www.cnitblog.com/windforce/articles/7040.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Tue, 28 Feb 2006 15:18:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/7040.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/7040.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/7040.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/7040.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/7040.html</trackback:ping><description><![CDATA[&nbsp;浅谈回流----作者漂流瓶<BR>
<P>“回流”，光这个名词我听说也没多久的，不知是哪里给的这么一个雅号。<BR>以前知道在映射上，有这么个事情。但一直以来也没个名称，也不好简单直观的描绘，现在总算有个俗称了，虽然只有八成的贴切，也是好的</P>
<P>回流是什么？最简单的一个实例：<BR>网吧内网一台主机192.168.0.2建了个WEB服务站点端口80，然后在网关(其内网地址是192.168.0.1、公网地址为218.4.218.4)上映射80端口到192.168.0.2的80端口，这样INTERNET上就能以<A href="http://218.4.218.4/" target=_blank><FONT color=#000000>http://218.4.218.4:80</FONT></A>的地址访问到192.168.0.2的WEB站点了。<BR>然后出现了个问题，在同网吧的另一台电脑192.168.0.3上，键入<A href="http://218.4.218.4/" target=_blank><FONT color=#000000>http://218.4.218.4:80</FONT></A>，却无法访问该WEB站点。<BR>就这个现象，我们就称之为“不支持回流”了，这里指的是网关上的映射方式不支持回流，所以说“回流”一说，是针对映射方式而言的。</P>
<P>现在我们来看常规情况下，是为什么会发生这种情况的<BR>我以前对iptables特别感兴趣的时候，曾对这个问题非常迷惑不解，直到去年为了考试，学习网络基础的时候才搞明白这个事情</P>
<P>过程如下：<BR>192.168.0.3要请求访问218.4.218.4的80端口，根据它掌握的路由表，它本身是不知道电脑218.4.218.4在哪里的，所以把将这个数据包发送给它的默认路由，即电脑192.168.0.1。<BR>注意：这个数据包的源地址是192.168.0.3、源端口假设是1025、目标地址是218.4.218.4、目标端口是80、SYN标志位为1、这是建立TCP连接的第一次握手。</P>
<P>如果“把目标地址为218.4.218.4的数据包发给了192.168.0.1”你听起来觉得有点矛盾，那么我解释一下：其实这个数据包的目标IP地址是218.4.218.4，目标MAC地址却是192.168.0.1的</P>
<P><BR>电脑192.168.0.1接收到了这份数据包(因为它的身份是路由器，所以允许接收和转发目标地址不是自已、MAC地址却是自已接口MAC地址的数据包)，它分析这个数据包的目标地址，发现这个数据包是需要中转到电脑192.168.0.2:80去的，于是它把这个数据包转发给了电脑192.168.0.2:80。<BR>注意：这个数据包的源地址是192.168.0.3、源端口是1025、目标地址为192.168.0.2、目标端口为80、SYN标志位为1。我们要注意这个数据包在转发后发生了变化了，即目标地址变了。<BR>电脑192.168.0.2顺利接到了数据包，它马上作出回应，发送一个数据包给电脑192.168.0.3。<BR>注意：这个数据包的源地址是192.168.0.2、源端口是80、目标地址192.168.0.3、目标端口为1025、SYN标志位为1、ACK标志位为1、这是建立TCP连接的第二次握手。<BR>电脑192.168.0.3顺利接到了数据包，然而它发现这是一个来自192.168.0.2:80的回应，因为ACK标志位值为1摆在那里呢。它想不起来什么时候给192.168.0.2:80这个目标对象发送过SYN请求，它认为这是一个错误的数据包，于是决定把这个数据包丢弃。然后继续等待218.4.218.4:80的回应，一直等到超时。<BR>而电脑192.168.0.2这边，它等192.168.0.3:1025的第三次握手请求包发送过来，以便建立一个TCP的连接。同样也没有结果，一直等到超时。三次握手在规定的时间内没有完成，访问宣布流产了。</P>
<P><BR>那么怎么样才能正常访问呢？也就是说怎么样形成“回流”呢？<BR>玄机在于电脑192.168.0.1把第一次握手的那个数据包在转发时，不仅要修改目标地址和端口，也要修改源地址和端口，我们来看一下情况会有什么不同：<BR>电脑192.168.0.1接收到了这份数据包(因为它的身份是路由器，所以允许接收和转发目标IP地址不是自已、MAC地址却是自已接口MAC地址的数据包)，它分析这个数据包的目标地址，发现这个数据包是需要中转到电脑192.168.0.2:80去的，于是它把这个数据包通过自已的5201端口转发给了电脑192.168.0.2:80，并在内存里面记录下来了，192.168.0.1:5201已定位给了192.168.0.3:1025。<BR>注意：这个数据包的源地址是192.168.0.1、源端口是5201、目标地址为192.168.0.2、目标端口为80、SYN标志位为1。<BR>电脑192.168.0.2顺利接到了数据包，它马上作出回应，发送一个数据包给电脑192.168.0.1。<BR>注意：这个数据包的源地址是192.168.0.2、源端口是80、目标地址192.168.0.1、目标端口为5201、SYN标志位为1、ACK标志位为1、这是建立TCP连接的第二次握手。<BR>电脑192.168.0.1顺利接到了数据包，检查内存记录发现，这个数据包真正的收货人是192.168.0.3:1025，于是它把这个数据包转发给192.168.0.3。<BR>注意：这个数据包的的源地址是218.4.218.4、源端口为80、目标地址为192.168.0.3、目标端口为1025。我们要注意这个数据包在转发后发生变化了，即源地址变了。这很重要！为什么会变，因为在它心目当中，192.168.0.2:80早已定位给了218.4.218.4:80，映射规则使然。<BR>电脑192.168.0.3顺利接到了数据包，发现期待已久的218.4.218.4:80终于有了回音，它兴奋不已的发出第三次的握手请求。<BR>注意：这个数据包的源地址是192.168.0.3、源端口是1025、目标地址是218.4.218.4、目标端口是80、ACK标志位为1、这是建立TCP连接的第三次握手。<BR>跟前面的数据包一样，这个数据包会从192.168.0.1那里中转给192.168.0.2</P>
<P>以后192.168.0.2:80和192.168.0.3:1025之间来往通信的数据包，全部由192.168.0.1负责中转，“回流”构成了</P>
<P>具体在软件上的实现，不是我的事了<BR>现在的“回流”应用常见于私服<BR>Linux里的iptables可以增加一条规则来实现对回流的支持<BR>很多硬件路由器不用设置就内建支持的<BR>Win2K的ICS/NAT内建的映射是标准DNAT，同样是不支持的、除非用第三方工具<BR>CC、RouterOS听说是支持的，不懂，没空去整过<BR>SW现在还有好多人在问，好像是没辄，我不知道SW是不是能跟iptables一样灵活<BR>BBIagent以前的版本没戏、现在不知<BR>。。。。。(此处省略五千字)</P>
<P><BR>不知大家明白了没有，反正我倒是有点糊涂了，继续睡觉去。。。<BR>睡眠不足，乱写了一气，前面也许写错许多，而且老实说最后一段是写的没有耐心了<BR>写得头痛，以后有空再作修改补充罢</P><BR><img src ="http://www.cnitblog.com/windforce/aggbug/7040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-02-28 23:18 <a href="http://www.cnitblog.com/windforce/articles/7040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cisco路由技术基础知识详解[收集]</title><link>http://www.cnitblog.com/windforce/articles/6962.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Sun, 26 Feb 2006 00:25:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/6962.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/6962.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/6962.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/6962.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/6962.html</trackback:ping><description><![CDATA[&lt;一&gt; <FONT style="BACKGROUND-COLOR: #ffffff" color=#0000ff>路由器</FONT> <BR><BR>　　最简单的网络可以想象成单线的总线，各个计算机可以通过向总线发送分组以互相通信。但随着网络中的计算机数目增长，这就很不可行了，会产 生许多问题： <BR><BR>&nbsp; &nbsp;1、带宽资源耗尽。 <BR>&nbsp; &nbsp;2、每台计算机都浪费许多时间处理无关的广播数据。 <BR>&nbsp; &nbsp;3、网络变得无法管理，任何错误都可能导致整个网络瘫痪。 <BR>&nbsp; &nbsp;4、每台计算机都可以监听到其他计算机的通信。 <BR><BR>　　把网络分段可以解决这些问题，但同时你必须提供一种机制使不同网段的计算机可以互相通信，这通常涉及到在一些ISO网络协议层选择性地在网段间传送数据，我们来看一下网络协议层和路由器的位置。 <BR><BR>　　我们可以看到，路由器位于网络层。本文假定网络层协议为IPv4，因为这是最流行的协议，其中涉及的概念与其他网络层协议是类似的。 <BR><BR>&nbsp; &nbsp;<FONT color=#0000ff>一、路由与桥接</FONT> <BR><BR>　　路由相对于2层的桥接/交换是高层的概念，不涉及网络的物理细节。在可路由的网络中，每台主机都有同样的网络层地址格式（如IP地址），而无论它是运行在以太网、令牌环、FDDI还是广域网。网络层地址通常由两部分构成：网络地址和主机地址。 <BR><BR>　　网桥只能连接数据链路层相同（或类似）的网络，路由器则不同，它可以连接任意两种网络，只要主机使用的是相同的网络层协议。 <BR><BR>　　<FONT color=#0000ff>路由器 &lt;二&gt;</FONT> <BR><BR>&nbsp; &nbsp;<FONT color=#0000ff>二、连接网络层与数据链路层</FONT> <BR><BR><BR>　　网络层下面是数据链路层，为了它们可以互通，需要“粘合”协议。ARP（地址解析协议）用于把网络层(3层)地址映射到数据链路层(2层)地址，RARP(反向地址解析协议)则反之。 <BR><BR>　　虽然ARP的定义与网络层协议无关，但它通常用于解析IP地址；最常见的数据链路层是以太网。因此下面的ARP和RARP的例子基于IP和以太网，但要注意这些概念对其他协议也是一样的。 <BR><BR>&nbsp; &nbsp;<FONT color=#0000ff>1、地址解析协议</FONT> <BR><BR>　　网络层地址是由网络管理员定义的抽象映射，它不去关心下层是哪种数据链路层协议。然而，网络接口只能根据2层地址来互相通信，2层地址通过ARP从3层地址得到。 <BR><BR>　　并不是发送每个数据包都需要进行ARP请求，回应被缓存在本地的ARP表中，这样就减少了网络中的ARP包。ARP的维护比较容易，是一个比较简单的协议。 <BR><BR>&nbsp; &nbsp;2、简介 <BR><BR>　　如果接口A想给接口B发送数据，并且A只知道B的IP地址，它必须首先查找B的物理地址，它发送一个含有B的IP地址的ARP广播请求B的物理地址，接口B收到该广播后，向A回应其物理地址。 <BR><BR>　　注意，虽然所有接口都收到了信息，但只有B回应该请求，这保证了回应的正确且避免了过期的信息。要注意的是，当A和B不在同一网段时，A只向下一跳的路由器发送ARP请求，而不是直接向B发送。 接收到ARP分组后处理，注意发送者的对被存到接收ARP请求的主机的本地ARP表中，一般A想与B通信时，B可能也需要与A通信。 &nbsp;<BR><BR>&nbsp; &nbsp;<FONT color=#0000ff>3、IP地址冲突</FONT> <BR><BR>　　ARP产生的问题中最常见的是IP地址的冲突，这是由于两个不同的主机IP地址相同产生的，在任何互联的网络中，IP地址必须是唯一的。这时会收到两个ARP回应，分别指出了不同的硬件地址，这是严重的错误，没有简单的解决办法。 <BR><BR>　　为了避免出现这类错误，当接口A初试化时，它发送一个含有其IP地址的ARP请求，如果没有收到回应，A就假定该IP地址没有被使用。我们假定接口B已经使用了该IP地址，那么B就发送一个ARP回应，A就可以知道该IP地址已被使用，它就不能再使用该IP地址，而是返回错误信息。这样又产生一个问题，假设主机C含有该IP地址的映射，是映射到B的硬件地址的，它收到接口A的ARP广播后，更新其ARP表使之指向A的硬件地址。为了解决这个错误，B再次发送一个ARP请求广播，这样主机C又更新其ARP表再次指向B的硬件地址。这时网络的状态又回到先前的状态，有可能C已经向A发送了应该发送给B的IP分组，这很不幸，但是因为IP提供的是无保证的传输，所以不会产生大的问题。 <BR><BR>&nbsp; &nbsp;<FONT color=#0000ff>4、管理ARP缓存表</FONT> <BR><BR>　　ARP缓存表是对的列表，根据IP地址索引。该表可以用命令arp来管理，其语法包括： <BR><BR>&nbsp; &nbsp;向表中添加静态表项 -- arp -s <BR><BR>&nbsp; &nbsp;从表中删除表项 -- arp -d <BR><BR>&nbsp; &nbsp;显示表项 -- arp -a <BR><BR>　　ARP表中的动态表项(没有手动加入的表项)通常过一段时间自动删除，这段时间的长度由特定的TCP/IP实现决定。 <BR><BR>5、静态ARP地址的使用 <BR><BR>　　静态ARP地址的典型使用是设置独立的打印服务器，这些设备通常通过telnet来配置，但首先它们需要一个IP地址。没有明显的方法来把此信息告诉该设备，好象只能使用其串口来设置。但是，这需要找一个合适的终端和串行电缆，设置波特率、奇偶校验等，很不方便。 <BR><BR>　　假设我们想给一个打印服务器设置IP地址P-IP，并且我们知道其硬件地址P-hard，在工作站A上创建一个静态ARP表项把P-IP映射到P-hard，这样，虽然打印服务器不知道自己的IP地址，但是所有指向P-IP的数据就将被送到P-hard。我们现在就可以telnet到P-IP并配置其IP地址了，然后再删除该静态ARP表项。 <BR><BR>　　有时会在一个子网里配置打印服务器，而在另一个子网里使用它，方法与上面类似。假设其IP地址为P-IP，我们分配一个本网的临时IP地址T-IP给它，在工作站A上创建临时ARP表项把T-IP映射到P-hard，然后telnet到T-IP，给打印服务器配以IP地址P-IP。接下来就可以把它放到另一个子网里使用了，别忘了删除静态ARP表项。 <BR><BR>&nbsp; &nbsp;6、代理ARP <BR><BR>　　可以通过使用代理ARP来避免在每台主机上配置路由表，在使用子网时这特别有用，但注意，不是所有的主机都能理解子网的。基本的思想是即使对于不在本子网的主机也发送ARP请求，ARP代理服务器（通常是网关）回应以网关的硬件地址。 <BR><BR>　　代理ARP简化了主机的管理，但是增加了网络的通信量(不是很明显)，并且可能需要较大的ARP缓存，每个不在本网的IP地址都被创建一个表项，都映射到网关的硬件地址。在使用代理ARP的主机看来，世界就象一个大的没有路由器物理网络。 <BR><BR>　　路由器 &lt;三&gt; <BR><BR>&nbsp; &nbsp;三、IP地址 <BR><BR>　　在可路由的网络层协议中，协议地址必须含有两部分信息：网络地址和主机地址。存贮这种信息最明显的方法是用两个分离的域，这样我们必须考虑到两个域的最大长度，有些协议(如IPX)就是这样的，它在小型和中型的网络里可以工作的很好。 <BR><BR>　　另一种方案是减少主机地址域的长度，如24位网络地址、8位主机地址，这样就有了较多的网段，但每个网段内的主机数目很少。这样一来，对于多于256个主机的网络，就必须分配多个网段，其问题是很多的网络给路由器造成了难以忍受的负担。 <BR><BR>　　IP把网络地址和主机地址一起包装在一个32位的域里，有时主机地址部分很短，有时很长，这样可以有效利用地址空间，减少IP地址的长度，并且网络数目不算多。有两种将主机地址分离出来的方法：基于类的地址和无类别的地址。 <BR><BR>&nbsp; &nbsp;1、主机和网关 <BR><BR>　　主机和网关的区别常产生混淆，这是由于主机意义的转变。在RFC中(1122/3和1009)中定义为： <BR><BR>&nbsp; &nbsp;主机是连接到一个或多个网络的设备，它可以向任何一个网络发送和从其接收数据，但它从不把数据从一个网络传向另一个。 <BR><BR>&nbsp; &nbsp;网关是连接到多于一个网络的设备，它选择性的把数据从一个网络转发到其它网络。 <BR><BR>　　换句话说，过去主机和网关的概念被人工地区分开来，那时计算机没有足够的能力同时用作主机和网关。主机是用户工作的计算机，或是文件服务器等。现代的计算机的能力足以同时担当这两种角色，因此，现代的主机定义应该如此： <BR><BR>&nbsp; &nbsp;主机是连接到一个或多个网络的设备，它可以向任何一个网络发送和从其接收数据。它也可以作为网关，但这不是其唯一的目的。 <BR><BR>　　路由器是专用的网关，其硬件经过特殊的设计使其能以极小的延迟转发大量的数据。然而，网关也可以是有多个网卡的标准的计算机，其操作系统的网络层有能力转发数据。由于专用的路由硬件较便宜，计算机用作网关已经很少见了，在只有一个拨号连接的小站点里，还可能使用计算机作为非专用的网关。 <BR><BR>&nbsp; &nbsp;2、基于类的地址 <BR><BR>　　最初设计IP时，地址根据第一个字节被分成几类： <BR><BR>&nbsp; &nbsp;0: 保留 <BR>&nbsp; &nbsp;1-126: A类(网络地址:1字节，主机地址:3字节) <BR>&nbsp; &nbsp;127: 保留 <BR>&nbsp; &nbsp;128-191: B类(网络地址:2字节，主机地址:2字节) <BR>&nbsp; &nbsp;192-223: C类(网络地址:3字节，主机地址:1字节) <BR>&nbsp; &nbsp;224-255: 保留 <BR><BR>&nbsp; &nbsp;3、子网划分 <BR><BR>　　虽然基于类的地址系统对因特网服务提供商来说工作得很好，但它不能在一个网络内部做任何路由，其目的是使用第二层(桥接/交换)来导引网络中的数据。在大型的A类网络中，这就成了个特殊的问题，因为在大型网络中仅使用桥接/交换使其非常难以管理。在逻辑上其解决办法是把大网络分割成若干小的网络，但在基于类的地址系统中这是不可能的。为了解决这个问题，出现了一个新的域：子网掩码。子网掩码指出地址中哪些部分是网络地址，哪些是主机地址。在子网掩码中，二进制1表示网络地址位，二进制0表示主机地址位。传统的各类地址的子网掩码为： <BR><BR>&nbsp; &nbsp;A类：255.0.0.0 <BR><BR>&nbsp; &nbsp;B类：255.255.0.0 <BR><BR>&nbsp; &nbsp;C类：255.255.255.0 <BR><BR>　　如果想把一个B类网络的地址用作C类大小的地址，可以使用掩码255.255.255.0。 <BR><BR>　　用较长的子网掩码把一个网络分成多个网络就叫做划分子网。要注意的是，一些旧软件不支持子网，因为它们不理解子网掩码。例如UNIX的routed路由守护进程通常使用的路由协议是版本1的RIP，它是在子网掩码出现前设计的。 <BR>　上面只介绍了三种子网掩码：255.0.0.0、255.255.0.0和255.255.255.0，它们是字节对齐的子网掩码。但是也可以在字节中间对其进行划分，这里不进行详细讲解，请参照相关的TCP/IP书籍。 <BR><BR>　　子网使我们可以拥有新的规模的网络，包括很小的用于点到点连接的网络（如掩码255.255.255.252，30位的网络地址，2位的主机地址：两个主机的子网），或中型网络（如掩码255.255.240.0，20位网络地址，12位主机地址：4094个主机的子网）。 <BR><BR>　　注意DNS被设计为只允许字节对齐的IP网络(在in-addr.arpa.域中)。 <BR><BR>&nbsp; &nbsp;4、超网(supernetting) <BR><BR>　　超网是与子网类似的概念--IP地址根据子网掩码被分为独立的网络地址和主机地址。但是，与子网把大网络分成若干小网络相反，它是把一些小网络组合成一个大网络--超网。 <BR><BR>　　假设现在有16个C类网络，从201.66.32.0到201.66.47.0，它们可以用子网掩码255.255.240.0统一表示为网络201.66.32.0。但是，并不是任意的地址组都可以这样做，例如16个C类网络201.66.71.0到201.66.86.0就不能形成一个统一的网络。不过这其实没关系，只要策略得当，总能找到合适的一组地址的。 <BR><BR>&nbsp; &nbsp;5、可变长子网掩码(VLSM) <BR><BR>　　如果你想把你的网络分成多个不同大小的子网，可以使用可变长子网掩码，每个子网可以使用不同长度的子网掩码。例如：如果你按部门划分网络，一些网络的掩码可以为255.255.255.0(多数部门)，其它的可为255.255.252.0(较大的部门)。 <BR><BR>&nbsp; &nbsp;6、无类别地址(CIDR) <BR><BR>　　因特网上的主机数量增长超出了原先的设想，虽然还远没达到232，但地址已经出现匮乏。1993年发表的RFC1519--无类别域间路由CIDR(Classless Inter-Domain Routing)--是一个尝试解决此问题的方法。CIDR试图延长IPv4的寿命，与128位地址的IPv6不同，它并不能最终解决地址空间的耗尽，但IPv6的实现是个庞大的任务，因特网目前还没有做好准备。CIDR给了我们缓冲的准备时间。 <BR><BR>　　基于类的地址系统工作的不错，它在有效的地址使用和少量的网络数目间做出了较好的折衷。但是随着因特网意想不到的成长出现了两个主要的问题： <BR><BR>&nbsp; &nbsp;已分配的网络数目的增长使路由表大得难以管理，相当程度上降低了路由器的处理速度。 <BR><BR>&nbsp; &nbsp;僵化的地址分配方案使很多地址被浪费，尤其是B类地址十分匮乏。 <BR><BR>　　为了解决第二个问题，可以分配多个较小的网络，例如，用多个C类网络而不是一个B类网络。虽然这样能够很有效地分配地址，但是更加剧了路由表的膨胀（第一个问题）。 <BR><BR>　　在CIDR中，地址根据网络拓扑来分配。连续的一组网络地址可以被分配给一个服务提供商，使整组地址作为一个网络地址（很可能使用超网技术）。例如：一个服务提供商被分配以256个C类地址，从213.79.0.0到213.79.255.0，服务提供商给每个用户分配一个C类地址，但服务提供商外部的路由表只通过一个表项--掩码为255.255.0.0的网络213.79.0.0--来分辨这些路由。 <BR><BR>　　这种方法明显减少了路由表的增长，CIDR RFC的作者估计，如果90%的服务提供商使用了CIDR，路由表将以每3年54%的速度增长，而如果没有使用CIDR，则增长速度为776%。如果可以重新组织现有的地址，则因特网骨干上的路由器广播的路由数量将大大减少。但这实际是不可行的，因为将带来巨大的管理负担。<BR><BR>　　路由器 &lt;四&gt; 　 <BR><BR>&nbsp; &nbsp;四、路由 <BR><BR>&nbsp; &nbsp;1、路由表 <BR><BR>　　如果一个主机有多个网络接口，当向一个特定的IP地址发送分组时，它怎样决定使用哪个接口呢？答案就在路由表中。来看下面的例子： <BR><BR>目的 子网掩码 网关 标志 接口 <BR>201.66.37.0 255.255.255.0 201.66.37.74 U eth0 <BR>201.66.39.0 255.255.255.0 201.66.39.21 U eth1 <BR><BR>　　主机将所有目的地为网络201.66.37.0内主机(201.66.37.1-201.66.37.254)的数据通过接口eth0(IP地址为201.66.37.74)发送，所有目的地为网络201.66.39.0内主机的数据通过接口eth1(IP地址为201.66.39.21)发送。标志U表示该路由状态为“up”（即激活状态）。对于直接连接的网络，一些软件并不象上例中一样给出接口的IP地址，而只列出接口。 <BR>　此例只涉及了直接连接的主机，那么目的主机在远程网络中如何呢？如果你通过IP地址为201.66.37.254的网关连接到网络73.0.0.0，那么你可以在路由表中增加这样一项： 　 <BR><BR>　　目的 <BR>　　掩码 <BR>　　网关 <BR>　　标志 <BR>　　接口 <BR><BR>　　73.0.0.0 <BR>　　255.0.0.0 <BR>　　201.66.37.254 <BR>　　UG <BR>　　eth0 <BR><BR>　　此项告诉主机所有目的地为网络73.0.0.0内主机的分组通过201.66.37.254路由过去。标志G(gateway)表示此项把分组导向外部网关。类似的，也可以定义通过网关到达特定主机的路由，增加标志H(host)：　 <BR><BR>　　目的 掩码 网关 标志 接口 <BR>　　91.32.74.21 255.255.255.255 201.66.37.254 UGH eth0 <BR><BR>　　下面是路由表的基础，除了特殊表项之外： <BR><BR>　　目的 掩码 网关 标志 接口 <BR>　　127.0.0.1 255.255.255.255 127.0.0.1 UH lo0 <BR>　　default 0.0.0.0 201.66.37.254 UG eth1 <BR><BR>　第一项是loopback接口，用于主机给自己发送数据，通常用于测试和运行于IP之上但需要本地通信的应用。这是到特定地址127.0.0.1的主机路由(接口lo0是IP协议栈内部的“假”网卡)。第二项十分有意思，为了防止在主机上定义到因特网上每一个可能到达网络的路由，可以定义一个缺省路由，如果在路由表中没有与目的地址相匹配的项，该分组就被送到缺省网关。多数主机简单地通过一个网卡连接到网络，因此只有通过一个路由器到其它网络，这样在路由表中只有三项：loopback项、本地子网项和缺省项（指向路由器）。 <BR><BR>&nbsp; &nbsp;2、重叠路由 <BR><BR><BR>　　假设在路由表中有下列重叠项：　 <BR><BR>　　目的 掩码 网关 标志 接口 <BR>　　1.2.3.4 255.255.255.255 201.66.37.253 UGH eth0 <BR>　　1.2.3.0 255.255.255.0 201.66.37.254 UG eth0 <BR>　　1.2.0.0 255.255.0.0 201.66.37.253 UG eth1 <BR>　　default 0.0.0.0 201.66.39.254 UG eth1 <BR><BR>　 &nbsp;之所以说这些路由重叠是因为这四个路由都含有地址1.2.3.4，如果向1.2.3.4发送数据，会选择哪条路由呢？在这种情况下，会选择第一条路由，通过网关201.66.37.253。原则是选择具有最长(最精确)的子网掩码。类似的，发往1.2.3.5的数据选择第二条路由。 <BR><BR>　　注意：这条原则只适用于间接路由(通过网关)。把两个接口定义在同一子网在很多软件实现上是非法的。例如下面的设置通常是非法的（不过有些软件将尝试在两个接口进行负载平衡）： <BR><BR>　　接口 IP地址 子网掩码 <BR>　　eth0 201.66.37.1 255.255.255.0 <BR>　　eth1 201.66.37.2 255.255.255.0 <BR><BR>　　对于重叠路由的策略是十分有用的，它允许缺省路由作为目的为0.0.0.0、子网掩码为0.0.0.0的路由进行工作，而不需要作为路由软件的一个特殊情况来实现。 <BR><BR>　　回头来看看CIDR，仍使用上面的例子：一个服务提供商被赋予256个C类网络，从213.79.0.0到213.79.255.0。该服务提供商外部的路由表只以一个表项就了解了所有这些路由：213.79.0.0，子网掩码为255.255.0.0。假设一个用户移到了另一个服务提供商，他拥有网络地址213.79.61.0，现在他是否必须从新的服务提供商处取得新的网络地址呢？如果是，意味着他必须重新配置每台主机的IP地址，改变DNS设置，等等。幸运的是，解决办法很简单，原来的服务提供商保持路由213.79.0.0(子网掩码为255.255.0.0)，新的服务提供商则广播路由213.79.61.0(子网掩码为255.255.255.0)，因为新路由的子网掩码较长，它将覆盖原来的路由。 <BR><BR>　　3、静态路由 <BR><BR>　　回头看看我们已建立的路由表，已有了六个表项： <BR><BR>　　目的 掩码 网关 标志 接口 <BR>　　127.0.0.1 255.255.255.255 127.0.0.1 UH lo0 <BR>　　201.66.37.0 255.255.255.0 201.66.37.74 U eth0 <BR>　　201.66.39.0 255.255.255.0 201.66.39.21 U eth1 <BR>　　default 0.0.0.0 201.66.39.254 UG eth1 <BR>　　73.0.0.0 255.0.0.0 201.66.37.254 UG eth0 <BR>　　91.32.74.21 255.255.255.255 201.66.37.254 UGH eth0 <BR><BR>　　这些表项分别是怎么得到的呢？第一个是当路由表初始化时由路由软件加入的，第二、三个是当网卡绑定IP地址时自动创建的，其余三个必须手动加入，在UNIX系统中，这是通过命令route来做的，可以由用户手工执行，也可以通过rc脚本在启动时执行。上述方法涉及的是静态路由，通常在启动时创建，并且没有手工干预的话将不再改变。 <BR><BR>　路由器 &lt;五&gt; <BR><BR>　　四、路由 <BR><BR>　　4、路由协议 <BR><BR>　　主机和网关都可以使用称作动态路由的技术，这使路由表可以动态改变。动态路由需要路由协议来增加和删除路由表项，路由表还是和静态路由一样地工作，只是其增添和删除是自动的。 <BR><BR>　　有两种路由协议：内部的和外部的。内部协议在自制系统(AS)内部路由，而外部协议则在自制系统间路由。自制系统通常在统一的控制管理之下，例如大的公司或大学。小的站点常常是其因特网服务提供商自制系统的一部分。 <BR><BR>　　这里只讨论内部协议，很少有人涉及到甚至听说外部协议。最常见的外部协议是外部网关协议EGP(External Gateway Protocol)和边缘网关协议BGP(Border Gateway Protocol)，BGP是较新的协议，在逐渐地取代EGP。 <BR><BR>　　5、ICMP重定向 <BR><BR>　　ICMP通常不被看作路由协议，但是ICMP重定向却与路由协议的工作方式很类似，所以将在这里讨论一下。假设现在有上面所给的六个表项的路由表，分组被送往201.66.43.33，看看路由表，除了缺省路由外，这并不能匹配任何路由。静态路由将其通过路由器201.66.39.254发送(trip 1)，但是，该路由器知道所有发向子网201.66.43.0的分组应该通过201.66.39.253，因此，它把分组转发到适当的路由器(trip 2)。但是如果主机直接把分组发到201.66.39.253就会提高效率(trip 3)。<BR><BR>&nbsp; &nbsp;因为路由器把分组从同一接口发回了分组，所以它知道有更好的路由，路由器可以通过ICMP重定向指示主机使用新的路由。虽然路由器知道所有发向201.66.43.0子网的分组应该通过201.66.39.253，它通常只发送特定的主机的ICMP重定向（此例中是201.66.43.33）。主机将在路由表中创建一个新的表项：　 <BR>目的 掩码 网关 标志 接口 <BR>　　201.66.43.33 255.255.255.255 201.66.39.253 UGHD eth1 <BR><BR>　　注意标志D，对所有由ICMP重定向创建的路由设置此标志。将来此类分组将通过新路由发送(trip 3)。 <BR><BR>　　6、RIP <BR><BR>　　RIP是一种简单的内部路由协议，已经存在很久，被广泛地实现（UNIX的routed就使用RIP）。它使用距离向量算法，所以其路由选择只是基于两点间的“跳(hop)”数，穿过一个路由器认为是一跳。主机和网关都可以运行RIP，但是主机只是接收信息，而并不发送。路由信息可以从指定网关请求，但通常是每隔30秒广播一次以保持正确性。RIP使用UDP通过端口520在主机和网关间通信。网关间传送的信息用于建立路由表，由RIP选定的路由总是具有距离目的跳数最少的。RIP版本1在简单、较小的网络中工作得不错，但是在较大的网络中，就出现一些问题，有些问题在RIP版本2中已纠正，但有些是由于其设计产生的限制。在下面的讨论中，适用于两种版本时简单称为RIP，RIP v1和RIP v2则指特定的版本。 <BR><BR>　　RIP并没有任何链接质量的概念，所有的链路都被认为是相同的，低速的串行链路被认为与高速的光纤链路是同样的。RIP以最小的跳数来选择路由，因此当在下面两个路由中选择时： <BR><BR>&nbsp; &nbsp;100Mbps的光纤链路，路由器，然后是10Mbps的以太网 <BR><BR>&nbsp; &nbsp;9600bps的串行链路 <BR><BR>　　RIP将选择后者。RIP也没有链路流量等级的概念。例如对于两条以太网链路，其中一个很繁忙，另一个根本没有数据流，RIP可能会选择繁忙的那条链路。 <BR><BR>　　RIP中的最大hop数是15，大于15则认为不可到达。因此在很大的自制系统中，hop数很可能超过15，使用RIP是很不现实的。RIP v1不支持子网，交换的信息中不含子网掩码，对给定路由确定子网掩码的方法各不相同，RIP v2则弥补了此缺点。RIP每隔30秒才进行信息更新，因此在大网中断链信息可能要花些时间才能传播开来，路由信息的稳定时间可能更长，并且在这段时间内可能产生路由环路。对此有一些解决办法，但这里不进行讨论。 <BR><BR>　　可以看出，RIP是一个简单的路由协议，有一些限制，尤其在版本1中。不过，它常常是某些操作系统的唯一选择。<BR><BR><SPAN id=post2 style="FONT-SIZE: 12px; COLOR: #000000">接口种类 <BR><BR>　　路由器能支持的接口种类，体现路由器的通用性。常见的接口种类有：通用串行接口（通过电缆转换成RS232 DTE/DCE接口、V.35 DTE/DCE接口、X.21 DTE/DCE接口、RS449 DTE/DCE接口和EIA530 DTE接口等）、10M以太网接口、快速以太网接口、10/100自适应以太网接口、千兆以太网接口、ATM接口（2M、25M、155M、633M等）、POS接口（155M、622M等）、令牌环接口、FDDI接口、E1/T1接口、E3/T3接口、ISDN接口等。 <BR><BR>用户可用槽数 <BR>　　该指标指模块化路由器中除CPU板、时钟板等必要系统板及/或系统板专用槽位外用户可以使用的插槽数。根据该指标以及用户板端口密度可以计算该路由器所支持的最大端口数。 &nbsp;<BR><BR>CPU <BR>　　无论在中低端路由器还是在高端路由器中，CPU都是路由器的心脏。通常在中低端路由器中，CPU负责交换路由信息、路由表查找以及转发数据包。在上述路由器中，CPU的能力直接影响路由器的吞吐量（路由表查找时间）和路由计算能力（影响网络路由收敛时间）。在高端路由器中，通常包转发和查表由ASIC芯片完成，CPU只实现路由协议、计算路由以及分发路由表。由于技术的发展，路由器中许多工作都可以由硬件实现（专用芯片）。CPU性能并不完全反映路由器性能。路由器性能由路由器吞吐量、时延和路由计算能力等指标体现。 <BR>　<BR>内存 <BR>　　路由器中可能由多种内存，例如Flash、DRAM等。内存用作存储配置、路由器操作系统、路由协议软件等内容。在中低端路由器中，路由表可能存储在内存中。通常来说路由器内存越大越好（不考虑价格）。但是与CPU能力类似，内存同样不直接反映路由器性能与能力。因为高效的算法与优秀的软件可能大大节约内存。 <BR><BR>端口密度 <BR>　　该指标体现路由器制作的集成度。由于路由器体积不同，该指标应当折合成机架内每英寸端口数。但是出于直观和方便，通常可以使用路由器对每种端口支持的最大数量来替代。 <BR><BR>路由信息协议(RIP) <BR>　　RIP是基于距离向量的路由协议，通常利用跳数来作为计量标准。RIP是一种内部网关协议。由于RIP实现简单，是使用范围最广泛的路由协议。该协议收敛较慢，一般用于规模较小的网络。RIP协议在RFC 1058规定。 <BR><BR>策略路由方式 <BR>　　路由器除将目的地址作为选路的依据以外，还可以根据TOS字段、源和目的端口号（高层应用协议）来为数据包选择路径。策略路由可以在一定程度上实现流量工程，使不同服务质量的流或者不同性质的数据（语音、FTP）走不同的路径。 <BR><BR>距离矢量组播路由协议(DVMRP) <BR>　　DVMRP是基于距离矢量的组播路由协议，基本上基于RIP开发。DVMRP利用IGMP与邻居交换路由<BR><BR>全双工线速转发能力 <BR>　　路由器最基本且最重要的功能是数据包转发。在同样端口速率下转发小包是对路由器包转发能力最大的考验。全双工线速转发能力是指以最小包长（以太网64字节、POS口40字节）和最小包间隔（符合协议规定）在路由器端口上双向传输同时不引起丢包。该指标是路由器性能重要指标。 <BR><BR>设备吞吐量 <BR>　　指设备整机包转发能力，是设备性能的重要指标。路由器的工作在于根据IP包头或者MPLS标记选路，所以性能指标是转发包数量每秒。设备吞吐量通常小于路由器所有端口吞吐量之和。 <BR><BR>端口吞吐量 <BR>　　端口吞吐量是指端口包转发能力，通常使用pps：包每秒来衡量，它是路由器在某端口上的包转发能力。通常采用两个相同速率接口测试。但是测试接口可能与接口位置及关系相关。例如同一插卡上端口间测试的吞吐量可能与不同插卡上端口间吞吐量值不同。 <BR><BR>路由表能力 <BR>　　路由器通常依靠所建立及维护的路由表来决定如何转发。路由表能力是指路由表内所容纳路由表项数量的极限。由于Internet上执行BGP协议的路由器通常拥有数十万条路由表项，所以该项目也是路由器能力的重要体现。 <BR><BR>背板能力 <BR>　　背板能力是路由器的内部实现。背板能力能够体现在路由器吞吐量上：背板能力通常大于依据吞吐量和测试包场所计算的值。但是背板能力只能在设计中体现，一般无法测试。 <BR><BR>QoS分类方式 <BR>　　指路由器可以区分QoS所依据的信息。最简单的QoS分类可以基于端口。同样路由器也可以依据链路层优先级（802.1Q中规定）、上层内容（TOS字段、源地址、目的地址、源端口、目的端口等信息）来区分包优先级。 <BR><BR>分组语音支持方式 <BR>　　在企业中，路由器分组语音承载能力非常重要。在远程办公室与总部间，支持分组语音的路由器可以使电话通信和数据通信一体化，有效地节省长途话费。当前技术环境下，分组语音可以分为3种：使用IP承载分组语音、使用ATM承载语音以及使用帧中继承载语音。使用ATM承载语音时可以分AAL1和AAL2两种。AAL1即电路仿真，技术非常成熟但是相对成本较高，AAL2技术较先进，但是当前ATM接口通常不支持。帧中继承载语音也比较成熟，相对成本较低。IP承载语音当前较流行。在上述技术中成本最低，但是当前IP网络QoS保证困难，通话质量较难保证。 <BR><BR>语音压缩能力 <BR>　　语音压缩是IP电话节约成本的关键之一。通常可以使用G.723和G.729。G.723在ITU－T建议G.723.1(1996)，语音编码器在5.3和6.3Kbps多媒体通信传输双率语音编码器中规定。相对压缩比较高，压缩时延较大。G.729在ITU－T 建议G.729 (1996)，8Kbps共扼结构代数码激励线形预测(CS－ACELP)语音编码中规定。压缩比较低，通话质量较好。 <BR><BR>信令支持 <BR>　　路由器E1端口上可能支持多种信令：ISUP、TUP、中国1号信令以及DSS1。支持ISUP、TUP或者DSS1信令的路由器可以有效地减少接续时间。在电信级的IP电话网络设备中通常要求支持7号信令。但是作为中低端路由器，通常只支持DSS1和中国1号信令。<BR><SPAN id=post3 style="FONT-SIZE: 12px; COLOR: #000000">软件路由器 <BR>--------------------------------------------------------------------------------<BR><BR>&nbsp; &nbsp; &nbsp; 一、什么是软件路由器？ <BR><BR>　　一般认为用普通PC安装一套专用的路由器程序组成的系统称为软件路由器. 486电脑+免费的软件=专业的软件路由器。 <BR><BR>　　二 、软件路由器技术复杂吗？ <BR><BR>　　不复杂,非常简单，会用普通操作PC就可以安装软件路由器。 <BR><BR>　　三、常见的软件路由器有那些？ <BR><BR>　　根据使用的操作不同可以分为基于windows平台和基于Linux/bsd平台开发的软件路由器，基于Windows平台的软件防火墙比较常见的有ISA Server、Winroute Firewall等，这些软件都是商业化的，通常根据授权用户数不同收费而不同，购买正版的软件防火墙的费用对许多中小型企业来说无疑是一笔不小的开支。有而基于Unix/Linux平台的软件防火墙大家一般接触较少，受益于开放源码运行，目前基于Unix/Linux平台的软件防火墙如雨后春笋般不断推出，这些软件防火墙大多是免费的，常见的有RouterOS、m0n0Wall、SmoothWall、Ipcop、CoyoteLinux等，这些系统共有的特点是一般对硬件要求较低，甚至只需要一台486电脑，一张软盘，两块网卡就可以安装出一台非常专业的软件防火墙，这对很多有淘汰下来的低档电脑的朋友来说，意味着拿一台淘汰的电脑，安装一套免费的防火墙软件，不花一分钱就DIY出一台专业的防火墙，而且这些系统自身也包含了NAT功能，同时可以实现宽带共享，这意味着这台免费的防火墙其实也是一台出色的宽带路由器，这是多么令人激动的事情。<BR><BR>　　四、软件路由器功能如何？ <BR><BR>　　不同的软件路由器功能不一样，绝大部分基于Linux/bsd的免费软件路由器功能并不比商业的差，而且比商业的功能还要强大。 <BR><BR>　　五、软件路由器的性能和稳定性如何？ <BR><BR>　　目前常见的硬件宽带路由器，绝大部分都是用软件来实现的，跟软件路由器是一样的，而且软件路由器一般硬件配置要比硬件的宽带路由器配置高，所以某些情况下速度比几千上万元的硬件路由器稳定还要快。至于软件路由器的稳定性，受益于稳定的Linux和BSD内核，软件路由器的稳定性非常好，我见过最长时间不用重启的软件路由器，已经有一年多了。 <BR><BR>　　六、制作软件路由器需要什么配件？ <BR><BR>　　一台486以上，8M内存以上的普通PC，再加两块网卡就可以了，有些软件路由器如CoyoteLinux只需一张软盘就可以了，对于网卡没有特殊的要求，常见的Rtl8139 和530tx，3COM905B-TX，Intel82559 服务器网卡等都可以，不过根据我们的经验，一台工作良好的软件路由器，网卡一定要好，所以我们会推荐你使用iNTEL或3COM品牌的网卡，特别是Intel82559效果非常不错。如果经验条件许可，购买一个电子硬盘或CF-IDE转接卡再配上CF存储卡，是不错的选择，这样做出来的软件路由器，可以跟硬件的路由器相比了。 <BR><BR>　　七、软件路由器会淘汰硬件路由器吗？ <BR><BR>　　不会，但会软件路由器会逐渐占领更多的硬件路市场，软件路由器还不可能淘汰硬件路由器，它们的市场定位不同，而且在高端只有硬件路由器才能胜任，但对于一般的用途如用软件路由器可以获得更高的经济效益。<BR><BR><BR>　　八、哪里可以下载到软件路由器？ <BR><BR>　　1、老牌的中文软路由bbiagent，全中文，但需要注册购买<BR>&nbsp;　　http://www.bbiagent.net/gb/index.html <BR><BR>　　2、Coyote北美土狼，方便好用，负载能力强，一张软盘即可。免费<BR>&nbsp;　　http://www.coyotelinux.com/ <BR><BR>　　3、FreeSCO看名字就知道她的能力了，免费的类cisco路由软件。<BR>&nbsp;　　http://www.freesco.info/ <BR><BR>　　4、Floppyfw最早的linux LRP项目之一的产物<BR>&nbsp;　　http://www.zelow.no/floppyfw <BR><BR>　　5、SmoothWall和IPCOP是用一个内核开发，功能不相上下<BR>&nbsp;　　http://www.smoothwall.org &nbsp; &nbsp; &nbsp; &nbsp; <A href="http://www.ipcop.org/" target=_blank>http://www.ipcop.org</A> <BR><BR>　　6、RouterOS这个软件有点争议，号称ISP级软路由，支持多路由协议，实际效果并不如意<BR>&nbsp;　　http://www.mikrotik.com <BR><BR>　　7、Fli4l德国的一个软路由，对ADSL支持非常好<BR>&nbsp;　　http://www.fli4l.de/ <BR><BR>　　8、Clarkconnect功能强大，但是体积大了点<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.clarkconnect.org <BR><BR>　　9、http://www.netboz.net/ <BR><BR>　　10、http://people.freebsd.org/~picobsd/ <BR><BR>　　11、http://www.docum.org/docum.org/ <BR><BR>　　12、http://m0n0.ch/wall/ <BR><BR><BR>代理服务器的路由分析 <BR>--------------------------------------------------------------------------------<BR><BR><BR>　　对于小型用户群体或家庭用户接入Internet，采用拨号上网不失为一种廉价实用的方式。在局域网上通过代理服务器软件便可以解决多用户共享访问Internet问题，代理服务器实质上是一个介于用户群体和Internet之间的桥梁，用以实现其网络用户对Internet的访问。 <BR><BR>　　利用局域网 <BR><BR>　　目前局域网的组网产品很多，以太网交换机或集线器（HUB）价格低廉，非常容易实现局域网客户的互联。本文以现有园区网为例，阐述如何利用PROXY代理服务器实现Internet连接，并进行代理服务器的内部路由分析。本局域网的拓扑结构如图1所示，局域网组成为：客户机若干台，服务器一台，拨号网络服务器一台，连接Internet的调制解调器一台。 <BR><BR>　　具体配置如下： <BR><BR>　　1、客户机：安装WINDOWS 95/98，IE浏览器（Internet Explorer4.0或5.0）。在Internet Explorer的“选项，连接”一栏中选择“使用代理服务器访问Internet”，并将代理服务器的IP地址和端口号（80）填入“地址”和“端口”项，如此便完成了客户端的简单配置。 <BR><BR>　　2、服务器：安装WINDOWS NT和PROXY软件。配置服务器的RAS、拨号网络、TCP/IP等，建立WINDOWS用户帐户，启动PROXY软件，启动WEB、FTP等代理任务并进行权限设置，给予客户访问Internet的权限等。 <BR><BR>　　<BR>3、调制解调器：在服务器端配置一台调制解调器（MODEM），一条电话线。拨通本地的Internet电话，如169、163等。 <BR><BR>　　4、拨号网络服务器：在局域网中为远程用户提供服务，使远程用户可以通过专用通讯线路与局域网连接。 <BR><BR>　　代理服务器的路由问题 <BR><BR>　　配置服务器的RAS服务和拨号网络后，进行拨号连接。此时的代理服务器中相当于存在两块接口卡，即一个网卡和一个调制解调器，可以把它看作是一个路由器，为客户和外界提供路由转发功能，因此必须查看并调整服务器的路由设置，以保证服务器与客户的正常通讯。 <BR><BR>　　在服务器上进行拨号，在DOS模式下通过ROUTE命令查看服务器的路由表。下面仅以缺省路由为例简单分析NT服务器在拨号过程中的路由表，假设10.119.40.254为服务器所在网段的网关，10.119.40.49为NT服务器网卡的IP地址。 <BR><BR>　　拨号前服务器路由表（表1）： <BR><BR>　　NETWORK ADDRESS NETMASK GATEWAY ADDRESS INTERFACE METRIC <BR><BR>　　0.0.0.0 0.0.0.0 10.119.40.254 10.119.40.49 1 <BR><BR>　　拨号后服务器路由表（表2）： <BR><BR>　　NETWORK ADDRESS NETMASK GATEWAY ADDRESS INTERFACE METRIC <BR><BR>　　0.0.0.0 0.0.0.0 10.119.40.254 10.119.40.49 2 <BR><BR>　　0.0.0.0 0.0.0.0 10.18.168.168 10.18.168.168 1 <BR><BR>　　其中10.18.168.168为INTERNET服务器分配给本拨号网络（调制解调器）的IP地址。经对比表1和表2，在拨号前后的缺省路由有了变化。分析这一现象，主要是由于在服务器中“拨号网络”，“TCP/IP设置”的选项中，选择了“使用拨号网络的默认网关”的缘故，这样服务器每次向10.119.40.0网段的客户发送信息都首先经过10.18.168.168的地址。当网络上的客户要求访问INTERNET站点时，每次都要通过局域网到NT服务器，然后至MODEM。所以必须保障客户机与服务器的正常连通，使路由过程通过10.119.40.49局域网网卡进行。应用PING命令进行检测，服务器可以PING通客户机，而客户机PING服务器时出现超时（TIME OUT）。这一现象表明由于代理服务器的默认路由发生了变化，从而使客户与服务器的连通首先要经过10.18.168.168来转发。解决这一问题须做以下设置，假设某客户所在网段为122.103.1.0，SUBMASK:255.255.255.0，需向路由表中填加指定项目，即执行命令ROUTE ADD 122.103.1.0 255.255.255.0 10.119.40.49。其中10.119.40.49为NT服务器的网卡IP地址，再查看服务器路由表如下： <BR><BR>　　NETWORK ADDRESS NETMASK GATEWAY ADDRESS INTERFACE METRIC <BR><BR>　　0.0.0.0 0.0.0.0 10.119.40.254 10.119.40.49 2 <BR><BR>　　0.0.0.0 0.0.0.0 10.18.168.168 10.18.168.168 1 <BR><BR>　　122.103.1.0 255.255.255.0 10.199.40.254 10.119.40.49 1 <BR><BR>　　进一步分析，我们还可以通过修改默认路由的方法来达到我们的目的，即使用ROUTE ADD 0.0.0.0 0.0.0.0 10.119.40.49 1 IF METRIC=2 <BR><BR>　　使路由表设置为： <BR><BR>　　NETWORK ADDRESS NETMASK GATEWAY ADDRESS INTERFACE METRIC <BR><BR>　　0.0.0.0 0.0.0.0 10.119.40.254 10.119.40.49 1 <BR><BR>　　作为特殊情况，我们分析一下局域网远程用户的路由问题。在局域网中存在远程用户，它们通常经过专用的通讯线路与局域网连接，如果它们试图通过代理服务器访问INTERNET，必须在NT服务器上配置路由表。由于这类远程用户访问INTERNET需要经过2次拨号服务，在PROXY代理服务器上直接的路由设置尤其必要。如上所述，局域网的客户还可以通过修改默认路由的方法使服务器和客户连通。对于远程客户则不然，必须直接设置代理服务器的路由。假设远程用户（拨号网络服务器）所在的网段为122.100.1.0，SUBMASK:255.255.255.0，须加入路由：ROUTE ADD 122.100.1.0 255.255.255.0 10.119.40.49，才能保证远程用户的直通性。否则，在客户拨通局域网时，远程客户机能PING通网上其它所有的设备，惟独PING NT服务器时超时错误。这说明代理服务器的默认路由此时并没有起作用。 <BR><BR>　　用户的管理 <BR><BR>　　通过WINDOWS NT可以对每个代理用户进行管理。在客户访问INTERNET时，首先要在代理服务器上进行用户验证，在用户输入正常的用户名和密码时，才能为其提供INTERNET服务，然后通过代理服务器访问INTERNET。代理服务器软件可使用MS PROXY 2.0，它提供了大量的代理权限的控制，使用它可以对授权用户、访问站点等进行方便地管理、监视、记录等。 <BR></SPAN></SPAN><img src ="http://www.cnitblog.com/windforce/aggbug/6962.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2006-02-26 08:25 <a href="http://www.cnitblog.com/windforce/articles/6962.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于HTTP的QQ协议 （转载）</title><link>http://www.cnitblog.com/windforce/articles/2987.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Thu, 29 Sep 2005 13:55:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/2987.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/2987.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/2987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/2987.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/2987.html</trackback:ping><description><![CDATA[<TABLE class="fixedTable blogpost" cellSpacing=0 width="100%" border=0>
<TBODY>
<TR>
<TD class=ellipse>
<P align=center><SPAN class=bvTitle id=subjcns!1pKnbff3FpJuGZcrsAlNZmZQ!106><STRONG>QQ协议网络协议--请求部份</STRONG></SPAN></P></TD></TR>
<TR>
<TD class=bvh8><STRONG></STRONG></TD></TR>
<TR>
<TD id=msgcns!1pKnbff3FpJuGZcrsAlNZmZQ!106>
<P>//登录 <BR>VER=1.0&amp;CMD=Login&amp;SEQ=&amp;UIN=&amp;PS=&amp;M5=1&amp;LC=9326B87B234E7235 </P>
<P>//获取消息 <BR>VER=1.0&amp;CMD=GetMsgEx&amp;SEQ=&amp;UIN= </P>
<P>//发送消息 <BR>VER=1.0&amp;CMD=CLTMSG&amp;SEQ=&amp;UIN=&amp;UN=&amp;MG= </P>
<P>//朋友列表 <BR>VER=1.0&amp;CMD=List&amp;SEQ=&amp;UIN=&amp;TN=160&amp;UN=0 </P>
<P>//获取好友状态 <BR>VER=1.0&amp;CMD=Query_Stat&amp;SEQ=&amp;UIN=&amp;TN=50&amp;UN=0 </P>
<P>//获取好友信息 <BR>VER=1.0&amp;CMD=GetInfo&amp;SEQ=&amp;UIN=&amp;LV=2&amp;UN= </P>
<P>//增加好友 <BR>VER=1.0&amp;CMD=AddToList&amp;SEQ=&amp;UIN=&amp;UN= </P>
<P>//回应对方请求加你为好友的响应 <BR>VER=1.0&amp;CMD=Ack_AddToList&amp;SEQ=&amp;UIN=&amp;UN=&amp;CD=&amp;RS= </P>
<P>//删除好友 <BR>VER=1.0&amp;CMD=DelFromList&amp;SEQ=&amp;UIN=&amp;UN= </P>
<P>//搜索好友 <BR>VER=1.0&amp;CMD=Finger&amp;SEQ=&amp;UIN=&amp;AG=&amp;SX=&amp;PV= </P>
<P>//改变自己状态，ST的代码应该和获取好友状态代码一致 <BR>VER=1.0&amp;CMD=Change_Stat&amp;SEQ=&amp;UIN=&amp;ST= </P>
<P>//退出登录 <BR>VER=1.0&amp;CMD=Logout&amp;SEQ=&amp;UIN=</P></TD></TR></TBODY></TABLE>
<P align=center><BR><BR><STRONG>基于HTTP的QQ协议之我所见</STRONG> <BR>&nbsp;<BR>有一年没有发表文章了,最近我为了一个项目对QQ协议进行研究,有些心得,不敢独享,故把其中一项协议--</P>
<P>基于HTTP的QQ协议V1.1的不完整成果,拿出来与大家分享一下。<BR>大家说到QQ协议都觉得很神秘，是因为QQ不像MSN或者ICQ协议都已经官方公布了，而QQ的没有公布。研究</P>
<P>它的人也不是特别的多，虽然已经有了基于QQ协议所写成的第三方软件 foicq, qq plugins for gaim, </P>
<P>LumaQQ，但是由于他们是基于二进制Stream的协议过于复杂，大家阅读代码也有一定的难度，再加上网络</P>
<P>上解析QQ协议的文章也不是十分多，所以基于QQ网络协议的应用程序也是寥寥无几的。现在我就把基于HT</P>
<P>TP的QQ协议进行一个粗浅的剖析，希望对大家有所帮助。源码部分就用我喜欢的DELPHI和现在比较流行的</P>
<P>C#语言对QQ协议的实现进行具体分析。<BR>1、找寻支持QQ HTTP协议的服务器。<BR>大家也许会被一些假像所迷惑，也许会认为QQ的HTTP服务器是基于80口进行通信的（如：218.17.209.23:</P>
<P>80），其实不然，正真基于HTTP的服务器应该是：<A href="http://tqq.tencent.com:8000">http://tqq.tencent.com:8000</A>，它是一个通过8000口</P>
<P>进行通讯的服务器。<BR>由于QQ的HTTP服务器并不支持HTTP协议中GET方法，它支持POST方法。所以我们要给QQ的HTTP协议传参数</P>
<P>，那么就必需要用POST方式才行。<BR>2、C#和DELPHI是实现HTTP的POST方法的通信。<BR>C#：<BR>&nbsp; C#里System.Web空间下提供了一个叫做WebClient的对象，使用此对象就可以使C#直接对服务器发送WEB</P>
<P>客户端的请求。那么我们要对服务器提交POST方法那么就必须使用其UploadData()方法才行。首先把要请</P>
<P>求的信息先转换为字节（因为POST提交的是字符的流数据），然后再做为UploadData()的参数。使用Uplo</P>
<P>adData()进行数据提交，最后返回，POST的回馈信息。如下：</P>
<P>&nbsp; WebClient _client = new WebClient();<BR>&nbsp; string postValues = "VER=1.0&amp;CMD=Query_Stat&amp;SEQ=12321&amp;UIN=29501213&amp;TN=50&amp;UN=0";<BR>&nbsp; Byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(postValues);<BR>&nbsp; Byte[] pageData = _client.UploadData(Host,"POST",byteArray);</P>
<P>这样，我们就利用C#进行了一次HTTP的POST方法提交了。</P>
<P>DELPHI：<BR>&nbsp; Delphi里我们利用一个比较流行的第三方VCL，INDY HTTP（这个组件D6，D7里面自带）进行HTTP通信。</P>
<P>使用其的POST方法便可以进行HTTP的POST通信，因为组件比较好用，我就不在其描述具体的过程了。大家</P>
<P>可以参考以下代码：</P>
<P>function PostWebPage(url,para:String;TimeOut:Integer):String;<BR>var<BR>&nbsp; tmpWeb:TIdHTTP;<BR>&nbsp; retrun:String;<BR>&nbsp; Proxy:String;<BR>&nbsp; i:Integer;<BR>&nbsp; paralist:TStrings;<BR>begin<BR>&nbsp; retrun:='';<BR>&nbsp; try<BR>&nbsp;&nbsp;&nbsp; paralist:=TStringList.Create;<BR>&nbsp;&nbsp;&nbsp; paralist.Text:=_Replacing(para,'&amp;',#13#10);<BR>&nbsp;&nbsp;&nbsp; tmpWeb:=TIdHTTP.Create(nil);<BR>&nbsp;&nbsp;&nbsp; tmpWeb.ReadTimeout:=TimeOut;<BR>&nbsp;&nbsp;&nbsp; for i:=1 to 3 do<BR>&nbsp;&nbsp;&nbsp; begin<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retrun:=tmpWeb.Post(url,paralist);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except end;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if retrun&lt;&gt;'' then break;<BR>&nbsp;&nbsp;&nbsp; end;<BR>&nbsp; finally<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpWeb.Disconnect;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeAndNil(tmpWeb);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FreeAndNil(paralist);<BR>&nbsp; end;</P>
<P>&nbsp; Result:=retrun;<BR>end;</P>
<P>值在传入、返回时，其是基于UTF-8进行的，C#显示中文是很常，而DELPHI就要进行UTF-8的转换了。大家</P>
<P>可通过Utf8ToAnsi()、AnsiToUtf8()进行转换。（编码转换是C#的优越性之一）</P>
<P>3、实现QQ的用户登录。<BR>在QQ通信中用户必需要登录后才可以进行互相发送信息等。QQ的登录是很关键的，大家所看到的用户在线</P>
<P>，并不是用户的QQ一直连接着服务器，而是定时发送消信给服务器，证明自己还连着线，如果超出时间QQ</P>
<P>就认为用户已经掉线了。<BR>在登录协议中，QQ的密码是用标准的MD5来进行加密，DELPHI的用户只需要下个MD5加密模块就可以了，而</P>
<P>C#自已带有，但是直接用不了，必需进行处理后，才能使其变成标准的MD5，处理代码如下：<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static string MD5(string toCryString)<BR>&nbsp; {<BR>&nbsp;&nbsp; MD5CryptoServiceProvider hashmd5;<BR>&nbsp;&nbsp; hashmd5 = new MD5CryptoServiceProvider();<BR>&nbsp;&nbsp; return </P>
<P>BitConverter.ToString(hashmd5.ComputeHash(Encoding.Default.GetBytes(toCryString))).Replace("</P>
<P>-","").ToLower();//asp是小写,把所有字符变小写<BR>&nbsp; } </P>
<P>了解QQ是如何对用户密码加密后，那么我们就开始真正，解析QQ的HTTP登录协议了,我们把协议当传POST</P>
<P>的参数传给服务器，而服务器则回馈相应的信息给客户端：<BR>传入协议：<BR>&nbsp; VER=1.1&amp;CMD=Login&amp;SEQ=&amp;UIN=&amp;PS=&amp;M5=1&amp;LC=9326B87B234E7235</P>
<P>&nbsp; VER是用来说明QQ协议的版本，CMD是说明协议的命令，Login就是指QQ的登录了，SEQ是他的为了防止重</P>
<P>复发送而设定的一个标记，一般我们取当前时间数值的一段放入即可。（C#：DateTime.Now.Ticks.ToStr</P>
<P>ing().Substring(7,7) DELPHI：CopyStr(inttostr(GetTickCount()),1,5)），UIN是说明你当前要登录</P>
<P>的用户QQ号，PS，是MD5加密过后的密码的值。</P>
<P>返回协议：</P>
<P>&nbsp; VER=1.1&amp;CMD=Login&amp;SEQ=11281&amp;UIN=&amp;RES=0&amp;RS=0&amp;HI=60&amp;LI=300（成功）</P>
<P>RES为0表示成功返回，RS为0表示登录成功。</P>
<P>&nbsp; VER=1.1&amp;CMD=Login&amp;SEQ=11422&amp;UIN=315103947&amp;RES=0&amp;RS=1&amp;RA=登录失败</P>
<P>RS为1表示登录失败，那么就会出现提示信息RA说明原因。</P>
<P>4、获得QQ名单。<BR>如果您加了您的好友，那么您的好友就会放入你的QQ的好友名单里面，那么我们要得到QQ名单就必需给QQ</P>
<P>服务器发送得到好友名单的协议（我就不从复已知的参数了）：</P>
<P>&nbsp; VER=1.1&amp;CMD=List&amp;SEQ=&amp;UIN=&amp;TN=160&amp;UN=0 </P>
<P>服务器得到协议后如果成功则返回：</P>
<P>&nbsp; VER=1.1&amp;CMD=LIST&amp;SEQ=43661&amp;UIN=29501213&amp;RES=0&amp;FN=1&amp;SN=24&amp;UN=561256,1943497,....</P>
<P>UN后面则是您好友的QQ号码，每个号码都由,进行分开。那么我们只需要得到UN后面的代码，把它列表化</P>
<P>就OK了。C#可以用string.Split(',')把值放入列表进行处理，而DELPHI可以使用Split()把数值放入TStr</P>
<P>ings里进行处理。</P>
<P>5、获得QQ好友在线名单<BR>获得QQ好友在线名单，跟获得好友名单差不多，唯一不同的是用的命令不同用的是Query_Stat，协议如下</P>
<P>：</P>
<P>&nbsp; VER=1.1&amp;CMD=Query_Stat&amp;SEQ=&amp;UIN=&amp;TN=50&amp;UN=0 </P>
<P>服务器得到协议后如果成功则返回：</P>
<P>VER=1.1&amp;CMD=QUERY_STAT&amp;SEQ=-1&amp;UIN=29501213&amp;RES=0&amp;FC=141,270,270,&amp;FN=1&amp;SN=3&amp;ST=10,10,10,&amp;UN=1</P>
<P>2327207,24259132,29501213,&amp;NK= □,微程,鶹鸑,&amp; </P>
<P>FC为QQ头像的的ID，如的头像ID为270，那么其头使用的图片为91.bmp,其算法为ID/3+1。ST为QQ用户的状</P>
<P>态，10为上线，20为离线，30为忙碌。UN为在线用户的QQ号，NK为在线用户的QQ昵称。ST，UN，NK，每个</P>
<P>逗号隔开的数据相互对应。在得到消息后如果用的是DELPHI语言，那么要用Utf8ToAnsi()进行转换，不然</P>
<P>会出现乱码。</P>
<P>6、得到QQ用户的信息。<BR>如果要看到QQ用户的真实名称，MAIL，年龄，个人说明等信息，那么我们必需要向服务器发送得到好友信</P>
<P>息的信息：</P>
<P>&nbsp; VER=1.1&amp;CMD=GetInfo&amp;SEQ=&amp;UIN=&amp;LV=2&amp;UN=</P>
<P>UN为要查看用户信息的QQ号。</P>
<P>服务器得到协议后如果成功则返回：</P>
<P>VER=1.1&amp;CMD=GETINFO&amp;SEQ=12707&amp;UIN=415103947&amp;RES=0&amp;AD=云南昆明<A href="mailto:&amp;AG=0&amp;EM=Microprogramer@hotmail">&amp;AG=0&amp;EM=Microprogramer@hotmail</A></P>
<P>.com&amp;FC=270&amp;HP=msger.org(建设中...)&amp;JB=程序员&amp;LV=2&amp;PC=650000&amp;PH=0871-6466529&amp;PR=网络为媒%252</P>
<P>c关系为本%252c信息为财%252c客户为主.%0d%0a&amp;PV=云南省&amp;RN=刘X&amp;SC=社会大学&amp;SX=0&amp;UN=24259132&amp;NK=</P>
<P>微程</P>
<P>AD用户的联系地址，AG为用户年龄，EM为用户MAIL，FC为用户头像，HP为用户网站，JB为用户职业，PC为</P>
<P>用户邮编，PH为用户联系电话，PR为用户简介，PV为用户所以的省，RN为用户真实名称，SC为用户毕业院</P>
<P>校，SX为用户性别，UN为用户QQ号，NK为用户QQ昵称。在得到消息后如果用的是DELPHI语言，那么要用Ut</P>
<P>f8ToAnsi()进行转换，不然会出现乱码。</P>
<P>7、增加QQ好友。<BR>想要新增好友，就要发送AddToList命令给服务器，具体命令如下：</P>
<P>&nbsp; VER=1.1&amp;CMD=AddToList&amp;SEQ=&amp;UIN=&amp;UN=</P>
<P>UN为我们要增加用户的QQ号。</P>
<P>服务器得到协议后如果成功则返回：</P>
<P>VER=1.1&amp;CMD=AddToList&amp;SEQ=13666&amp;UIN=415103947&amp;RES=0&amp;CD=0&amp;UN=24259132</P>
<P>CD为被加QQ的身份验证状态，CD为0表示“允许任何人把我列为好友”，CD为1表示“需要身份证认才能把</P>
<P>我列为好友”，CD为3表示“不允许任何人把我列为好友”。如果CD为0那么信息回馈后，用户就直接加为</P>
<P>好友了，如果CD为1，那么还要发送一次回应加为好友的响应。</P>
<P>8、回应加为好友的响应。</P>
<P>回应加为好友响应是双方的：1、如果你发送了请求加对方为好友，如果对方需要验证，那么必需发送回</P>
<P>应加为好友的响应。2、如果对方发送加为好友请求给你，那么你可以加应加为好友的响应，一是加为好</P>
<P>友，一是通过验证，一是拒决加为好友。我们要向服务器发送命令：</P>
<P>VER=1.1&amp;CMD=Ack_AddToList&amp;SEQ=&amp;UIN=&amp;UN=&amp;CD=&amp;RS=</P>
<P>CD为响应状态，CD为0表示“通过验证”。CD为1表示“拒决加为对方为好友”。CD为2表示“为请求对方</P>
<P>加为好友”。RS为你要请求的理由，如果您用的是DELPHI那么RS在发送之间要用AnsiToUtf8()进行转换，</P>
<P>不然发送过后，请求理由会变成“？”。</P>
<P>服务器得到协议后如果成功则返回：</P>
<P>VER=1.1&amp;CMD=Ack_AddToList&amp;SEQ=1130&amp;UIN=415103947&amp;RES=0&amp;</P>
<P>9、删除好友。</P>
<P>删除好友其实很容易，向服务器发送DelFromList命令则可以删除用户：</P>
<P>VER=1.1&amp;CMD=DelFromList&amp;SEQ=&amp;UIN=&amp;UN= </P>
<P>UN为要删除用户的QQ号。</P>
<P>服务器得到协议后如果成功则返回：</P>
<P>VER=1.1&amp;CMD=DelFromList&amp;SEQ=24514&amp;UIN=415103947&amp;RES=0&amp;</P>
<P>10、改变用户当前状态。<BR>可以把QQ设置为在线，隐身等状态，我们可以发送Change_Stat给服务器以改变当前状态，具体命令如下</P>
<P>：</P>
<P>VER=1.1&amp;CMD=Change_Stat&amp;SEQ=&amp;UIN=&amp;ST= </P>
<P>ST为要改变的状态，10为上线，20为离线，30为忙碌。</P>
<P>服务器得到协议后如果成功则返回：</P>
<P>VER=1.1&amp;CMD=Change_Stat&amp;SEQ=17512&amp;UIN=415103947&amp;RES=0&amp;</P>
<P>11、退出登录<BR>要退出登录，要向服务器发送命令Logout，具体命令如下：</P>
<P>VER=1.1&amp;CMD=Logout&amp;SEQ=&amp;UIN=</P>
<P>服务器得到协议后如果成功则返回：</P>
<P>VER=1.1&amp;CMD=LOGOUT&amp;SEQ=15803&amp;UIN=415103947&amp;RES=0</P>
<P>12、获得好友QQ的消息</P>
<P>如果要接收好友的消息，要向服务器发送命令GetMsgEx，具体命令如下：</P>
<P>VER=1.1&amp;CMD=GetMsgEx&amp;SEQ=&amp;UIN= </P>
<P>服务器得到协议后如果成功则返回：</P>
<P>VER=1.1&amp;CMD=GETMSGEX&amp;SEQ=56661&amp;UIN=29501213&amp;RES=0&amp;MN=3&amp;MT=99,9,9,&amp;UN=24259132,24259132,24259</P>
<P>132,&amp;MG=30 ,asdfasdfasdfasdf ,asdfasdfasdf ,&amp;</P>
<P>MT表示消息类型，99表示系统消息，9表示用户消息。UN表示消息发送来源用户，MG表示发送的消息，MG</P>
<P>消息可以表示某些特定的系统含意，譬如：当MT为99，MG为30，UN为24259132则表示用户4259132现在处</P>
<P>于忙碌状态，可根据此消息进行好友列表的刷新，提高效率。在得到消息后如果用的是DELPHI语言，那么</P>
<P>要用Utf8ToAnsi()进行转换，不然会出现乱码。</P>
<P>13、向好友QQ发送消息</P>
<P>要发送消息给好友，要向服务器发送命令CLTMSG命令，具体命令如下：</P>
<P>VER=1.1&amp;CMD=CLTMSG&amp;SEQ=&amp;UIN=&amp;UN=&amp;MG= </P>
<P>UN为消息发送给的用户QQ号码，MG为发送给该用户的消息。如果您用的是DELPHI那么MG在发送之间要用An</P>
<P>siToUtf8()进行转换，不然发送过后，消息会变成“？”。</P>
<P>服务器得到协议后如果成功则返回：</P>
<P>&nbsp;VER=1.1&amp;CMD=CLTMSG&amp;SEQ=15803&amp;UIN=415103947&amp;RES=0</P>
<P>好了，以上就是QQ基于HTTP的一个不完全的协议分析，在无源码前提下，在下能力有限，只能够分析这么</P>
<P>多了。利用以上协议您就可以实现很多东西，如：QQ机器人，QQ广告系统，即时通讯的整合工具等等。如</P>
<P>果您还有什么问题，请加我的QQ：24259132，MSN：<A href="mailto:microprogramer@hotmail.com">microprogramer@hotmail.com</A>，BLOG：<A href="http://spaces.msn.com/members/mprogramer/">http://spaces.msn.com/members/mprogramer/</A>。</P>
<P><BR>&nbsp;</P><img src ="http://www.cnitblog.com/windforce/aggbug/2987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2005-09-29 21:55 <a href="http://www.cnitblog.com/windforce/articles/2987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个注册页面检查代码-JAVASCRIPT</title><link>http://www.cnitblog.com/windforce/articles/2976.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Thu, 29 Sep 2005 08:19:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/2976.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/2976.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/2976.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/2976.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/2976.html</trackback:ping><description><![CDATA[<P>中华网BLOG注册页面检查代码</P>
<P>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<A href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</A>"&gt;<BR>&lt;html xmlns="<A href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</A>" lang="zh-CN"&gt;<BR>&lt;head&gt;<BR>&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312" /&gt;<BR>&lt;meta http-equiv="Content-Language" content="zh-CN" /&gt;<BR>&lt;title&gt;中华网博客---注册&lt;/title&gt;</P>
<P>&lt;script&gt;<BR>function checkEmail (str) { <BR>&nbsp;&nbsp;//alert(str);<BR>&nbsp;&nbsp;isEmail1=/^\w+([\.\-]\w+)*\@\w+([\.\-]\w+)*\.\w+$/; <BR>&nbsp;&nbsp;<A href="mailto:isEmail2=/^.*@[^_]*$/">isEmail2=/^.*@[^_]*$/</A>;<BR>&nbsp;&nbsp;//alert(isEmail1.test(str)&amp;&amp;isEmail2.test(str));<BR>&nbsp;&nbsp;return (isEmail1.test(str)&amp;&amp;isEmail2.test(str)); <BR>}<BR>function IsDigit(cCheck)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;return (('0'&lt;=cCheck) &amp;&amp; (cCheck&lt;='9'));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>function IsAlpha(cCheck)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;return ((('a'&lt;=cCheck) &amp;&amp; (cCheck&lt;='z')) || (('A'&lt;=cCheck) &amp;&amp; (cCheck&lt;='Z')))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>function IsaNull(cCheck)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;return(cCheck != " ")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;<BR>function checkform(){<BR>&nbsp;//alert(document.bloguserForm.username.value);<BR>&nbsp;if (document.bloguserForm.username.value == ""){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;&nbsp;alert("请输入注册名");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;&nbsp;document.bloguserForm.username.focus();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;&nbsp;return false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;<BR>&nbsp; &nbsp;if(document.bloguserForm.username.value.length&gt;20 || document.bloguserForm.username.value.length&lt;6){<BR>&nbsp; &nbsp;&nbsp;alert("用户名为6到12个字母或数字");<BR>&nbsp; &nbsp;&nbsp;document.bloguserForm.username.focus();<BR>&nbsp; &nbsp;&nbsp;return false;<BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;<BR>&nbsp; &nbsp;for (nIndex=0; nIndex&lt;document.bloguserForm.username.value.length; nIndex++){<BR>&nbsp;&nbsp;cCheck = document.bloguserForm.username.value.charAt(nIndex);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;&nbsp;if (!(IsDigit(cCheck) || IsAlpha(cCheck) || cCheck=='-' || cCheck=='_' || cCheck=='.')){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;alert("用户名只能使用字母、数字以及-、_和.，并且不能使用中文");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;document.bloguserForm.username.focus();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;return false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp; &nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;if (document.bloguserForm.password.value == ""){<BR>&nbsp; &nbsp;&nbsp;alert("请输入注册密码");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;&nbsp;document.bloguserForm.password.focus();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;&nbsp;return false;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;if(document.bloguserForm.password.value.length &lt; 6 || document.bloguserForm.password.length &gt;20){<BR>&nbsp; &nbsp;&nbsp;alert("密码长度在6--12位之间！");<BR>&nbsp; &nbsp;&nbsp;document.bloguserForm.password.focus(); <BR>&nbsp; &nbsp;&nbsp;return false;<BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;if(document.bloguserForm.password.value!=document.bloguserForm.password1.value){<BR>&nbsp; &nbsp;&nbsp;alert("密码不匹配！");<BR>&nbsp; &nbsp;&nbsp;document.bloguserForm.password.focus();<BR>&nbsp; &nbsp;&nbsp;return false;<BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;if(document.bloguserForm.question.value == ""){<BR>&nbsp; &nbsp;&nbsp;alert("请输入密码问题！");<BR>&nbsp; &nbsp;&nbsp;document.bloguserForm.question.focus();<BR>&nbsp; &nbsp;&nbsp;return false;<BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;if(document.bloguserForm.answer.value == ""){<BR>&nbsp; &nbsp;&nbsp;alert("请输入密码回答！");<BR>&nbsp; &nbsp;&nbsp;document.bloguserForm.answer.focus();<BR>&nbsp; &nbsp;&nbsp;return false;<BR>&nbsp; &nbsp;}<BR>&nbsp; &nbsp;if(!checkEmail(document.bloguserForm.mailbox.value)){<BR>&nbsp;&nbsp;alert('邮箱地址错误！');<BR>&nbsp;&nbsp;document.bloguserForm.mailbox.focus();<BR>&nbsp;&nbsp;return false;<BR>&nbsp;}<BR>&nbsp; &nbsp;if(!checkEmail(document.bloguserForm.mailbox.value)){<BR>&nbsp;&nbsp;alert('邮箱地址错误！');<BR>&nbsp;&nbsp;document.bloguserForm.mailbox.focus();<BR>&nbsp;&nbsp;return false;<BR>&nbsp;}<BR>&nbsp;document.bloguserForm.submit();<BR>&nbsp;return true; &nbsp; <BR>}</P>
<P><BR>&lt;/script&gt;</P>
<P>&lt;link href="/form/css/style.css" rel="stylesheet" type="text/css" /&gt;<BR>&lt;/head&gt;</P>
<P>&lt;body&gt;<BR>&lt;br /&gt;<BR>&lt;table width="90%" border="0" cellpadding="0" cellspacing="0" align="center"&gt;<BR>&nbsp;&lt;tr&gt;&lt;td&gt;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&lt;/td&gt;&lt;/tr&gt;<BR>&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td height="31"&gt;&lt;table border="0" cellspacing="0" cellpadding="0"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="35" height="30"&gt;&lt;img src="/form/images/icon_greenball.jpg" width="23" height="21" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="tit_blue18"&gt;填写注册资料&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/table&gt;&lt;/td&gt;<BR>&nbsp; &lt;/tr&gt;<BR>&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td height="3" background="/form/images/bg_line.gif"&gt;&lt;/td&gt;<BR>&nbsp; &lt;/tr&gt;<BR>&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td height="8"&gt;&lt;/td&gt;<BR>&nbsp; &lt;/tr&gt;<BR>&lt;/table&gt;<BR>&lt;table width="90%" border="0" cellpadding="0" cellspacing="0" background="/form/images/bor_fillet05.gif" align="center"&gt;<BR>&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img src="/form/images/bor_fillet01.gif" width="6" height="6" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img name="" src="" width="1" height="1" alt="" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td align="right"&gt;&lt;img src="/form/images/bor_fillet02.gif" width="6" height="6" /&gt;&lt;/td&gt;<BR>&nbsp; &lt;/tr&gt;<BR>&lt;/table&gt;<BR>&lt;table width="90%" border="0" cellpadding="0" cellspacing="0" align="center"&gt;<BR>&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td width="6" background="/form/images/bor_fillet06.gif"&gt;&lt;img name="" src="" width="1" height="1" alt="" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;table width="95%" border="0" align="center" cellpadding="5" cellspacing="0" class="bor_btm txt_black"&gt;<BR>&nbsp;&lt;form name="bloguserForm" method="post" action="/bloguser.do"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="3%"&gt;&lt;img src="/form/images/icon_arrow.gif" width="9" height="9" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="13%"&gt;注册用户名:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="27%"&gt;&lt;input type="text" name="username" value=""&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td width="57%"&gt;&lt;span class="txt_red"&gt;*用户名为6-12个字母或数字&lt;/span&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img src="/form/images/icon_arrow.gif" width="9" height="9" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;注册用密码:&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type="password" name="password" value=""&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;span class="txt_red"&gt;密码为6-12个字母，密码区分大小写&lt;/span&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img src="/form/images/icon_arrow.gif" width="9" height="9" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;确认密码:&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type="password" name="password1" value=""&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;span class="txt_red"&gt;*&lt;/span&gt; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img src="/form/images/icon_arrow.gif" width="9" height="9" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;密码问题:&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type="text" name="question" value=""&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;span class="txt_red"&gt;*&lt;/span&gt; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img src="/form/images/icon_arrow.gif" width="9" height="9" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;密码回答:&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt; &lt;input type="text" name="answer" value=""&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;span class="txt_red"&gt;*&lt;/span&gt; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img src="/form/images/icon_arrow.gif" width="9" height="9" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;Email地址:&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;input type="text" name="mailbox" value=""&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;span class="txt_red"&gt;*&lt;/span&gt; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td colspan="4" align="center"&gt;&amp;nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="image" name="imageField" src="/form/images/btn_submit.gif" onclick="return checkform();"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<BR>&nbsp;&nbsp; &lt;/form&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/table&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td width="6" background="/form/images/bor_fillet07.gif"&gt;&lt;img name="" src="" width="1" height="1" alt="" /&gt;&lt;/td&gt;<BR>&nbsp; &lt;/tr&gt;<BR>&lt;/table&gt;<BR>&lt;table width="90%" border="0" cellpadding="0" cellspacing="0" background="/form/images/bor_fillet08.gif" align="center"&gt;<BR>&nbsp; &lt;tr&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img src="/form/images/bor_fillet03.gif" width="6" height="6" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;img name="" src="" width="1" height="1" alt="" /&gt;&lt;/td&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;td align="right"&gt;&lt;img src="/form/images/bor_fillet04.gif" width="6" height="6" /&gt;&lt;/td&gt;<BR>&nbsp; &lt;/tr&gt;<BR>&lt;/table&gt;<BR>&lt;/body&gt;<BR>&lt;/html&gt;<BR></P><img src ="http://www.cnitblog.com/windforce/aggbug/2976.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2005-09-29 16:19 <a href="http://www.cnitblog.com/windforce/articles/2976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载] MySQL SQL 语法参考</title><link>http://www.cnitblog.com/windforce/articles/2601.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Sun, 11 Sep 2005 21:02:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/2601.html</guid><description><![CDATA[<P><SPAN class=postbody><FONT size=2>转载自<A href="http://www.bsd8.com/php/mysql/199.htm"><FONT color=#800080>BDS吧</FONT></A><BR><BR>一、资料定义 ｄｄｌ（data definition language) <BR>资料定语言是指对资料的格式和形态下定义的语言，他是每个资料库要建立时候时首先要面对的，举凡资料分哪些表格关系、表格内的有什麽栏位主键、表格和表格之间互相参考的关系等等，都是在开始的时候所必须规划好的。 <BR><BR>１、建表格： <BR></FONT><FONT size=2>create table table_name( <BR>column1 datatype [not null] [not null primary key], <BR>column2 datatype [not null], <BR>...);<BR>说明：　 <BR>datatype --是资料的格式，详见表。 <BR>nut null --可不可以允许资料有空的（尚未有资料填入）。 <BR>primary key --是本表的主键。 <BR><BR>２、更改表格　 <BR></FONT><FONT size=2>alter table table_name <BR>add column column_name datatype <BR>说明：增加一个栏位（没有删除某个栏位的语法。 <BR></FONT><FONT size=2>alter table table_name <BR>add primary key (column_name) <BR>说明：更改表得的定义把某个栏位设为主键。 <BR></FONT><FONT size=2>alter table table_name <BR>drop primary key (column_name) <BR>说明：把主键的定义删除。 <BR><BR>３、建立索引　 <BR>create index index_name on table_name (column_name) <BR>说明：对某个表格的栏位建立索引以增加查询时的速度。 <BR><BR>４、删除　 <BR></FONT><FONT size=2>drop table_name <BR>drop index_name <BR><BR>二、的资料形态 datatypes <BR>smallint <BR>16 位元的整数。 <BR>interger <BR>32 位元的整数。 <BR>decimal(p,s) <BR>p 精确值和 s 大小的十进位整数，精确值p是指全部有几个数(digits)大小值，s是指小数 <BR>点後有几位数。如果没有特别指定，则系统会设为 p=5; s=0 。 <BR>float <BR>32位元的实数。 <BR>double <BR>64位元的实数。 <BR>char(n) <BR>n 长度的字串，n不能超过 254。 <BR>varchar(n) <BR>长度不固定且其最大长度为 n 的字串，n不能超过 4000。 <BR>graphic(n) <BR>和 char(n) 一样，不过其单位是两个字元 double-bytes， n不能超过127。这个形态是为 <BR>了支援两个字元长度的字体，例如中文字。 <BR>vargraphic(n) <BR>可变长度且其最大长度为 n 的双字元字串，n不能超过 2000。 <BR>date <BR>包含了 年份、月份、日期。 <BR>time <BR>包含了 小时、分钟、秒。 <BR>timestamp <BR>包含了 年、月、日、时、分、秒、千分之一秒。 <BR><BR>三、资料操作 ｄｍｌ （data manipulation language) <BR>资料定义好之後接下来的就是资料的操作。资料的操作不外乎增加资料（insert)、查询资料（query）、更改资料（update) 、删除资料（delete）四种模式，以下分 别介绍他们的语法： <BR><BR>１、增加资料： <BR></FONT><FONT size=2>insert into table_name (column1,column2,...) <BR>values ( value1,value2, ...) <BR>说明： <BR>1.若没有指定column 系统则会按表格内的栏位顺序填入资料。 <BR>2.栏位的资料形态和所填入的资料必须吻合。 <BR>3.table_name 也可以是景观 view_name。 <BR><BR></FONT><FONT size=2>insert into table_name (column1,column2,...) <BR>select columnx,columny,... from another_table <BR>说明：也可以经过一个子查询（subquery）把别的表格的资料填入。 <BR><BR>２、查询资料： <BR>基本查询 <BR></FONT><FONT size=2>select column1,columns2,... <BR>from table_name <BR>说明：把table_name 的特定栏位资料全部列出来 <BR></FONT><FONT size=2>select * <BR>from table_name <BR>where column1 = xxx <BR>[and column2 > yyy] [or column3 <> zzz] <BR>说明： <BR>1.'*'表示全部的栏位都列出来。 <BR>2.where 之後是接条件式，把符合条件的资料列出来。 <BR><BR></FONT><FONT size=2>select column1,column2 <BR>from table_name <BR>order by column2 [desc] <BR>说明：order by 是指定以某个栏位做排序，[desc]是指从大到小排列，若没有指明，则是从小到大 <BR>排列 <BR><BR>组合查询 <BR>组合查询是指所查询得资料来源并不只有单一的表格，而是联合一个以上的 <BR>表格才能够得到结果的。 <BR></FONT><FONT size=2>select * <BR>from table1,table2 <BR>where table1.colum1=table2.column1 <BR>说明： <BR>1.查询两个表格中其中 column1 值相同的资料。 <BR>2.当然两个表格相互比较的栏位，其资料形态必须相同。 <BR>3.一个复杂的查询其动用到的表格可能会很多个。 <BR><BR>整合性的查询： <BR></FONT><FONT size=2>select count (*) <BR>from table_name <BR>where column_name = xxx <BR>说明： <BR>查询符合条件的资料共有几笔。 <BR></FONT><FONT size=2>select sum(column1) <BR>from table_name <BR>说明： <BR>1.计算出总和，所选的栏位必须是可数的数字形态。 <BR>2.除此以外还有 avg() 是计算平均、max()、min()计算最大最小值的整合性查询。 <BR></FONT><FONT size=2>select column1,avg(column2) <BR>from table_name <BR>group by column1 <BR>having avg(column2) > xxx <BR>说明： <BR>1.group by: 以column1 为一组计算 column2 的平均值必须和 avg、sum等整合性查询的关键字 <BR>一起使用。 <BR>2.having : 必须和 group by 一起使用作为整合性的限制。 <BR><BR>复合性的查询 <BR></FONT><FONT size=2>select * <BR>from table_name1 <BR>where exists ( <BR>select * <BR>from table_name2 <BR>where conditions ) <BR>说明： <BR>1.where 的 conditions 可以是另外一个的 query。 <BR>2.exists 在此是指存在与否。 <BR></FONT><FONT size=2>select * <BR>from table_name1 <BR>where column1 in ( <BR>select column1 <BR>from table_name2 <BR>where conditions ) <BR>说明：　 <BR>1. in 後面接的是一个集合，表示column1 存在集合里面。 <BR>2. select 出来的资料形态必须符合 column1。 <BR><BR>其他查询 <BR></FONT><FONT size=2>select * <BR>from table_name1 <BR>where column1 like 'x%' <BR>说明：like 必须和後面的'x%' 相呼应表示以 x为开头的字串。 <BR></FONT><FONT size=2>select * <BR>from table_name1 <BR>where column1 in ('xxx','yyy',..) <BR>说明：in 後面接的是一个集合，表示column1 存在集合里面。 <BR></FONT><FONT size=2>select * <BR>from table_name1 <BR>where column1 between xx and yy <BR>说明：between 表示 column1 的值介於 xx 和 yy 之间。 <BR><BR>３、更改资料： <BR></FONT><FONT size=2>update table_name <BR>set column1='xxx' <BR>where conditoins <BR>说明： <BR>1.更改某个栏位设定其值为'xxx'。 <BR>2.conditions 是所要符合的条件、若没有 where 则整个 table 的那个栏位都会全部被更改。 <BR><BR>４、删除资料： <BR></FONT><FONT size=2>delete from table_name <BR>where conditions <BR>说明：删除符合条件的资料。 <BR><BR>说明：关于where条件后面如果包含有日期的比较，不同数据库有不同的表达式。具体如下： <BR>(1)如果是access数据库，则为：where mydate>#2000-01-01# <BR>(2)如果是oracle数据库，则为：where mydate>cast('2000-01-01' as date) <BR>或：where mydate>to_date('2000-01-01','yyyy-mm-dd') <BR>在delphi中写成： <BR></FONT><FONT size=2>thedate='2000-01-01'; <BR>query1.sql.add('select * from abc where mydate>cast('+''''+thedate+''''+' as date)'); <BR><BR>如果比较日期时间型，则为： <BR>where mydatetime>to_date('2000-01-01 10:00:01','yyyy-mm-dd hh24:mi:ss');</FONT></SPAN></P><img src ="http://www.cnitblog.com/windforce/aggbug/2601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2005-09-12 05:02 <a href="http://www.cnitblog.com/windforce/articles/2601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>操作系统进程描述(转载)</title><link>http://www.cnitblog.com/windforce/articles/process.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Wed, 27 Jul 2005 04:38:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/process.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/1147.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/process.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/1147.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/1147.html</trackback:ping><description><![CDATA[<P><FONT color=red><B><FONT color=#000000></FONT><FONT color=#000000>转载自<A href="http://www.5tb.com/list.asp?id=1119">http://www.5tb.com/list.asp?id=1119</A></FONT><BR><BR>系统进程</B></FONT></P>
<P><B>system process</B><BR>进程文件: [system process] or [system process]<BR>进程名称: Windows内存处理系统进程<BR>描述: Windows页面内存管理进程，拥有0级优先。</P>
<P><B>alg.exe</B><BR>进程文件: alg or alg.exe<BR>进程名称: 应用层网关服务<BR>描述: 这是一个应用层网关服务用于网络共享。</P>
<P><B>csrss.exe</B><BR>进程文件: csrss or csrss.exe<BR>进程名称: Client/Server Runtime Server Subsystem<BR>描述: 客户端服务子系统，用以控制Windows图形相关子系统。</P>
<P><B>ddhelp.exe</B><BR>进程文件: ddhelp or ddhelp.exe<BR>进程名称: DirectDraw Helper<BR>描述: DirectDraw Helper是DirectX这个用于图形服务的一个组成部分。</P>
<P><B>dllhost.exe</B><BR>进程文件: dllhost or dllhost.exe<BR>进程名称: DCOM DLL Host进程<BR>描述: DCOM DLL Host进程支持基于COM对象支持DLL以运行Windows程序。</P>
<P><B>inetinfo.exe</B><BR>进程文件: inetinfo or inetinfo.exe<BR>进程名称: IIS Admin Service Helper<BR>描述: InetInfo是Microsoft Internet Infomation Services (IIS)的一部分，用于Debug调试除错。</P>
<P><B>internat.exe</B><BR>进程文件: internat or internat.exe<BR>进程名称: Input Locales<BR>描述: 这个输入控制图标用于更改类似国家设置、键盘类型和日期格式。</P>
<P><B>kernel32.dll</B><BR>进程文件: kernel32 or kernel32.dll<BR>进程名称: Windows壳进程<BR>描述: Windows壳进程用于管理多线程、内存和资源。</P>
<P><B>lsass.exe</B><BR>进程文件: lsass or lsass.exe<BR>进程名称: 本地安全权限服务<BR>描述: 这个本地安全权限服务控制Windows安全机制。</P>
<P><B>mdm.exe</B><BR>进程文件: mdm or mdm.exe<BR>进程名称: Machine Debug Manager<BR>描述: Debug除错管理用于调试应用程序和Microsoft Office中的Microsoft Script Editor脚本编辑器。</P>
<P><B>mmtask.tsk</B><BR>进程文件: mmtask or mmtask.tsk<BR>进程名称: 多媒体支持进程<BR>描述: 这个Windows多媒体后台程序控制多媒体服务，例如MIDI。</P>
<P><B>mprexe.exe</B><BR>进程文件: mprexe or mprexe.exe<BR>进程名称: Windows路由进程<BR>描述: Windows路由进程包括向适当的网络部分发出网络请求。</P>
<P><B>msgsrv32.exe</B><BR>进程文件: msgsrv32 or msgsrv32.exe<BR>进程名称: Windows信使服务<BR>描述: Windows信使服务调用Windows驱动和程序管理在启动。</P>
<P><B>mstask.exe</B><BR>进程文件: mstask or mstask.exe<BR>进程名称: Windows计划任务<BR>描述: Windows计划任务用于设定继承在什么时间或者什么日期备份或者运行。</P>
<P><B>regsvc.exe</B><BR>进程文件: regsvc or regsvc.exe<BR>进程名称: 远程注册表服务<BR>描述: 远程注册表服务用于访问在远程计算机的注册表。</P>
<P><B>rpcss.exe</B><BR>进程文件: rpcss or rpcss.exe<BR>进程名称: RPC Portmapper<BR>描述: Windows 的RPC端口映射进程处理RPC调用(远程模块调用)然后把它们映射给指定的服务提供者。</P>
<P><B>services.exe</B><BR>进程文件: services or services.exe<BR>进程名称: Windows Service Controller<BR>描述: 管理Windows服务。</P>
<P><B>smss.exe</B><BR>进程文件: smss or smss.exe<BR>进程名称: Session Manager Subsystem<BR>描述: 该进程为会话管理子系统用以初始化系统变量，MS-DOS驱动名称类似LPT1以及COM，调用Win32壳子系统和运行在Windows登陆过程。</P>
<P><B>snmp.exe</B><BR>进程文件: snmp or snmp.exe<BR>进程名称: Microsoft SNMP Agent<BR>描述: Windows简单的网络协议代理（SNMP）用于监听和发送请求到适当的网络部分。</P>
<P><B>spool32.exe</B><BR>进程文件: spool32 or spool32.exe<BR>进程名称: Printer Spooler<BR>描述: Windows打印任务控制程序，用以打印机就绪。</P>
<P><B>spoolsv.exe</B><BR>进程文件: spoolsv or spoolsv.exe<BR>进程名称: Printer Spooler Service<BR>描述: Windows打印任务控制程序，用以打印机就绪。</P>
<P><B>stisvc.exe</B><BR>进程文件: stisvc or stisvc.exe<BR>进程名称: Still Image Service<BR>描述: Still Image Service用于控制扫描仪和数码相机连接在Windows。</P>
<P><B>svchost.exe</B><BR>进程文件: svchost or svchost.exe<BR>进程名称: Service Host Process<BR>描述: Service Host Process是一个标准的动态连接库主机处理服务。</P>
<P><B>system</B><BR>进程文件: system or system<BR>进程名称: Windows System Process<BR>描述: Microsoft Windows系统进程。</P>
<P><B>taskmon.exe</B><BR>进程文件: taskmon or taskmon.exe<BR>进程名称: Windows Task Optimizer<BR>描述: windows任务优化器监视你使用某个程序的频率，并且通过加载那些经常使用的程序来整理优化硬盘。</P>
<P><B>tcpsvcs.exe</B><BR>进程文件: tcpsvcs or tcpsvcs.exe<BR>进程名称: TCP/IP Services<BR>描述: TCP/IP Services Application支持透过TCP/IP连接局域网和Internet。</P>
<P><B>winlogon.exe</B><BR>进程文件: winlogon or winlogon.exe<BR>进程名称: Windows Logon Process<BR>描述: Windows NT用户登陆程序。</P>
<P><B>winmgmt.exe</B><BR>进程文件: winmgmt or winmgmt.exe<BR>进程名称: Windows Management Service<BR>描述: Windows Management Service透过Windows Management Instrumentation data (WMI)技术处理来自应用客户端的请求。</P>
<P><FONT color=red><B>程序进程（非系统进程）</B></FONT></P>
<P><B>absr.exe</B><BR>进程文件: absr or absr.exe<BR>进程名称: Backdoor.Autoupder Virus<BR>描述: 这个进程是Backdoor.Autoupder后门病毒程序创建的。</P>
<P><B>acrobat.exe</B><BR>进程文件: acrobat or acrobat.exe<BR>进程名称: Adobe Acrobat<BR>描述: Acrobat Writer用于创建PDF文档。</P>
<P><B>acrord32.exe</B><BR>进程文件: acrord32 or acrord32.exe<BR>进程名称: Acrobat Reader<BR>描述: Acrobat Reader是一个用于阅读PDF文档的软件。</P>
<P><B>agentsvr.exe</B><BR>进程文件: agentsvr or agentsvr.exe<BR>进程名称: OLE automation server<BR>描述: OLE Automation Server是Microsoft Agent的一部分。</P>
<P><B>aim.exe</B><BR>进程文件: aim or aim.exe<BR>进程名称: AOL Instant Messenger<BR>描述: AOL Instant Messenger是一个在线聊天和即时通讯IM软件客户端。</P>
<P><B>airsvcu.exe</B><BR>进程文件: airsvcu or airsvcu.exe<BR>进程名称: Microsoft Media Manager<BR>描述: OLE 这是一个用于在硬盘上建立索引文件和文件夹，在Microsoft Media Manager媒体管理启动时运行的进程。它可以在控制面板被禁用。</P>
<P><B>alogserv.exe</B><BR>进程文件: alogserv or alogserv.exe<BR>进程名称: McAfee VirusScan<BR>描述: McAfee VirusScan是一个反病毒软件用于扫描你的文档和E-mail中的病毒。</P>
<P><B>avconsol.exe</B><BR>进程文件: avconsol or avconsol.exe<BR>进程名称: McAfee VirusScan<BR>描述: McAfee VirusScan是一个反病毒软件用于扫描你的文档和E-mail中的病毒。</P>
<P><B>avsynmgr.exe</B><BR>进程文件: avsynmgr or avsynmgr.exe<BR>进程名称: McAfee VirusScan<BR>描述: McAfee VirusScan是一个反病毒软件用于扫描你的文档和E-mail中的病毒。</P>
<P><B>backWeb.exe</B><BR>进程文件: backWeb or backWeb.exe<BR>进程名称: Backweb Adware<BR>描述: Backweb是一个Adware（广告插件，一般是由于安装某些免费软件而伴随安装上的程序）来自Backweb Technologies。</P>
<P><B>bcb.exe</B><BR>进程文件: bcb or bcb.exe<BR>进程名称: Borland C++ Builder<BR>描述: Borland C++ Builder</P>
<P><B>calc.exe</B><BR>进程文件: calc or calc.exe<BR>进程名称: Calculator<BR>描述: Microsoft Windows计算器程序</P>
<P><B>ccapp.exe</B><BR>进程文件: ccapp or ccapp.exe<BR>进程名称: Symantec Common Client<BR>描述: Symantec公用应用客户端包含在Norton AntiVirus 2003和Norton Personal Firewall 2003。</P>
<P><B>cdplayer.exe</B><BR>进程文件: cdplayer or cdplayer.exe<BR>进程名称: CD Player<BR>描述: Microsoft Windows包含的CD播放器</P>
<P><B>charmap.exe</B><BR>进程文件: charmap or charmap.exe<BR>进程名称: Windows Character Map<BR>描述: Windows字符映射表用来帮助你寻找不常见的字符。</P>
<P><B>idaemon.exe</B><BR>进程文件: cidaemon or cidaemon.exe<BR>进程名称: Microsoft Indexing Service<BR>描述: 在后台运行的Windows索引服务，用于帮助你搜索文件在下次变得更快。</P>
<P><B>cisvc.exe</B><BR>进程文件: cisvc or cisvc.exe<BR>进程名称: Microsoft Index Service Helper<BR>描述: Microsoft Index Service Helper监视Microsoft Indexing Service (cidaemon.exe) 的内存占用情况，如果cidaemon.exe内存使用超过了40M，则自动重新启动该进程。</P>
<P><B>cmd.exe</B><BR>进程文件: cmd or cmd.exe<BR>进程名称: Windows Command Prompt<BR>描述: Windows控制台程序。不像旧的command.com，cmd.exe是一个32位的命令行使用在WinNT/2000/XP。</P>
<P><B>cmesys.exe</B><BR>进程文件: cmesys or cmesys.exe<BR>进程名称: Gator GAIN Adware<BR>描述: Gator GAIN是一个Adware插件（广告插件，一般是由于安装某些免费软件而伴随安装上的程序）。</P>
<P><B>ctfmon.exe</B><BR>进程文件: ctfmon or ctfmon.exe<BR>进程名称: Alternative User Input Services<BR>描述: 控制Alternative User Input Text Processor (TIP)和Microsoft Office语言条。Ctfmon.exe提供语音识别、手写识别、键盘、翻译和其它用户输入技术的支持。</P>
<P><B>ctsvccda.exe</B><BR>进程文件: ctsvccda or ctsvccda.exe<BR>进程名称: Create CD-ROM Services<BR>描述: 在Win9X创建CD-ROM访问服务。</P>
<P><B>cutftp.exe</B><BR>进程文件: cutftp or cutftp.exe<BR>进程名称: CuteFTP<BR>描述: CuteFTP是一个流行的FTP客户端用于从FTP服务器上传/下载文件。</P>
<P><B>defwatch.exe</B><BR>进程文件: defwatch or defwatch.exe<BR>进程名称: Norton AntiVirus<BR>描述: Norton Anti-Virus扫描你的文件和email以检查病毒。</P>
<P><B>devldr32.exe</B><BR>进程文件: devldr32 or devldr32.exe<BR>进程名称: Create Device Loader<BR>描述: Creative Device Loader属于Create Soundblaster驱动。</P>
<P><B>directcd.exe</B><BR>进程文件: directcd or directcd.exe<BR>进程名称: Adaptec DirectCD<BR>描述: Adaptec DirectCD是一个用文件管理器式的界面，烧录文件到光盘的软件。</P>
<P><B>dreamweaver.exe</B><BR>进程文件: dreamweaver or dreamweaver.exe<BR>进程名称: Macromedia DreamWeaver<BR>描述: Macromedia DreamWeaver是一个HTML编辑器用于创建站点和其它类别的HTML文档。</P>
<P><B>em_exec.exe</B><BR>进程文件: em_exec or em_exec.exe<BR>进程名称: Logitech Mouse Settings<BR>描述: 这是Logitech MouseWare状态栏图标的进程，用于用户访问控制鼠标属性和察看MouseWare帮助。</P>
<P><B>excel.exe</B><BR>进程文件: excel or excel.exe<BR>进程名称: Microsoft Excel<BR>描述: Microsoft Excel是一个电子表格程序包括在Microsoft Office中。</P>
<P><B>findfast.exe</B><BR>进程文件: findfast or findfast.exe<BR>进程名称: Microsoft Office Indexing<BR>描述: Microsoft Office索引程序，用于提高Microsoft Office索引Office文档的速度。</P>
<P><B>frontpage.exe</B><BR>进程文件: frontpage or frontpage.exe<BR>进程名称: Microsoft FrontPage<BR>描述: Microsoft FrontPage是一个HTML编辑器用于创建站点和其它类别的HTML文档。</P>
<P><B>gmt.exe</B><BR>进程文件: gmt or gmt.exe<BR>进程名称: Gator Spyware Component<BR>描述: Gator Spyware是一个广告插件，随Gator安装和启动。</P>
<P><B>hh.exe</B><BR>进程文件: hh or hh.exe<BR>进程名称: Gator Windows Help<BR>描述: Windows Help程序用以打开帮助文件和文档，包括在很多Windows程序中。</P>
<P><B>hidserv.exe</B><BR>进程文件: hidserv or hidserv.exe<BR>进程名称: Microsoft Human Interface Device Audio Service<BR>描述: 后台服务，用来支持USB音效部件和USB多媒体键盘。</P>
<P><B>QQ.exe</B><BR>进程文件: QQ or QQ.exe<BR>进程名称: QQ<BR>描述: QQ是一个在线聊天和即时通讯客户端。</P>
<P><B>iexplore.exe</B><BR>进程文件: iexplore or iexplore.exe<BR>进程名称: Internet Explorer<BR>描述: Microsoft Internet Explorer网络浏览器透过HTTP访问WWW万维网。</P>
<P><B>kodakimage.exe</B><BR>进程文件: kodakimage or kodakimage.exe<BR>进程名称: Imaging<BR>描述: Kodak Imaging是一个图片察看软件。包括在Windows，用以打开图像文件。</P>
<P><B>loadqm.exe</B><BR>进程文件: loadqm or loadqm.exe<BR>进程名称: MSN Queue Manager Loader<BR>描述: MSN Queue Manager Loader被随着MSN Explorer和MSN Messenger安装。他在一些时候会占用很多系统资源。</P>
<P><B>loadwc.exe</B><BR>进程文件: loadwc or loadwc.exe<BR>进程名称: Load WebCheck<BR>描述: Load WebCheck用以定制一些Internet Explorer的设定，添加、删除或者更新用户profiles设定。</P>
<P><B>mad.exe</B><BR>进程文件: mad or mad.exe<BR>进程名称: System Attendant Service<BR>描述: System Attendant Service是Microsoft Exchange Server的后台程序。它用以读取Microsoft Exchange的DLLs文件，写log信息和生成离线地址薄。</P>
<P><B>mcshield.exe</B><BR>进程文件: mcshield or mcshield.exe<BR>进程名称: McAfee VirusScan<BR>描述: McAfee VirusScan是一个反病毒软件用以扫描你的文件和email中的病毒。</P>
<P><B>mgabg.exe</B><BR>进程文件: mgabg or mgabg.exe<BR>进程名称: Matrox BIOS Guard<BR>描述: Matrox BIOS守护进程。</P>
<P><B>mmc.exe</B><BR>进程文件: mmmc or mmc.exe<BR>进程名称: Microsoft Management Console<BR>描述: Microsoft Management Console管理控制程序集成了很多的系统控制选项。例如设备管理（系统、硬件 <BR>）或者计算机权限控制（Administrative管理工具）。</P>
<P><B>mobsync.exe</B><BR>进程文件: mobsync or mobsync.exe<BR>进程名称: Microsoft Synchronization Manager<BR>描述: Internet Explorer的一个组成部分，用以在后台同步离线察看页面。</P>
<P><B>mplayer.exe</B><BR>进程文件: mplayer or mplayer.exe<BR>进程名称: Windows Media Player<BR>描述: Windows Media Player是一个用以打开音乐、声音和视频文件的软件。</P>
<P><B>mplayer2.exe</B><BR>进程文件: mplayer2 or mplayer2.exe<BR>进程名称: Windows Media Player<BR>描述: Windows Media Player是一个用以打开音乐、声音和视频文件的软件。</P>
<P><B>msaccess.exe</B><BR>进程文件: msaccess or msaccess.exe<BR>进程名称: Microsoft Access<BR>描述: Microsoft Access是一个数据库软件包括在Microsoft Office。</P>
<P><B>msbb.exe</B><BR>进程文件: msbb or msbb.exe<BR>进程名称: MSBB Web3000 Spyware Application<BR>描述: MSBB Web3000 Spyware是包括在一些adware产品中，利用注册表随Windows启动。</P>
<P><B>msdtc.exe</B><BR>进程文件: msdtc or msdtc.exe<BR>进程名称: Distributed Transaction Coordinator<BR>描述: Microsoft Distributed Transaction Coordinator控制多个服务器的传输，被安装在Microsoft Personal Web Server和Microsoft SQL Server。</P>
<P><B>msiexec.exe</B><BR>进程文件: msiexec or msiexec.exe<BR>进程名称: Windows Installer Component<BR>描述: Windows Installer的一部分。用来帮助Windows Installer package files (MSI)格式的安装文件。</P>
<P><B>msimn.exe</B><BR>进程文件: msimn or msimn.exe<BR>进程名称: Microsoft Outlook Express<BR>描述: Microsoft Outlook Express是一个Email和新闻组客户端包括在Microsoft Windows。</P>
<P><B>msmsgs.exe</B><BR>进程文件: msmsgs or msmsgs.exe<BR>进程名称: MSN Messenger Traybar Process<BR>描述: MSN Messenger是一个在线聊天和即时通讯客户端。</P>
<P><B>msoobe.exe</B><BR>进程文件: msoobe or msoobe.exe<BR>进程名称: Windows Product Activation<BR>描述: Windows XP License的Product Activation产品激活程序。</P>
<P><B>mspaint.exe</B><BR>进程文件: mspaint or mspaint.exe<BR>进程名称: Microsoft Paint<BR>描述: Microsoft Paint画图是一个图像编辑器包括在Microsoft Windows，它能够编辑bmp图像。</P>
<P><B>mspmspsv.exe</B><BR>进程文件: mspmspsv or mspmspsv.exe<BR>进程名称: WMDM PMSP Service<BR>描述: Windows Media Player 7需要安装的Helper Service。</P>
<P><B>mysqld-nt.exe</B><BR>进程文件: mysqld-nt or mysqld-nt.exe<BR>进程名称: MySQL Daemon<BR>描述: MySQL Daemon控制访问MySQL数据库。</P>
<P><B>navapsvc.exe</B><BR>进程文件: navapsvc or navapsvc.exe<BR>进程名称: Norton AntiVirus Auto-Protect Service<BR>描述: Norton Anti-Virus扫描你的文件和email中的病毒。</P>
<P><B>navapw32.exe</B><BR>进程文件: navapw32 or navapw32.exe<BR>进程名称: Norton AntiVirus Agent<BR>描述: Norton Anti-Virus扫描你的文件和email中的病毒。</P>
<P><B>ndetect.exe</B><BR>进程文件: ndetect or ndetect.exe<BR>进程名称: ICQ Ndetect Agent<BR>描述: ICQ Ndetect Agent是ICQ用来侦测网络连接的程序。</P>
<P><B>netscape.exe</B><BR>进程文件: netscape or netscape.exe<BR>进程名称: Netscape<BR>描述: Netscape网络浏览器通过HTTP浏览WWW万维网。</P>
<P><B>notepad.exe</B><BR>进程文件: notepad or notepad.exe<BR>进程名称: Notepad<BR>描述: Notepad字符编辑器用于打开文档。在Windows中附带。</P>
<P><B>ntbackup.exe</B><BR>进程文件: ntbackup or ntbackup.exe<BR>进程名称: Windows Backup<BR>描述: Windows备份工具用于备份文件和文件夹。</P>
<P><B>ntvdm.exe</B><BR>进程文件: ntvdm or ntvdm.exe<BR>进程名称: Windows 16-bit Virtual Machine<BR>描述: Windows Virtual Machine是为了兼容旧的16位Windows和DOS程序而设置的虚拟机。</P>
<P><B>nvsvc32.exe</B><BR>进程文件: nvsvc32 or nvsvc32.exe<BR>进程名称: NVIDIA Driver Helper Service<BR>描述: NVIDIA Driver Helper Service在NVIDA显卡驱动中被安装。</P>
<P><B>nwiz.exe</B><BR>进程文件: nwiz or nwiz.exe<BR>进程名称: NVIDIA nView Control Panel<BR>描述: NVIDIA nView控制面板在NVIDA显卡驱动中被安装，用于调整和设定。</P>
<P><B>osa.exe</B><BR>进程文件: osa or osa.exe<BR>进程名称: Office Startup Assistant<BR>描述: Microsoft Office启动助手，随Windows启动，增强启动、Office字体、命令和Outlook事务提醒等特性。</P>
<P><B>outlook.exe</B><BR>进程文件: outlook or outlook.exe<BR>进程名称: Microsoft Outlook<BR>描述: Microsoft Outlook是一个Email客户端包括在Microsoft Office。</P>
<P><B>photoshop.exe</B><BR>进程文件: photoshop or photoshop.exe<BR>进程名称: Adobe Photoshop<BR>描述: Adobe Photoshop是一个图像编辑软件，能够打开和编辑照片和其它更多类型格式的图片。</P>
<P><B>point32.exe</B><BR>进程文件: point32 or point32.exe<BR>进程名称: Microsoft Intellimouse Monitor<BR>描述: Microsoft Intellimouse Monitor添加一个鼠标设定图标在工具栏。</P>
<P><B>powerpnt.exe</B><BR>进程文件: powerpnt or powerpnt.exe<BR>进程名称: Microsoft PowerPoint<BR>描述: Microsoft PowerPoint是一个演示软件包括在Microsoft Office。</P>
<P><B>pstores.exe</B><BR>进程文件: pstores or pstores.exe<BR>进程名称: Protected Storage Service<BR>描述: Microsoft Protected Storage服务控制保密的内容密码。</P>
<P><B>qttask.exe</B><BR>进程文件: qttask or qttask.exe<BR>进程名称: Quick Time Tray Icon<BR>描述: Quick Time任务栏图标在你运行Quick Time的时候启动。</P>
<P><B>realplay.exe</B><BR>进程文件: realplay or realplay.exe<BR>进程名称: Real Player<BR>描述: Real Player是一个媒体播放器用来打开和播放音乐、声音和Real Media格式的视频文件。</P>
<P><B>rnaapp.exe</B><BR>进程文件: rnaapp or rnaapp.exe<BR>进程名称: Windows Modem Connection<BR>描述: Windows Modem连接控制用以控制拨号modem连接。</P>
<P><B>rtvscan.exe</B><BR>进程文件: rtvscan or rtvscan.exe<BR>进程名称: Norton AntiVirus<BR>描述: Norton Anti-Virus用以扫描你的文件和email中的病毒。</P>
<P><B>rundll32.exe</B><BR>进程文件: rundll32 or rundll32.exe<BR>进程名称: Windows RUNDLL32 Helper<BR>描述: Windows Rundll32为了需要调用DLLs的程序。</P>
<P><B>sndrec32.exe</B><BR>进程文件: sndrec32 or sndrec32.exe<BR>进程名称: Windows Sound Recorder<BR>描述: Windows录音机用以播放和录制声音文件(.wav)。</P>
<P><B>sndvol32.exe</B><BR>进程文件: sndvol32 or sndvol32.exe<BR>进程名称: Windows Volume Control<BR>描述: Windows声音控制进程在任务栏驻留用以控制音量和声卡相关。</P>
<P><B>spoolss.exe</B><BR>进程文件: spoolss or spoolss.exe<BR>进程名称: Printer Spooler Subsystem<BR>描述: Windows打印机控制子程序用以调用需要打印的内容从磁盘到打印机。</P>
<P><B>starter.exe</B><BR>进程文件: starter or starter.exe<BR>进程名称: Creative Labs Ensoniq Mixer Tray icon<BR>描述: 状态栏图标在Creative Sound Mixer中被安装。为了Creative声卡 (Soundblaster)。</P>
<P><B>systray.exe</B><BR>进程文件: systray or systray.exe<BR>进程名称: Windows Power Management<BR>描述: Windows电源管理程序用以控制节能和恢复启动。</P>
<P><B>tapisrv.exe</B><BR>进程文件: tapisrv or tapisrv.exe<BR>进程名称: TAPI Service<BR>描述: Windows Telephony (TAPI) 的后台服务程序。</P>
<P><B>userinit.exe</B><BR>进程文件: userinit or userinit.exe<BR>进程名称: UserInit Process<BR>描述: UserInit程序运行登陆脚本，建立网络连接和启动Shell壳。</P>
<P><B>visio.exe</B><BR>进程文件: visio or visio.exe<BR>进程名称: Microsoft Visio<BR>描述: Microsoft Visio是一个图形化管理软件。</P>
<P><B>vptray.exe</B><BR>进程文件: vptray or vptray.exe<BR>进程名称: Norton AntiVirus<BR>描述: Norton Anti-Virus扫描你的文件和email中的病毒。</P>
<P><B>vshwin32.exe</B><BR>进程文件: vshwin32 or vshwin32.exe<BR>进程名称: McAfee VirusScan<BR>描述: McAfee VirusScan是一个反病毒软件用以扫描你的文件和email中的病毒。</P>
<P><B>vsmon.exe</B><BR>进程文件: vsmon or vsmon.exe<BR>进程名称: True Vector Internet Monitor<BR>描述: True Vector Internet Monitor是ZoneAlarm个人防火墙的一部分，用以监视网络流经数据和攻击。</P>
<P><B>vsstat.exe</B><BR>进程文件: vsstat or vsstat.exe<BR>进程名称: McAfee VirusScan<BR>描述: McAfee VirusScan是一个反病毒软件用以扫描你的文件和email中的病毒。</P>
<P><B>wab.exe</B><BR>进程文件: wab or wab.exe<BR>进程名称: Address Book<BR>描述: 在Outlook中的地址薄。用来存放email地址、联系信息。</P>
<P><B>webscanx.exe</B><BR>进程文件: webscanx or webscanx.exe<BR>进程名称: McAfee VirusScan<BR>描述: McAfee VirusScan是一个反病毒软件用以扫描你的文件和email中的病毒。</P>
<P><B>winamp.exe</B><BR>进程文件: winamp or winamp.exe<BR>进程名称: WinAmp<BR>描述: WinAmp Media Player是一个用来打开音乐、声音和视频文件以及用以管理Mp3文件的软件。</P>
<P><B>winhlp32.exe</B><BR>进程文件: winhlp32 or winhlp32.exe<BR>进程名称: Windows Help<BR>描述: Windows帮助文件察看程序，用来打开帮助文档。该程序被包括在很多的Windows程序中。</P>
<P><B>winoa386.mod</B><BR>进程文件: winoa386 or winoa386.mod<BR>进程名称: MS-DOS Console<BR>描述: Windows MS-DOS控制台用以DOS命令和脚本。</P>
<P><B>winproj.exe</B><BR>进程文件: winproj or winproj.exe<BR>进程名称: Microsoft Project<BR>描述: Microsoft Project是一个项目计划编制程序。</P>
<P><B>winroute.exe</B><BR>进程文件: winroute or winroute.exe<BR>进程名称: WinRoute<BR>描述: WinRoute是一个基于Windows的防火墙/路由/连接共享软件。</P>
<P><B>winword.exe</B><BR>进程文件: winword or winword.exe<BR>进程名称: Microsoft Word<BR>描述: Microsoft Word是一个字处理程序包括在Microsoft Office。</P>
<P><B>winzip32.exe</B><BR>进程文件: winzip32 or winzip32.exe<BR>进程名称: WinZip<BR>描述: WinZip是一个文件压缩工具，用于创建，打开和解压zip文件。</P>
<P><B>wkcalrem.exe</B><BR>进程文件: wkcalrem or wkcalrem.exe<BR>进程名称: Microsoft Works Calendar Reminder<BR>描述: Microsoft Works Calendar Reminders工作日程提醒，在后台处理和显示弹出计划的工作日志提醒。</P>
<P><B>wkqkpick.exe</B><BR>进程文件: wkqkpick or wkqkpick.exe<BR>进程名称: WinZip traybar icon<BR>描述: WinZip的状态栏图标，被允许在Winzip启动时启动。</P>
<P><B>wmplayer.exe</B><BR>进程文件: wmplayer or wmplayer.exe<BR>进程名称: Windows Media Player<BR>描述: Windows Media Player是一个用来打开和播放音乐，声音和视频的软件。</P>
<P><B>wordpad.exe</B><BR>进程文件: wordpad or wordpad.exe<BR>进程名称: Wordpad<BR>描述: Wordpad是一个字符编辑器用以打开和编辑txt和rtf档。</P>
<P><B>wowexec.exe</B><BR>进程文件: wowexec or wowexec.exe<BR>进程名称: Windows On Windows Execution Process<BR>描述: Windows On Windows Execution Support Process和ntvdm.exe作用类似，为了兼容16位应用程序。</P>
<P><B>ypager.exe</B><BR>进程文件: ypager or ypager.exe<BR>进程名称: Yahoo Messenger Helper<BR>描述: Yahoo Messenger的状态栏图标，随Yahoo Messenger运行，是其一部分。<BR><BR>以下部分为我自己添加~：）<BR>ait2evxx.exe-ATI显卡<BR><BR></P><img src ="http://www.cnitblog.com/windforce/aggbug/1147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2005-07-27 12:38 <a href="http://www.cnitblog.com/windforce/articles/process.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网页制作小技巧</title><link>http://www.cnitblog.com/windforce/articles/webpage.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Mon, 25 Jul 2005 12:23:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/webpage.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/1132.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/webpage.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/1132.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/1132.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 近日修改家里网站,偶尔注意到几个小技巧,又怕忘记,于是决定写下来,也许以后会有点用处...不断更新中....&nbsp;&nbsp;<a href='http://www.cnitblog.com/windforce/articles/webpage.html'>阅读全文</a><img src ="http://www.cnitblog.com/windforce/aggbug/1132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2005-07-25 20:23 <a href="http://www.cnitblog.com/windforce/articles/webpage.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>just test .....</title><link>http://www.cnitblog.com/windforce/articles/259.html</link><dc:creator>wf</dc:creator><author>wf</author><pubDate>Sat, 04 Jun 2005 10:52:00 GMT</pubDate><guid>http://www.cnitblog.com/windforce/articles/259.html</guid><wfw:comment>http://www.cnitblog.com/windforce/comments/259.html</wfw:comment><comments>http://www.cnitblog.com/windforce/articles/259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windforce/comments/commentRss/259.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windforce/services/trackbacks/259.html</trackback:ping><description><![CDATA[testing how to use these buttons...<BR><BR>目前仍不知除了ARTICLE不在首页显示之外还有什么区别，与POST比较。。。<img src ="http://www.cnitblog.com/windforce/aggbug/259.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windforce/" target="_blank">wf</a> 2005-06-04 18:52 <a href="http://www.cnitblog.com/windforce/articles/259.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>