HarmonyOS-ArkUI Web控件基础铺垫2-DNS解析
ArkWeb中,WebviewController含有一些关于DNS解析环节的设置接口。我们先了解一下DNS解析这个知识点,便于以后系统掌握WebviewController和进行相关优化。
ArkWeb中,WebviewController含有一些关于DNS解析环节的设置接口。我们先了解一下DNS解析这个知识点,便于以后系统掌握WebviewController和进行相关优化。
DNS由来
大致讲下这个DNS出现的原因以及相关解题思路。设一个最简化场景:世界上的所有电脑都只有IP地址,如图所示:

从上图可以看出,如果用户能记住各个IP,其实传输数据也可以。现在的情况是,人类记不住这些IP!这太难用了。所以就出现了第一版解决方式:
- 记录IP记不住,那就将这个IP映射为人类可以理解的方式: 比如上图中的购物网站是192.168.8.1:8080, 如果换成 “shopping.com”, 就好记得多。shopping.com便是“域名”!
- 如果大家都按照shopping.com记录的话,得出一个中间层机制确保shopping.com能映射到192.168.8.1:8080 。并且如果以后人家shopping.com网站的IP变了,用户也可以无感知,中间层只需要改这个映射地址就可以了。
针对以上问题的出现和解题思路我们不难得出,一定要有一个类似于“电话本”的存在,来将用户能记住的域名与真实的IP绑定!
“电话本”应该怎么设计呢?
最粗暴的方式就是,将电话本写成一个文件放在您电脑上!当你拿着域名访问的时候,通过读取这个“电话本”的记录,就可以知道这个域名对应的IP,就可以访问了。但是!如果途中购物网站系统升级,把IP给改了,你电话本里的记录可是没办法更新的。这是个bug!
怎么解决这个bug呢?很简单:把这个电话本记录在一个远程服务器上,这个服务器上记录着全世界的域名IP对应,如果购物网站想变动域名,那也得必须改这个服务器里的域名。说白了也就是创造一个平台专门处理全世界的域名IP映射问题, 全世界的电脑只需要本地记录一下这个平台的IP,每当访问一个域名的时候,先从本地电话本拿到这个平台的IP, 一个传输层协议过去就可以访问这个平台了,再找这个平台要域名的真实IP。如图所示:

于是最为简单粗暴的DNS便出现了!图中的域名平台服务器,就是DNS服务器。 注意,是最简化的。现实中的DNS服务器,为了让电脑高效快速的访问到"电话本"映射的IP,设计的很复杂,包括为什么域名是XXX.com这类结构,都是为了快速查域名IP。
实际中的DNS系统是什么样的
DNS是解析域名用的,我们首先了解一下域名本身的结构,要解析的快,那域名必须也得配合一个可以快速查到的规则才可以。就像二分查找要在有序数据中找最快那样。
域名规则
www.baidu.com , www.deepseek.com 等是我们常见的域名,他们以逗号隔开,com结尾,域名的排布其实是有规则的,是树形结构的!而且其实真正的域名最后有个.的存在,只是我们键入可以省略。 所以他们的域名全名为:www.baidu.com., www.deepseek.com.
如图所示:

域名划分
- 根域名:互联网的顶级域名解析服务由根域名服务器来完成,根域名服务器对网络安全、运行稳定至关重要,被称为互联网的“中枢神经”。
- 顶级域名:顶级域一般有两种划分方法,按国家划分和按组织性质划分:
- 国家顶级域名(nTLDs):200多个国家都按照ISO3166国家代码的规定分配了顶级域名,例如中国是.cn、美国是.us、英国是.uk、日本是.jp等。
- 国际顶级域名(iTDs):按照组织性质来进行划分,比如商业组织用.com、教育机构用.edu、非营利组织用.org、政府部门用.gov、公司或企业用.biz、网络服务机构用.net、军事部门用.mil等。
- 二级域名:顶级域名下面是二级域名,网上能够注册的域名基本都是二级域名,它们由企业和Linux运维人员管理。
- 三级域名(子域,这是自定义的随便几层都可以):是二级域名的延伸,一般由网站管理员自己命名,三级域名由字母、大小写和连接符号组成,网站管理员可以根据自己网站的特点进行选择。例如,有个域名为 abcd.com,如果公司是做邮箱服务的可以叫 mail.abcd.com,如果是做网站的可以叫 www.abcd.com……
以上是拆分一个简单的网址的域名结构。 实际上域名结构本身是树形的,下图为域名设计本身的结构:

为什么这样设计呢? 是因为这个排序就像家庭地址那样便于归类查找,比如你要寄一个快递给 “北京市海淀区百度大厦张三”, 那么当你定位的时候按照树层结构定位,最快!
快递总局->北京分局->海淀站点->快递员
域名这样设计也是方面快速的定位。
域名服务器的排布
域名服务器是分布式排布的。其排布结构非常有利于处理上述树形结构:
- 根域名服务器: 全球仅13组,主根在美国,辅根分散多国, 存储顶级域如 .com, .cn的服务器地址
- 顶级域名服务器:用于管理顶级域下的二级域, 比如.com下的.baidu.com
- 权威域名服务器:存储域名最终解析记录,比如(www.baidu.com -> 180.101.49.12), 这种服务器是由域名注册商或者托管商进行管理的。
- 本地DNS服务器: 我们自己电脑直连的服务器,负责代理查询上述所有层级用的,并将结果缓存下来。说白了就是我们的电脑可以跑DNS系统提供的代码,这段代码的能力是开辟一个服务,这个服务用来查询域名的IP,且将IP缓存下来。
每种类型的服务器记录的内容,是非常符合树形结构检索的:

