| # Host Resolution | 
 |  | 
 | This document is a brief overview of how host resolution works in the Chrome | 
 | network stack. | 
 |  | 
 | The stack includes two different implementations: the "system" or "platform" | 
 | resolver, and the "async" or "built-in" resolver. The higher layers are shared | 
 | between the implementations, and the lower layers are implemented separately. | 
 |  | 
 | ## Shared layers | 
 |  | 
 | ### Host resolver | 
 |  | 
 | The HostResolverImpl is the main interface between DNS and the rest of the | 
 | network stack. It checks the HostCache, checks if there is an already running | 
 | Job, and schedules a new Job if there isn't one in progress. | 
 |  | 
 | Data collected at this layer: | 
 | * "Net.DNS.TotalTime" (recommended for DNS experiments) | 
 | * "Net.DNS.TotalTimeNotCached" | 
 |  | 
 | ### Job | 
 |  | 
 | The HostResolverImpl::Job represents a single DNS resolution from the network | 
 | (or in some cases the OS's DNS cache, which Chrome doesn't know about). It | 
 | starts a task depending on which implementation should be used. If a DnsTask | 
 | fails, it retries using a ProcTask. | 
 |  | 
 | Data collected at this layer: | 
 | * "Net.DNS.ResolveSuccessTime" (also by address family) | 
 | * "Net.DNS.ResolveFailureTime" (also by address family) | 
 | * "Net.DNS.ResolveCategory" | 
 | * "Net.DNS.ResolveError.Fast" | 
 | * "Net.DNS.ResolveError.Slow" | 
 |  | 
 | ## System resolver | 
 |  | 
 | ### Task | 
 |  | 
 | The entry point for the system resolver is HostResolverImpl::ProcTask. The task | 
 | runs almost entirely on TaskScheduler. Its main implementation is in | 
 | SystemHostResolverProc. Other implementations of HostResolverProc can be swapped | 
 | in for testing. | 
 |  | 
 | Data collected at this layer: | 
 | * "Net.DNS.ProcTask.SuccessTime" | 
 | * "Net.DNS.ProcTask.FailureTime" | 
 | * "Net.OSErrorsForGetaddrinfo*" | 
 |  | 
 | ### Attempt | 
 |  | 
 | Attempts in the system resolver are not a separate class. They're implemented as | 
 | separate tasks posted to TaskScheduler. | 
 |  | 
 | Data collected at this layer: | 
 | * "DNS.AttemptFirstSuccess" | 
 | * "DNS.AttemptFirstFailure" | 
 | * "DNS.AttemptSuccess" | 
 | * "DNS.AttemptFailure" | 
 | * "DNS.AttemptDiscarded" | 
 | * "DNS.AttemptCancelled" | 
 | * "DNS.AttemptSuccessDuration" | 
 | * "DNS.AttemptFailDuration" | 
 |  | 
 | ## Async resolver | 
 |  | 
 | ### Task | 
 |  | 
 | The entry point for the async resolver is HostResolverImpl::DnsTask. DnsTask | 
 | starts one DnsTransaction for each lookup needed, which can be one for a single | 
 | address family or two when both A and AAAA are needed. | 
 |  | 
 | Data collected at this layer: | 
 | * "Net.DNS.DnsTask.SuccessTime" | 
 | * "Net.DNS.DnsTask.FailureTime" | 
 | * "Net.DNS.DnsTask.ErrorBeforeFallback.Fast" | 
 | * "Net.DNS.DnsTask.ErrorBeforeFallback.Slow" | 
 | * "Net.DNS.DnsTask.Errors" | 
 |  | 
 | ### Transaction | 
 |  | 
 | The main implementation of the async resolver is in the DnsTransaction. Each | 
 | transaction represents a single query, which might be tried multiple times or in | 
 | different ways. | 
 |  | 
 | Data collected at this layer: | 
 | * "AsyncDNS.TransactionFailure" | 
 | * "AsyncDNS.TransactionSuccess" (and by query type) | 
 |  | 
 | ### Attempt | 
 |  | 
 | Attempts in the async resolver are an explicit layer, implemented by subclasses | 
 | of DnsAttempt. In most cases, DnsUDPAttempt is used. DnsTCPAttempt is used | 
 | instead when the server requests it. DnsHTTPAttempt is experimental. | 
 |  | 
 | Data collected at this layer: | 
 | * "AsyncDNS.UDPAttemptSuccess" | 
 | * "AsyncDNS.UDPAttemptFail" | 
 | * "AsyncDNS.TCPAttemptSuccess" | 
 | * "AsyncDNS.TCPAttemptFail" | 
 | * "AsyncDNS.AttemptCountSuccess" | 
 | * "AsyncDNS.AttemptCountFail" |