我正在尝试通过 UDP 端口 6666 进行通信(目标是为 netconsole 设置一个侦听器,但这在这里并不重要)。
在听力方面,nc -luv 6666
. 在发送方,nc -uv LISTENER_IP 6666
. 我可以发送和接收,生活是美好的。
现在我让监听器运行,但杀死发送者并启动另一个发送者。它立即终止。网络跟踪显示接收服务器发送了一个ICMP Port Unreachable。但是,听众仍然在听:
$ sudo ss -nlup|grep 6666
UNCONN 0 0 :::6666 :::* users:(("nc",pid=3417,fd=3))
我杀死接收器并运行一个新的。在我杀死发件人之前,一切都像以前一样工作。
发送者和接收者是同一网络上的物理机器。物理机和在其上运行的 VM 之间的相同测试会产生相同的结果。
如何解释这种行为?
由于 UDP“连接”的工作方式,这是预期的行为。这在
nc6(1)
手册页socat
(“UDP”)中进行了讨论,但也适用于nc
:当您从发送方连接时,会选择一个随机的 UDP 源端口。接收器然后绑定到该特定
host:port
对,并且从那时起将不会监听任何其他连接。要解决这个问题,您需要强制发送方始终使用相同的端口。我用于socat
这个例子是因为它更容易做到:听众:
发件人:
如您所见,发送方的源端口发生了变化,但如果我强制它重用相同的端口,它就可以工作。