我在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)?

更大的图片有关详细说明,请参阅hereServerFault

  • 我试图用上面的代码以较小的比例模拟 生产环境 问题

  • 在 生产环境 代码中(我没有编写,但我维护它),服务器套接字的backlog参数为100 .

  • 我怀疑积压队列已满,因此删除了较新的连接 .

  • 我看到很多SYN请求,但 生产环境 wireshark中的SYN-ACK很少,这是一个小时 . 它是否响铃,我们可以与上面的玩具代码平行吗?