同时建立多个TCP连接

Establishing multiple TCP connections simultaneously

我在 Java 中对 TCP 的理解是,虽然您可以在套接字上使用多线程处理数据传输,但一次只能建立一个连接。这是真的?如果没有,你将如何实现一个可以在同一个地址和端口上同时建立多个连接的服务器。

即如果客户端尝试建立与服务器的连接,但通过非常不稳定的网络连接,服务器是否必须等待连接握手完成才能接受来自另一个的连接客户?

如果您参考基于 JAVA 的服务器实现线程架构,大多数服务器使用基于池和队列的线程。我们不能为每个请求创建 N 个线程。但是服务端维护了一个线程池架构的请求队列,一个一个处理请求。

因此,如果您正在考虑创建自己的 JAVA 基于服务器。然后计划创建可配置的线程队列并处理请求。

参考How many concurrent request can tomcat handle by Default

服务器套接字在接受其他连接之前不会强制等待单个套接字完成连接。在等待来自一个端点的 TCP 消息时,它可以轻松地等待来自另一个端点的消息。

早期的 TCP 中存在一个缺陷,允许通过仅启动连接而不完成连接来进行简单的 DOS 攻击,但即使这样也需要大量连接。

If a client was to try and establish a connection to the server, but is connecting over a very unstable network, would the server have to wait for the connection handshake to complete before being able to accept a connection from another client?

TCP 协议的这一方面由 listen backlog 解决。至少在 linux 上,服务器的半开连接会排队等待完成,之后它们就可以接受了。服务器可以处理的最大半开连接数上限为 OS。在 Linux 上,您可以通过检查 /proc 条目来了解上限是多少。例如在 RHEL 6 虚拟机上:

$ cat /proc/sys/net/core/somaxconn 
128

恶意实体可以通过启动 SYN_FLOOD attack that will fill up the listen backlog and prevent your server from accepting new connections. Mitigating this type of attack (especially when performed by a botnet) is extremely difficult but there are some basic defences 以及一些昂贵的付费服务来利用这一点。