移动环境下DNS解析失败后的优化方案

我们手机游戏中,通过上报收集到的数据来分析,发现相当多的一部分用户,在请求一些配置时会遇到无法解析的情况,或者域名的解析直接被拦截了。

特别是游戏的补丁包文件(放在CDN上),遇到的域名解析失败是最多的,比较小的配置可以通过请求动态接口来获得数据,但是比较大的补丁文件,比如单个zip就超过15M这样的文件,就无法提供接口来返回数据了。这些问题很棘手,如何解决确实困扰了很久

有一个方案,就是分流,多提供几个CDN的域名进行轮询,也就是下载分流。但它依然面临的问题是域名解析,被ISP运营商劫持就over了(电信、移动它们经常干这种事情)

 

后来内部讨论的结果是说把这些请求全部放到BGP机房(成本会高一些),然后较大的补丁文件放到CDN上,购买几家CDN供应商,配置几个不同的CDN请求域名,使用轮询的方式下载补丁。但即便是这种,如同上面所说,依然无法避免域名解析失败的问题

 

后来我看到一篇文件,就是腾讯的GSLB团队开放出来的HttpDNS服务(点击查看原文链接>>),说白一点就是请求一个动态接口,这个动态接口根据你请求的ip来返回你想要访问域名的最近的ip列表(它会不断的优化ip库)。这样所有的请求都可以走ip了,跳过ISP的域名解析了

 

 

比如我们想要访问www.baidu.com,那么请求http://119.29.29.29/d?dn=www.baidu.com

就会返回离我最近的IP地址:

180.97.33.107;180.97.33.108

我使用的是苏州电信,它返回的IP列表是泰州的电信,我直接访问IP也是能显示百度首页

http://180.97.33.108/

能访问到,是因为它的服务器配置对ip也做了支持。如果遇到比如网宿这种它没有对相应的ip进行支持(就是当你直接访问ip时不鸟你的),怎么办呢?

 

我们来做这样一个实验,使用libcurl访问www.baidu.com,正常情况下应该是直接返回百度首页,现在我在本地配置nginx(但未配置hosts),规则如下图:

然后我访问http://127.0.0.1/index.html

这样访问就直接到我本机了,使用了我本机的配置(下图是Nginx的访问日志)。

 

如何做到的呢?其实就只是修改了http的头部host参数。我直接访问指定的ip,并设置相应的host,这样就绕开了域名解析这一步。

回到文章的开始,腾讯提供的HttpDNS就派上用场了,调用接口获取到IP列表,取其中一个ip,然后修改访问目标网址(以http://ip/xxx开头了),并设置请求的host,这样就直接跳过了域名解析。其实还是有解析的,只是这一步完全交给腾讯的那个动态接口了,它会根据域名来返回离我当前请求网络最近的ip列表

 

希望这篇文章对同样被域名解析所困扰的同行有所帮助吧,如果你有更好的方案,欢迎一起讨论:)

 

本文参考链接:

腾讯的 GSLB 新思路 HttpDNS 已经实现可用

curl 请求指定host 的 URL

libcurl httpcustomheader.c

时间: 2024-08-08 22:03:47

移动环境下DNS解析失败后的优化方案的相关文章

Linux环境下DNS服务器原理及主服务器简单配置

1,DNS介绍 DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串.通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析). 监听的协议端口:UDP/TCP 53 软件实现:bind 2,DNS数状结构: 如下图: 根域:. 一级域如下: 组织域:.com, .org, .net, .mil, .edu, .gov, .info, .cc, .

验证DNS解析失败:解决办法之一

今天晚上练习简单的DNS解析验证: 环境是在一台虚拟机上搭建,另一台虚拟机验证,步骤如下: 虚拟机A: 1.安装软件包 bind  和bind-chroot[[email protected] ~]# yum -y install bind-chroot bind 2.修改主配置文件  /etc/named.conf ,[[email protected] ~]# vim /etc/named.conf options {        listen-on port 53 { any; }; 

Linux环境下部署完JDK后运行一个简单的Java程序

前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version"命令是否有正确的内容打印,也许这并不具备太大的说服力.可能能够运行起一个正确的java程序来,不管从感性角度还是理性角度来说,都会有一个更好的认识. 所以本文写一段很简单的java代码,并且在Linux环境下编译运行,以证明JDK部署得确实没有问题. 代码验证JDK部署是否正确 1.级联建立两个目录 首

linux下编译安装的Apache安全优化方案

上节我们学习了Linux的系统优化解决方案,我个人总结为18项,当然还有别的,例如系统内核裁剪这些我没讲到,为什么呢?大家不用太关心了,要记得我们学习的目的是能够胜任工作即可.我们对一个知识点不要讲的太深,避免钻进死胡同了,那就不好啦. 今天我们讲解下lamp架构安全优化中的Apache服务的安全优化.在讲这节内容之前我说下,静态web请求的流程: 当客户端访问一个静态网站的时候,网站上的Apache服务就会给他发送html文档给客户端浏览器,客户端浏览器会进行解析,然后就是我们看到的内容了.

Linux环境下DNS主从配置

1,DNS主从原理 为了解决主服务器负载过重,实现负载均衡配置从服务器,主服务器每次修改完成后将传送通知给slave服务器,master服务器收到slave的请求后将SOA记录发送给slave服务器,slave服务器收到后同时对比自己的SOA中的serial number,如果serial number值大于本机的话,slave将发送zone transfer区域传送请求.Master响应zone transfer请求并传送结果,直到整个slave更新完成. 2,DNS主从配置 实验环境: 1,

Centos6.4环境下DNS服务器的搭建

DNS服务器搭建很繁琐吗?给你个简单的招吧! 配置域主服务器 阶段: 1.在bind的主配置文件中添加该域 2.在/var/named中创建该域的zone文件 3.编辑zone文件,添加需要的信息 4.检测防火墙或selinux设置 5.启动bind服务 6.使用host或nslookup命令   检测域信息是否正常 工具/原料 安装了Centos6.4系统的电脑一台 方法/步骤 安装bind yum install -y bind bind-chroot bind-utis   BIND配置文

linux环境下DNS服务器

DNS (Domain Name Service) 域名服务 用于主机名和IP的转换.分为正向解析(FQDN--->IP)和反向解析(IP--->FQDN) UDP协议,53端口 TCP协议,53端口 DNS服务器类型: 主DNS服务器:维护所负责的区域内解析库的服务器 从DNS服务器:定时同步更新主DNS服务器的内容记录.只有当主服务器当机后,从服务器才会接替其工作 高速缓存服务器:把经常要查询DNS记录缓存到本地,以便下次更快进行解析反馈 转发服务器:负责将非本区域内的域名转发到其他DNS

win7下安装ie11失败后的方法

首先,win7必须是sp1或以上,然后尽可能安装多点补丁,把.net framwork4.5也安装上,不行的话2.0和3.0也装上,然后想安装ie11最少也要有这6个补丁.(KB2729094,KB2731771,KB2533623,KB2670838,KB2786081,KB2834140) 以下网址打开: https://support.microsoft.com/zh-cn/help/2847882/prerequisite-updates-for-internet-explorer-11

代理环境下 xcode submit 失败解决

由于公司网络需要设置代理才能访问外网,此时通过xocde提交应用到itunesconnect的时候会出现443访问失败的错误,可以通过下面的方法来解决. Go to Application Loader java folder : /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/MacOS/itms/java/lib Open net.properties file with "subli