文档章节

模拟dns优选,处理dns的响应时间

林小宝
 林小宝
发布于 2018/06/07 16:40
字数 762
阅读 52
收藏 0

模拟dns优选,处理dns的响应时间

说明

主要用于选择更合适的dns解析服务器。可以自定义配置需要测试的dns地址。 如果你们的宽带是电信联通或移动可以去查询它们所在城市的dns地址也可以加入测试

配置文件 dnstest.ini

#要进行解析的域名
test www.baidu.com
test www.oschina.com
test tv.sohu.com
 
#可用的dns。
dns 8.8.8.8
dns 8.8.4.4
dns 114.114.114.114
dns 114.114.115.115
dns 223.5.5.5
dns 223.6.6.6
dns 1.2.4.8
dns 210.2.4.8
dns 208.67.222.222
dns 208.67.220.220
dns 101.226.4.6
dns 123.125.82.6
dns 123.125.83.6

代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
 
public class DNSSpeed implements Runnable {
    private final InetAddress dns;
    private final String dd;
 
    public DNSSpeed(String dns, String dd) throws UnknownHostException {
        this.dns = InetAddress.getByName(dns);
        this.dd = dd;
    }
 
    public void run() {
        byte[] data = toDnsBytes(dd);
        DatagramSocket dispatcher = null;
        DatagramPacket pack = null;
        boolean isSuccess = false;
        long start = System.currentTimeMillis();
        try {
            pack = new DatagramPacket(data, data.length, dns, 53);
            dispatcher = createDatagramSocket();
            dispatcher.setSoTimeout(1000);
            dispatcher.send(pack);
            data = new byte[512];
            pack = new DatagramPacket(data, data.length);
            dispatcher.receive(pack);
            if (pack.getLength() > 12) {//简单验证返回包
                isSuccess = true;
            }
        } catch (Exception e) {
        } finally {
            if (null != dispatcher) {
                dispatcher.close();
            }
            String info = "%-15s\t%-20s\t%s\t%4d\t";
            info = String.format(info, dns.getHostAddress(), dd, isSuccess, (System.currentTimeMillis() - start));
            System.out.println(info);
        }
    }
 
    /**
     * 组dns查询包
     * 2015年7月14日
     * @param dd
     * @return
     */
    protected static final byte[] toDnsBytes(String dd) {
        ByteBuffer b = ByteBuffer.allocateDirect(512);
        short id = (short) (3 + r.nextInt(1000));
        b.putShort(id);// id;
        b.put((byte) 0x01);
        b.put((byte) 0x00);
        b.putShort((short) (0x01 & 0xFFFF));
        b.putShort((short) (0x00 & 0xFFFF));
        b.putShort((short) (0x00 & 0xFFFF));
        b.putShort((short) (0x00 & 0xFFFF));
        String[] ss = dd.split("\\.");
        for (int i = 0; i < ss.length; i++) {
            byte[] bb = ss[i].getBytes();
            b.put((byte) (bb.length & 0xFF));
            b.put(bb);
        }
        b.put((byte) 0x00);
        b.putShort((short) 0x01);
        b.putShort((short) 0x01);
        b.flip();
        byte[] bb = new byte[b.remaining()];
        b.get(bb);
        return bb;
    }
 
    private static Random r = new Random();
 
    /**
     * 随机取一个 50000开始的端口
     * 2015年7月14日
     * @return
     */
    private static synchronized DatagramSocket createDatagramSocket() {
        DatagramSocket result = null;
        while (null == result) {
            try {
                int port = 50000 + r.nextInt(10000);
                result = new DatagramSocket(port);
            } catch (SocketException e) {
                result = null;
            } finally {
            }
        }
        return result;
    }
 
    public static void main(String[] args) throws UnknownHostException {
        List<String> config = loadFile("dnstest.ini");
        List<String> dns = getConfig(config, "dns");
        List<String> test = getConfig(config, "test");
        for (String s : dns) {
            for (String t : test) {
                new DNSSpeed(s, t).run();
            }
        }
    }
 
    /**
     * 取key. 配置以 key  value格式
     * 2015年7月14日
     * @param config
     * @param key
     * @return
     */
    protected static final List<String> getConfig(List<String> config, String key) {
        List<String> result = new ArrayList<String>();
        for (String ss : config) {
            ss = ss.trim();
            if (ss.startsWith(key)) {
                result.add(ss.substring(key.length()).trim());
            }
        }
        return result;
    }
 
    /**
     * 加载配置文件转list
     * 2015年7月14日
     * @param path
     * @return
     */
    protected static final List<String> loadFile(String path) {
        List<String> result = new ArrayList<String>();
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader(path));
            String s = null;
            while (null != (s = in.readLine())) {
                s = s.trim();
                if (!s.startsWith("#") && !s.isEmpty()) {//过滤掉空行及#号开头的配置
                    result.add(s);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != in) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
        }
        return result;
    }
}

执行结果

