mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-24 22:36:09 +03:00
103 lines
3.1 KiB
Markdown
103 lines
3.1 KiB
Markdown
|
# 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"
|