有人说linux的TCP连接数量最大不能超过65535个吗,是真的吗?

有人说linux的TCP连接数量最大不能超过65535个吗,是真的吗?,第1张

linux的TCP连接数量最大不能超过65535个,这种说法是错误的。

一、TCP最大连接数和端口数量没有必然联系

TCP连接是服务器IP端口和客户端IP端口组成的,对于服务器而言,一般一个服务器只监听一个端口,而客户端是可以不计其数的。一个连接由一个5元组决定(protocol,local IP,local port,remote ip,remote port),对于TCP,protocol固定是TCP,还有四个元素。对于服务器来说,local port一般是固定的,比如>

二、TCP连接数是和内存正成比的

客户端和服务器建立的每个TCP连接都会占用服务器内存,所以最大TCP连接数和内存成正比。简单估算为最大内存除以单TCP连接占用的最小内存。

三、linux对tcp数量限制是为了文件管理方便

1、Linux *** 作系统中,一切都是文件。所以每个TCP连接,都会打开一个文件。为此Linux *** 作系统限制了每个用户能打开的文件数量,通过ulimit -n 查看。当然,我们也可以对此进行修改,修改方式如下:

vi /etc/security/limitsconf文件,在文件中添加如下行(限制修改为10240):

speng soft nofile 10240

speng hard nofile 10240

2、Linux *** 作系统对所有用户最大能打开文件的限制:cat /proc/sys/fs/file-max。

3网络核心模块对tcp连接的限制(最大不能超过65535)。

4、防火墙管理策略也会对tcp连接数量进行限制。

基于以上的原因,在Linux *** 作系统中,对TCP连接数量的限制依次有:端口数量限制,网络核心限制,最大文件数量限制(因为每建立一个连接就要打开一个文件),防火墙限制,用户打开文件限制。但并不存在65535这个数量限制。

由一个经典问题来引出:一台机器最多可以建立多少tcp连接?
这个问题基本都是从server的角度来回答,因为很少会有客户端需要建立多个连接。
需要记住:
client_ip:client_port <---> server_ip:server_port,一个四元组可以确定一个连接
一对于单机server,单机可以接受的最大连接数是多少?
65536是一个经典错误答案
理论上是受系统支持的最大打开文件描述符的数目限制;实际则受到系统资源的各种限制。之前转过一篇淘宝探索单机server 支持200M连接的尝试。
对于从同一个listen的socket accept进来的连接,是本机端口号都是同一个端口号,都是listen之前bind的那个端口号。从同一个listen的socket可以接受的连接实际上也远大于65536
对于单机server来讲,通常server_ip和server_port是固定的,client_ip和client_port都是可变量,可变数目远大于65536。实际上server_ip也可以通过多网卡,虚ip等手段来变化
二对于单机client,单机可以发起的最大连接数是多少?
1client连接的只是一个对端server,即对端ip:port是确定的,只有一个。
这时,要受到系统端口号的限制,每发起一个新的连接,就要占用一个新的端口号。这就是65536这个数字的由来,因为端口号是16位无符号整数,0-65535之前变化。
但实际最大连接数并到不了65536,还要受到netipv4ip_local_port_range 这个范围的限制,自己的程序只能使用这个范围内的端口号。
这种情况下,通常server_ip,server_port,client_ip都是固定的,可变的只有client_port,所以受到端口号数目的限制。实际上client_ip也可以通过多网卡,虚ip等手段来变化
2client连接的是多个server,即对端ip:port有多个可以同时连接
这时的答案和单机server的情况是一样的,理论上是受系统支持的最大打开文件描述符的数目限制;实际则受到系统资源的各种限制。
对于这种情况下,只有client_ip是固定的,server_ip server_port client_port都是可变量,可变数目远大于65536,但在实际编程处理时,需要注意如何支持使用相同的本地ip和port向不同的远端发起连接,即支持:
client_ip:client_port ------- server_ip1:server_ip1
client_ip:client_port ------- server_ip2:server_ip2
这样的情况,需要设置客户端socket 的SO_REUSEADDR选项,即可使用相同的本地ip和port向不同的远端发起连接
SO_REUSEADDR通常只在server端设置,用来能使server快速重启
Stevens的Unix网络编程中说,SO_REUSEADDR可以用在以下四种情况下:
1当有一个有相同本地地址和端口的socket1处于TIME_WAIT状态时,而你启动的程序的socket2要占用该地址和端口,你的程序就要用到该选项。
2SO_REUSEADDR允许同一port上启动同一服务器的多个实例(多个进程)。但每个实例绑定的IP地址是不能相同的。在有多块网卡或用IP Alias技术的机器可以测试这种情
3SO_REUSEADDR允许单个进程绑定相同的端口到多个socket上,但每个socket绑定的ip地址不同。
4SO_REUSEADDR允许完全相同的地址和端口的重复绑定。正常只用于UDP的多播

ie
工具
internet选项
连接
局域网(lan)设置
代理服务器
一般的>

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13252121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-26
下一篇 2023-06-26

发表评论

登录后才能评论

评论列表(0条)

保存