8.8.8.8         www.baidu.com           true      12    
8.8.8.8         www.oschina.com         true       4    
8.8.8.8         tv.sohu.com             true       7    
8.8.4.4         www.baidu.com           true       7    
8.8.4.4         www.oschina.com         true       8    
8.8.4.4         tv.sohu.com             true       6    
114.114.114.114 www.baidu.com           true       5    
114.114.114.114 www.oschina.com         true       6    
114.114.114.114 tv.sohu.com             true       8    
114.114.115.115 www.baidu.com           true       5    
114.114.115.115 www.oschina.com         true       6    
114.114.115.115 tv.sohu.com             true       5    
223.5.5.5       www.baidu.com           true      41    
223.5.5.5       www.oschina.com         true      44    
223.5.5.5       tv.sohu.com             true      42    
223.6.6.6       www.baidu.com           true      40    
223.6.6.6       www.oschina.com         true      45    
223.6.6.6       tv.sohu.com             true      46    
1.2.4.8         www.baidu.com           true       8    
1.2.4.8         www.oschina.com         true       6    
1.2.4.8         tv.sohu.com             true      13    
210.2.4.8       www.baidu.com           true       6    
210.2.4.8       www.oschina.com         true       8    
210.2.4.8       tv.sohu.com             true     187    
208.67.222.222  www.baidu.com           true       5    
208.67.222.222  www.oschina.com         true       6    
208.67.222.222  tv.sohu.com             true       4    
208.67.220.220  www.baidu.com           true       5    
208.67.220.220  www.oschina.com         true       7    
208.67.220.220  tv.sohu.com             true      10    
101.226.4.6     www.baidu.com           true       5    
101.226.4.6     www.oschina.com         true       5    
101.226.4.6     tv.sohu.com             true       6    
123.125.82.6    www.baidu.com           true       5    
123.125.82.6    www.oschina.com         true       7    
123.125.82.6    tv.sohu.com             true       5    
123.125.83.6    www.baidu.com           true       5    
123.125.83.6    www.oschina.com         true       5    
123.125.83.6    tv.sohu.com             true       6    

© 著作权归作者所有

林小宝
粉丝 5
博文 30
码字总数 11167
作品 2
深圳
私信 提问
移动端 IP 优选方案

移动端 IP 优选方案 1. IP 优选目的 无论是从 Local DNS 解析域名,获取到 IP 列表,还是从第三方的 DNS 解析服务中,获取到域名对应的 IP 列表。我们获得多个 IP 后,总是想选取一个最优的 ...

stevechen1010
2017/12/25
0
0
云解析小编科普:“SRTT” DNS服务器选择算法介绍

大家都知道BIND在作为递归服务器时在向权威DNS请求时会使用优选策略,不过这个优选策略目前没有清晰的资料。小编查阅了一些公开的资料发现基本都是各种传抄,没有什么清晰的说明。因此小编专...

云解析小二
2018/08/03
0
0
求 监控宝 的开源软件

功能类似 监控宝 http://www.jiankongbao.com 主要实现: 站点监控 网址(HTTP/HTTPs) 监控Web站点中任何指定的URL,获得可用率报告以及响应时间详细分析。 Ping 对指定的服务器进行ICMP Ping...

王仕超
2011/07/01
1K
5
高流量网站如何做出高性能?

前一段时间接触了一个教育集团的老总,集团本身是在教育实体化阶段也就是各种教科书盛行的时候起来的,最近 10 年互联网教育越来越火,老板也瞅准商机跳了进来。 可是公司的在线教育板块一直...

OneAPM蓝海讯通
2015/12/21
4
0
正在解析主机,路由器打不开个别网页,已解决

在连接路由器的情况下,无论上无线上网,还是网线与路由器直接相连,360浏览器左下角都会经常显示正在解析主机,个别网站能打开,个别网站,有时能打开,有时怎么搞也不行.一般反复重启路由器可以暂...

越野小生
2015/12/17
469
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux的基本命令

目录的操作命令(增删改查) 增: mkdir 目录名称; 查: ls 可以看到该目录下的所有的目录和文件 ls -a,可以看到该目录下的所有文件和目录,包括隐藏的 ls -l,可以看到该目录下的所有目录和...

凹凸凸
今天
2
0
在古老unix中增加新用户

Installing 4.3 BSD Quasijarus on SIMH 目标:要在4.3BSD中新增加用户dmr,指定目录/home/dmr,uid为10 gid=31(guest组,系统已建立) 4.3BSD还没有adduser或useradd 直接修改/etc/passwd...

wangxuwei
今天
2
0
Bootstrap(六)表单样式

基本样式 所有设置了 .form-control 类的 <input>、<textarea> 和 <select> 元素都将被默认设置宽度属性为 width: 100%;。 将 label 元素和前面提到的控件包裹在 .form-group 中可以获得最好...

ZeroBit
昨天
3
0
SSL 证书格式转换

SSL 证书格式转换 不同服务器情况下,需要不同的证书格式。 比如 pem 转 pfx。 pem在window 平台下可以导入,但是无法正常使用。 需要转换成pfx。 推荐在线转换工具,由中国数字证书网站提供...

DrChenXX
昨天
2
0
HAProxy

xx

Canaan_
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部