套接字在fin_wait_1中占用的时间较长

时间:2018-09-25 16:53:07

标签: java windows tcp

得到这种奇怪的行为并且不知道 SO_LINGER(0)是否是解决问题的“最佳方法”。

只有当我同时拥有这两个因素时,这种情况才会发生:

  • 操作系统-Windows
  • 降低互联网带宽

当这两个因素结合在一起时,我的tcp连接(客户端)在调用close()之后立即卡在 FIN_WAIT TIME_WAIT 时间

(在此网络中,在其他操作系统上运行的完全相同的应用程序的行为符合预期。适用于Windows,但网络连接更好)

在这种特殊情况下,我只是为fin_wait _(1或2)状态而烦恼。我的第一个想法是将so_linger设置为0,但我并不完全相信,在这里,异常终止关闭是正确的(或唯一的)选择。

关于如何处理此问题的任何想法?还有其他方法可以强制窗口以编程方式关闭该连接吗?

(编辑)

EventLoopGroup group = new NioEventLoopGroup(); try {
    Bootstrap b = new Bootstrap();
    b.group(group)
            .channel(NioSocketChannel.class)
            .option(ChannelOption.TCP_NODELAY, true)
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
            // .option(ChannelOption.SO_LINGER, 0)   ( ?? )
            .handler(new ChannelInitializer<SocketChannel>() {
                @Override
                protected void initChannel(SocketChannel ch) throws Exception {
                    ChannelPipeline p = ch.pipeline();
                    p.addLast(new MyHandler());
                    p.addLast(new WriteTimeoutHandler(8, TimeUnit.SECONDS));
                    ch.config()
                            .setSendBufferSize(TCP_BUF_SIZE)
                            .setReceiveBufferSize(TCP_BUF_SIZE);
                }
            });

    ChannelFuture channelFuture = bootstrap.connect(host, port).sync();
    channelFuture.channel().closeFuture().sync();

} finally {
    group.shutdownGracefully(); }

0 个答案:

没有答案