一台机器最多能撑多少个 TCP 连接
这是一个数据库的问题,看来我还得写一篇论文《论数据库对计算机学习的重要性》,看完这篇论文,这个问题就不再是一个问题。
数据库有两个专业词汇:主键、组合键。同学们肯定想知道这两者是什么含义与区别,不急,接下来一一解释。
主键 一个数据库用来存储一个个表项,当我们查询到数据库某一条表项时,我们希望用一个关键字就可以过滤出想要查询的表项,这个唯一标识(Uniquely Identify)的关键字就是主键。
举个例子 比如,要在全国人口数据库里查询“车小胖”的信息,使用哪个关键字查询呢?那肯定是身份证号啊
车小胖的身份证号:31010xxxxxxxxxxxxx
这个信息一输入敲回车,有点帅的大帅哥就会映入眼帘。
想必各位同学已经理解了什么是主键。
组合键 顾名思义,就是用几个关键字组合在一起,尽管每一个关键字在数据库条目里不唯一,但组合在一起却可以唯一定位一个条目。
举个例子 还是上面的那个例子,要查询“车小胖”,但是不知道他的身份证号,如果只是输入“车小胖”,全国叫车小胖的人千千万,我们可以使用组合键:
车小胖 + 有点帅 + 长宁区 + 会点计算机网络
这个组合信息一输入,肯定可以唯一过滤出“31010xxxxxxxxxxxxx”的帅哥。
谈完专业词汇,再来回答这个问题。 计算机通信,有一个问题必须解决,就是如何唯一识别一个会话,英文名称是session,TCP/IP协议里没有一个字段可以完全胜任这个工作,意味着,无法遴选出一个主键,我们可以退而求其次,遴选出组合键来完成这个使命。
既然通信是双方的事,最终遴选出五元组的这个组合键:
服务器IP + 服务器端口 + TCP + 客户端IP + 客户端端口
只要保证这个五元组是唯一的,就可以唯一识别一个session,不是吗?
对于一个特定的服务器,一般IP、端口号都是固定的,比如提供网页服务的默认端口是80不会变。
如果相同的客户端来连接这个服务器,客户端的IP是相同的,多个TCP连接都使用相同的端口号,那么这个组合键是不是都是一样的?这是绝对不行的!因为无法唯一识别一个session!
客户端的操作系统TCP/IP必须做出硬性的限制,每次连接,要从空闲的端口号池子里随机选取一个端口号作为源端口,这样无论是在客户端的眼里,还是服务器的眼里,最终的五元组肯定是唯一的。
端口号在TCP协议字段里,一共两个字节,二进制的16位,意味着有2^16= 65536个端口号可用,但0-1023系统通常保留为知名服务端口,所以最多有64512个端口做为端口池资源。并且需要注意的是在Linux操作系统中net.ipv4.ip_local_port_range
参数可以限制socket 四元组中的本地端口的范围(参考:net.ipv4.ip_local_port_range 的值究竟影响了啥)
通过下列命令可以查看该参数值:
[root@CentOS-Server ~]# sysctl -a | grep ip_local_port_range
net.ipv4.ip_local_port_range = 32768 60999 #客户端连接服务器使用的随机端口在32768~60999
一个问题 如果相同的客户端使用相同的端口号来连接同一个服务器(IP相同)的不同端口、或不同服务器(IP不同)相同端口,那可不可以呢?
理论上,按照五元组的精神,根据五元组的哈希值,只要有任何一项是不同的,session ID 就是不同的,所以是完全可行的,但为何操作系统也要限制?
是为了简化实现,试想客户端每个TCP连接硬性规定,使用不同的端口号,服务器一点也不需要担心session ID 的唯一性。此外,64512个端口难道还不够一个客户端使用?
服务器 服务器在监听端口(比如80)可以接受来自五湖四海的客户端TCP连接,至于这个连接数的上限是多少,则完全取决于服务器的CPU、Memory 资源限制。
总结
- TCP连接的客户端机:每一个ip可建立的TCP连接理论受限于ip_local_port_range参数,也受限于65535。但可以通过配置多ip的方式来加大自己的建立连接的能力。
- TCP连接的服务器机:每一个监听的端口虽然理论值很大,但这个数字没有实际意义。最大并发数取决你的内存大小,每一条静止状态的TCP连接大约需要吃3.3K的内存。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论