扩展阅读
HTTPDNS架构图
- 架构详细说明:HTTPDNS在iOS端的实践
策略层
- 容灾策略放在网络库中处理,未在HTTPDNS架构中体现。
- 黑白名单策略架构中只实现IPV6白名单,即未开启IPV6开关下,只获取白名单中的域名的IPV6地址。
- 缓存策略仅做了内存缓存,可能是担心下次启动时服务器IP变更,直接使用本地缓存会导致访问失败。
- 查询策略逻辑基本一致。
注入层
- IP替换、SSL证书处理、Cookie处理、重定向处理皆在网络库中解决,未在HTTPDNS架构中体现。
HTTPDNS流程图
流程说明
- 注:名称有缩减,对应类图查阅
- NetworkingManager初始化
- HttpDNSManager初始化
- queue,初始化5分钟、1小时(刷新)时间
- 通过特定地址,验证Ipv6连通性
- 通过域名创建 DNSIPsSer 对象
- 对该对象打上isGetIPV6标签
- 通过IPTools判断该域名是否为ip地址
- 若不是,获取域名对应ip列表
- 通过DnsDes对域名加密,加密结果拼接到dnsURL上
- 解析结果,只取前1个
- 通过IPTools判断是否为ipv6地址
- 进行ipv6连通性测试
- 构建DNSResolItem对象,最终存入对象iPItemArray中
- 更新DNSIPsSer对象iPItemArray、isIpv6Done、updateTime属性
- ipv6白名单,开关,对称加密密钥
- 初始化监测网络变化
- 网络切换时,检测ipv6连通性,并对ItemArray所有域名重发。
- 获取本地域名缓存列表
- 对所有域名请求ip地址
- 若ItemArray中已有该域名,则跳过。
- 如果不存在此域名,则将次域名加入到域名列表。
- 更新ItemArray
- 批量请求ip地址
- 通过域名创建DNSIPSer对象
- 将域名组每8份一组进行切割、请求
- 通过白名单获取ipv6请求域名数组,并批量请求
- 若ipv6连通性未返回结果,等待0.6s,等待2s
- 解析获取的IPv4地址,只取前2个(会根据运营商、地区返回最佳IP)
- 构建DNSResolItem对象,最终存入对象iPItemArray中
- 更新DNSIPsSer对象iPItemArray、isIpv6Done、updateTime属性
- 程序进入前台,触发激活逻辑。
- 如果当前时间距离记录时间超过1小时,则所有dns都更新。