单机TCP最大连接数简析

来源:互联网 发布:网络上弧是什么意思 编辑:程序博客网 时间:2024/04/25 13:51

linux系统如何来标示一个TCP连接?
用一个四元组来唯一标示TCP连接:{local ip,local port,remote ip,remote port}

client的最大tcp连接数
客户端发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port) 该端口为独占,不能和其它tcp连接共享。 tcp端口的数据类型是unsigned short,因为本地端口个数最大只有65536.端口0,23等小与1024的数字端口通常为保留端口,这样,客户端最大的连接数基本在65000左右。这些端口可以连接到不同的server ip

server的最大tcp连接数
server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用的情况下,即使server端有多个ip,本地监听端口也是独占的。因为server端tcp连接的4元组只有 remote ip(即client ip)和remote port(客户端端口)可变的,因此,最大的tcp连接数为客户端ip数*客户端port数,对于ipv4,不考虑地址分类等因素,最大的tcp连接数约为2的32次方(ipv4数量)乘以2的16次方(port数量),也就是server端单机的最大tcp连接数约为2的48次方。

实际环境中的tcp连接数量
受到机器资源、操作系统等限制,特别是server端,最大并发tcp连接数远不能达到理论上限。在linux平台下,tcp连接数的主要因素是内存限制和允许的文件描述符fd的个数(因为每个tcp连接都要占用一定内存,每个socket就是一个文件描述符fd,而linux系统对用户的单一进程同时打开的文件数量是有限制的)。另外,1024以下的端口通常都为保留端口。

linux相关配置需要注意的地方
1、ulimit -n 可以查看每个进程允许打开的文件个数。这些文件还得除去每个进程必然打开的标准输入,标准输出,标准错误,服务端监听socket,进程间通讯的unix域socket等文件,那么剩下的可用于客户端socket连接的文件数量还要-10个。缺省情况下,linux通讯程序默认打开1024-1014个tcp并发连接。
想要支持更高数量的tcp并发连接的通讯处理程序,就必须修改linux对当前用户的进程同时打开的文件数量的软限制(soft limit)和硬限制(hard limit).其中软限制指的是linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;硬限制是根据系统硬件资源状况(主要内存)计算出来的系统最多可以同时打开的文件数量。通常软限制小于硬限制。
2、网络内核对本地端口范围通常有限制。系统中某一时刻同时存在太多的tcp客户端连接时,由于每个tcp客户端连接要占用唯一的本地端口号,现有的tcp连接将本地端口号占满。 问题表现在connect()调用返回失败,系统错误提示‘Can’t assign requestedaddress’。用tcpdump工具监视网络的话,会发现根本没有tcp连接时客户端发syn包的网络流量。解决方法是找到修改本地端口范围的地方更新。 在/etc/sysctl.conf文件中,添加行:
net.ipv4.ip_local_port_range = 1024 65000 之后再执行 sysctl -p命令,不报错及修改成功
3、ip_table防火墙对最大跟踪的tcp连接数有限制。iptable防火墙在内核中会对每个tcp连接的状态进行跟踪,跟踪信息会放在位于内核内存中的conntrackdatabase中,这个数据库大小有限,当系统中存在过多的tcp连接时数据库容量不足,ip_table无法为新tcp连接建立跟踪信息,于是表现为connect()调用中堵塞。 在/etc/sysctl.conf文件中,添加行: net.ipv4.ip_conntrack_max = 10240 执行sysctl命令: sysctl -p

所以,对server端可以通过增加内存、修改最大文件描述符个数等参数,单机最大并发tcp连接数超过10万没问题,国外UrbanAirship公司在产品环境中已做到50万并发。