linux端口数量上限65535原因;linux服务端最大连接数量可以超过65535

概述

关于端口数量,大家都知道最多是65535个端口。
这个来源于标识端口号的变量是16位的,那么就是65536个,去掉0这个特殊端口,剩下65535个,所以理论上最大可用数量是65535

但是实际中还有一些特殊端口已经定义好用处了,不能随便拿来给应用监听了,比如80,443等端口号.

linux端口数量上限65535原因

这个原因很简单,上面概述中已经说过了。

但是linux中打开一个端口是需要用一个文件描述符来标识,而且linux还有端口范围。
net.ipv4.ip_local_port_range是指本地端口范围,它的默认值是32768-61000

linux的可用端口= 61000-32768=28232=大概2.8W个

文件描述符查询,默认的值是1024,可以自己修改

ulimit -n

捞一张tcp通信图,其中可以看到socket是在tcp上的抽象,把tcp复杂的操作抽象为几个简单的接口来调用。
socket建立的时候客户端和服务端会各自打开一个网络套接字文件,linux中会给这个文件分配一个文件描述符
linux端口数量上限65535原因;linux服务端最大连接数量可以超过65535_第1张图片

linux服务端最大连接数量

上面说到linux可用端口才2.8W个,那是不是只能支持2.8W个连接呢,那肯定不是的。

一个TCP连接的标记为一个四元组(source_ip, source_port, destination_ip, destination_port)
(源IP,源端口,目的IP,目的端口)四个元素的组合.

这样通过服务端的一个端口就可以和多个客户端建立多个连接了。
这里初步就可以知道,服务端的可以和客户端建立超过端口数量的连接数了。

进一步分析下服务端和客户端的连接建立过程

这个过程就直接捞大佬们的意见了

https://www.cnblogs.com/codingmengmeng/p/13676605.html

客户端:

socket()---->创建出 active_socket_fd (client_socket_fd)

bind()—>把active_socket_fd与ip,port绑定起来

connect()—>client_socket_fd 主动请求服务端的 listen_socket_fd

read()/write()---->读/写 socket io

close()---->关闭socket_fd

服务端:

socket()---->创建出 active_socket_fd

bind()—>把active_socket_fd与ip,port绑定起来

listen()---->active_socket_fd–> listen_socket_fd
等待客户端的client_socket_fd来请求连接

accept()---->listen_socket_fd–>connec_socket_fd
把监听socket转变为连接socket,用于建立连接后的读写数据

read()/write()---->读/写 socket io

close()---->关闭socket_fd

linux内核中,socket函数不管在客户端还是服务端,创建的套接字都是主动socket,但是在服务端经过listen(),后把其转变为listen_socket_fd(被动监听socket),经过accept()后转变为connect_socket_fd(已连接socket)

在转变为connect_socket_fd之前,都是同一个socket,只不过socket的状态改变了,但是服务端经过accept()后返回的socket是新的socket,用于连接后的read()/write()

一个tcp连接的唯一标识是一个四元组,serverIP和serverPort是固定的,假定客户端也只有一个,即clientIP也是固定的,则描述不同的tcp连接就只剩下clientPort了。而实际上每当客户端调用connect()函数试图与服务端建立连接时,内核会为客户端分配一个临时端口作为源端口clientPort,服务端通过accept()函数感知到这个连接时,将返回一个全新的tcp连接的描述字(connect_socket_fd)

所以,一个服务端端口是能建立多个连接的,因为每个连接中clientPort都是不同的,在进行通信时,操作系统接收到向serverPort发来的数据时,会在该端口产生的连接中查找到符合这个唯一标识并传递信息到对应的缓冲区。

你可能感兴趣的:(linux,linux,服务器,运维)