我试图重现服务器负载很重的情况,状态中应该有几个连接,通过netcat可视化SYN_SENT。
我创建了一个服务器套接字并从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句柄?这种行为在不同的操作系统中是否一致?
答案 0 :(得分:1)
因为建立了连接 。调用accept()不是先决条件。系统接受传入连接并将它们排入积压队列。调用accept()只是从队列中删除一个项目,当它是空的时阻塞。
答案 1 :(得分:0)
SYN_SENT存在于网络堆栈的较低级别,而不是您在此处使用的级别。使用网络数据包制作工具来欺骗您需要的连接部件可能会有更好的结果。