更新时间:2023-11-09 17:09:11
常规域名解析是通过 DNS 协议进行解析的,其最终结果就是获取域名对应的真实服务器地
址,无法绕开 DNS 拦截和故障问题。
而 HttpDNS 则是以 HTTP 的方式代替传统 DNS 协议传递解析结果,能够有效避开 DNS 层
面的拦截和故障。客户端通过接口向网宿 HttpDNS 集群发起“DNS 查询”请求,网宿 HttpDNS 集
群根据请求携带的域名和 IP 信息,查询 CDN 内部调度策略,通过响应请求的方式,返回给客户
端最优节点 IP。客户端得到最优节点 IP,通过在 header 中指定 host 字段,进行正常的业务访问。
拓扑图
访问流程
客户端已根据 “2.接入指南” 完成客户端改造,具体客户端与 HTTPDNS 系统的业务流程如
下:
缓存说明
缓存策略
移动互联网用户的网络环境比较复杂,为了尽可能地减少由于域名解析导致的延迟,建议在本
地进行缓存。 缓存规则如下:
① 缓存时间:
缓存时间建议采用查询得到域名 TTL。在客户端向网宿 HttpDNS 集群发起域名解析请求时,得
到请求响应的实体中会包含域名对应的 TTL 值。
查询本地缓存
本地是否缓存
② 缓存更新:
缓存更新应在以下两种情形下进行: i.
用户网络状态发生变化时
移动互联网的用户的网络状态由 3G/4G 切 Wi-Fi,Wi-Fi 切 3G/4G 的情况下,其接入点
的网络归属可能发生变化。所以用户的网络状态发生变化时,需要重新向网宿 HttpDNS
发起域名解析请求,以获得用户当前网络归属下的最优指向 IP。
ii. 缓存过期时
当域名解析的结果缓存时间到期时,客户端应该向网宿 HttpDNS 重新发起域名解析请求
以获取最新的域名对应的 IP。
③ 缓存时间更新优化:
为了减少用户在缓存过期后重新进行域名解析时的等待时间,建议在 TTL 快过期时(例如达
过期时间 75%时)就开始进行域名解析。例如本地缓存的 TTL 为 600s,那么在第
600*0.75=450s 时刻,客户端就应该进行域名解析。 ④ 配合缓存的其他建议:
i. 可在一次 http 请求中同时查询多个域名结果,批量得到结果,减少域名解析的次数,
提升了解析效率
ii. 建议在业务允许的情况下,尽量减少域名的数量。如需区分不同的资源,建议通过 url
来进行区分。
网宿提供以下 HTTPDNS 服务接入方案,针对不同地区客户提供不同的接入 HTTPDNS 方
案:
1.国内客户:
⑴在接入过程中,测试期网宿只提供一个测试的 httpdns 服务 IP(测试时由网宿统一提供),
如果转正后,可以提供三组 httpDNS 的服务 IP。推荐使用这种方式接入 HTTPDNS 服务。
参数说明,详见 2.2.2
⑵https 接入方式(详见 2.2.3):
a.IP 证书方式接入
b.域名接入方式
2.海外客户:
Anycast IP 接入方式,使用 Anycast IP: (由网宿统一提供),保证服务的高可用性。
获取节点 ip 的接口示例:
http://网宿服务 IP/v1/httpdns/clouddns?ws_domain=www.a.com&ws_ret_type=json&ws_cli_IP=1.1.1.1
参数说明,详见 2.2.2
客户端请求客户端采用 HTTP 方式发起请求,具体内容包括:要查询的加速
域名+用户 IP
Curl "http:// httpDNS 服务 ip 或者域名/v1/httpdns/clouddns?ws_domain= www.
chinanetcenter.com.com
&ws_ret_type=json&ws_cli_IP=1.1.1.1 "
参数说明:
① httpDNS 服务 ip 或者域名: HTTPDNS 调度集群 IP 或者域名(包含 ipv4 或者 ipv6 的域名
入口)。国内客户测试阶段使用(由网宿统一提供)。
海外地区使用 Anycast IP,:(由网宿统一提供)
②ws_domain:客户的请求域名
③ws_ret_type:返回包格式,若该值为 json,则返回包格式为 json 格式,若不带该参数,则
返回格式为传统的 IP TTL 格式
④ws_cli_IP :客户端 IP,可为空,若为空则表示 HTTPDNS 自动获取建连 IP 作为客户端 IP
HttpDNS 响应若请求参数带 ret_type=json 则 DNS 解析结果以 json 形式返
回,返回格式为:
{“msg”:“Success”,“data”:{“www.chinanetcenter.com.com”:{“ips”:[“157.185.185.85”],“ttl”:300}},“retC
ode”:“0”}
若不带 ret_type 则返回普通格式,返回 DNS 解析结果,响应内容格式为:A 记录 TTL 时间
157.185.185.85 300
(IPV4 请求则响应 IPV4 的 A 记录,IPV6 请求则响应 IPV6 的 A 记录)
客户端根据获取到的 A 记录 IP 进行访问,并根据 TTL 时间实现客户端 DNS 记录缓存。
*/
@Override
public boolean verify(String hostname, SSLSession session) { return
HttpsURLConnection.getDefaultHostnameVerifier().verify(“edge.wshttpdns.com”, session);
return false;
}
});
connection.connect(); }
catch (Exception e) {
e.printStackTrace();
} finally {
}
IOS 使用 NSURLSession/NSURLConnection 接口
来完成,
HttpDNS 响应若请求参数带 ret_type=json 则 DNS 解析结果以 json 形式返
回,返回格式为:
{“msg”:“Success”,
“data”:{“www.chinanetcenter.com.com”:{“ips”:[“157.185.185.85”],“ttl”:300}}, “retCode”:“0”}
若不带 ret_type 则返回普通格式,返回 DNS 解析结果,响应内容格式为:A 记录
TTL 时间
157.185.185.85 300
客户端根据获取到的 A 记录 IP 进行访问,并根据 TTL 时间实现客户端 DNS 记录缓存。
(IPV4 请求则响应 IPV4 的 A 记录,IPV6 请求则响应 IPV6 的 A 记录)
2) 域名 https 访问的方式
客户端请求
curl “https://httpDNS 集群域名/v1/httpdns/clouddns?ws_domain=www.
chinanetcenter.com.com&ws_ret_type=json&ws_cli_IP=223.104.212.138”
参数说明:
①httpDNS 集群域名:域名入口(包含 ipv4 或者 ipv6 的域名入口)。(入口由网宿
提供。)
②ws_domain:客户的请求域名
③ws_ret_type:返回包格式,若该值为 json,则返回包格式为 json 格式,若不带该参数,则
返回格式为传统的 IP TTL 格式
④ws_cli_IP :客户端 IP,可为空,若为空则表示 HTTPDNS 自动获取建连 IP 作为客户端
IP HttpDNS 响应若请求参数带 ret_type=json 则 DNS 解析结果以 json 形式返回,返回格式
为: {“msg”:“Success”,
“data”:{“www. chinanetcenter.com.com”:{“ips”:[“157.185.185.85”],“ttl”:300}}, “retCode”:“0”}
若不带 ret_type 则返回普通格式,返回 DNS 解析结果,响应内容格式为:A 记录
TTL 时间
157.185.185.85 300
客户端根据获取到的 A 记录 IP 进行访问,并根据 TTL 时间实现客户端 DNS 记录缓存。
(IPV4 请求则响应 IPV4 的 A 记录,IPV6 请求则响应 IPV6 的 A 记录)
2.2.4. 多频道查询
支持同一个 HttpDNS 请求中带多个频道请求(多个域名以分号分隔);并且在响应的时候,根
据网宿自定义的个数,返回多个频道的解析 A 记录。下面以 http 方式的形式举例,https 的情景类
似:
客户端请求
http://ip/v1/httpdns/clouddns?ws_domain=www.
chinanetcenter.com.com;www.quansucloud.com&ws_ret_type=json
HTTPDNS 响应(非 json 格式)
36.250.248.66 300
222.138.255.254 300
112.91.133.117 300
HTTPDNS 响应(json 格式)
{“msg”:“Success”,
“data”:{“www.quansucloud.com”:{“ips”:[“112.91.133.117”],“ttl”:300},“www.
chinanetcenter.com.com”:{“ips”:[“36.250.248.66”,“222.138.255.254”],“ttl”:300}},
“retCode”:“0”}
(IPV4 请求则响应 IPV4 的 A 记录,IPV6 请求则响应 IPV6 的 A 记录)
故障切换策略
虽然网宿 HttpDNS 集群已经接入 BGP Anycast,并实现了多地跨机房容灾。但为了保证在最
坏的情况下客户端域名解析依然不受影响。建议采用以下的故障切换保障策略:
① 第一步先向首选网宿 HttpDNS 集群发起域名查询请求。
② 如果查询返回的结果不是一个 IP 地址(结果为空、结果非 IP、连接超时等),则尝试下
一个集群或者直接通过本地 LocalDNS 进行域名解析。超时时间建议为 5s。注意,返回结果
为空可能情况为参数错误或者域名未开启 HttpDNS 服务,返回的状态码仍然是 200。
日志记录
为了方便排查问题,需要记录提供服务的 HTTPDNS IP 是哪一个,以及日志输出记录是获取
到哪些节点 ip 等相关信息。建议采用以下的日志记录策略:
① 记录提供服务的 HTTPDNS 服务 IP 信息
② 记录通过 HTTPDNS 集群获取到的节点 IP 信息
③ 记录访问资源时所使用的节点 IP 信息
④ 记录客户端的 IP 信息
附录 1 错误码
retCode 含义
0 成功
1 参数错误
HttpDNS 方案·DNS 防劫持方案