我目前正在使用网络地图在我的程序的一部分中映射本地网络,我想知道对所有端口执行不同的端口扫描需要多长时间?
如果端口打开,则检查其超时时间和平均数据包大小是多少(如果发送数据包进行检查),并且这些因素和任何其他因素与扫描所需的时间是否存在关联?
我很想能够在图表中表示这些,并且可能测试这些结果。
我确实知道,一般来说 UDP 端口扫描比 TCP 花费的时间更长,因为它是无连接的并且使用了更多的资源。
答案1
涉及的因素有很多,包括链路速度、双工、最小数据包大小、往返时间、目标主机的延迟、是否涉及入侵检测/预防系统、特定扫描类型需要多少次往返、链路繁忙程度等。
因此,我们假设扫描器机器和目标位于同一个千兆以太网上,我们将估算扫描 65536 个端口所需的理论最短时间。GigE 始终是全双工的,最小帧大小为 64 字节,在计算强制性帧间间隙后,最大帧速率为每秒 1,488,000 个最小帧。TCP Syns、Syn-Acks、(空)Acks、Fins 和 Rsts 都是最小帧。在我现在使用的 GigE 上,RTT 为 0.3ms(300µsec),因此我们假设目标主机在相同的 0.3ms 延迟内使用 Syn-Ack 或 Rst 回复 Syns。我们进一步假设它将使用其中一个或另一个进行回复;不会有任何“过滤”端口,我们只需等待某个任意超时即可。
因此,向所有端口发送 TCP Syns 所需的时间为:65,536 / 1,488,000 = 44ms
由于 GigE 是全双工的,第一个响应会在后续 Syn 发出时开始进入,但我们必须在最后一个 Syn 发送和最后一个回复之间等待 1 RTT,因此添加 1 RTT 即 0.3ms,总共44.3毫秒。
即使您的扫描需要进行两次往返,所有网络流量仍可以在不到 1 秒的时间内完成。
请注意,如果目标主机没有回复某些端口的 Syns,您必须在自己的算法中自行选择将“无响应”超时设置为多长时间。但您可以将其视为 RTT。假设您想使用 10 秒超时。您仍然可以在 44 毫秒内发送所有 Syn,但您可能需要从上次发送的 Syn 等待 10 秒,以确定您不太可能从该端口获得响应。因此,即使在所有 2^16 个端口无响应且超时 10 秒的情况下,您的总时间也将是 44 毫秒 + 10 秒 = 10.044 秒。