对于单机server,单机可以接受的(tcp)最大连接数是多少?
socket是系统的一个操作系统句柄,不是本地端口。对于TCP链接来说,由本地的IP、PORT、远端的IP、PROT,来唯一确定一个连接,即TCP得socket。
服务器創建Socket过程:服务器创建监听socket- >与对外服务的端口号绑定->开始listen->客户端连接到服务器对应的port->服务器accept为新的客户端产生新的socket->基于这个新的socket与客户端交换数据。(這裡新的Socket是指源IP或者源端口不一樣)
在链接发起端,操作系统中,端口号的范围是0-65535,其中0-1024是预留端口号,不可使用,其他的端口都是可以使用的。理论上是受系统支持的最大打开文件描述符的数目限制(65535);实际则受到系统资源的各种限制,也可以通过多网卡,虚ip等手段来变化。
在一个链接接收端,同一个listen的socket accept进来的连接,都是本機同一个端口号,是listen之前bind的那个端口号。从同一个listen的socket可以接受的连接实际上也远大于65536,理论上最大的TCP链接数=所有有效ip排列组合的数量*端口数量64000。
在实际环境中,受到机器资源、操作系统等的限制。
Windows 下修改TCP连接数限制:
调整系统参数来调整单机的最大TCP连接数,Windows 下单机的TCP连接数有多个参数共同决定:
通过修改注册表[HKEY_LOCAL_MACHINE System CurrentControlSet Services Tcpip Parameters]
1.最大TCP连接数 TcpNumConnections (REG_DWORD)(Default = 16,777,214)
2.TCP关闭延迟时间 TCPTimedWaitDelay(REG_DWORD)的值表示系统释放已关闭的TCP连接并复用其资源之前,必须等待的时间。如果系统显示大量连接处于TIME_WAIT状态,则会导致并发量与吞吐量的严重下降,通过减小该项的值,系统可以更快地释放已关闭的连接,从而为新连接提供更多的资源,特别是对于高并发短连接的Server具有积极的意义。(沒有就添加該鍵值(0-240)s)
3.最大动态端口数 MaxUserPort(REG_DWORD) (Default = 5000, Max = 65534) 的值表示当应用程序向系统请求可用的端口时,TCP/IP可分配的最大端口号。默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起3977 Socket 连接。
4.最大TCB 数量 MaxFreeTcbs
系统为每个TCP 连接分配一个TCP 控制块(TCP control block or TCB),这个控制块用于缓存TCP连接的一些参数,每个TCB需要分配 0.5 KB的pagepool 和 0.5KB 的Non-pagepool,也就说,每个TCP连接会占用 1KB 的系统内存。
非Server版本,MaxFreeTcbs 的默认值为1000 (64M 以上物理内存)Server 版本,这个的默认值为 2000。也就是说,默认情况下,Server 版本最多同时可以建立并保持2000个TCP 连接。
5. 最大TCB Hash table 数量 MaxHashTableSize TCB 是通过Hash table 来管理的。
这个值指明分配 pagepool 内存的数量,也就是说,如果MaxFreeTcbs = 1000 , 则 pagepool 的内存数量为 500KB那么 MaxHashTableSize 应大于 500 才行。这个数量越大,则Hash table 的冗余度就越高,每次分配和查找 TCP 连接用时就越少。这个值必须是2的幂,且最大为65536.
IBM WebSphere Voice Server 在windows server 2003 下的典型配置
MaxUserPort = 65534 (Decimal)
MaxHashTableSize = 65536 (Decimal)
MaxFreeTcbs = 16000 (Decimal)
可以看到 MaxHashTableSize 被配置为比MaxFreeTcbs 大4倍,这样可以大大增加TCP建立的速度。
linux下, 一个端口可以有多少个长连接 ?是无限个的,ulimit -n 的上限也不是 65535,文件数上限也是归根到底根据内存的大小决定的。(/proc/sys/fs/file-max是系统给出的建议值,系统会计算资源给出一个和合理值,一般跟内存有关系,内存越大,改值越大,ulimit -n 和limits.conf里最大文件数设定可以設置成系統給出的建議值)
注:本文主要用於個人學習與總結,如有錯誤期待各位大佬的指導!