摘要:一个完整的连接由四部分组成:源端口、目的端口,这是经典的四重连接。没错,这是服务器上唯一消耗的端口。但是,它可以完全支持以下连接:客户端服务器连接,客户端服务器连接,即使只有一个客户端,也可以建立到该服务器的多个连接。
在工作和学习中,我们都知道一台电脑共有65535个端口号,但是一台电脑真的只能建立65535个TCP连接吗?Tcp:(传输控制协议)提供面向连接的可靠数据传输。
一个完整的TCP连接由四部分组成:源IP、源端口、目的IP、目的端口。这是经典的插座四倍。
要建立tcp连接,需要绑定两端的套接字:源IP地址:源端口号:目标IP地址:目标端口号。只要绑定的套接字不重复,就可以完成tcp连接。可以看到,如果端口号不够,可以不断的改变目标IP地址和目标端口号,保证四元组不重复,可以创建很多TCP连接。可见有人说最多只能创建65535个TCP连接。在这种情况下,可以创建的tcp数量有限制吗?
首先,系统设置了连接数的限制。
1.Linux系统可以使用的端口范围是特别有限的。具体检查方法如下:
[root @鱼目~]# cat/proc/sys/net/IP v4/IP _ local _ port _ range
32768 60999
的当前限制是32768-60999,因此此时只能使用60999-32768=28231个端口号
当然,这个数字可以修改。(这是系统管理员优化操作系统的一个重点。)
修改方法如下:[root @鱼目~] # vim/etc/sysctl.conf加一行:net . IP v4 . IP _ local _ port _ range = 1024 60009。保存后执行sysctl -p /etc/sysctl.conf使其生效[root @鱼目~] # cat/proc/。
其次,文件描述符限制了连接数
在Linux下,一切都是文件,计算机会给每个TCP连接分配一个文件描述符。与目标IP通信时,只需要读写文件描述符。
但是,linux在三个方面限制了可以打开的文件描述符的数量。"系统级别:当前系统可以打开的最大数量。检查[root @鱼目~]# cat /proc/sys/fs/file-max 95861到cat/proc/sys/fs/file -max。用户级别:指定用户可以打开的最大数量。通过cat /etc/security/limits.conf查看[root @鱼目~]# cat/etc/security/limits . conf...* softnproc20 * hardnproc50进程级别:单个进程可以打开的最大数量,通过cat/proc/sys/fs/NR _ open1048576查看[root @鱼目~]# cat/proc/sys/fs/NR _ open 1048576
当然,这个数字可以修改。(这也是系统管理员优化操作系统的一个重点。)
修改方法如下:[root @鱼目~]# echo 1000 >/proc/sys/fs/NR _ open[root @鱼目~] # cat/proc/sys/fs/NR _ open1000
三。对线程连接数的限制
在这里,我们绕不开一个著名的C10K问题。造成这个问题的原因是,当服务器连接数达到10000个,每个连接需要消耗一个线程资源时,操作系统会不断忙于线程的上下文切换,最终导致系统崩溃。为每个TCP连接创建一个线程的方式是传统的多线程并发模型,只有早期的操作系统支持。现在所有的操作系统都支持IO复用。简单来说,一个线程可以管理多个TCP连接的资源,这样少量的线程就可以管理大量的TCP连接。因此,只有采用IO复用才能解决这个问题。
第四,内存对连接数的限制
每个TCP连接本身以及这个连接所使用的缓冲区都需要占用一定的内存,大量的连接会消耗大量的内存空间。
为了清楚地讨论这个问题,我们最好分别看一下客户端和服务器的角色。上面你举的QQ的例子就是操作系统作为服务器工作的时候。
这个时候,还不是你纠结65535这个问题的时候。通常,服务器在固定的端口上侦听。如Nginx,一般听80。来自客户端的所有连接都连接到服务器的端口80。你是对的,服务器只消耗80个端口。但是可以完全支持下面的连接。
1:客户端IP1 10000服务器IP 80连接2:客户端IP2 10000服务器IP 80连接3:......
此外,即使只有一个客户端,也可以建立到该服务器的多个连接。只是不断改变你的端口号。1:客户端IP1 10000服务器IP 80连接2:客户端IP1 10001服务器IP 80连接3:......
你看,对于服务器来说,一个80端口全世界都可以用。根本没必要纠结65535的问题TG: li9047
评论前必须登录!
注册