linux查看可使用的端口信息

嗨,小伙伴们!TCP/IP协议里的端口范围是从0到6 5 5 3 5 ,但Linux系统里对端口的使用有特定的限制哦。
通常,这个限制在/proc/sys/net/ipv4 /ip_local_port_range文件里设置。
想调整端口范围?没问题!你可以在/etc/sysctl.conf文件里这样写:net.ipv4 .ip_local_port_range=1 02 4 6 5 000。
这样一来,你的可用端口就从1 02 4 开始,一直扩展到6 5 000啦!简单不简单?😉

Linux 的 TCP 连接数量最大不能超过 65535?那服务器是如何应对百万千万的并发的?

嘿,聊聊Linux服务器到底能撑多少TCP连接这事儿吧。
很多人以为6 5 5 3 5 是上限,其实这是个误区。
咱们得搞清楚,为啥会有6 5 5 3 5 这个数字,以及真正限制服务器处理并发连接的是啥。

首先,6 5 5 3 5 是TCP/IP协议里端口号的最大值。
为啥是这个数?因为端口号是1 6 位的,所以理论上能表示的数值范围就是0到6 5 5 3 5 不过,端口0一般不用,所以实际可用的就只有6 5 5 3 5 个。

但关键在于,端口号并不直接限制服务器能处理的并发TCP连接数。
为啥呢?因为服务器通常是在一个固定的端口上监听客户端的连接请求。
比如,一个HTTP服务器通常会在8 0端口上监听。
每当有新的客户端连接时,服务器会为这个连接分配一个新的socket,但并不需要为每个连接都分配一个不同的端口号。
这就是所谓的“端口复用”。

那么,真正限制服务器处理并发连接的是什么呢?主要有以下几个方面:
1 . 系统资源限制:服务器的内存、CPU、网络带宽等资源是有限的。
每个TCP连接都需要占用一定的系统资源,比如内存和文件描述符。
当系统资源用尽时,服务器就无法再接受新的连接了。

2 . 文件描述符限制:在Linux系统中,每个进程都有一个文件描述符表,用来跟踪该进程打开的所有文件(包括socket)。
系统对单个进程可以打开的文件数量有限制,这个限制可以通过ulimit -n命令查看和修改。
如果服务器需要处理大量的并发连接,可能需要增加这个限制。

3 . 网络架构和负载均衡:在实际应用中,服务器通常会采用分布式集群架构,通过负载均衡器将请求分发到多个服务器上。
这样,每个服务器只需要处理一部分请求,从而提高了整个系统的并发处理能力。

举个例子,假设一个Linux服务器在8 0端口上监听HTTP请求。
即使只有一个端口,该服务器仍然可以处理来自不同客户端的多个并发连接。
每个连接都由一个唯一的四元组来标识,其中远程IP和远程端口是变化的。
比如,客户端A(IP:2 .2 .2 .2 ,端口:5 5 5 5 )连接到服务器(IP:1 .1 .1 .1 ,端口:8 0),而客户端B(IP:3 .3 .3 .3 ,端口:6 6 6 6 )也连接到服务器(IP:1 .1 .1 .1 ,端口:8 0)。
这两个连接虽然都使用了服务器的8 0端口,但它们是独立的TCP连接,因为它们的四元组不同。

综上所述,Linux服务器的TCP并发连接数并不受6 5 5 3 5 个端口的限制。
通过端口复用、增加系统资源、修改文件描述符限制以及采用分布式集群架构等手段,服务器可以处理远超6 5 5 3 5 个并发连接。
因此,在实际应用中,服务器完全有能力应对百万、千万级别的并发请求。

端口号可能不够用了

好嘞,咱们来聊聊TCP连接这回事儿。
你想啊,每个TCP连接,就像俩人打电话,得有独特的身份标识,对吧?这个身份标识就是TCP连接四元组,它包括了谁打的电话(客户端IP)、谁接的(服务端IP),还有打电话用的端口(客户端PORT)和接电话用的端口(服务端PORT)。
有了这四样,每个连接就独一无二了。

咱们现在主要聊聊Linux系统下的事儿。
Linux系统规定,单个机器上能用的端口号一共有6 5 5 3 6 个。
不过,实际上,我们一般不太会用到这么高的端口,对外连接的时候,常用的范围大概在3 2 7 6 8 到6 1 000这个区间。
为啥不是6 5 5 3 6 呢?因为0到1 02 3 这些端口是系统保留的,比较重要的服务都在这儿,咱们一般不随便用。

