go dns解析流程
dns解析主要流程
入口函数:\src\net\ipsock.go里面的lookupIPAddr
windows
调用库函数GetAddrInfoW
linux
- go内置的dns解析
- 非内置dns解析
内置go dns解析
实现func:lookup_unix.go的goLookupIP
initConfVal函数会初始化dns的配置文件首次初始化,后续会cached 5s,然后再次从文件中获取
先找到dns解析的查询规则,通过读取/etc/nsswitch.conf里面的配置,获取查询规则,使用hosts
hostLookupCgo hostLookupOrder = iota
hostLookupFilesDNS // files first
hostLookupDNSFiles // dns first
hostLookupFiles // only files
hostLookupDNS // only DNS
nss := c.nss
srcs := nss.sources["hosts"]
// If /etc/nsswitch.conf doesn't exist or doesn't specify any
// sources for "hosts", assume Go's DNS will work fine.
if os.IsNotExist(nss.err) || (nss.err == nil && len(srcs) == 0) {
if c.goos == "solaris" {
// illumos defaults to "nis [NOTFOUND=return] files"
return fallbackOrder
}
if c.goos == "linux" {
// glibc says the default is "dns [!UNAVAIL=return] files"
// https://www.gnu.org/software/libc/manual/html_node/Notes-on-NSS-Configuration-File.html.
return hostLookupDNSFiles
}
return hostLookupFilesDNS
}
关于nssswitch.conf的说明