经典的”服务器最多65536个链接”误解

无心间在一个牛人的技术博客上看到了这篇博客,也解了本身心中多年的谜(呵呵,虽说得有点夸张,可是我以为这是好多java程序员须要了解透彻的知识)。java


“由于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, 能够经过以下命令查看:socket

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

也就是说, 一个客户端链接同一个服务器的同一个ip:port(好比进行压力测试), 最多能够发起30000个左右的链接.测试

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

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

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

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

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

结论

不管是对于服务器仍是客户端, 认为”一台机器最多创建65536个TCP链接”是没有根据的, 理论上远远超过这个值.

相关文章
相关标签/搜索