同时建立多个TCP连接

时间:2015-06-25 05:51:47

标签: java sockets serversocket

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

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

3 个答案:

答案 0 :(得分:1)

  

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

listen backlog解决了TCP协议的这一方面。至少在Linux上,服务器的半开连接排队等待完成,然后他们就可以接受了。服务器可以处理的最大半开连接数受操作系统限制。在Linux上,您可以通过检查/proc条目来查看上限。例如,在RHEL 6 VM上:

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

恶意实体可以通过启动SYN_FLOOD攻击来利用此漏洞,该攻击将填满侦听积压并阻止您的服务器接受新连接。减轻这种类型的攻击(特别是在僵尸网络执行时)非常困难,但有一些basic defences以及一些昂贵的付费服务。

答案 1 :(得分:0)

如果您参考基于JAVA的服务器实现线程体系结构,则大多数服务器使用基于池和队列的线程。我们无法为每个请求创建N个线程。但是服务器使用线程池架构维护一个请求队列,并逐个处理请求。

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

参考How many concurrent request can tomcat handle by Default

答案 2 :(得分:0)

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

之前的TCP中存在一个缺陷,它只是通过启动连接而不完成它来允许简单的DOS攻击,但即使这样也需要很多连接。

相关问题