DNS查询方式
DNS的查询是按照树结构查询的,就像查地址那样查,
1 检查本地缓存
- 若近期解析过该域名,直接返回IP(跳过后续查询)。
1 递归查询(若缓存未命中)
- 向根服务器查询 → 获得顶级域服务器地址(如
.com的服务器IP); - 向顶级域服务器查询 → 获得权威服务器地址(如
taobao.com的权威IP); - 向权威服务器查询 → 获得最终域名IP(如
www.taobao.com→180.101.50.12)。
2 返回结果并缓存
- 将IP返回给你的电脑,同时按TTL(存活时间)缓存结果。
如图下图,为电脑本地没有记录DNS缓存的情况下的请求链路:

上图为实际执行中要走的诸多链路,描述的比较详细复杂。我们仅对于服务器之间周转而言,可以简化为网上经常看到的下图:

DNS访问域名服务器时用到的协议
大部分情况下用的就是UDP协议。原因是我们上图可以看出,这找个域名完整链路需要建立四条链接,需要走八步。 UDP主要是快,而且DNS返回的信息量很少的,UDP即使稳定性不如TCP,也可以Hold住的。目前行业内采用UDP的居多。
关于DNS缓存策略
这块很好理解,就是通常我们找到一个域名对应的地址的时候,通常会记录下来,以便于下次访问,就不用走以上冗长的流程了。
那么对于电脑最开始找IP地址的时候,先去找缓存,这里面有什么细节呢?我们不妨在现有的基础上假设一个问题--电脑拿到的IP, 与运营商真实的IP不符合。也就是,运营商改了域名对应的服务器(现实中这个IP其实就是变来变去的),而我们的电脑内依旧存在缓存。至少目前我们学习的这点知识来实现DNS解析,肯定是会存在这么个问题的。
那怎么办?
最坏的结果莫过于停摆不干了就是访问不上了!HTTP 5XX错误酷酷报呗😂。哈哈哈。其实这是一个偏服务端的问题。秉承着来都来的态度,思考下吧。
如果存在缓存过期当如何处理-思考:
- 电脑找的过期IP,直接连接对应的服务端,必然会出现连接失败的问题,连接失败在代码实现上好歹也能触发个回调是不。此时我们收到失败的回调重新走一下DNS解析流程不就好了👀。这个bug解得可谓简单粗暴啊。最多能当个兜底方案。原因是:此期间从第一次连接失败到再DNS解析,到拿到新鲜的IP再连接,其实浪费了第一次连接。我们在写TCP代码的时候会有连接时长的限制,包括在应用端上层实现Http请求封装的时候,也会让您设置的。这个值国内通常设置为3000毫秒(我待的这几个厂都是3秒),那么第一次连接必然会拖到这3秒的时间,发现没有收到对方的包,才报失败! 3秒啊那是!浪费了这么长的时间必然是不太好的。所以这条失败,最好让他原地消失,干脆想办法不让它请求!
有没有更好的办法?
- 思路2: 把缓存清理了不就好了,清理完之后正好触发找不到IP重新DNS解析的流程🤐。--也可以解,但这么解,相当于缓存机制直接被除名了,以后我们的每一个连接都要进行那8步DNS解析流程! 得不偿失。这方案压根就不能用,PASS!
- 思路3: 既然思路2不好用,但是缓存消失这个策略的确可以避免第一次连接的问题。那如果运营商自己设置缓存条目的有效期,我们电脑上将有效期记录下来,时间到了就清理掉对应的条目呢?这个思考就有些接近真相了,这种策略解不了全部的场景,但是能消除一大波缓存过期的问题。运营商可以根据自己的需要,在缓存条目中设置一个名为TTL的字段,这个字段被设置在权威服务器中,返回给我们的电脑。例如设置为3600, 也就是一小时。那么我们电脑拿到这些IP缓存的时候自然能晓得什么时候该缓存能正常使用。这个策略可以有!
- 思路4: 在电脑端与服务端打交道的时候,可以维护一个长链接,专门监听IP改变这件事。如果使用过程中突然收到,甚至不用DNS解析,就可以直接更换连接IP。这个策略也可以有。但这种策略是各公司应用程序自己的职责范围内做的。如果您是系统开发者,手伸不到这里。 这种方案在实际中也是存在的,是一种高级策略。
现实中怎么处理的缓存IP过期的?
现实中采取了思路2的方案, 即运营商设置TTL,单位为秒。来决定DNS解析结果在客户端或者服务器中可以保留多久。
- 如果过期了,则自动进行DNS解析,将请求到的新的域名IP缓存信息覆盖。
- 如果没有过期,就直接和目标服务器建立连接。
在运营商自身的App或者服务端实现业务中,也采用了思路4, 即通过一种方式得知IP变更,使得应用做出相应的补偿操作,确保正常使用。
如何调整DNS缓存,使得DNS解析更快
缓存机制的存在本身就是提升DNS解析速度,降低DNS服务器负载的。但!还可以更上一层楼!
- 增加缓存容量:增大DNS缓存的容量可以存储更多的解析记录,减少对上级DNS服务器的查询次数。但是过大的缓存容量也会占用更多的内存资源,需要根据实际情况进行权衡。
- 设置合理的缓存过期时间:为了避免缓存中的记录过期导致解析错误,需要合理设置缓存的过期时间。一般情况下,可以将缓存过期时间设置为较短的时间,例如几个小时或一天。
- 使用智能DNS解析服务:一些智能DNS解析服务可以根据用户的地理位置、网络状况等因素自动选择最佳的解析结果,并提供更快的解析速度。可以考虑使用这些服务来提升域名解析速度。
- 定期清理缓存:定期清理DNS缓存可以避免缓存中的过时记录影响解析速度和准确性。可以通过编写脚本或使用工具来自动化清理过程。
更多推荐
所有评论(0)