- TCP最大连接数
在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少?
- 理论最大值
在确定最大连接数之前,先来看看系统如何标识一个tcp连接。系统用一个4四元组来唯一标识一个TCP连接: {local ip, local port,remote ip,remote port} 。server最大tcp连接数server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
- 实际的tcp连接数
上面给出的是理论上的单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制,特别是sever端,其最大并发tcp连接数远不能达到理论上限。在unix/linux下限制连接数的主要因素是内存和允许的文件描述符个数(每个tcp连接都要占用一定内存,每个socket就是一个文件描述符),另外1024以下的端口通常为保留端口。在默认2.6内核配置下,经过试验,每个socket占用内存在15~20k之间。那么也就是说tcp连接数与内存以及允许的最大描述符个数有关。对server端,通过增加内存、修改最大文件描述符(FD)个数等参数,单机最大并发TCP连接数超过10万 是没问题的。那么问题就来了,对于DDoS攻击,是如何进行的呐?
- 针对于DDOS攻击的TCP半连接数
在DDOS攻击中,假如服务器允许的TCP连接数超大,服务器内存超大,那么攻击者针对于此种情况往往是发送大量TCP半连接请求,使得连接数超过FD的最大值或者说FD没有超过最大值,但是维护FD的内存之和超过服务器内存,因为FD数对应与连接数,而大量半连接需要去维护需要大量内存,使得服务器无法处理。另外,如果服务器采用select/poll模式进行多路服用,那为此消耗的CPU资源也同样是可怕的。因此针对于DDOS攻击,我们要做的就是限制半连接数的数目,使得它不会影响正常的请求,同时采用epoll模式进行I/O多路复用。这里简单的介绍一下epoll和select/poll:
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集 合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符 集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的电平触发 (Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率.ET只读取一次数据(就算没读完也不在通知,直到状态改变),而LT只要还有数据就会一直通知,直到读完。