浅析IM即时通讯开发移动端DNS域名劫持问题

对于互联网,域名是访问的第一跳,而这一跳很多时候会“失足”(尤其是移动端网络),导致访问错误内容、失败连接等,让用户在互联网上畅游的爽快瞬间消失。

而对于这关键的第一跳,包括鹅厂在内的国内互联网大厂,都在持续深入地研究和思考对策,本文将就鹅厂团队在这一块的技术实践,做一个深度的总结和技术分享,希望给大家带来些许启发。

但凡使用域名来给用户提供服务的互联网企业,都或多或少地无法避免在有中国特色的互联网环境中遭遇到各种域名被缓存、用户跨网访问缓慢等问题。那么对于腾讯这样的域名数量在10万级别的互联网公司来讲,域名解析异常的情况到底有多严重呢?

每天腾讯的分布式域名解析监测系统在不停地对全国所有的重点LocalDNS(指运营商的DNS服务)进行探测,腾讯域名在全国各地的日解析异常量是已经超过了80万条(这方面,来自移动端的异常尤为突出)。这给腾讯的业务带来了巨大的损失。为此腾讯建立了专业的团队与各个运营商进行了深度沟通,但是由于各种原因,处理效率及效果均不能达到腾讯各业务部门的需求。

除了和运营商进行沟通,有没有一种技术上的方案,能从根源上解决域名解析异常及用户访问跨网的问题呢?这是包括腾讯在内的很多国内互联网大厂技术团队一直在思考的问题。

首先,什么是DNS?

要想理解本文将要讨论的DNS各种问题,我们需要首先来复习一下DNS的基本原理和相关知识。

DNS的工作原理

DNS(Domain Name System,域名系统),DNS 服务用于在网络请求时,将域名转为 IP 地址。能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的 IP 数串。

扫描二维码关注公众号,回复: 14386449 查看本文章

传统的基于 UDP 协议的公共 DNS 服务极易发生 DNS 劫持,从而造成安全问题。

典型DNS域名系统的结构如下:

    1)Root 域名:DNS 域名使用时,规定由尾部句号来指定名称位于根或更高级别的域层次结构;
    2)Top Level 顶级域名:用来指示某个国家、地区或组织使用的名称的类型名称。如 .net;
    3)Second Level 域名:个人或组织在 Internet 上使用的注册名称。如 52im.net;
    4)Third Level 域名:已注册的二级域名派生的域名。如 docs.52im.net。

DNS的递归查询和迭代查询

递归查询:如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步的查询。

迭代查询:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:你下一步应当向哪一个域名服务器进行查询。然后让本地域名服务器进行后续的查询,而不是替本地域名服务器进行后续的查询。

由此可见,客户端到 Local DNS 服务器,Local DNS 与上级 DNS 服务器之间属于递归查询;DNS 服务器与根 DNS 服务器之前属于迭代查询。

实际环境中,因为采用递归模式会导致 DNS 服务器流量很大,所以现在大多数的 DNS 都是迭代模式。

国内移动端网络所面临的各种DNS杂症

总结下来,DNS的这些咋整主要的带来了三类问题:

    1)LocalDNS劫持;
    2)平均访问延迟下降;
    3)用户连接失败率下降。


LocalDNS劫持: 由于HttpDNS是通过ip直接请求http获取服务器A记录地址,不存在向本地运营商询问domain解析过程,所以从根本避免了劫持问题。 (对于http内容tcp/ip层劫持,可以使用验证因子或者数据加密等方式来保证传输数据的可信度)即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

平均访问延迟下降: 由于是ip直接访问省掉了一次domain解析过程,(即使系统有缓存速度也会稍快一些‘毫秒级’)通过智能算法排序后找到最快节点进行访问。

用户连接失败率下降: 通过算法降低以往失败率过高的服务器排序,通过时间近期访问过的数据提高服务器排序,通过历史访问成功记录提高服务器排序。如果ip(a)访问错误,在下一次返回ip(b)或者ip(c) 排序后的记录。

我们得先得了解下现在国内各ISP运营商的LocalDNS的基本情况。

国内运营商LocalDNS造成的这些问题,可以归为下以下3种原因:

    域名缓存;
    解析转发;
    LocalDNS递归出口NAT。


下面,我们来逐一分析。

域名缓存

域名缓存很好理解,就是LocalDNS缓存了腾讯的域名的解析结果,不向腾讯权威DNS发起递归。

为何LocalDNS要把域名解析结果进行缓存呢?原因有以下几个:

    1)保证用户访问流量在本网内消化:国内的各互联网接入运营商的带宽资源、网间结算费用、IDC机房分布、网内ICP资源分布等存在较大差异。为了保证网内用户的访问质量,同时减少跨网结算,运营商在网内搭建了内容缓存服务器,通过把域名强行指向内容缓存服务器的IP地址,就实现了把本地本网流量完全留在了本地的目的;
    2)推送广告:有部分LocalDNS会把部分域名解析结果的所指向的内容缓存,并替换成第三方广告联盟的广告。


以上类型的行为就是我们常说的域名缓存,域名缓存会导致用户产生以下的访问异常:

    A、仅对80端口的http服务做了缓存,如果域名是通过https协议或其它端口提供服务的,用户访问就会出现失败。比如支付服务、游戏通过指定端口连接connect server服务等;
    B、缓存服务器的运维水平参差不齐,时有出现缓存服务器故障导致用户访问异常的问题。

解析转发

除了域名缓存以外,运营商的LocalDNS还存在解析转发的现象。解析转发是指运营商自身不进行域名递归解析,而是把域名解析请求转发到其它运营商的递归DNS上的行为。

而部分小运营商为了节省资源,就直接将解析请求转发到了其它运营的递归LocalDNS上去了:

这样的直接后果就是腾讯权威DNS收到的域名解析请求的来源IP就成了其它运营商的IP,最终导致用户流量被导向了错误的IDC,用户访问变慢。

LocalDNS递归出口NAT

LocalDNS递归出口NAT指的是运营商的LocalDNS按照标准的DNS协议进行递归,但是因为在网络上存在多出口且配置了目标路由NAT,结果导致LocalDNS最终进行递归解析的时候的出口IP就有概率不为本网的IP地址。

这样的直接后果就是GSLB DNS收到的域名解析请求的来源IP还是成了其它运营商的IP,最终导致用户流量被导向了错误的IDC,用户访问变慢。

猜你喜欢

转载自blog.csdn.net/wecloud1314/article/details/125910707
今日推荐