0

我试图重现服务器负载过重的情况,应该有一些状态连接,SYN_SENT 通过 netcat 可视化。

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

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而是等待操作系统/内核为该套接字分配一个 io 句柄?这种行为在不同的操作系统中是否一致?

4

2 回答 2

1

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

于 2013-09-01T10:34:15.843 回答
0

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

于 2013-09-01T10:42:47.600 回答