1
0
mirror of https://github.com/nmap/nmap.git synced 2026-01-21 05:39:14 +00:00

Change the completion percentage algorithm to estimate the total number of

probes that will be sent and calculate from that. This makes the 100%
completion match up closely with the end of the scan, as the estimate gets
better as the scan gets closer to finishing. It also works against filtered
hosts. There is still the related problem that the completion time estimate
uses a global average to estimate completion rate, so it tends to
underestimate.
This commit is contained in:
david
2008-08-15 05:59:05 +00:00
parent 0dee9b603d
commit 116ba8fb91

View File

@@ -1359,24 +1359,28 @@ HostScanStats *UltraScanInfo::nextIncompleteHost() {
is done. */
double UltraScanInfo::getCompletionFraction() {
list<HostScanStats *>::iterator hostI;
HostScanStats *host;
int maxtries;
double thishostpercdone;
double total;
/* Add 1 for each completed host. */
total= gstats->numtargets - numIncompleteHosts();
/* For incomplete hosts add the fraction of finished to total ports. */
/* Get the completion fraction for each incomplete host. */
for(hostI = incompleteHosts.begin(); hostI != incompleteHosts.end(); hostI++) {
host = *hostI;
maxtries = host->allowedTryno(NULL, NULL) + 1;
// This is inexact (maxtries - 1) because numprobes_sent includes
// at least one try of ports_finished.
thishostpercdone = host->ports_finished * (maxtries - 1) + host->numprobes_sent;
thishostpercdone /= maxtries * gstats->numprobes;
if (thishostpercdone >= 0.9999)
thishostpercdone = 0.9999;
total += thishostpercdone;
HostScanStats *host = *hostI;
int ports_left;
double rate;
double probes_left;
ports_left = host->freshPortsLeft();
if (ports_left == gstats->numprobes)
continue;
/* Get the overall rate of probes sent to ports completed. */
rate = (double) host->numprobes_sent / (gstats->numprobes - ports_left);
/* Find out how many probes it will take to scan the remainder of the ports
at that rate. */
probes_left = rate * host->freshPortsLeft();
/* Get the completion fraction: number of probes sent divided by estimated
total number of probes. */
total += (double) host->numprobes_sent / (host->numprobes_sent + probes_left);
}
return total / gstats->numtargets;