2013-09-01 14 views
0

我试图重现服务器负载过重时的情况,应该有一些连接处于状态,SYN_SENT通过netcat进行可视化。为什么客户端连接在连接未被接受时显示为已建立

我已经创建了一个服务器套接字并从netcat打开了十个连接;我认为他们会在netstat中显示为SYN_SENT,但是随后是tcpdump,它看起来像内核发送syn-ack,并且客户端用ack响应并且tcp握手完成,并且它们都是ESTABLISHED。

import java.io.IOException; 
import java.net.ServerSocket; 

public class Server { 

    public static void main(String[] args) throws IOException, InterruptedException { 
     ServerSocket ss = new ServerSocket(9999); 
     Thread.currentThread().join(); 
    } 
} 

所以serversocket.accept并不能起到连接建立的任何角色(决定syn.ack是否要发送),而等待的OS /内核分配为套接字的IO处理?这种行为在不同操作系统中是否一致

回答

1

因为连接建立。调用accept()不是这个的先决条件。系统接受传入连接并将它们排入积压队列。调用accept()只是从队列中删除一个项目,在它为空时被阻塞。

+0

accept()调用将积压作为参数。该输入决定允许的未决TCP连接的最大数量。所以,如果你正在处理大量的连接,那么请确保你指定一个大的积压限制来接受()调用。请注意,底层操作系统也可以有自己的限制。例如,Linux有它自己的最大连接限制(我认为是256),所以如果你指定的积压超过256,那么Linux不会采取这种做法,而是使用最大限制256. –

+0

@ManojPandey * listen ()*调用将积压作为参数。该平台可以改变您指定的,上下的,并且无法发现它是否如此,或者有效价值是什么。在我看来,这应该是对这个问题的答案,而不是对这个答案的评论。 – EJP

+0

嗯,我首先喜欢你的答案(因此,upvoted它!),所以我认为增加积压的细节将是一个很好的一个额外的信息给你的答案!我同意,listen()提供的最大限制可能令人惊讶,并且作为程序员,特别是在编写连接密集型应用程序时,需要注意这一点。 –

0

SYN_SENT存在于网络堆栈的较低级别,而不是您在此处使用的级别。使用网络数据包制作工具来欺骗您所需的连接部件,您可能会获得更好的结果。

相关问题