程序员一代码搬运工
【Java学习心得和Java学习技术个人总结】

TCP服务器和客户端最大连接数

TCP服务器和客户端最大连接数

只要资源 (内存硬盘cpu)足够,理论上可以接收无限个链接。所谓65535的限制,是针对客户端的,客户机每链接一个服务,就必须开一个tcp端口与之对应。这样,链接到65535个服务后,本地端口就被占满。服务端口仅仅使用一个。一个tcp链接,是四个元素决定的,server IP:port+client IP:port。

对于服务器,每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,就会返回错误。

我们知道操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接?但是事实并不是这样。

我们还知道对于TCP连接是由:原IP,原端口,目的IP,目的端口。但是监听server端TCP连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因为它是固定在本地的端口上去监听,所以最大TCP连接为:客户端ip数×客户端port数

而对于客户端,网络通信过程中服务端监听一个固定的端口,客户端主动发起连接请求后要经过三次握手才能与服务器建立起一个TCP连接.客户端每次发起一个TCP连接时,系统会随机选取一个空闲的端口,该端口是独占的不能与其他TCP连接共享,因此理论上一台机器有多少空闲的端口,就能对外发起多少个TCP连接。

根据TCP/IP协议,端口port使用16位无符号整数unsigned short来存储,因此本地端口一共有2^16=65536个,即0-65535,其中0~1023是预留端口,0有特殊含义不能使用,1024以下端口都是超级管理员用户(如root)才可以使用,因此就算使用root权限,一台机器最多能使用的端口也只有65535个。但是一台机器最多只能利用28232个端口。

拓展

端口号范围限制?

操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。

最大动态端口数 MaxUserPort (Default = 5000, Max = 65534) TCP客户端和服务器连接时,客户端必须分配一个动态端口,默认情况下这个动态端口的分配范围为 1024-5000 ,也就是说默认情况下,客户端最多可以同时发起3977 Socket 连接

最大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 连接。

最大TCB Hash table 数量 MaxHashTableSize TCB 是通过Hash table 来管理的。

这个值指明分配 pagepool 内存的数量,也就是说,如果MaxFreeTcbs = 1000 , 则 pagepool 的内存数量为 500KB那么 MaxHashTableSize 应大于 500 才行。这个数量越大,则Hash table 的冗余度就越高,每次分配和查找 TCP 连接用时就越少。这个值必须是2的幂,且最大为65536.

未经允许不得转载:程序员一代码搬运工 » TCP服务器和客户端最大连接数

分享到:更多 ()