服務器最多建立65536個tcp連接嗎?

要戳破这个错误结论, 可以从理论和实践两方面来.
理论
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和端口自动决定是否重用本地端口。