目前IPV6的大力推广,所以现在越来越多的Android设备都开始支持IPV6了,那么在网络上就是IPV4//IPV6双栈连接
IPV4/IPV6双栈连接那么系统就会得到下发的ipv4 dns服务器和ipv6 dns服务器,DNS服务器地址在dns协议中保存在一个数组中,后面进行DNS请求也是对该数组进行遍历,所以首先进行请求的目标DNS就是保存在数组中的第一个(具体DNS原理可以查看
https://blog.csdn.net/cc0410/article/details/103288483这篇文章)
而数组中保存的DNS顺序依据是什么呢?依据的是IPV4或者IPV6哪个先连接成功,如果IPV4先连接成功,那么DNS数组中优先存储的就是IPV4下发的DNS服务器,如果是IPV6先连接成功,那么DNS数组中优先存储的就是IPV6下发的DNS服务器
IPV4先连成功:
dns_list[0] = 8.8.8.8
dns_list[1] = 114.114.114.114
dns_list[2] = fe80::1
dns_list[3] = 2000::1
IPV6先连成功:
dns_list[0] = fe80::1
dns_list[1] = 2000::1
dns_list[2] = 8.8.8.8
dns_list[3] = 114.114.114.114
假设我们想先向IPV6 DNS发起请求,但这时是IPV4先连成功,那么Android原生流程就无法满足,所以这个时候我们需要对DNS的保存过程做一个调整:
/**
* set dns priority according to sys.network.priority(4 ro 6)
*/
private Collection<InetAddress> sortDnsesByPriority(Collection<InetAddress> dnses) {
Collection<InetAddress> dnsesList = new ArrayList<InetAddress>();
if (dns