-
tcp连接 本地端口_面试官挖了一个坑:并发TCP连接数到底可以有多少 ?
2020-12-10 10:24:12有关 C10K(即单机1万个并发连接问题)的信息可以参考《上一个10年,著名的C10K并发连接问题[1]》和《The C10K problem[2]》这两篇文章。我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远...曾几何时我们还在寻求网络编程中 C10K 问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了。有关 C10K(即单机1万个并发连接问题)的信息可以参考《上一个10年,著名的C10K并发连接问题[1]》和《The C10K problem[2]》这两篇文章。
我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用户基数的互联网公司,往往面临的并发连接数是百万、千万、甚至上亿。虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力垂直扩展,再进行水平扩展,这样可以有效的节省服务器相关的开支(硬件资源、机房、运维人力、电力其实也是一笔不小的开支)。
那么到底一台服务器能够支持多少TCP并发连接呢?
首先需要考虑文件句柄的限制。在linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是“Socket/File:Can't open so many files”。这时你需要明白操作系统对可以打开的最大文件数的限制。我们可以通过
ulimit -n
命令、/etc/security/limits.conf 文件 以及 /etc/sysctl.conf 文件等来修改文件句柄数。更多细节可以参阅 「朱小厮的博客」里的这篇文章《文件句柄?文件描述符?傻傻分不清楚》。其次要考虑的是端口范围的限制。操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。我想有这种错误思路朋友不在少数吧?面试官也比较喜欢在这里引导挖坑,类似的问题还有:一个UDP连接可以复用已经被TCP连接占用的端口嘛?(可以在下方留言区留下你的答案。)
如何标识一个TCP连接? 系统使用一个4四元组来唯一标识一个TCP连接:本地端口号 local port、本地IP地址 local ip、远端端口号 remote port、远端IP地址 remote ip。server通常固定在某个本地端口上监听,等待client的连接请求。不考虑地址重用(unix的SO_REUSEADDR选项)的情况下,即使server端有多个ip,本地监听端口也是独占的,因此server端tcp连接4元组中只有remote ip(也就是client ip)和remote port(客户端port)是可变的,因此最大tcp连接为客户端ip数×客户端port数,对IPV4,不考虑ip地址分类等因素,最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),也就是server端单机最大tcp连接数约为2的48次方。
上面给出的结论都是理论上的单机TCP并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)、网络资源(带宽)的限制,至少对我们的需求现在可以做到数十万级的并发了。
参考资料
[1]上一个10年,著名的C10K并发连接问题: http://www.52im.net/thread-566-1-1.html
[2]The C10K problem: http://www.kegel.com/c10k.html
面试官问:MySQL的自增ID用完了,怎么办?
ArrayList插入1000w条数据之后,我怀疑了jvm...
蚂蚁二面,面试官问我零拷贝的实现原理,当场懵了…
明天见(。・ω・。)ノ♡ -
一个端口可以有多少个TCP的连接?
2008-07-17 21:59:00答案是系统的上限个,系统存在TCP连接的个数上限的。在服务端,监听连接的时候,就会和客户端建立连接socket,只需要把这个socket保存到某个线程里新建的socket,这样线程就可以用自己的socket和客户端通信,线程...这2天就搞这个了。答案是系统的上限个,系统存在TCP连接的个数上限的。
在服务端,监听连接的时候,就会和客户端建立连接socket,只需要把这个socket保存到某个线程里新建的socket,这样线程就可以用自己的socket和客户端通信,线程进行监听客户端数据的发送和响应。当线程毁灭的时候,socket也不再存在。
服务器原socket又回去继续accept了。
连接是能有N个,同时通信的话可只有1个。正好和线程一样,这样的处理是蛮切合实际的哈。
运气还不错。
在网络通信中,是一个相当严谨的过程。数据包,务必做到一模一样,不要有多余和丢失任何信息。否则就会带来莫名的痛苦!
线程池,原来就是一个封装好的类。。。。NND,我还以为要自己去写这个池的初始化==
@。@ -
Socket编程之一个端口能建立多个TCP连接
2019-12-04 19:37:33tomcat作为服务端程序,一直在监听80端口,之前一直以为tomcat每接收到一个新的连接,都会创建一个新的socket,然后这个socket又会占用一个端口。但是事实上并不是这样的,肯定是会创建新的socket的,但是这个新创建...唯一能够确定一个socket连接有4点
- 服务器的IP
- 服务器的Port
- 客户端的IP
- 客户端的Port
tomcat最多能建立多少个连接?tomcat作为服务端程序,一直在监听80端口,之前一直以为tomcat每接收到一个新的连接,都会创建一个新的socket,然后这个socket又会占用一个端口。但是事实上并不是这样的,肯定是会创建新的socket的,但是这个新创建的socket并不会占用新的端口。
那么问题来了,客户端发送的数据,服务器是怎么区分是哪个客户端?
关键就在于上面的4个点,标识一个socket的是上面的4个点,而不是单纯的一个本地ip和一个本地端口,所以tomcat每accpet到一个连接,都会创建一个新的socket连接,这个socket连接种包含了下面4个信息,假设现在tomcat的ip为12.1.11.11服务器ip:12.1.11.11 服务器端口:80 客户端ip:213.32.1.2 客户端端口:80
由这4个信息标识一个唯一的socket,tomcat accept到的每一个连接的服务器ip和端口都是一样的,但是客户端的ip和端口是不一样的,根据唯一标识socket的4点,系统能正确的区分。
服务端的socket有什么特殊的?
其实就我们创建一个新的socket来说,他是没有什么特殊的,他就是一个未连接的socket,特殊的点在于socket.listen()方法
#include<sys/socket.h> int listen(int sockfd, int backlog);
listen函数仅由TCP服务器调用,当socket函数创建一个套接口时,它被假设为一个主动套装口,也就是说,它是一个将调用connet发起连接的客户套接口。listen函数把一个未连接的套接口转换成一个被动套接口,指示内核应接受指向该套接口的连接请求。根据TCP状态转换图,调用listen导致套接口从CLOSED状态转换到LISTEN状态。
注意,在java中是没有listen()函数的,因为java帮我们进行了封装,使用了ServerSocket来专门代表监听的Socket。
运行下面这个简单的程序public static void main(String[] args) throws IOException, InterruptedException { ServerSocket serverSocket = new ServerSocket(21111); Thread.sleep(100000000); }
在windows中我们就能通过netstat -ano来查看端口占用,可以发现21111正处于监听状态
我们查看Java中的ServerSocket类的构造函数
能够看到,其实这与我们的c语言中的listen()函数差不多,其也有一个backlog参数。
为了更好的理解backlog参数,我们必须认识到内核为任何一个给定的监听套接口维护两个队列:
1、未完成连接队列(incomplete connection queue),每个这样的SYN分节对应其中一项:已由某个客户发出并到达服务器,而服务器正在等待完成相应的TCP三路握手过程。这些套接口处于SYN_RCVD状态。
2、已完成连接队列(completed connection queue),每个已完成TCP三路握手过程的客户对应其中一项。这些套接口处于ESTABLISHED状态。
当来自客户的SYN到达时,TCP在未完成连接队列中创建一个新项,然后响应以三路握手的第二个分节:服务器的SYN响应,其中稍带对客户SYN的ACK(即SYN+ACK)。这一项一直保留在未完成连接队列中,直到三路握手的第三个分节(客户对服务器SYN的ACK)到达或者该项超时为止(曾经源自Berkeley的实现为这些未完成连接的项设置的超时值为75秒)。如果三路握手正常完成,该项就从未完成连接队列移到已完成连接队列的队尾。当进程调用accept时,已完成连接队列中的队头项将返回给进程,或者如果该队列为空,那么进程将被投入睡眠,直到TCP在该队列中放入一项才唤醒它。如果监听的线程释放掉监听用的SOCKET了,会影响之前通过这个监听SOCKET建立的TCP连接么?
这个问题的答案是不会的,利用ServerSocket建立的连接,即使是ServerSocket关闭了,这个连接依然还是存在,因为他们之间本身就没有任何关系了
测试代码,Server
public static void main(String[] args) throws IOException, InterruptedException { ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress(8080)); Socket accept = serverSocket.accept(); new Thread(() -> { try { OutputStream outputStream = accept.getOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); while (true) { outputStreamWriter.write(UUID.randomUUID().toString() + System.lineSeparator()); outputStreamWriter.flush(); Thread.sleep(1000); System.out.println("写了一个"); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } }).start(); serverSocket.close(); System.out.println("连接关闭"); Thread.sleep(100000); }
Client
public static void main(String[] args) throws IOException, InterruptedException { Socket socket = new Socket(); socket.connect(new InetSocketAddress("localhost", 8080)); InputStream in = socket.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); String msg; while ((msg = reader.readLine()) != null) { System.out.println("读了一个"); System.out.println(msg); } System.out.println("dsadsa"); Thread.sleep(100000); }
运行这两个代码我们就能发现,即使是ServerSocket关闭,依然能继续通信
我们又利用netstat -ano命令来查看端口占用 -
一个IP地址最多可以同时对外发起多少TCP连接
2019-03-14 16:23:19因为它只能打开28232个端口,具体看下面! 当你写程序连接端口的时候,达到28231 - 28233左右这个连接数的时候,就会报错 cannot assign requested address 这个时候去看linux源码你会发现,其实里面就已经设定值...对于客户端来说,linux向外TCP最大的连接数是28232,
为什么呢?
因为它只能打开28232个端口,具体看下面!
当你写程序连接端口的时候,达到28231 - 28233左右这个连接数的时候,就会报错 cannot assign requested address
这个时候去看linux源码你会发现,其实里面就已经设定值了,源码首先判断sysctl_local_port_range这个变量,不符合条件就返回return -EADDRNOTAVAIL;
sysctl_local_port_range[0] = 32768; sysctl_local_port_range[1] = 61000;
可以通过这个方法改写
echo "net.ipv4.ip_local_port_range = 1024 65000" >> /etc/sysctl.conf; sysctl -p
不过这样的话重启后就恢复原来的数据了,要想永远生效可以修改/etc/sysctl.conf文件,增加一行:
net.ipv4.ip_local_port_range= 1024 65000
然后再执行:
sysctl -p
可以通过命令行查看客户端的最多连接数
root@qgfzzzzzz-ubuntu1804:/proc/sys/net/ipv4# cat ip_local_port_range 32768 60999
单机最多有6w多连接,若想模拟实现百万级别的客户端连接,至少需要十几台机器以上,当然也可以在单机上使用多个虚拟ip来模拟实现.
对于服务端来说,最多能接受多少个TCP连接?
理论上是无上限的,为什么?
因为只要你服务端开一个TCP固定端口去监听客户端的连接请求,就可以允许任何的IP主机进行访问,所以说服务端最大的连接数是2^32(IP数) * 2^16(端口数) = 2^48。不过实际情况下会受到服务器配置等条件的制约,往往达不到理论值,不过可以通过增加内存等等,这样的话才可以达到更多的连接数。
-
linux 关闭tcp连接_漫画|一台Linux服务器最多能支撑多少个TCP连接?
2020-12-23 05:24:29困惑很多人的并发问题在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。很多同学看到这个问题... -
一个TCP端口最多可以同时连接多少个客户端呢?
2006-04-14 13:58:00pp616 (傻小子) 2003-12-08 17:54:11 在...发现一个问题。服务器只能接受3900多个Client端再多了就Accept不了了。开始怀疑是服务器程序写的有问题。后来我打开本机的http服务和ftp服务。模拟Client去连接80 或是 21端 -
Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结...
2017-12-23 16:23:00Socket TCP Server一个端口可以有多少个长连接? 网上答案很多,不知道那个才是正确的 理论上是无限的 16、Linux中,一个端口能够接受tcp链接数量的理论上限是? A.1024 B.65535 C.65535 * 65535 D.无上限 ... -
理论上有多少tcp连接
2018-07-05 19:31:34如何标识一个TCP连接在确定最大连接数之前,先... client最大tcp连接数client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他tcp连接共享。t... -
tcp连接 本地端口_单台服务器并发TCP连接数到底可以有多少 ?
2020-12-07 23:40:29有关 C10K(即单机1万个并发连接问题)的信息可以参考《上一个10年,著名的C10K并发连接问题[1]》和《The C10K problem[2]》这两篇文章。我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远... -
网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。...
2017-12-15 10:46:08详解Linux服务器最大tcp连接数 ...在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。...系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,rem -
一台Linux服务器最多能支撑多少个TCP连接?
2021-01-16 14:21:54困惑很多人的并发问题 很多同学看到这个问题的第一反应是 65535。原因是:“听说端口号最多有 65535 个,那长连接就最多保持 65535 个了”。...任意一个元素发生了改变,那么就代表的是一条完全不... -
漫画详解一台Linux服务器最多能支撑多少个TCP连接?
2020-12-21 15:39:55在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。 很多同学看到这个问题的第一反应是65535。... -
mysql最多多少个索引_漫画 | 一台Linux服务器最多能支撑多少个TCP连接?
2020-12-18 21:02:08来自公众号:开发内功修炼困惑很多人的并发问题在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个... -
一台机器最多能撑多少个TCP连接? 今天掰扯清楚!
2020-12-04 09:22:34还有的人说是应该受TCP连接里四元组的空间大小限制,这样算起来就是非常非常大的一个数字了。这两个答案都对,也都不对。 其实要想把这个问题搞清楚,最最最关键的地方在于要把TCP连接的两端里的角色分清楚-客户端... -
linux 清tcp缓存 命令_漫画 | 一台Linux服务器最多能支撑多少个TCP连接?
2021-01-21 21:48:24困惑很多人的并发问题在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络连接?我想我有必要单独发一篇文章来好好说一下这个问题。很多同学看到这个问题... -
理论上两台主机可以建立多少tcp连接
2019-10-28 16:45:20如何标识一个TCP连接 在确定最大连接数之前,先来看看系统如何标识一个tcp连接。...client每次发起tcp连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他t... -
支撑200并发_漫画:一台 Linux 服务器最多能支撑多少个 TCP 连接
2021-01-06 18:52:27(给Linux爱好者加星标,提升Linux技能)作者:开发内功修炼 / 张彦飞(本文来自作者投稿)【导读】:单台 Linux 服务器可以支撑多少个 TCP 连接?关于这个问题,我想很多客户端的同学都不怎么了解,甚至于很多服务器... -
高并发100问-服务端和客户端最大支持多少tcp连接?
2020-11-13 22:30:571、基础概念 tcp四元组 所谓tcp连接是由一个四元组组成,如下所示: 本地ip地址+本地端口+远端ip地址+远端端口 一个设备不管是服务端还是...2、服务端支持最大多少tcp连接? 在不考虑服务端cpu和内存消耗情况下. -
客户端和服务器最多能发送和接收多少TCP连接数?
2019-03-24 09:32:001. 对于服务器,每一个...由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接?但是事实并不是这样。 我们还知道对于TCP连接是由:原IP,原端口,目的IP,目的端口。但是监听server端TCP连... -
并发TCP连接数可以有多少
2019-10-08 10:20:39网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。...系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。 client最大... -
对TCP端口和连接数的一点思考
2016-10-02 10:22:05先来看看一些约定俗成的... 一个端口只能被一个socket监听(listen) 我在面试的时候,被问到过这么一个问题:ipv4协议下,假如主机的资源是无限的,理论上一个网卡能够接受多少个tcp连接?这个问题一开始很容易有个na -
Linux系列:一台主机上只能保持最多65535个TCP连接?错!
2020-09-15 23:26:44内核一条TCP连接靠什么标识? 一台机器可以提供多少不同端口的TCP服务? 内核一条TCP连接靠什么标识? 四元组(源IP,源PORT,目标IP,目标PORT) 在一台主机上,只要这个四元组不重复,限制连接个数的就是系统... -
TCP/IP Server同一个端口 怎么区分不同socket
2017-06-28 20:12:44多线程情况下,服务器端监听(listen)某个端口后,每... 进程间不能用同一端口,但是进程内部不同Socket可以用同一个端口。 Client端发送给Server同一端口的不同Socket怎么区分。 用Client端Socket端口区分! -
关于单机最大tcp连接数 及 linux 下 TCP 连接数修改
2013-10-14 21:18:05在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少? 如何标识一个TCP连接 在确定最大连接数之前,先来看看系统如何... -
Linux服务器支撑TCP连接个数说明
2021-01-04 14:23:04"TCP连接四元组是源IP地址、源端口、目的IP地址和目的端口。任意一个元素发生了改变,那么就代表的是一条完全不同的连接了。拿我的Nginx举例,它的端口是固定使用80。另外我的IP也是固定的,这样目的IP地址、目的... -
linux下tcp客户端能建立多少个长连接
2017-09-05 15:32:52一、TCP四元组 本地IP地址、本地TCP端口号、外地IP地址、外地TCP端口号 二、调整能打开的最大文件描述符 $ echo "655350" > /proc/sys/fs/file-max $ vi /etc/security/limits.conf * soft nofile 655350 *... -
单机最大tcp连接数
2017-11-26 20:24:00单机最大tcp连接数 网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。...系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,...
-
c#注册表操作类分享
-
2021.3.2总结
-
交通工程学试卷B标准答案.pdf
-
MySQL 触发器
-
使用vue搭建微信H5公众号项目
-
龙芯生态应用开发基础:C语言精要
-
【Python-随到随学】 FLask第一周
-
信息论08
-
民法-期末考试复习重点.pdf
-
两套《数据结构》期末试卷.pdf
-
Xilinx 7系列FPGA PCB设计指导(四)
-
民法学期末复习训练题(含答案).pdf
-
azkaban学习文档
-
嵌入式实时操作系统大作业+实验报告(代码完整).7z
-
南京大学_计算机组织与系统结构(含答案).pdf
-
C/C++反汇编解密
-
江西财经大学《政治经济学》3套期末考试试卷.pdf
-
MySQL 事务和锁
-
LeetCode 131. 分割回文串
-
无机化学习题解答(大连理工第五版).pdf