【发布时间】: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