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

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

    简介: HashMap: 具有很快的访问速度,但遍历顺序却是不确定的. HashMap最多只允许一条记录的键为null,允许多条记录的值为null. HashMap非线程安全,即任一时刻可以有多个线程 ...

  2. 【LOJ】#2078. 「JSOI2016」无界单词

    题解 用所有的方案减去有界的方案 我们规定两个前缀后缀相同时长度最短的,设长度为l,因为长度最短所以他们也是无界单词,可以递推 \(f[i] = \sum_{j = 1}^{\lfloor \frac ...

  3. ps -aux与ps -ef

    ps -aux与ps -ef这两个命令显示的结果是差不多的. 不同之处就是显示风格不同,前者是BSD风格,后者SYSTEM V(其实我不太明白这尼玛风格是什么跟什么,我看起来都差不多啊) 然后重要的不 ...

  4. k8s 集群中的etcd故障解决

    一次在k8s集群中创建实例发现etcd集群状态出现连接失败状况,导致创建实例失败.于是排查了一下原因. 问题来源 下面是etcd集群健康状态: [root@docker01 ~]# cd /opt/k ...

  5. Ural 2045. Richness of words 打表找规律

    2045. Richness of words 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2045 Description For ...

  6. OpenVPN选项topology subnet实现子网掩码24的子网地址扩展

    首先,在国内的文章中都没有提及这个概念,到时很多人生成的VPN服务端配置分配的IP都采用net30这种形式,这就导致了在任何一台VPN客户端上无法实现路由指向,因为子网掩码30换算出来就两个地址. t ...

  7. MCU PWM DAC OP Voltage Output

  8. LPC-Link2 CMSIS-DAP firmware source

    LPC-Link2 CMSIS-DAP firmware source Hi, I'm using the CMSIS-DAP firmware with the LPC-Link2. I'd lik ...

  9. Canbus ID filter and mask

    Canbus ID filter and mask CANBUS is a two-wire, half-duplex, bus based LAN system that is ‘collision ...

  10. 【Go命令教程】1. 标准命令详解

    Go 语言的 1.5 版本在标准命令方面有了重大变更.这倒不是说它们的用法有多大的变化,而是说它们的底层支持已经大变样了.让我们先来对比一下 $GOROOT/pkg/tool/< 平台相关目录 ...