我在Linux机器上运行以下客户端 - 服务器代码
Server Code
public class MyServer {
public static void main(String[] args) {
try {
ServerSocket server = new ServerSocket(6868, 5);
while (true) {
Thread.sleep(5000);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client Code
public class MyClient {
public static void main(String[] args) throws UnknownHostException, IOException {
Socket[] clients = new Socket[8];
for (int i = 0; i < 6; i++) {
clients[i] = new Socket("175.27.3.4", 6868);
System.out.printf("Client %2d: " + clients[i] + "%n", i);
//clients[i].close();
}
for (int i = 6; i < 10; i++) {
clients[i] = new Socket("175.27.3.4", 6868);
System.out.printf("Client %2d: " + clients[i] + "%n", i);
//clients[i].close();
}
}
}
注意-
-
我没有"ACCEPTED"客户端请求来测试ServerSocket backlog参数 .
-
客户端代码中的两个循环是故意帮助调试代码 .
-
服务器框是Cent OS
-
客户端框是Cent OS(不同的物理服务器)
-
客户端套接字未故意关闭 .
执行服务器代码和更高版本的客户端代码后,我会观察以下内容
-
在使用netstat的服务器上,我看到6个处于ESTABLISHED状态的连接
-
在使用netstat的服务器上,我看到SYN_RECV状态下的4个连接(积压队列已满)
-
在客户端计算机上,我看到所有10个连接处于ESTABLISHED状态 - 这是正常的吗?
-
在前6个连接的服务器端(tcpdump)的wireshark中,我看到正确的3路握手用于 Build 连接(SYN,SYN-ACK,ACK)
-
对于接下来的4个连接,在服务器端的wireshark中,我看到(SYN [有时多个],SYN-ACK,ACK,然后是许多重复的SYN-ACKS)
题 -
-
以上观察结果是否正常?
-
观测系统是否依赖(OS)?
更大的图片有关详细说明,请参阅here或ServerFault
-
我试图用上面的代码以较小的比例模拟 生产环境 问题
-
在 生产环境 代码中(我没有编写,但我维护它),服务器套接字的backlog参数为100 .
-
我怀疑积压队列已满,因此删除了较新的连接 .
-
我看到很多SYN请求,但 生产环境 wireshark中的SYN-ACK很少,这是一个小时 . 它是否响铃,我们可以与上面的玩具代码平行吗?