【问题标题】:ServerSocket open and immediate close on localhost will lead to TIME_WAIT?在 localhost 上打开 ServerSocket 并立即关闭会导致 TIME_WAIT?
【发布时间】:2016-10-18 09:56:07
【问题描述】:

我在其中一个 java 库中看到以下逻辑来测试在 localhost 上打开套接字:

 ServerSocket socket = new ServerSocket(port);
 socket.close();

我的问题是,当没有发送数据包并且套接字在打开后立即关闭时,这个套接字会导致本地主机上的 TIME_WAIT 状态吗?在这种情况下,如果应用程序尝试绑定到同一端口,如果在 2MSL 值内完成,是否会导致“地址已在使用错误”?

我写了一个类似上面的小测试程序,但是当我在运行这个程序的 linux 机器上 netstat 或 ss 时,我根本看不到这个端口的 TIME_WAIT。即使套接字没有被用来发送任何数据包,状态机也不应该应用吗?

【问题讨论】:

  • 如果套接字从未移出CLOSED 状态,则无需执行任何操作即可返回CLOSED 状态。
  • 嗨@Damien_The_Unbeliever - 对不起,我没有明白这一点。上述情况下的套接字会通过TIME_WAIT吗?
  • 我不确定您正在查看哪个特定的状态机图,但请说this one。套接字开始处于CLOSED 状态。然后它必须经过几个特定的​​转换才能成为ESTABLISHED,然后必须沿着一条特定的路线在TIME_WAIT 中等待,然后再返回CLOSED。您没有做任何事情来将您的套接字移出CLOSED 状态,因此不需要转换。
  • 感谢您的回复。如果我在创建 serversocket 和关闭之间添加睡眠,并尝试在该时间间隔内使用 nc 将任何数据发送到端口,则 netstat 现在显示 nc 进程的连接处于 FIN_WAIT2 状态,而程序处于 LISTEN 状态。同样,我知道我没有编写任何代码来接受传入连接,但根据上图,它应该从 FIN_WAIT2 到达 TIME_WAIT。但是,我没有看到它达到那种状态,但它只是消失了。或者很可能,它是用 RST 标志关闭的。

标签: sockets tcp serversocket time-wait


【解决方案1】:

TIME_WAIT 是连接中的一个状态。你还没有创建连接,ergo你永远不会到达 TIME_WAIT。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2020-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2014-06-14
    • 1970-01-01
    相关资源
    最近更新 更多