Pre
高性能网络编程 - 关于单台服务器并发TCP连接数理论值的讨论
问题
一台主机上只能保持最多 65535 个 TCP 连接,正确吗?
先说结论: 这个说法不对,我们分服务器和客户端分开讨论,以下的讨论都基于服务器和客户端都只有 1 个 IP 地址。
分析
操作系统是通过 源 IP 地址、目标 IP 地址、协议号(协议类型)、源端口号以及目标端口号 这五个元素唯一性的识别一个网络上的通信。
我们已经知道网络通信五元组是由过源 IP 地址、目标 IP 地址、协议号(协议类型)、源端口号以及目标端口号构成。现在考察的是 TCP 连接,自然五元组中的协议号已经定下来了,于是网络通信五元组就变化为 TCP 四元组。
那就是说 TCP 连接四元组是由源 IP 地址、源端口、目的 IP 地址和目的端口 构成。
单一IP的服务端
很明显当四元组中任意一个元素发生了改变,那么就代表的是一条完全不同的新连接。拿我们常用的 MySQL 举例,假设它的 IP 是 X,端口 3306。用户 A 基于 IP 地址 A1,端口PA 连接 MySQL ,于是构成了一个 TCP 连接四元组(A1,PA,X,3306)
。
用户 B 基于 IP 地址 B1,端口 PB 连接同一个 MySQL,这个时候 MySQL 需要开启一个新端口来和用户 B 通信吗?从我们日常的开发就可以知道,MySQL 并不需要这么做,所以用户 B 就和 MySQL 构成了一个新的 TCP 连接四元组(B1,PB,X,3306)
。
服务端理论上能达成的最高并发数量是多少?从我们上面的用户 A 和用户 B 构成的 TCP连接四元组:
(A1,PA,X,3306)
(B1,PB,X,3306)
可以看到目的 IP 地址和目的端口(X,3306)
是不变的,这样就只剩下源 IP 地址、源端口是可变的。
- IP 地址是一个 32 位的整数,所以源 IP 最大有 2 的 32 次方这么多个。
- 端口是一个 16 位的整数,所以端口的数量就是 2 的 16 次方。
- 2 的 32 次方(ip 数)× 2的 16 次方(port 数)大约等于两百多万亿。所以理论上,我们每个 server 可以接收的连接上限就是两百多万亿。
当然实际上做不到,目前工程实践中可以达到的连接数在千万级别。基于 Java 的应用程序大概能支持百万级别
单一IP的客户端
“客户端应用程序完全可以不用自己设置端口号,而全权交给操作系统进行分配”,可用的端口号只有 6 万多,从这个角度考虑,客户端最多只能发起 6 万多条 TCP 连接。但其实也不是。
从 TCP 连接四元组来考虑:源 IP 地址、源端口、目的 IP 地址和目的端口,目的 IP 地址和目的端口指的是服务器的 IP 和端口,源 IP 地址、源端口自然就是客户端的。
只要服务器的 IP 或者端口不一样,即使客户端的 IP 和端口是一样的。这个四元组也是属于一条完全不同的新连接 。比如:
- 连接 1:客户端 IP 10000 服务器 IP 10000
- 连接 2:客户端 IP 10000 服务器 IP 20000
虽然客户端的 IP 和端口完全一样,但由于服务器侧的端口不同,所以仍然是两条不同的连接。问题来了, 客户端同一个端口可以连接不同的服务器吗?答案是可以的 。
客户端只要启动时不显示绑定到某个端口上,内核是可以使用一个端口连不同的服务端,内核会自己进行选择并恰当地复用的,而且完全不会产生数据混乱,因为“源 IP 地址、目标 IP 地址、源端口号以及目标端口号就能唯一性确定一个 TCP 连接” 。
那么对客户端来说,四元组里有 3 个可变,自然客户端能同时支持的连接数比服务器还要大得多
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。