1、控制并发连入数量
epoll技术支持数万高并发,但是在实际的业务中,单纯探讨epoll支持多少并发连接意义不是很大,并发数量取决于很多因素:
一、采用的并发技术,epoll
二、服务器程序收发数据的频繁程度,以及处理的具体的业务复杂程度,占用的资源大小。
三、实际的物理内存。可用的物理内存数量直接决定能支持的并发连接。
四、其它的tcp/ip配置项。
一般日常所写的服务器程序一台计算机能支持几千甚至1到2万的并发基本上差不多够了。一个服务器程序要根据具体的物理内存,以及我们具体要实现的业务控制能够同时连入的数量。
如果允许客户无限连入,服务器肯定会崩溃。
初始化连接池要控制同时连入数量。
定义一个变量统计当前在线用户数。m_onlineusercont
accept成功+1,回收连接的时候-1。
- 控制允许连入数量的解决思路:
如果同时连入的用户的用户数量超过允许的最大数量时,直接将连接踢出去。close掉。
2、黑客攻击的防范
攻击效果:轻则服务器工作迟缓,重则整个服务器停摆,没办法提供正常服务。
比如拒绝服务攻击。
最严重的是利用程序漏洞,通过远程溢出手段攻破服务器程序锁在的计算机,拿到一定的权限甚至是root权限,那么计算机都在黑客的控制中了。制药谨慎细心的写程序,这个漏洞可以避免。
有些攻击利用tcp/ip协议先天的设计问题来攻击【syn flood】
DDOS攻击的一种。防火墙设备都可能防不住。甚至得从数据路由器想办法。
我们的服务器无法解决DDOS攻击,能够拒绝用户三路握手进来后的一些网络问题。
2.1、flood攻击防范(本服务器这里是成功收包的频繁度)
flood:洪水。用户三路握手只完成一半,只发送syn包不接收服务器的ack包,这样服务器会在一段时间后继续发送ack包。只到分钟级时间过后才抛弃这个连接。当数以万计的这种连接过来就会占用服务器的连接数。达到正常的连接被拒绝服务的效果。
假设一个合理的客户端一秒钟发送数据包给服务器不超过10个,如果客户端不停的给服务器发送数据包,1秒钟超过了10个数据包,我们就认为这个客户端有恶意倾向,服务器应该果断的关闭这个客户端tcp连接。
-
代码上如何实现呢?
加3个配置项。是否开启;时间间隔;连续收到次数。
引入函数testflood()
调用哪个地方:凡是包收完整的地方都要调用。本服务器的类似情况有3个。2.2、畸形数据包防范 意识:客户端发送过来的数据并不可信,服务器端必须要谨慎的验证。因为这些数据有可能是造假的或者畸形的。 造假:数量是否合理。传值是否在正常值范围内。多做数据判断。基本能够避免客户端造假。 畸形数据包:远程溢出攻击。攻击成功的主要原因就是服务器程序书写不当。缺少边界检查等。
-
缓冲区溢出攻击:
通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:
void function(char *str) {char buffer[16]; strcpy(buffer,str);}
上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat()、sprintf()、vsprintf()、gets()、scanf()等。
当然,随便往缓冲区中填东西造成它溢出一般只会出现分段错误(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。
缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
- 有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响。
1.通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码。
2.强制写正确的代码的方法。
3.利用编译器的边界检查来实现缓冲区的保护。这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。
4.一种间接的方法,这个方法在程序指针失效前进行完整性检查。虽然这种方法不能使得所有的缓冲区溢出失效,但它能阻止绝大多数的缓冲区溢出攻击。分析这种保护方法的兼容性和性能优势。
_handleregister()函数有处理。数组边界溢出。人为的在字符数组末尾增加个\0字符串结束标记。以确保用这个字符数组的时候不会出问题。
3、超时直接踢出服务器的需求
账号服务器,超过20秒不主动断开与服务器连接的,服务器就主动断开连接。
本服务器适合于游戏,账号类。
网友评论