一、 为什么会有DNS系统?
记忆问题:IP地址不便于记忆,使用名字便于记忆;然而,名字需要对应的ip进行查询资源 —— DNS系统
二、 DNS(Domain Name System)是什么?
官方: 一种用于TCP/IP应用程序的分布式的数据库。* 提供了主机名字和ip地址之间的转换* 以及 有关电子邮件的选录信息。
域名解析器:客户端的程序包含;进行DNS查询的主机和软件。(eg:个人电脑)
域名服务器:DNS服务器; 存储ip地址和域名映射表的服务。
三、域名
eg: www.xxx.com , www是三级域名, xxx是二级域名,com是顶级域名,域名末尾的根域名服为".",一般不需要输入。
分局域名服务器所起的作用,可以把域名服务器划分为四种不同的类型:
根域名服务器:根域名服务器是最高层次的域名服务器。根域名服务器知道所有顶级域名服务器的域名和IP地址。
顶级域名服务器:顶级域名服务器负责管理在该服务器注册的所有二级域名。当收到DNS查询请求时,就给出相应的回答。
权威域名服务器:负责一个区的域名服务器。 当一个权威域名服务器还不能够给出最后的额查询回答时,就会告知发出查询请求的DNS客户,下一步应当找哪一个权威域名服务器。
本地域名服务器:当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器。每个互联网服务提供者ISP都可以拥有一个本地域名服务器。
四、查询方式/过程: 递归查询、迭代查询
DNS是基于UDP做的查询。
递归查询:如果主机所询问的本地域名服务器不知道被查询域名的IP地址,那么本地域名服务器就 以DNS客户端的身份,向其他根域名服务器继续发出查询请求报文,即替主机继续查询,而不是让主机进行下一步查询。 上图中的 (1)和(10)
迭代查询:当前根域名服务器收到本地域名服务器发出的迭代查询请求报文时候,要么给出所要查询的IP地址,要么告诉本地服务器下一步应该找那个域名服务器进行查询,然后让本地服务器进行后续的查询; 上图中的(2)~ (9)
例子:查询过程示例
1)首先搜索浏览器的DNS缓存,缓存中维护一张域名与IP地址的对应表
2)若没命中,继续搜索操作系统的DNS缓存; 有则返回
3)若还没命中,则操作系统域名发送至本地域名服务器,本地域名服务器采用递归查询自己的DNS缓存,有则返回。
4)若本地域名服务器的DNS缓存没有命中,则本地域名服务器向上级域名服务器进行迭代查询
4.1)本地域名服务器向根DNS服务器发起请求,根域名服务器返回顶级域名服务器的地址给本地服务器
4.2)本地域名服务器拿到顶级域名服务器地址后,向其发起请求,获取宣威域名服务器地址
4.3)本地域名服务器根据权威域名服务器的地址发起请求,最终得到该域名对应的IP地址
5)本地域名服务器得到的IP地址返回给操作系统,同时自己将IP地址缓存起来
6)操作系统将IP地址返回给浏览器,同时自己也将IP地址缓存起来
7)浏览器得到域名对应的IP地址,并将IP地址缓存起来。
五、域名缓存
计算机中的DNS的记录分为两种缓存方式:
1)浏览器缓存:浏览器在获取网站域名的实际IP地址后会对其进行缓存,减少网络请求的损耗。
2)操作系统缓存:操作系统的缓存其实是用户自己配置的hosts文件
六、DNS 为什么用UDP
DNS既使用 TCP 又使用 UDP
当进行
区域传送
【主域名你服务器向辅助域名服务器传送变化的那部分数据】时会使用TCP, 因为数据同步传送的数量比一个请求和应答的数据要多, 而TCP允许的报文长度更长,因此为了保证数据的正确性, 会使用基于可靠连接的TCP
当客户端向DNS服务器查询域名【
域名解析
】的时候,一般返回的内容不超过UDP报文的最大长度, 即512字节。用UDP传输时,不需要经过TCP三次握手的过程,从而大大提高了响应速度,但这要求域名解析器和域名服务器都必须自己处理超时混合重传从而保证可靠性。
七、DNS劫持/污染
定义
: DNS劫持【域名劫持】,是通过将原域名对应的 IP 地址进行替换从而使得用户访问到错误的网站或者使得用户无法正常访问网站的一种攻击方式。
可见的结果:跳转到非预期的网站,有一些弹窗
域名劫持往往只能在特定的网络范围内进行,范围外的 DNS 服务器能够返回正常的 IP 地址。
攻击者可以冒充原域名所属机构,(1)通过电子邮件的方式修改组织机构的域名注册信息,或者(2)将域名转让给其它组织,并将新的域名信息保存在所指定的 DNS 服务器中,从而使得用户无法通过对原域名进行解析来访问目的网址。
具体实现DNS劫持步骤:
通过控制E-MAIL来劫持DNS
1)获取要劫持的域名信息:攻击者首先会访问域名查询站点查询要劫持的域名信息。
2)控制域名相应的E-MAIL账号:在获取到域名信息后,攻击者通过暴力破解或者专门的方法破解公司注册域名时使用的 E-mail 账号所对应的密码。更高级的攻击者甚至能够直接对 E-mail 进行信息窃取。
3)修改注册信息:当攻击者破解了E-MAIL后,会利用相关的更改功能修改改域名的注册信息,包含域名拥有者信息,DNS服务器信息等
4)使用E-MAIL收发确认函:在修改完注册信息后,攻击者在 E-mail 真正拥有者之前收到修改域名注册信息的相关确认信息,并回复确认修改文件,待网络公司恢复已成功修改信件后,攻击者便成功完成 DNS 劫持。
客户端的预防DNS劫持手段
1)直接通过 IP 地址访问网站,避开 DNS 劫持。
2)由于域名劫持往往只能在特定的网络范围内进行,因此一些高级用户可以通过网络设置让 DNS 指向正常的域名服务器以实现对目的网址的正常访问
,例如将计算机首选 DNS 服务器的地址固定为 8.8.8.8。
3)移动开发中常见的使用httpDNS。
八、国内移动端网络DNS的问题
(1) localDNS劫持 (2)平均访问延迟下降 (3)用户连接失败率下降
LocalDNS劫持: 由于HttpDNS是通过ip直接请求http获取服务器A记录地址,不存在向本地运营商询问domain解析过程,所以从根本避免了劫持问题。 (对于http内容tcp/ip层劫持,可以使用验证因子或者数据加密等方式来保证传输数据的可信度)
平均访问延迟下降: 由于是ip直接访问省掉了一次domain解析过程,(即使系统有缓存速度也会稍快一些‘毫秒级’)通过智能算法排序后找到最快节点进行访问。 【优先级】
用户连接失败率下降: 通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。如果ip(a)访问错误,在下一次返回ip(b)或者ip(c) 排序后的记录。【优先级】
国内运营商LocalDNS造成的问题根源:
1)域名缓存
2)解析转发
3)localDNS递归出口NAT
1)域名缓存:lcoalDNS缓存了腾讯的域名的解析结果,不向腾讯权威DNS发起递归。
localDNS 缓存的原因:
<1> 保证用户访问流量在本网内消化:国内的各互联网接入运营商的带宽资源、网间结算费用、IDC机房分布、网内ICP资源分布等存在较大差异。为了保证网内用户的访问质量,同时减少跨网结算,运营商在网内搭建了内容缓存服务器,通过把域名强行指向内容缓存服务器的IP地址,就实现了把本地本网流量完全留在了本地的目的;
<2> 推送广告:有部分localDNS会把部分域名解析结果的所指向的内容缓存,并替换成第三方广告联盟的广告
导致的用户体验:
A、仅对80端口的http服务做了缓存,如果域名是通过https协议或其它端口提供服务的,用户访问就会出现失败。比如支付服务、游戏通过指定端口连接connect server服务等;
B、缓存服务器的运维水平参差不齐,时有出现缓存服务器故障导致用户访问异常的问题。
2)解析转发 : 解析转发是指运营商自身不进行域名递归解析,而是把域名解析请求转发到其它运营商的递归DNS上的行为。
这样的直接后果就是腾讯权威DNS收到的域名解析请求的来源IP就成了其它运营商的IP,最终导致用户流量被导向了错误的IDC,用户访问变慢。
3)LocalDNS递归出口NAT:
LocalDNS递归出口NAT指的是运营商的LocalDNS按照标准的DNS协议进行递归,但是因为在网络上存在多出口且配置了目标路由NAT,结果导致LocalDNS最终进行递归解析的时候的出口IP就有概率不为本网的IP地址。
这样的直接后果就是GSLB DNS收到的域名解析请求的来源IP还是成了其它运营商的IP,最终导致用户流量被导向了错误的IDC,用户访问变慢。
PS: 解决方案 —— 使用HTTPDNS
1)什么HTTPDNS?
HTTPDNS 利用 HTTP 协议与 DNS 服务器交互,代替了传统的基于 UDP 协议的 DNS 交互,绕开了运营商的 Local DNS,有效防止了域名劫持,提高域名解析效率。另外,由于 DNS 服务器端获取的是真实客户端 IP 而非 Local DNS 的 IP,能够精确定位客户端地理位置、运营商信息,从而有效改进调度精确性。
主要解决问题:
<1>Local DNS 劫持:由于 HttpDns 是通过 IP 直接请求 HTTP 获取服务器 A 记录地址,不存在向本地运营商询问 domain 解析过程,所以从根本避免了劫持问题。
<2>平均访问延迟下降:由于是 IP 直接访问省掉了一次 domain 解析过程,通过智能算法排序后找到最快节点进行访问。
<3>用户连接失败率下降:通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。
HttpDNS思路: —— 专治LocalDNS解析异常 以及 浏览调度不准
HttpDNS的原理非常简单,主要有两步:
A、客户端直接访问HttpDNS接口,获取业务在域名配置管理系统上配置的访问延迟最优的IP。(基于容灾考虑,还是保留次选使用运营商LocalDNS解析域名的方式);
B、客户端向获取到的IP后就向直接往此IP发送业务协议请求。以Http请求为例,通过在header中指定host字段,向HttpDNS返回的IP发送标准的Http请求即可。
从原理上来讲,HttpDNS只是将域名解析的协议由DNS协议换成了Http协议,并不复杂。
但是这一微小的转换,却带来了无数的收益:
A、根治域名解析异常:由于绕过了运营商的LocalDNS,用户解析域名的请求通过Http协议直接透传到了腾讯的HttpDNS服务器IP上,用户在客户端的域名解析请求将不会遭受到域名解析异常的困扰;
B、调度精准:HttpDNS能直接获取到用户IP,通过结合腾讯自有专利技术生成的IP地址库以及测速系统,可以保证将用户引导的访问最快的IDC节点上;
C、实现成本低廉:接入HttpDNS的业务仅需要对客户端接入层做少量改造,无需用户手机进行root或越狱;而且由于Http协议请求构造非常简单,兼容各版本的移动操作系统更不成问题;另外HttpDNS的后端配置完全复用现有权威DNS配置,管理成本也非常低。总而言之,就是以最小的改造成本,解决了业务遭受域名解析异常的问题,并满足业务精确流量调度的需求;
D、扩展性强:HttpDNS提供可靠的域名解析服务,业务可将自有调度逻辑与HttpDNS返回结果结合,实现更精细化的流量调度。比如指定版本的客户端连接请求的IP地址,指定网络类型的用户连接指定的IP地址等。
当然各位可能会问:用户将首选的域名解析方式切换到了HttpDNS,那么HttpDNS的高可用又是如何保证的呢?另外不同运营商的用户访问到同一个HttpDNS的服务IP,用户的访问延迟如何保证?
为了保证高可用及提升用户体验,HttpDNS通过接入了腾讯公网交换平台的BGP Anycast网络,与全国多个主流运营商建立了BGP互联,保证了这些运营商的用户能够快速地访问到HttpDNS服务;另外HttpDNS在多个数据中心进行了部署,任意一个节点发生故障时均能无缝切换到备份节点,保证用户解析正常。
参考:
DNS详细理解:https://www.jianshu.com/p/af4fadbed7f4
腾讯的HttpDNS方案 http://www.52im.net/thread-2121-1-1.html
公众号:
技术小难
简书
博客园 链接需要替换
CSDN
知乎
掘金
segmentfault
本文由mdnice多平台发布