In the original DTS algorithm the clockselection procedure
exits at this point with the presumed correct time set midway in the computed intersection [low,high]. However, this can lead to a
considerable loss in accuracy and stability, since the individual peer statistics are lost. Therefore, in NTP the candidates that
survived the preceding steps are processed further. The candidate list is rebuilt with entries of the form [distance,index], where
distance is computed from the (scaled) peer stratum and synchronization distance LAMBDA. The scaling factor provides a mechanism to
weight the combination of stratum and distance. Ordinarily, the stratum will dominate, unless one or more of the survivors has an
exceptionally high distance. The list is then sorted by increasing distance.
m < 0;
for (each peer) begin /* calling all peers */
if (low <= theta <= high) begin
LAMBDA < distance (peer); /* make list entry */
ist < peer.stratum * NTP.MAXDISPERSE + LAMBDA >
add [ dist ,peer] to candidate list;
m < m + 1;
endif;
endfor;
sort candidate list by increasing dist;
The next steps are designed to cast out outlyers which exhibit significant dispersions relative to the other members of the candidate
list while minimizing wander, especially on highspeed LANs with many time servers. Wander causes needless network overhead, since the
poll interval is clamped at sys.poll as each new peer is selected for synchronization and only slowly increases when the peer is no
longer selected. It has been the practical experience that the number of candidates surviving to this point can become quite large and
can result in significant processor cycles without materially
enhancing stability and accuracy. Accordingly, the candidate list is truncated at NTP.MAXCLOCK entries.
Note epsilon sub {xi i} is the select (sample) dispersion relative to the ith peer represented on the candidate list, which can be
calculated in a manner similar to the filter dispersion described previously. The EPSILON sub j is the dispersion of the jth peer
represented on the list and includes components due to measurement error, skewerror accumulation and filter dispersion. If the
maximum epsilon sub {xi i} is greater than the minimum EPSILON sub j and the number of survivors is greater than NTP.MINCLOCK, the ith
peer is discarded from the list and the procedure is repeated. If the current synchronization source is one of the survivors and there
is no other survivor of lower stratum, then the procedure exits without doing anything further. Otherwise, the synchronization source
is set to the first survivor on the candidate list. In the following i, j, k, l are peer indices, with k the index of the current
synchronization source (NULL if none) and l the index of the first survivor on the candidate list.
while begin
for (each survivor [distance,index]) begin /* compute dispersions */
find index i for max epsilon sub {xi i};
find index j for min EPSILON sub j;
endfor
if (epsilon sub {xi i} <= EPSILON sub j or m <= NTP.MINCLOCK) break;
peer.survivor [i] < 0; /* discard ith peer */
if (i = k ) sys.peer < NULL;
delete the ith peer from the candidate list;
m < m  1;
endwhile
if (peer.survivor [k] = 0 or peer.stratum[k] > peer.stratum [l]>) begin
sys.peer < l; /* new clock source */
call pollupdate;
endif
end clockselect procedure;
The algorithm is designed to favor those peers near the head of the candidate list, which are at the lowest stratum and distance and
presumably can provide the most accurate and stable time. With proper selection of weight factor v (also called NTP.SELECT), entries
will be trimmed from the tail of the list, unless a few outlyers disagree significantly with respect to the remaining entries, in
which case the outlyers are discarded first. The termination condition is designed to avoid needless switching between synchronization
sources when not statistically justified, yet maintain a bias toward the lowstratum, lowdistance peers.

