DNS域名解析的过程

我们知道互联网都是通过URL来发布和请求资源的,而URL中的域名需要解析成IP地址才能与远程主机建立连接,如何将域名解析成IP地址就属于DNS解析的工作范畴。

当我们浏览器地址栏输入:www.baidu.com时候,dns域名解析完成大约需要10个步骤,整体可以由一张图来表示:

注:比较重要的点知识点专门做了文字加粗 

1. 浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。

 2. 如果浏览器缓存中没有,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。操作系统也有一个域名解析的过程,C:\Windows\System32\drivers\etc\host文件来设置,这个文件为了防止被病毒和黑客恶意篡改,所以它是只读的,你自己可以获取管理员权限才可以编辑,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。

3.  如果至此还没有找到域名对应的ip地址,这时候会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般是距离你比较近的,并且这台服务器的性能都很好,一般大部分的域名都会在这里获取到并且解析完成。

4. 如果本地域名服务器(LDNS)仍然没有解析完成,就直接跳到根域名服务器(Root Server)请求解析。

5. 根域名服务器返回给本地域名服务器一个所查询域的主域名服务器(gTLD Server),gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。

6. 本地域名服务器(LDNS)再向第五步中根域名服务器返回过来的主域名服务器(gTLD Server)服务器发送请求。

7. 接收到请求的主域名服务器(gTLD Server)查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是用户注册的域名服务器。

8. Name Server域名服务器根据映射关系表找到目标ip,返回给本地域名服务器(LDNS)。

9. 本地域名服务器(LDNS)缓存这个千辛万苦获得来的域名和对应的ip。

10. 本地域名服务器(LDNS)把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束

在实际的DNS解析过程中,可能还不止这10步,如Name Server可能有很多级,或者有一个GTM来负载均衡控制,这都有可能会影响域名解析过程。

### DNS域名解析过程详解 DNS域名解析是一个分层递归的过程,其主要目的是将人类可读的域名转换为机器可以理解的IP地址。以下是详细的解析流程: #### 1. 客户端发起请求 当用户在浏览器中输入一个域名时,客户端会先检查本地缓存是否有该域名对应的IP地址记录。如果有,则直接返回;如果没有,则进入下一步。 #### 2. 查询本地主机配置文件 如果未命中本地缓存,客户端会尝试查询本地主机配置文件(通常是`/etc/hosts`或`C:\Windows\System32\drivers\etc\hosts`),查看是否存在手动映射的域名与IP地址的关系[^2]。 #### 3. 请求本地域名服务器 (LDNS) 如果前两步均未能找到匹配项,客户端会向指定的本地域名服务器发送查询请求。此服务器通常由用户的互联网服务提供商(ISP)提供[^3]。 #### 4. LDNS 的处理逻辑 - **缓存命中**:如果本地域名服务器在其缓存中有目标域名的相关记录,则立即返回给客户端。 - **缓存未命中**:如果本地域名服务器无法解析该域名,它将以递归方式代替客户端继续向上级域名服务器请求解析[^4]。 #### 5. 向根域名服务器请求 本地域名服务器作为代理角色,首先联系根域名服务器(Root Server)。这些服务器负责指导如何定位顶级域(Top-Level Domain, TLD)的信息。例如,“com”、“org”等后缀分别指向不同的TLD服务器[^1]。 #### 6. 转发至权威名称服务器 根据根域名服务器提供的指引,本地域名服务器接着访问相应的TLD服务器获取更具体的子域信息。最终到达存储实际域名到IP映射关系的授权名称服务器(Authoritative Name Servers)[^1]。 #### 7. 返回结果并更新缓存 一旦获得确切的IP地址,这一路径上的每一环节都将把结果保存下来以便未来更快响应相同的请求。最后,原始请求者——即最初发出查询的应用程序收到所需的数据完成整个过程。 ```python import dns.resolver def resolve_domain(domain_name): try: answers = dns.resolver.resolve(domain_name, 'A') for rdata in answers: print(f"The IP address of {domain_name} is {rdata.address}") except Exception as e: print(e) resolve_domain('example.com') ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值