android 65536 简书,"服务器最多65536个连接"到底哪里不对?

"因为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。也就是说一般情况下remote_ip和remote_port不受限制,可以达到 2^(32+16) 个连接. (理论上经过NAT以后server端看到的remote_ip会变少)

比如浏览器可以通过高位端口从公网IP或者经过NAT之后访问www.baidu.com,而对于百度单个IP上的服务器而言,nginx绑定的ip和port固定。

扩展内容

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

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

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

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

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

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

580382

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

[root@localhost ~]# ulimit -n

1024

结论

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值