我在本地机器上打开了端口 4000,如下所示:
nc -lvup 4000
然后尝试连接到同一端口,如下所示:
nc -vu 127.0.0.1 4000
并能够成功连接并来回发送和接收文本。但是,当我监听第一个代码片段中显示的同一端口,然后尝试使用
nmap -sU 127.0.0.1 -p 4000
结果如下:
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000061s latency).
PORT STATE SERVICE
4000/udp closed icq
既然第一次测试确定端口已打开,那么难道不应该说打开吗?请说清楚,因为我对此真的很困惑。
答案1
不。你不明白发生了什么。这是 UDP,没有連接。
当你运行第二个程序nc
并输入一些内容时,它只会发送数据包。然后你通过其他方式(查看通信的另一侧,例如另一台计算机的屏幕)确认通信已发生。如果没有“监听” nc
,则“发送”nc 会愉快地发送相同的数据包,而不知道这些数据包是已接收还是已丢弃。
也是如此nmap
。它发送数据包,没有收到任何答复,并决定其数据包消失在黑洞中。
这是 UDP,它就是这样。它没有内在的接收确认。如果应用程序需要它,它会自己进行确认。而且由于我们这里没有应用程序级协议来执行此操作,因此 nmap 没有看到任何答案,没有检测到“开放端口”。
相比之下,TCP 具有内置确认(ACK),这就是我们可以可靠地检测端口是否开放的原因。