SQL教程:提高SQL执行效率的几点建议

提高SQL执行效率的几点建议:

◆尽量不要在where中包含子查询;

关于时间的查询,尽量不要写成:where to_char(dif_date,’yyyy-mm-dd’)=to_char(’2007-07-01′,’yyyy-mm-dd’);

◆在过滤条件中,可以过滤掉最大数量记录的条件必须放在where子句的末尾;

FROM子句中写在最后的表(基础表,driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有三个以上的连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表;

◆采用绑定变量

◆在WHERE中尽量不要使用OR

◆用EXISTS替代IN、用NOT EXISTS替代NOT IN;

◆避免在索引列上使用计算:WHERE SAL*12>25000;

◆用IN来替代OR: WHERE LOC_ID=10 OR LOC_ID=15 OR LOC_ID=20

◆避免在索引列上使用IS NULL和IS NOT NULL;

◆总是使用索引的第一个列;

◆用UNION-ALL替代UNION;

◆避免改变索引列的类型:SELECT…FROM EMP WHERE EMPNO=’123′,由于隐式数据类型转换,to_char(EMPNO)=’123′,因此,将不采用索引,一般在采用字符串拼凑动态SQL语句出现;

◆’!=’ 将不使用索引;

◆优化GROUP BY;

◆避免带有LIKE参数的通配符,LIKE ’4YE%’使用索引,但LIKE ‘%YE’不使用索引

◆避免使用困难的正规表达式,例如select * from customer where zipcode like “98___”,即便在zipcode上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改成select * from customer where zipcode>”98000″,在执行查询时就会利用索引来查询,显然会大大提高速度;

◆尽量明确的完成SQL语句,尽量少让数据库工作。比如写SELECT语句时,需要把查询的字段明确指出表名。尽量不要使用SELECT *语句。组织SQL语句的时候,尽量按照数据库的习惯进行组织。

转自:

http://www.webjx.com/database/sqlserver-16738.htm

Posted in DataBase | Tagged | 9 Comments

推荐VS2008插件CodeRush Xpress for C#

前段时间DevExpress和微软共同发布了CodeRush Xpress for C#,它包含了Code RushRefactor! Pro中的一些特性。这些特性包括增强的导航、选择工具、代码创建功能以及强大的重构能力。另外CodeRush Xpress还对C#中既有的重构功能做了封装,这些功能用起来更为方便了。不过它不支持Express版的Visual Studio。

CodeRush Xpress的强点包括易于访问的重构和代码创建功能、强大的文件和代码导航功能、一组编辑器、选择、剪贴板工具等。

下面简单介绍一下几个功能。

1. 使用中生成(Generate From Usage)

本来C#中有一个生成方法的功能,如果来类中调用了一个未声明的方法,VS会提示是否生成该方法,不过CodeRushX的功能要强大得多。除了方法,它还支持构造函数、类、委托、枚举、事件处理器、字段、属性、接口、局部变量、结构等。

来看看生成类时的情况。在下面的代码引用了未声明的类TestClass,此时可选择声明类(或结构、枚举)

生成结果为:

TestClass类的框架生成好了,并按照调用者的代码添加了相应的构造函数。右下角的提示框是CodeRushX的一大特色,它根据当前使用的功能提供相应的提示。

等一下,有了这样的功能,我们写代码的顺序是不是可以跟以前不一样了?我们可以先编写使用一个类的代码,然后利用CodeRushX生成该类,这有些像TDD的方式,所以这个特性成为TDD风格的使用中生成

2. 文件导航功能

CodeRushX支持快速文件导航,使用快捷键Ctrl+Alt+F,可以打开快速文件导航窗口:

这个功能DPack也有,不过看看这个更奇妙的:

我们只要输入单词的首字母就可以进行过滤,当然这里需要大写字母。

3. 代码导航功能

对于代码导航,CodeRushX提供了一个快速导航窗口,快捷键为Ctrl+Shift+Q:

默认地,它会列出所有的成员。CodeRushX为此也提供了文本过滤功能:

比如我们可以选择只显示当前文件,这里也支持类似于文件导航的缩略词过滤。

4. 代码编辑

先看看复制行(Duplicate Line)功能。我们经常要在类的开头定义多个字段,或在方法开头定义多个变量,它们的类型可能是一样的,此时复制行就派上用场了。

这里要连续定义firstName和lastName,先写出firstName这一行,然后按Shift+Enter,就会生成新的行,并选中了字段名,可以直接进行编辑。

除了这里提到的字段,复制行还支持方法、事件、属性、using语句、赋值语句等。程序员最怕重复性的工作,CodeRushX可以帮我们的大忙。

高亮所有引用

在NetBeans中见过这样的功能,即高亮标识符所有的引用。

现在CodeRushX提供了类似的功能,虽然没有这么酷,快捷键是Ctrl+Alt+U:

5. 递增/递减选择文本(Increase Reduce Selection)

这个功能很有用。代码中会有命名空间、类、方法、方法体,通过快捷键我们就可以递增地选择方法体、方法直到当前文件的所有代码,快捷键为Ctrl+Alt+=,也可以按Ctrl+Alt+-按原路返回。

6. 重构

CodeRushX提供了多达25种重构特性,它们是:

  • 增加块分隔符
  • 组合条件
  • 压缩为Lambda表达式
  • 压缩为Ternary表达式
  • 转化为自动实现的属性
  • 转化为Initializer
  • 创建存储备份
  • 分解Initializer
  • 分解参数
  • 扩展Lambda表达式
  • 扩展Ternary表达式
  • 抽取方法
  • 压缩条件
  • 内联代理
  • 内联Temp
  • 引入Local
  • 显示
  • 隐藏
  • 将类型转到文件中
  • 命名匿名方法
  • 命名匿名类型
  • 翻转条件
  • 分割条件
  • 使用String.Format
  • 使用StringBuilder

要使用这些重构特性,可以使用右键菜单或者快捷键Ctrl+`:

7. 可视化元素

CodeRushX的一大特色是提供了大量直观、动感的提示信息,比如:

Action Hints ->

Big Hints ->

Smart Tags ->

Shortcuts ->

当然,上面介绍的这些只是它的部分功能而已,如果你感兴趣,就尝试一下吧,肯定会有惊喜的。用了CodeRush Xpress,才体会到”工欲善其事,必先利其器”,它无疑会大大改善我们的开发体验,再次强烈推荐。

转自:
http://hi.baidu.com/%CE%E5%C1%B8%D2%BA%BD%BD%BB%A8/blog/item/f37b622a8ebba82ad52af109.html

Posted in ASP.NET, 开发工具 | Tagged | 1 Comment

[转]AJAX开发之通讯模式介绍

HTTP是无连接的,HTTP通讯过程基本就是:客户端发送请求给服务器,服务器接收请求给出响应信息,客户端接收响应信息显示在用户的显示器上,客户端断开连接。由此可知,要实现即时聊天中的”即时”,我们有两个办法:服务器抓住连接不断开和客户端不断的向服务器发起请求实现伪即时。当然用 Flash XMLSocket可以实现真正的即时通讯,但这样已经不是使用HTTP协议了,HTTP天生的优势(无需另外开端口、自动穿越防火墙)也就无法体现。

1.短轮询(polling):核心思想是客户端定时去服务器取消息。为了实现即时效果,轮询的间隔必须设计得足够短,另外为了操作的流畅,需要使用 Ajax来发送请求。本人的QGYWebIM就是采用的此方案。这种方案的优点是:后端程序编写比较容易,发送完响应信息马上断开连接,不会占用太多服务器资源。缺点是一般情况下,频繁的请求中有大半是无用,这些冗余请求无形中浪费了带宽和服务器资源。我们可以通过判断用户的活跃程度来决策请求服务器的间隔,我在51的一个帖子提到过这种方法,但是间隔一旦长了,消息的传送就有延时,违背了即时聊天的初衷了。

2.长轮询(long-polling):基本原理是客户端向服务器发送请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,连接被断开期间用户的新信息会被服务器缓存起来。客户端处理完响应信息后再向服务器发送新的请求。这种做法的优势是如果用户一直没新消息,客户端不会频繁的轮询去服务器取消息,节省了流量,但是服务器维持长连接是很消耗资源的。具体实现起来,前端这边基本不需要什么改动,依然是用Ajax轮询取信息,后端需要在没有新消息时处理一下。

3.长连接(streaming):其实很早以前就有人使用这种技术来实现聊天室的通讯。以前在页面中嵌入一个iframe,iframe里放一个使用长连接页面,服务器有新消息就会及时的在iframe里反映出来,再依靠客户端的脚本解析出来就OK了。这样做一个比较严重的问题是:使用 iframe请求长连接时,无论是IE还是firefox都会认为页面没有加载完而显示进度条,很难看。不过这个问题是可以解决的。firefox支持了 Streaming Ajax,在readyState为3的时候就能接受数据,所以问题不大;IE则只能在readyState为4,即连接断开时才能得到返回值。但是伟大的Google工程师使用了一个hack成功的解决了这个问题:使用一个被称为“htmlfile”的ActiveX,把iframe放在这个 ActiveX里就OK了。

// we were served from child.example.com but
// have already set document.domain to example.com
var currentDomain = “http://exmaple.com/”;
var dataStreamUrl = currentDomain+”path/to/server.cgi”;
var transferDoc = new ActiveXObject(“htmlfile”); // !?!
// make sure it’s really scriptable
transferDoc.open();
transferDoc.write(“”);
transferDoc.write(““);
transferDoc.write(“”);
transferDoc.close();
// set the iframe up to call the server for data
var ifrDiv = transferDoc.createElement(“div”);
transferDoc.appendChild(ifrDiv);
// start communicating
ifrDiv.innerHTML = “”;

复制代码
无疑,使用长连接对于用户来说是最好的方案,用户体验最好(消息能及时的到达)、占用用户带宽最少(不会发送无用的请求),但是会增加服务器的开销;长轮询是折中方案,Facebook IM 就是采用这种方案,不过做了一点改动:客户端发起的每个连接服务器都hold10S,这10S中新消息会源源不断的返回给客户端,10s后连接关闭,客户端发起下一个连接。这样做是因为Facebook的用户会不断的打开、关闭新页面,如果每个页面都建立一个永久的长连接,会阻塞浏览器其他请求,服务器也会吃不消的;短轮询因为实现起来简单,适用于小型应用。

转自:

http://www.qgy18.com/2008/08/webim-design-transport/

Posted in Web UI | 1 Comment

VMware images 下载(Debian,OpenBSD,Ubuntu)

要装个linux玩玩,但是又不想把它安装在硬盘上,在vmware中安装也非常耗时。如果能一个 wmware image 直接下载就太好了.现在 chrysaor.info 就为我们提供了这么方便的免费服务.

大家可以到 chrysaor.info 的网站上,可以看到有以下版本可以下载:

Debian VMware images
Debian 5.0 VMware image (705 MiB, Gzipped Tarball)
Debian 4.0 Server VMware image (230 MiB)

OpenBSD VMware images
OpenBSD 4.4 VMware image (190 MiB, Gzipped Tarball)
OpenBSD 4.3 VMware image (61 MiB, 7-Zip)
OpenBSD 4.2 VMware image (59 MiB, 7-Zip)
OpenBSD 4.1 VMware image (73 MiB)
OpenBSD 4.0 VMware image (260 MiB)

Ubuntu VMware images
Ubuntu 9.04 Desktop VMware image (1.1 GiB, Gzipped Tarball)
Ubuntu 9.04 Server VMware image (299 MiB, Gzipped Tarball)
Ubuntu 8.10 Desktop VMware image (948 MiB, 7-Zip)
Ubuntu 8.10 Server VMware image (561 MiB, 7-Zip)
Ubuntu 8.04.1 Desktop VMware image (979 MiB, 7-Zip)
Ubuntu 8.04.1 Server VMware image (398 MiB, 7-Zip)
Ubuntu 8.04.1 Jeos VMware image (405 MiB, 7-Zip)
Ubuntu 8.04 Desktop VMware image (568 MiB, 7-Zip)
Ubuntu 8.04 Server VMware image (187 MiB, 7-Zip)
Ubuntu 8.04 Jeos VMware image (190 MiB, 7-Zip)
Ubuntu 7.10 Desktop VMware image (564 MiB, 7-Zip)
Ubuntu 7.10 Server VMware image (208 MiB, 7-Zip)
Ubuntu 7.10 Jeos VMware image (225 MiB, 7-Zip)
Ubuntu 7.04 Desktop VMware image (799 MiB, 7-Zip)
Ubuntu 7.04 Server VMware image (252 MiB)

下载地址: http://chrysaor.info/?page=images

Posted in Linux | Tagged , , , | Leave a comment

简单防范SYN_RECV攻击

SYN攻击是最常见又最容易被利用的一种攻击手法。相信很多人还记得2000年YAHOO网站遭受的攻击事例,当时黑客利用的就是简单而有效的SYN攻击,有些网络蠕虫病毒配合SYN攻击造成更大的破坏。本文介绍SYN攻击的基本原理、工具及检测方法,并全面探讨 SYN攻击防范技术。一、TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED 状态,完成三次握手。 (TCP 连接示意图)(TCP 关闭示意图) 完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念:未连接队列:在三次握手协议中,服务器维护一个未连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入 ESTABLISHED状态。 Backlog参数:表示未连接队列的最大容纳数目。 SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout 时间、SYN_RECV存活时间。

二、SYN攻击的基本原理 SYN攻击属于DOS攻击的一种,它利用TCP协议缺陷,通过发送大量的半连接请求,耗费CPU和内存资源。SYN攻击除了能影响主机外,还可以危害路由器、防火墙等网络系统,事实上SYN攻击并不管目标是什么系统,只要这些系统打开TCP服务就可以实施。从上图可看到,服务器接收到连接请求(syn= j),将此信息加入未连接队列,并发送请求包给客户(syn=k,ack=j+1),此时进入SYN_RECV状态。当服务器未收到客户端的确认包时,重发请求包,一直到超时,才将此条目从未连接队列删除。配合IP欺骗,SYN攻击能达到很好的效果,通常,客户端在短时间内伪造大量不存在的IP地址,向服务器不断地发送syn包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

三、SYN攻击工具 SYN攻击实现起来非常的简单,互联网上有大量现成的SYN攻击工具。 windows系统下的SYN工具以synkill.exe为例,运行工具,选择随机的源地址和源端囗,并填写目标机器地址和TCP端囗,激活运行,很快就会发现目标系统运行缓慢。如果攻击效果不明显,可能是目标机器并未开启所填写的TCP端囗或者防火墙拒绝访问该端囗,此时可选择允许访问的TCP端囗,通常,windows系统开放 tcp139端囗,UNIX系统开放tcp7、21、23等端囗。四、检测SYN攻击检测SYN攻击非常的方便,当你在服务器上看到大量的半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。我们使用系统自带的 netstat 工具来检测SYN攻击:   
# netstat -n -p TCP   
tcp 0  0 10.11.11.11:23  124.173.152.8:25882  SYN_RECV -   
tcp 0  0 10.11.11.11:23  236.15.133.204:2577  SYN_RECV -   
tcp 0  0 10.11.11.11:23  127.160.6.129:51748  SYN_RECV -   
tcp 0  0 10.11.11.11:23  222.220.13.25:47393  SYN_RECV -   
tcp 0  0 10.11.11.11:23  212.200.204.182:60427 SYN_RECV -   
tcp 0  0 10.11.11.11:23  232.115.18.38:278   SYN_RECV -   
tcp 0  0 10.11.11.11:23  239.116.95.96:5122  SYN_RECV -   
tcp 0  0 10.11.11.11:23  236.219.139.207:49162 SYN_RECV -

上面是在LINUX系统中看到的,很多连接处于SYN_RECV状态(在WINDOWS系统中是SYN_RECEIVED状态),源IP地址都是随机的(也可能是同一个IP的很多SYN_RECV连接状态),表明这是一种带有IP欺骗的SYN攻击。我们也可以通过下面的命令直接查看在LINUX环境下某个端囗的未连接队列的条目数:   #netstat –atun grep SYN_RECV grep :80 wc -l 显示TCP端囗80的未连接数请求及个数,虽然还远达不到系统极限,但应该引起管理员的注意。五、SYN攻击防范技术关于SYN攻击防范技术,人们研究得比较早。归纳起来,主要有两大类,一类是通过防火墙、路由器等过滤网关防护,另一类是通过加固TCP/IP协议栈防范.但必须清楚的是,SYN攻击不能完全被阻止,我们所做的是尽可能的减轻SYN攻击的危害,除非将TCP协议重新设计。

1、过滤网关防护

这里,过滤网关主要指明防火墙,当然路由器也能成为过滤网关。防火墙部署在不同网络之间,防范外来非法攻击和防止保密信息外泄,它处于客户端和服务器之间,利用它来防护SYN攻击能起到很好的效果。过滤网关防护主要包括超时设置,SYN网关和SYN代理三种。

■ 网关超时设置:防火墙设置SYN转发超时参数(状态检测的防火墙可在状态表里面设置),该参数远小于服务器的timeout时间。当客户端发送完SYN 包,服务端发送确认包后(SYN+ACK),防火墙如果在计数器到期时还未收到客户端的确认包(ACK),则往服务器发送RST包,以使服务器从队列中删去该半连接。值得注意的是,网关超时参数设置不宜过小也不宜过大,超时参数设置过小会影响正常的通讯,设置太大,又会影响防范SYN攻击的效果,必须根据所处的网络应用环境来设置此参数。

■SYN网关:SYN网关收到客户端的SYN包时,直接转发给服务器;SYN网关收到服务器的 SYN/ACK包后,将该包转发给客户端,同时以客户端的名义给服务器发ACK确认包。此时服务器由半连接状态进入连接状态。当客户端确认包到达时,如果有数据则转发,否则丢弃。事实上,服务器除了维持半连接队列外,还要有一个连接队列,如果发生SYN攻击时,将使连接队列数目增加,但一般服务器所能承受的连接数量比半连接数量大得多,所以这种方法能有效地减轻对服务器的攻击。

■SYN代理:当客户端SYN包到达过滤网关时,SYN代理并不转发SYN包,而是以服务器的名义主动回复SYN/ACK包给客户,如果收到客户的ACK包,表明这是正常的访问,此时防火墙向服务器发送ACK包并完成三次握手。SYN代理事实上代替了服务器去处理SYN攻击,此时要求过滤网关自身具有很强的防范SYN攻击能力。2、加固tcp/ip协议栈防范 SYN攻击的另一项主要技术是调整tcp/ip协议栈,修改tcp协议实现。主要方法有SynAttackProtect保护机制、SYN cookies技术、增加最大半连接和缩短超时时间等。tcp/ip协议栈的调整可能会引起某些功能的受限,管理员应该在进行充分了解和测试的前提下进行此项工作。

■ SynAttackProtect机制 (针对windows操作系统) 为防范SYN攻击,win2000系统的tcp/ip协议栈内嵌了SynAttackProtect机制,Win2003系统也采用此机制。 SynAttackProtect机制是通过关闭某些socket选项,增加额外的连接指示和减少超时时间,使系统能处理更多的SYN连接,以达到防范 SYN攻击的目的。默认情况下,Win2000操作系统并不支持SynAttackProtect保护机制,需要在注册表以下位置增加 SynAttackProtect键值:   HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 当SynAttackProtect值(如无特别说明,本文提到的注册表键值都为十六进制)为0或不设置时,系统不受SynAttackProtect保护。 当SynAttackProtect值为1时,系统通过减少重传次数和延迟未连接时路由缓冲项(route cache entry)防范SYN攻击。当SynAttackProtect值为2时(Microsoft推荐使用此值),系统不仅使用backlog队列,还使用附加的半连接指示,以此来处理更多的SYN连接,使用此键值时,tcp/ip的TCPInitialRTT、window size和可滑动窗囗将被禁止。我们应该知道,平时,系统是不启用SynAttackProtect机制的,仅在检测到SYN攻击时,才启用,并调整 tcp/ip协议栈。那么系统是如何检测SYN攻击发生的呢?事实上,系统根据 TcpMaxHalfOpen,TcpMaxHalfOpenRetried 和TcpMaxPortsExhausted三个参数判断是否遭受SYN攻击。 TcpMaxHalfOpen 表示能同时处理的最大半连接数,如果超过此值,系统认为正处于SYN攻击中。Win2000 server默认值为100,Win2000  Advanced server为500。 TcpMaxHalfOpenRetried定义了保存在backlog队列且重传过的半连接数,如果超过此值,系统自动启动 SynAttackProtect机制。Win2000 server默认值为80,Win2000 Advanced server为400。 TcpMaxPortsExhausted 是指系统拒绝的SYN请求包的数量,默认是5。如果想调整以上参数的默认值,可以在注册表里修改(位置与 SynAttackProtect相同)

■ SYN cookies技术我们知道,TCP协议开辟了一个比较大的内存空间backlog队列来存储半连接条目,当SYN请求不断增加,并这个空间,致使系统丢弃SYN连接。为使半连接队列被塞满的情况下,服务器仍能处理新到的SYN请求,SYN cookies技术被设计出来。 SYN cookies应用于linux、FreeBSD等操作系统,当半连接队列满时,SYN cookies并不丢弃SYN请求,而是通过加密技术来标识半连接状态。在TCP实现中,当收到客户端的SYN请求时,服务器需要回复SYN+ACK包给客户端,客户端也要发送确认包给服务器。通常,服务器的初始序列号由服务器按照一定的规律计算得到或采用随机数,但在SYN cookies中,服务器的初始序列号是通过对客户端IP地址、客户端端囗、服务器IP地址和服务器端囗以及其他一些安全数值等要素进行hash运算,加密得到的,称之为cookie。当服务器遭受SYN攻击使得backlog队列满时,服务器并不拒绝新的SYN请求,而是回复cookie(回复包的 SYN序列号)给客户端,如果收到客户端的ACK包,服务器将客户端的ACK序列号减去1得到cookie比较值,并将上述要素进行一次hash运算,看看是否等于此 cookie。如果相等,直接完成三次握手(注意:此时并不用查看此连接是否属于backlog队列)。 在RedHat linux中,启用SYN cookies是通过在启动环境中设置以下命令来完成:   
# echo 1 > /proc/sys/net/ipv4/tcp_syncookies 注:也可以通过修改其它参数,或者使用/proc/sys/net/ipv4/netfilter/ip_contrack_*

■ 增加最大半连接数(加大未连接队列空间) 大量的SYN请求导致未连接队列被塞满,使正常的TCP连接无法顺利完成三次握手,通过增大未连接队列空间可以缓解这种压力。当然backlog队列需要占用大量的内存资源,不能被无限的扩大。 WIN2000:除了上面介绍的TcpMaxHalfOpen, TcpMaxHalfOpenRetried参数外,WIN2000操作系统可以通过设置动态backlog(dynamic backlog)来增大系统所能容纳的最大半连接数,配置动态backlog由AFD.SYS驱动完成,AFD.SYS是一种内核级的驱动,用于支持基于 window socket的应用程序,比如ftp、telnet等。AFD.SYS在注册表的位置: HKLM\System\CurrentControlSet\Services\AFD \ParametersEnableDynamicBacklog 值为1时,表示启用动态backlog,可以修改最大半连接数。  MinimumDynamicBacklog表示半连接队列为单个TCP端囗分配的最小空闲连接数,当该TCP端囗在backlog队列的空闲连接小于此临界值时,系统为此端囗自动启用扩展的空闲连接(DynamicBacklogGrowthDelta),Microsoft推荐该值为20。 MaximumDynamicBacklog是当前活动的半连接和空闲连接的和,当此和超过某个临界值时,系统拒绝SYN包,Microsoft推荐 MaximumDynamicBacklog值不得超过2000。 DynamicBacklogGrowthDelta值是指扩展的空闲连接数,此连接数并不计算在MaximumDynamicBacklog内,当半连接队列为某个TCP端囗分配的空闲连接小于MinimumDynamicBacklog时,系统自动分配 DynamicBacklogGrowthDelta所定义的空闲连接空间,以使该TCP端囗能处理更多的半连接。Microsoft推荐该值为10。 LINUX:Linux用变量tcp_max_syn_backlog定义backlog队列容纳的最大半连接数。在Redhat 7.3中,该变量的值默认为256,在AS中,是1024。这个值是远远不够的,一次强度不大的SYN攻击就能使半连接队列占满。我们可以通过以下命令修改此变量的值:   
# sysctl -w net.ipv4.tcp_max_syn_backlog=”2048″
Sun Solaris Sun Solaris用变量tcp_conn_req_max_q0来定义最大半连接数,在Sun Solaris 8中,该值默认为1024,可以通过add命令改变这个值:   
# ndd -set /dev/tcp tcp_conn_req_max_q0 2048
HP-UX:HP-UX用变量tcp_syn_rcvd_max来定义最大半连接数,在HP-UX 11.00中,该值默认为500,可以通过ndd命令改变默认值:   
#ndd -set /dev/tcp tcp_syn_rcvd_max 2048
■ 缩短超时时间上文提到,通过增大backlog队列能防范SYN攻击;另外减少超时时间也使系统能处理更多的SYN请求。我们知道,timeout超时时间,也即半连接存活时间,是系统所有重传次数等待的超时时间总和,这个值越大,半连接数占用backlog队列的时间就越长,系统能处理的SYN请求就越少。为缩短超时时间,可以通过缩短重传超时时间(一般是第一次重传超时时间)和减少重传次数来实现。 Win2000第一次重传之前等待时间默认为3秒,为改变此默认值,可以通过修改网络接口在注册表里的TcpInitialRtt注册值来完成。重传次数由TcpMaxConnectResponseRetransmissions 来定义,注册表的位置是:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters registry key。当然我们也可以把重传次数设置为0次,这样服务器如果在3秒内还未收到ack确认包就自动从backlog队列中删除该连接条目。 LINUX:Redhat使用变量tcp_synack_retries定义重传次数,其默认值是5次,总超时时间需要3分钟。
 # sysctl -w net.ipv4.tcp_synack_retries=0  Sun Solaris Solaris 默认的重传次数是3次,总超时时间为3分钟,可以通过ndd命令修改这些默认值。综合上述的方法:在linux下可以通过修改/etc/ sysctl.conf,添加下列选项达到效果。
# add by geminis for syn crack
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog=2048
net.ipv4.tcp_synack_retries=1
转自:http://blog.csdn.net/dddfly/archive/2009/07/07/4328344.aspx

Posted in TCP/IP, 网站应用 | Leave a comment

TCP三次握手/四次挥手

 

TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。

1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。

2)第二次握手:服务器B收到SYN包,必须确认客户ASYNACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

3)第三次握手:客户端A收到服务器BSYNACK包,向服务器B发送确认包ACKACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

                               图1 TCP三次握手建立连接

由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

TCP采用四次挥手关闭连接如图2所示。

                               图2  TCP四次挥手关闭连接

1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢?

这是因为服务端的LISTEN状态下的SOCKET当收到SYN报文的建连请求后,它可以把ACKSYNACK起应答作用,而SYN起同步作用)放在一个报文里来发送。但关闭连接时,当收到对方的FIN报文通知时,它仅仅表示对方没有数据发送给你了;但未必你所有的数据都全部发送给对方了,所以你可以未必会马上会关闭SOCKET,也即你可能还需要发送一些数据给对方之后,再发送FIN报文给对方来表示你同意现在可以关闭连接了,所以它这里的ACK报文和FIN报文多数情况下都是分开发送的。

2.为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?

这是因为虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的ACK报文。

 

转自:

http://blog.pfan.cn/xman/44384.html

Posted in TCP/IP | Leave a comment

安装VS2010后,更改iis的asp.net版本

今天安装了一个vs2010来更新一下程序,发现一个奇怪的问题.asp.net的版本不能更改了.出现以下提示:
—————————
Confirm
—————————
Changing the Framework version requires a restart of the W3SVC service. Alternatively, you can change the Framework version without restarting the W3SVC service by running: aspnet_regiis.exe -norestart -s IIS-Viirtual-Path
Do you want to continue (this will change the Framework version and restart the W3SVC service)?
—————————
是(Y) 否(N)
—————————

解决办法如下:
我的项目原本就是v2.0的,按照提示直接在命行执行以下命令,
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727>aspnet_regiis.exe -norestart -s W3SVC/1/ROOT/HrInfo
——————————–
开始在 W3SVC/1/ROOT/HrInfo 递归注册 ASP.NET 脚本映射(2.0.50727)。
已在 W3SVC/1/ROOT/HrInfo 递归注册了 ASP.NET 脚本映射 (2.0.50727)。

HrInfo 表示您的项目名称.

Posted in ASP.NET, Microsoft产品, 开发工具 | 1 Comment

监视MySQL的所有执行语句(类似sqlserver)

有时我们使用了PHP框架,然后使用现成的ORM,省去了写SQL的麻烦,但又想看看到底生成了哪些SQL;或者下载了wordpress或druapl,想看看人家的SQL是怎么写的,这时如果能够监视MySQL的一举一动就好了,也不难,只需要稍微配置一下,再加上一个工具就行了。

首先,打开%MySQLDir%my.ini(linux下是my.cnf)加上这么一句

# 指定log的位置
log=C:/AppServ/MySQL/mysql.log
# 或者linux下 log=/var/log/mysql/mysql.log

这样,MySQL就会把所有操作记录都写在mysql.log这个文件里。接下来可以先清空这个文件,然后运行wordpress,再打开这个文件,就会看到所有执行的SQL了,不过这个有点麻烦,如果能实时查看就好了,linux下有tail命令 tail -f /var/log/mysql/mysql.log就行了,windows下没有相应的命令,这时就需要BareTail这个工具了,其实就是模拟tail操作的一个绿色可执行文件。打开后,浏览到之前定义的log文件,然后再运行wordpress,应该能看到BareTail里出现了SQL的操作记录,如下

可以看到wordpress的数据库开销还是挺大的。

BareTail 免费下载地址:
http://www.baremetalsoft.com/baretail/

转自: http://blog.pianzhizhe.com/archives/57

Posted in DataBase, PHP | Tagged , | 3 Comments

中国(国内)机场缩写代码

现在越来越多的公司在各个城市都有自己的分公司,我们公司也不例外.对于我们系统开发人员来说,每个城市都有一个缩写是最好记的.很多人或者会这样说,直接用系统生成的code不就行了吗?没错,这样虽然可以解决一个系统的问题,如果你有多个系统,或者需要连接外部的其他系统.这个时候我们系统自动生成的代码显然就不够好.
但使用什么样的简称才能保证唯一呢?如:深圳(SZ),苏州(SZ)极有可能会有重复.其实现在很多城市都有了自己的飞机场,用它来做你的城市缩写代码,不但不会重复,而且很标准.(唯一缺点是如果还没有开通飞机场的城市没有官方的缩写代码).

以下是标准的机场缩写代号:

城市名称 代码 城市名称 代码 城市名称 代码
阿勒泰 AAT 乌兰浩特 HLH 上海浦东 PVG
安康 AKA 哈尔滨 HRB 上海 SHA
阿克苏 AKU 和田 HTN 沈阳 SHE
安庆 AQG 汉中 HZG 沙市 SHS
包头 BAV 银川 INC 西安 SIA
北京 BJS 且末 IQM 汕头 SWA
北海 BHY 庆阳 IQN 深圳 SZX
保山 BSD 景德镇 JDZ 思茅 SYM
广州 CAN 嘉峪关 JGN 三亚 SYX
常德 CGD 九江 JIU 青岛 TAO
郑州 CGO 晋江 JJN 铜仁 TEN
长春 CGQ 佳木斯 JMU 通辽 TGO
朝阳 CHG 库车 KCA 济南 TNA
酒泉 CHW 喀什 KHG 天津 TSN
赤峰 CIF 南昌 KHN 黄山 TXN
长治 CIN 昆明 KMG 太原 TYN
重庆 CKG 吉安 KNC 乌鲁木齐 URC
长海 CNI 赣州 KOW 榆林 UYN
长沙 CSX 库尔勒 KRL 武汉 WUH
成都 CTU 克拉玛依 KRY 万县 WXN
常州 CZX 贵阳 KWE 兴城 XEN
大同 DAT 桂林 KWL 襄樊 XFN
达县 DAX 梁平 LIA 西昌 XIC
丹东 DDG 兰州 LHW 锡林浩特 XIL
大连 DLX 庐山 LUZ 咸阳 XIY
敦煌 DNH 拉萨 LXA 兴宁 XIN
大庸 DYG 林西 LXI 厦门 XMN
恩施 ENH 连云港 LYG 西宁 XNN
延安 ENY 洛阳 LYA 徐州 XUZ
福州 FOC 临沂 LYI 宜昌 YIH
阜阳 FUG 兰州东 LZD 伊宁 YIN
富蕴 FYN 柳州 LZH 烟台 YNT
格尔木 GOQ 牡丹江 MOG 依兰 YLN
广汉 GHN 梅县 MXZ 延吉 YNJ
海口 HAK 南充 NAO 昭通 ZAT
黑河 HEK 齐齐哈尔 NDG 兰州(中川) ZGC
呼和浩特 HET 宁波 NGB 湛江 ZHA
合肥 HFE 南京 NKG 珠海 ZUH
杭州 HGH 南宁 NNG 哈密 HMI
长沙(黄花) HHA 南阳 NNY 衡阳 HNY
海拉尔 HLD 北京 PEK 山海关 SHP
Posted in 生活乐事, 网站应用 | Tagged | 1 Comment

vs.php在预先安装的Apache/PHP上调试.

很久之前就下载过vs.php来开发程序,那时候的vs.php并不是太理想,存在很多小bug.今天为了写一个简单的教程,再次使用php语言,为了方便与自己的.net开发环境相结合,再次选择了 vs.php(虽然只有30天的试用期,但对我来说已经足够了,写一个教程最多10天就完成了).

调试时由于内置的Apache在我的Vista下还是存在一些问题,显示内存地址无法读取.没有办法,去官方网站找了一些资料.终于知道怎么样使用外置的Apache来调试PHP程序了.详细方法如下:

1,设置vs.php中的项目属性.

发件人 ExtJs_Blog

2.配置你预安装的Apache中的php.ini文件.
把以下内容加入到你的php.ini文件中.

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;

extension=php_dbg.dll

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;

[DBG]
debugger.enabled = true
debugger.profiler_enabled = true
debugger.JIT_host = 127.0.0.1
debugger.JIT_port = 7869

3,最后,把 “C\Program Files\Jcx.Software\VS.Php\2008\2.6\Php 5\ext\php_dbg.dll” 复制到你的php.ini中设置的 extension_dir 目录下面.

完成以上3步后,你就可以开始你的vs.php调试之旅了!

Posted in PHP, 开发工具 | Tagged , | Leave a comment

无法定位程序输入点xxx 于动态链接库 SEMSFC.dll 上。

无法定位程序输入点 ?ProcessExecute@@YAXPAUHWND__@@PBG1@Z 于动态链接库 SEMSFC.dll 上。安装sqlserver2000的时候经常会出现这样的问题.很是无耐,经常只有重装sqlserver2000一次.但就算是重新安装也不一定能解决问题,怎么办呢?

其实我们有一个好的解决方案,那就是安装sp补丁.我的vista出现这种情况后,直接安装sp4补丁就解决了.

Posted in DataBase, Microsoft产品 | Tagged , , | Leave a comment