w88优德 - 经典的「服务器最多65536个连接」误解

${website.getHeaderOriginal(${article.taxonomyName})}

来自:idea's blog

作者:ideawu

链接:http://www.ideawu.net/blog/archives/533.html(点击尾部阅读原文前往)


"因为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@benegg.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@benegg.com ~]# cat /proc/sys/fs/file-max
580382


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


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


结论


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


另外··|,对于client端··|,操作系统会自动根据不同的远端 ip:port··|,决定是否重用本地端口··|--。



●本文编号102··|,以后想阅读这篇文章直接输入102即可··|--。

●输入m获取文章目录

更多推荐

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等··|--。

${website.getFooterOriginal(${article.taxonomyName})}

发布者 :w88优德_优德w88官网登录_优德88官方网站登录 - 分类 w88优德

(必填)