我的网络浏览器如何解析域名?
Posted
技术标签:
【中文标题】我的网络浏览器如何解析域名?【英文标题】:how does my web browser resolve Domain Names? 【发布时间】:2011-05-22 11:46:11 【问题描述】:我正在开发一个应该能够联系 DNS 服务器的网络应用程序。
我想知道最好的方法是什么。我想到了浏览器。
例如,Firefox 或 Chrome 如何解析我在 URL 栏中输入的域名?
我的意思是,我输入http://www.google.com,它怎么知道必须向IP 209.85.195.104 发出TCP 请求?
谢谢!
【问题讨论】:
我已经阅读过 DNS 解析是由您的 ISP 进行的,但我不知道这在多大程度上是真实的,也不记得我在哪里看到的,抱歉。 是的,事实上,在我的 resolv.conf 中,前 4 个域名服务器(来自 5 个)属于我的 ISP。 【参考方案1】:这是一个很好的漫画,描述了您的浏览器如何解析主机名:
http://www.labnol.org/internet/comic-how-browser-works/18086/
您的环境应该能够为您处理主机名解析。您是否有理由需要自己实现此功能?
【讨论】:
谢谢,但我不是白痴。我知道 DNS 服务器是如何工作的。只是想知道从技术上讲,网络浏览器是如何做到的。 @santiagobasulto:我想他们的代码会访问主机操作系统的 API 来获取这些信息。我不认为他们会手动完成。像这样的东西:msdn.microsoft.com/en-us/library/ms682016%28v=vs.85%29.aspx 谢谢大卫!你有什么文章、书籍或类似的东西可以多读一点吗? 实际上,我正在使用 Java,然后我有一个带有魔法方法的魔法类: InetAddress.getAllByName(String name) 事情是我想知道一切是如何工作的。再次感谢。 DNS 上还有一段漂亮的视频:youtube.com/watch?v=hcaJ1Vp_Ntg【参考方案2】:在最简单的情况下,浏览器会使用gethostbyname()
之类的函数将名称解析为地址。然而,这个函数并不总是以方便浏览器的方式实现(它通常会阻塞直到得到答案)。
今天的浏览器开始使用"DNS prefetch",当页面加载时,浏览器将直接向 DNS 服务器发送 DNS 请求,以便在用户点击下一个链接之前解析地址。这样,用户在点击时不必等待名称解析,并且浏览体验会更快。
【讨论】:
Python 中的示例:import socket; print(socket.gethostbyname_ex('www.example.com'))
【参考方案3】:
试试这个:
http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=7992
相关的 RFC 是 rfc1035.txt
或 google 获取 DNS 解析器来源。
【讨论】:
【参考方案4】:Web 浏览器向 DNS 服务器发送请求。服务器发送关联地址列表(如果域名记录确实有,几个 IP 地址 - 例如 cnn.com 有几个 IPv4 和 IPv6 地址)。我不确定这个地址是否存储浏览器或操作系统,但如果浏览器使用第一个地址和不要得到答案,他将使用列表中的另一个地址。我在某处读到它最多等待 30 秒,直到他使用列表中的另一个地址。
【讨论】:
以上是关于我的网络浏览器如何解析域名?的主要内容,如果未能解决你的问题,请参考以下文章