邓立波 深圳,2007-8
作者联系方式:
email: libodeng@gmail.com
msn: libodeng@gmail.com
tel: 13510275799
版权/著作权所有 (C) 2007 邓立波 保留所有权利
警告:未经作者许可,任何人或组织不得转载,公开发布,拷贝,传播本文献的全部或部分
针对《编写大容量和健壮的服务器系列-处理连接关闭》一文,一位网友这样认为:
[当服务器程序主动关闭连接时,刚发往客户端的包有时出现丢失
---------------------------
从来不考虑这种情况,服务器“主动”关闭,服务器永远都设计成为“被动”关闭。应该将服务器成功发送后关闭连接模式设计成客户端成功收到数据后关闭连接,如果你设计成第一种模式,除非特殊需要否则设计就是错误的。我这么以为。]
你觉得呢,你实现的服务器也从没做过“服务器主动关闭连接吗”?
不过我对此倒存在一点不同见解,因为我觉得,原则上,任何依赖客户端控制流程的设计都是不安全的,比如按这位网友说的去做,如果万一出现客户端强制关闭连接但reset包丢失或者网络中断,服务器的连接应该何时释放呢?是不是还需要一种连接检测机制,更不用说在处理大量爆发性短连接的场合。
换一个角度,从系统安全上来说,这种依赖客户端的机制也很不安全,攻击者只需要不断连接你,处理正常流程后不断“无声无息”的关闭连接,而不发出FIN或者RESET,对攻击者而言,根本不需要消耗资源,却可以使服务器不断的消耗资源(这里主要是socket分配的资源),这是典型的Dos攻击。这里不妨详细计算一下,攻击者使用一台单机,假如每秒建300个连接,10分钟后 300 x 60 x 10 = 180000个连接,按在windows上1G内存
大约最多建立10万个连接经验值估算(这个值主要受未分页内存池与单个应用程序锁定内存限制,具体可以看相关资料),相信互联网上大多数服务器都崩溃了。