go(golang) dns 解析源码 go/src/net/dnsclient_unix.go 分析

mumumuwudi · · 2760 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

关于go dns解析的一些说明参照另一篇文章http://blog.csdn.net/mumumuwudi/article/details/48200505

go dns 解析 源码在go/src/net/dnsclient_unix.go, lookupHost()通过向本地dns server发送请求,获得IP和域名的

对应关系然后返回,函数调用关系如下:

lookupHost()
->goLookupHostOrder()
-->goLookupIPOrder()
--->tryOneName()
---->exchange()

func exchange(server, name string, qtype uint16, timeout time.Duration) (*dnsMsg, error) {
	d := Dialer{Timeout: timeout}
	out := dnsMsg{
		dnsMsgHdr: dnsMsgHdr{
			recursion_desired: true,
		},
		question: []dnsQuestion{
			{name, qtype, dnsClassINET},
		},
	}
	for _, network := range []string{"udp", "tcp"} {
		c, err := d.dialDNS(network, server)    //创建UDP
		if err != nil {
			return nil, err
		}
		defer c.Close()
		if timeout > 0 {
			c.SetDeadline(time.Now().Add(timeout))
		}
		out.id = uint16(rand.Int()) ^ uint16(time.Now().UnixNano())
		if err := c.writeDNSQuery(&out); err != nil {   //发送DNS请求
			return nil, err
		}
		in, err := c.readDNSResponse()   //解析DNS请求得到IP
		if err != nil {
			return nil, err
		}
		if in.id != out.id {
			return nil, errors.New("DNS message ID mismatch")
		}
		if in.truncated { // see RFC 5966
			continue
		}
		return in, nil
	}
	return nil, errors.New("no answer from DNS server")
}

其中的timeout 是 dns 超时时间 是在dnsconfig_unix.go 文件中读取 /etc/reslove.conf  的配置决定的

net.go中的DialTimeout函数也会走到DNS解析流程中,该函数最终会调用到 lookupIPDeadline 启用一个新的协

去解析DNS, 具体调用栈如下:

DialTimeout()
->resolveAddrList()
-->internetAddrList()
--->lookupIPDeadline()
---->lookupGroup.DoChan() 在新的协程中去做 dns解析
----->lookupIP()
------>goLookupIPOrder()

总之,纯go语言的 DNS解析流程还是比较完善的~~

版权声明:转载请注明出处, 多谢 http://blog.csdn.net/mumumuwudi


有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:mumumuwudi

查看原文:go(golang) dns 解析源码 go/src/net/dnsclient_unix.go 分析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2760 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传