服务器最多建立65536个tcp连接吗?

字号+ 编辑: 种花家 修订: 种花家 来源: 热门技术 2023-10-19 我要说两句(0)

“因为TCP端口号是16位无符号整数, 最大65535, 所以一台服务器最多支持65536个TCP socket连接.” – 一个非常经典的误解! 即使是有多年网络编程经验的人, 也会持有这个错误结论。

要戳破这个错误结论, 可以从理论和实践两方面来.

理论

TCP连接使用一个四元组来唯一标识,这个四元组包括本地IP地址、本地端口、远程IP地址和远程端口。对于IPv4来说,系统理论上最多可以管理2^(32+16+32+16),即2的96次方个连接。

然而,由于同一台服务器通常只有一个本地IP地址,因此该服务器最多可以管理2^(16+32+16)个连接。而一个服务(例如Nginx进程)通常只监听一个本地端口,因此同一台服务器最多可以管理2^(32+16)个连接。当从一台远程机器(即客户端)连接到该服务器上的一个服务时,本地IP地址、本地端口和远程IP地址这三个变量是固定的,因此最多只能建立2^16=65536个连接。这是一个常见的误解!

如果考虑的不仅是TCP,而是一个五元组,则还需要加上协议号(TCP、UDP或其他)。

实践

服务器绑定一个ip:port, 然后accept连接, 所有accept的连接使用的本地地址也是同样的ip:port.

扩展内容

如果某个客户端向同一个TCP端点(ip:port)发起主动连接, 那么每一条连接都必须使用不同的本地TCP端点, 如果客户端只有一个IP则是使用不同的本地端口, 该端口的范围在*nix系统上的一个例子是32768到61000, 可以通过如下命令查看:

[root@~]# cat /proc/sys/net/ipv4/ip_local_port_range 
32768   61000

换句话说,当一个客户端与同一台服务器的相同IP和端口(例如进行压力测试)建立连接时,最多可以发起大约30000个连接。

TCP客户端(即主动发起连接的一方)可以在同一个IP和端口上主动连接到不同的服务器,只需在绑定(bind)之前设置socket的SO_REUSEADDR选项。

系统支持的最大打开文件描述符数(包括socket连接):

[root@~]# cat /proc/sys/fs/file-max
580382

单个进程所能打开的最大文件描述符数:

[root@~]# ulimit -n
1024

结论

无论是针对服务器还是客户端,所谓"一台机器最多建立65536个TCP连接"的说法毫无根据,从理论上来说,这个限制可以远远超过的。此外,对于客户端而言,操作系统会根据不同的远程IP和端口自动决定是否重用本地端口。

阅完此文,您的感想如何?
  • 有用

    4418

  • 没用

    260

  • 开心

    310

  • 愤怒

    19

  • 可怜

    18

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • Linux系统下word文档转成pdf的办法

  • ubuntu和debian安装nginx或者tengine报错, 找不到pcre依赖库的解决办法

  • linux终端下借助awk命令查询筛出网站access.log日志里的统计信息

  • 常见的web中间件请求返回状态码

我要说说
网上宾友点评
沙发已空