Android中DNS域名劫持问题
在客户端进行业务接口请求时,往往会在线上出现解析JSON响应内容失败而导致的应用崩溃,但是在实际开发测试过程中却没有遇到此问题。解决办法就是对JSON解析进行异常捕获,然后将实际响应内容上报到服务端,从而查看具体问题。对上报到服务端的实际响应内容进行分析后,发现响应内容变成各种HTML文本,以下是常见的几种
以上几种均是DNS劫持导致的结果,想知道DNS是如何被劫持的,需要先理解DNS域名是如何解析的,当用户在浏览器地址栏输入域名时,DNS解析有大致十个过程:
1、浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
2、如果浏览器缓存中没有,浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程,即通过hosts文件来设置,如果在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。
3、如果至此还没有命中域名,才会真正地请求本地域名服务器(LDNS)来解析这个域名。
4、如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析。
5、根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD
Server,国际顶尖域名服务器,如.com .cn .org等)地址。
6、此时LDNS再发送请求给上一步返回的gTLD。
7、接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器。
8、Name Server根据映射关系表找到目标ip,返回给LDNS。
9、LDNS缓存这个域名和对应的ip。
10、 LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束。
缓存是DNS被动持的根本原因,在DNS解析过程的各个缓存中均有可能被动持。主要包括本机的hosts算改持,和运营商的LocalDNS持等。