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

特别是游戏的补丁包文件(放在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

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

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

    今天晚上练习简单的DNS解析验证: 环境是在一台虚拟机上搭建,另一台虚拟机验证,步骤如下: 虚拟机A: 1.安装软件包 bind  和bind-chroot[root@svr7 ~]# yum -y ...

  2. 在新建的python3环境下运行jupyter失败的原因

    在deeplearning中再运行jupyter notebook就出现了错误: (deeplearning) userdeMBP:~ user$ jupyter notebook -bash: ju ...

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

    前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...

  4. C++高并发场景下读多写少的优化方案

    概述 一谈到高并发的优化方案,往往能想到模块水平拆分.数据库读写分离.分库分表,加缓存.加mq等,这些都是从系统架构上解决.单模块作为系统的组成单元,其性能好坏也能很大的影响整体性能,本文从单模块下读 ...

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

    DNS服务器搭建很繁琐吗?给你个简单的招吧! 配置域主服务器 阶段: 1.在bind的主配置文件中添加该域 2.在/var/named中创建该域的zone文件 3.编辑zone文件,添加需要的信息 4 ...

  6. hanlp在Python环境中的安装失败后的解决方法

    Hanlp是由一系列模型与算法组成的javag工具包,目标是普及自然语言处理再生环境中的应用.有很多人在安装hanlp的时候会遇到安装失败的情况,下面就是某大神的分享的在python环境中安装失败的解 ...

  7. qt 环境下mapx组件打包后编译产生c2248和c2512错误

    C:\Qt\Qt5.6.0\5.6\msvc2013\include\QtCore\qmetatype.h:760: error: C2248: “MapSpace::IRowCursor::IRow ...

  8. Linux环境下sudo切换用户后执行其他命令

    https://blog.csdn.net/liangxw1/article/details/80106465

  9. mac 环境下mysql登陆失败问题Access denied for user 'root'@'localhost' (using passwordYES)

    1.停止mysql服务 sudo /usr/local/mysql/support-files/mysql.server stop 2.进入mysql的bin目录 cd /usr/local/mysq ...

随机推荐

  1. maven-replacer-plugin 静态资源版本号解决方案(css/js等)

    本文介绍如何使用 maven 的 com.google.code.maven-replacer-plugin 插件来自动添加版本号,防止浏览器缓存. 目录 1.解决方案 2.原始文件和最终生成效果 3 ...

  2. Git(二)使用git管理文件版本(TortoiseGit )

    一.创建版本库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都 ...

  3. zabbix3.4+grafana5.0.1数据可视化

    转自:https://blog.csdn.net/xiaoying5191/article/details/79530280

  4. 配置https域名

    https://help.aliyun.com/knowledge_detail/95505.html?spm=5176.11065259.1996646101.searchclickresult.6 ...

  5. NLP自然语言处理系列5-支持向量机(SVM)

    1.什么是支持向量机 支持向量机(Support Vector Machine,SVM)是一种经典的分类模型,在早期的文档分类等领域有一定的应用.了解SVM的推导过程是一个充满乐趣和挑战的过程,耐心的 ...

  6. 一个简单的python练习题

    最近几天看了python的基础知识,也写了两篇博客:http://futuretechx.com/python2/和 http://futuretechx.com/python-basicknowl/ ...

  7. UML类图-聚合和组合的区别

    类图-组合和聚合 学习自 http://blog.sina.com.cn/s/blog_4ae8f77f0100ji5k.html http://blog.csdn.net/nodeathphoeni ...

  8. BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)

    题目链接 f定义和下面的思路一样,转移时枚举填什么字符,去更新f并算出有哪些字符串可以匹配某个状态(见code吧...). 预处理出有哪些字符串在第i位可以转移到某个字符c,dp时&一下状态即 ...

  9. 【原】Spring整合Redis(第二篇)—SDR环境搭建具体步骤

    [环境参数] Spring版本:4.2.6.RELEASESpring-Data-Redis版本:1.7.2.RELEASE Redis版本:redis-2.4.5-win32-win64 [简要说明 ...

  10. 使用 IntraWeb (25) - 基本控件之 TIWRegion

    这应该是 IW 中最重要的容器了, 和它同父的还有 TIWTabControl TIWRegion 所在单元及继承链: IWRegion.TIWRegion 主要成员: property Align: ...