![Ncat 在 UDP 上非常慢。可能的原因?](https://linux22.com/image/217987/Ncat%20%E5%9C%A8%20UDP%20%E4%B8%8A%E9%9D%9E%E5%B8%B8%E6%85%A2%E3%80%82%E5%8F%AF%E8%83%BD%E7%9A%84%E5%8E%9F%E5%9B%A0%EF%BC%9F.png)
我有三台服务器,“a”、“b”和“c”,都具有相同的 /24 子网掩码。
在所有服务器上,到其他两台服务器中的任何一个,nc
到 TCP 端口 9999 始终需要 0.01 秒,而 UDP 到端口 9694 始终需要 0.01 秒。2.01秒。
这是在带有 ncat 7.70 的 RHEL 8.6 上。
是否有一些配置参数会减慢 UDP 响应速度?
$ hostname
FISPCCPGS302c
$ nc -zvu FISPCCPGS302a 9694
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 10.109.160.16:9694.
Ncat: UDP packet sent successfully
Ncat: 1 bytes sent, 0 bytes received in 2.01 seconds.
$ nc -zv FISPCCPGS302a 9999
Ncat: Version 7.70 ( https://nmap.org/ncat )
Ncat: Connected to 10.109.160.16:9999.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
答案1
与 TCP 相反,UDP 不是面向连接的协议。
这里nc
只发送一个包含一字节有效负载的数据包,并等待返回消息,无论是 UDP 数据包还是 ICMP 数据包,表示端口不可用或目的地不可路由,等等,就像 TCP 一样。
一般来说,侦听该 UDP 端口的任何内容都没有理由将 UDP 消息发送回发送方。例如,如果这是一个 DNS 服务器,则传入的一字节消息将被视为垃圾并被忽略。为了获得答案,您需要像nmap
UDP 扫描那样发送正确的 DNS 查询。
因此,当在超时(对于您的 netcat 来说似乎是 2 秒)内未收到响应时,netcat 会假定 UDP 端口已打开,因为它也没有收到任何 ICMP 消息。
所以你看到的只是:
- 对于 TCP,另一端的系统(甚至不是那里运行的服务器软件)根据客户端发送的 SYN 回复 SYN+ACK 以建立连接。那会立即发生。
- 对于 UDP,netcat 在 2 秒后超时,假设端口已打开,因为它没有收到任何 ICMP 数据包(表明端口未打开)。
要估计服务器软件的响应时间,您需要在这些服务器的协议中发出适当的请求。这适用于 TCP 和 UDP。
例如,如果这些是 DNS 服务器,您需要发送 DNS 查询(可能有些不涉及查询上游服务器,例如针对 DNS 服务器具有权威性的域的 SOA 查询,或者针对根域的 NS 查询)与dig . NS @"$address" -p "$port"
1) 类似,对于 TCP 来说意味着发送连接请求、数据和终止数据包并等待它们的响应,而对于 UDP 则意味着发送带有查询的数据包并等待响应。
1 例如,根据此处测试运行的网络跟踪,在 UDP 端口 53(DNS 的标准端口)上nmap -sU
发送服务器状态请求DNS 查询。