那么问题来了,一个短连接用完了,端口是不是立马就能给下一个连接用呢?理论上说,不能啊。
你想啊,TCP传输要确保最后确认信息(ACK)肯定能送到对方那儿,不会丢失。
所以,当一个连接结束的时候,得有个等待时间,这个时间叫TIME_WAIT状态。
Linux系统默认这个状态要持续2 个最大报文段生命周期(MSL),大概就是1 2 0秒。
这意味着,一个端口在释放后,要等1 2 0秒才能被重新使用。

这1 2 0秒听起来挺长的,那短连接用完,短时间内能开多少个新连接呢?因为端口总数有限,假设你每秒都开启一个新连接,那1 2 0秒内最多也就6 4 5 1 1 个连接。
平均下来,每秒大概是5 3 8 个。
当然,这只是一个理论上的最大值。

不过,这6 4 5 1 1 也不是绝对的。
咱们可以通过设置虚拟网卡、分配不同的IP地址来玩花样。
每个虚拟网卡可以有自己的一套端口范围,这样就能实现多IP并行,最大连接数就能乘以IP的数量了。
理论上,如果咱们做得够好,单机并发连接数可以达到几十万甚至上百万,但这只是理论,实际操作中得考虑各种因素。

好了,咱们刚才说的都是客户端这边的情况。
现在再来看看服务端。
服务端通常是固定监听某个IP和端口的,比如常见的8 0端口(HTTP)或者4 4 3 端口(HTTPS)。
对于服务端来说,不同的客户端IP和端口组合,就能标识出一个不同的TCP连接。

服务端是通过一个叫socket_fd的东西来绑定端口号的。
当客户端来请求连接时,服务端会返回一个新的socket_fd给客户端用,以后的数据传输就通过这个fd来搞定。
所以你看,服务端作为接收连接的一方,端口号其实没啥限制,关键在于那个socket_fd的数量。
咱们得给socket_fd设置一个合理的上限,不然可能会撑爆系统。

但是!当服务端扮演客户端,去调用第三方服务的时候,问题就来了。
如果它频繁地打开和关闭大量短连接,就会产生很多TIME_WAIT状态。
这时候,虽然端口没被占用,但是socket_fd被占用了,短时间內端口号的可用性就会受限。

为了解决这个问题,咱们推荐使用长连接或者连接池的方式。
长连接意味着一旦连接建立,就长时间使用,不用每次都建立和断开,这样能省去不少TCP连接和断开的开销。
连接池呢,就是预先创建好一批连接,需要的时候直接从池子里拿,用完了再放回去,也能大大提高效率。

另外,还有一种情况是服务端主动断开连接,这时候也会产生TIME_WAIT状态。
短期内,确实会占用一些socket_fd,但不会影响端口号的使用。
因为这时候连接四元组里的端口号,都是服务端自己监听的那些唯一端口。

所以说啊,端口号的管理,得根据咱们用的连接形式和应用场景来考虑,得合理规划资源利用才行。

Linux 的 TCP 连接数量最大不能超过 65535?那服务器是如何应对百万千万的并发的?

想知道单机最大TCP连接数是多少吗?首先,6 5 5 3 5 这个数字是指客户端能建立的最大连接数。
在TCP协议里,服务器会在一个端口上等待客户端发起连接,然后通过三次握手建立连接。
那单机最多能有多少个并发TCP连接呢?其实,每个TCP连接都有四个关键信息来标识它:本地IP、本地端口、远程IP和远程端口。
客户端每次发起连接时,系统会自动选择一个空闲的本地端口,所以理论上一个客户端可以建立6 5 5 3 5 个连接。
服务器端通常固定一个端口,等待客户端的连接。
在不考虑地址重用的情况下,即使服务器有多个IP,本地端口也是唯一的。
所以,最大TCP连接数就是客户端IP数乘以端口数,对于IPv4 来说,这个数字大约是2 的4 8 次方。
不过,实际操作中,受限于硬件和操作系统,这个数字远远达不到理论值。
在Unix/Linux系统里,内存和文件描述符的数量是限制连接数的关键。
通过调整这些参数,单机最大并发TCP连接数可以超过1 0万甚至上百万。
6 5 5 3 5 只是可用的端口总数,不代表服务器只能处理这么多的并发连接。
服务器的实际承受能力取决于硬件、软件和优化等多方面因素。
像淘宝、腾讯这样的巨头,之所以能处理海量并发,是因为他们使用了服务器集群。
至于6 5 5 3 5 这个数字,它来源于Linux系统中端口号的数量限制,因为端口号是用1 6 位表示的,所以最多有6 5 5 3 6 个端口,但端口0是保留的,所以实际可用的是6 5 5 3 5 个。