×
ABao阿宝
想是问题,做是答案;输在犹豫,赢在行动。
linux服务器最多65536个连接误解
分类:
Linux运维
发表:2017-07-21
围观(2205)
抢沙发
"因为TCP端口号是16位无符号整数,最大65535,所以一台服务器最多支持65536个TCP socket连接。" 一个非常经典的误解! 即使是有多年网络编程经验的人, 也会持有这个错误结论。 要戳破这个错误结论,可以从理论和实践两方面来。 ### 理论 系统通过一个四元组来唯一标识一条TCP连接. 这个四元组的结构是{local\_ip, local\_port, remote\_ip, remote\_port}, 对于IPv4, 系统理论上最多可以管理2^(32+16+32+16), 2的96次方个连接。 因为对于同一台服务器来说,一般只有一个 local\_ip,那么同一台服务器可以管理 2^(16+32+16) 个连接。而一个服务(进程, 如 Nginx 进程)一般只监听一个 local\_port,那么同一台服务就可以管理 2^(32+16) 个连接。而如果从一台远端机器(所谓的 client)来连接这台服务器上的一个服务,那么 local\_ip,local\_port,remote\_ip 这3个变量是固定的,那么就只能建立 2^16=65536 个连接了。这就是经典的误解的来源! 如果不仅仅考虑TCP,则是一个五元组,加上协议号(TCP,UDP或者其它)。 ### 实践 服务器绑定一个ip:port, 然后accept连接, 所有accept的连接使用的本地地址也是同样的ip:port。 ### 扩展内容 如果某个客户端向同一个TCP端点(ip:port)发起主动连接,那么每一条连接都必须使用不同的本地TCP端点,如果客户端只有一个IP则是使用不同的本地端口,该端口的范围在\*nix系统上的一个例子是32768到61000,可以通过如下命令查看: ``` [root@xubaojin.com ~]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 ``` 也就是说,一个客户端连接同一个服务器的同一个ip:port(比如进行压力测试),最多可以发起30000个左右的连接。 TCP客户端(TCP的主动发起者)可以在同一ip:port上向不同的服务器发起主动连接,只需在bind之前对socket设置SO\_REUSEADDR选项。 系统支持的最大打开文件描述符数(包括socket连接): ``` [root@xubaojin.com ~]# cat /proc/sys/fs/file-max 580382 ``` 单个进程所能打开的最大文件描述符数: ``` [root@xubaojin.com ~]# ulimit -n 1024 ``` ### 结论 无论是对于服务器还是客户端,认为"一台机器最多建立65536个TCP连接"是没有根据的,理论上远远超过这个值。 另外,对于client端,操作系统会自动根据不同的远端 ip:port,决定是否重用本地端口。
标签:
linux
服务器
连接
本文
暂无
评论
回复给
点击这里取消回复。
验证码(*)
Top
Python
产品设计
学习笔记
网络基础
PHP
经营管理
运维开发
系统测试
Shell
Java
系统开发
Linux运维
运维架构
Go
×
本文 暂无 评论