经典的"服务器最多65535个连接"误解

38 views
Skip to first unread message

benegg

unread,
May 31, 2009, 7:53:22 AM5/31/09
to online_game_dev
“因为TCP端口号是16位, 最大65535, 所以一台服务器最多支持65535个TCP socket连接.” - 一个非常经典的误解! 即使
是有几年网络编程经验的人, 也会犯.

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

系统通过一个四元组来唯一标识一条TCP连接. 这个四元组的结构是{local ip, local port, remote ip,
remote port}. 如果不仅仅考虑TCP, 则是一个五元组, 加上协议号(TCP, UDP或者其它).
实践

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

转载自: http://www.benegg.com/?p=29

Ask_u

unread,
Jun 11, 2009, 9:41:12 PM6/11/09
to online_game_dev
我老大5、6的经验了,还认为是65535。。哈哈

benegg

unread,
Jun 13, 2009, 1:39:24 AM6/13/09
to online_game_dev
更新:
-----------------------------
"因为TCP端口号是16位无符号整数, 最大65535, 所以一台服务器最多支持65536个TCP socket连接." - 一个非常经典的误
解! 即使是有多年网络编程经验的人, 也会持有这个错误结论.

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

**理论

系统通过一个四元组来唯一标识一条TCP连接. 这个四元组的结构是{local ip, local port, remote ip,

remote port}, 对于IPv4, 系统理论上最多可以管理2^(32+16+32+16), 2的96次方个连接. 如果不仅仅考虑
TCP, 则是一个五元组, 加上协议号(TCP, UDP或者其它).

**实践

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

**扩展内容

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

[ro...@www.benegg.com ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000

也就是说, 一个客户端连接同一个服务器(比如进行压力测试), 最多可以发起30000个左右的连接.

TCP客户端(TCP的主动发起者)可以在同一ip:port上向不同的服务器发起主动连接, 只需在bind之前对socket设置
SO_REUSEADDR选项.

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

[ro...@www.benegg.com ~]# cat /proc/sys/fs/file-max
580382

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

[ro...@www.benegg.com ~]# ulimit -n
1024

**结论

无论是对于服务器还是客户端, 认为"一台机器最多建立65536个TCP连接"是没有根据的, 理论上远远超过这个值.

转载自: http://www.benegg.com/?p=29

Reply all
Reply to author
Forward
0 new messages