文档章节

使用WHOIS协议查询domain信息

IamOkay
 IamOkay
发布于 2016/05/07 08:04
字数 689
阅读 373
收藏 6

一、 原理


原理非常简单,域名的查询主要是基于RFC 954提供的WHOIS协议。在上述过程中,我们实际上是访问了InterNIC站点的WHOIS服务器,该服务器从WHOIS数据库中查询我们所需要的内容。
WHOIS服务器是一个基于"查询/响应"的TCP事务服务器,它运行在SRI-NIC机器上(26.0.0.73或10.0.0.51),向用户提供internet范围内的目录服务。本地主机上的用户程序可以通过Internet访问该服务器,其过程主要有下面三步:

(1)Client通过TCP协议连接到SRI-NIC服务主机端口43(十进制);
(2)发送一个命令(域名),以回车和换行(<CRLF>)结尾;
(3)接受相应命令的返回信息,一旦输出结束,SRI-NIC服务主机将关闭连接。

命令的格式非常简单。可以直接输入域名,例如,可以使用"sohu.com"查询"搜狐"网站的域名信息;也可以使用"help"得到详细的帮助信息。

二、程序实现

public class WhoisHost {
	public final static int port = 43;
	public final static Map<String, String> WHOIS = new HashMap<String, String>();

	static{
		
		WHOIS.put(".cn", "whois.cnnic.cn");
		WHOIS.put(".com", "whois.crsnic.net");
		WHOIS.put(".net", "whois.crsnic.net");
		WHOIS.put(".org", "whois.publicinterestregistry.net");
		WHOIS.put(".edu", "whois.educause.net");
		WHOIS.put(".gov", "whois.nic.gov");
		WHOIS.put(".mil", "whois.nic.mil");
		WHOIS.put(".cc", "whois.nic.cc");
		WHOIS.put(".coop", "whois.nic.coop");
		
	}
	
	public String doAsk(String netAddress,String hostName) {
		Socket theSocket;
		InputStream theWhoisStream;
		PrintStream ps;

		try {
			
			
			String[] nets = netAddress.split("\\.");
			String targetNet = nets[nets.length-2]+"."+nets[nets.length-1];
			
			// 在TCP服务端口43(十进制)连接SRI-NIC服务主机
			theSocket = new Socket(hostName, port);
			ps = new PrintStream(theSocket.getOutputStream());
			// 发送用户提供的一个或多个命令
			ps.print(targetNet);
			// 以回车和换行(<CRLF>)结尾
			ps.print("\r\n");
			theWhoisStream = theSocket.getInputStream();
			// 接受相应命令的返回信息
			StringBuilder sb = new StringBuilder();

			byte[] buf= new byte[1024];
			int len = -1;
			
			while ((len=theWhoisStream.read(buf, 0, 1024))!=-1) {
				sb.append(new String(buf, 0, len));
			}

			// 关闭DataInputStream和PrintWriter
			theWhoisStream.close();
			ps.close();
			// 关闭socket
			theSocket.close();
			return sb.toString();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		
		return null;
	}
}

然后我们直接使用即可

WhoisHost whoisProtocol = new WhoisHost();
String t = "www.baidu.com";
String hostName = WhoisHost.WHOIS.get(t.substring(t.lastIndexOf(".")));
String  orgResult = whoisProtocol.doAsk(t,hostName);

下面我们结合RxJava实现一个完整的测试用例

Observable.just("baidu.com").filter(new Func1<String, Boolean>() {

		@Override
		public Boolean call(String t) {
			
				return t!=null &&t.lastIndexOf(".")>=0;
		}
		}).filter(new Func1<String, Boolean>() {

			@Override
			public Boolean call(String t) {
				return WhoisHost.WHOIS.get(t.substring(t.lastIndexOf(".")))!=null;
			}
		}).map(new Func1<String, String>() {

			@Override
			public String call(String t) {
				return t.toLowerCase();
			}
		}).map(new Func1<String, String>() {

			@Override
			public String call(String t) {
				
				WhoisHost whoisProtocol = new WhoisHost();
				System.out.println(t);
				String hostName = WhoisHost.WHOIS.get(t.substring(t.lastIndexOf(".")));
				String  orgResult = whoisProtocol.doAsk(t,hostName);
				//这个whois.markmonitor.com地址是第三方地址,信息量比官方地址大
				String  fullResult= whoisProtocol.doAsk(t,"whois.markmonitor.com");  
				
				return orgResult+"\r\n\r\n"+fullResult;
			}
		}).subscribe(new Action1<String>() {

			@Override
			public void call(String t) {
				
				System.out.println("\r\n"+t);
			}
		});

三、整合到URL协议处理框架

当然,大家也可以这个协议加入URL协议处理框架,具体请参考:

Java URL自定义私有网络协议





© 著作权归作者所有

IamOkay

IamOkay

粉丝 200
博文 483
码字总数 403074
作品 0
海淀
程序员
私信 提问
Python使用Whois协议查询域名、IP地址信息

原文地址:http://shajunxing.tpddns.cn:8888/web/blog/2018-04-17-Python使用Whois协议查询域名、IP地址信息/index.html 问题由来 我想查询某个IP地址所属的运营商,于是在百度里搜索,得到...

shajunxing
2018/04/17
0
0
WHOIS查询(WHOIS lookup)

WHOIS查询(WHOIS lookup) 简单来说:“WHOIS查询”用来获得某一域名的注册信息,当您搜索一个域名时,如果该域名已成功注册,它会反馈域名的注册信息,包括持有人、管理资料以及技术联络资...

hfzhoulin
2014/10/06
0
0
BackTrack5 whois

whois 用了查询域名注册信息 查询的时候 就不要加上 www 等等了。。。 root@bt :~# whois cctry.com Whois Server Version 2.0 Domain names in the .com and .net domains can now be regi......

sincoder
2012/07/16
0
0
信息收集之DNS信息收集 -- dnsenum

dnsenum 由perl编写的一款多线程的、可指定DNS服务器、支持域名爆破、支持不同网速情况下的工具调优、结果可导入到其他工具中使用的一款DNS信息收集工具。(网上大佬们都说可以用来查不连续的...

董志勇
2017/10/25
0
0
Kali DNS枚举工具之dnsenum

dnsenum是一款非常强大的域名信息收集工具,可查询网站的主机地址信息、域名服务器和邮件交换记录,本文简单介绍工具的参数的定义及事例。在介绍之前先来张help图,有个大体的认知: 用法:d...

E书吧
2018/07/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

使用lombok配置数据

导入lombok后,便可省略entity中繁琐的get,set方法,并且在xml文件中也应写的更加简洁 1.在pom中添加依赖 <lombok.version>1.16.20</lombok.version> <!-- https://mvnrepository.com/arti......

沉迷于编程的小菜菜
7分钟前
0
0
Linux awk使用案例教程

awk脚本   awk脚本通常由以下3部分构成:  BEGIN{ 这里面放的是执行前的语句 }  END {这里面放的是处理完所有的行后要执行的语句 }  {这里面放的是处理每一行时要执行的...

Linux就该这么学
15分钟前
0
0
Hive(四)——Hive的其他配置

一、

ittzg
16分钟前
0
0
iOS 倒计时

1、SGLCountDown

_____1____
18分钟前
0
0
[算法]图的最短路径算法

Dijkstra算法(单源最短路径,时间复杂度O(n^2),堆优化后O((m+n)logn),贪心算法) Floyd算法(Floyd-Warshall,插点法)(多源最短路径,时间复杂度O(n^3),空间复杂度O(n^2),动态规划算法) ...

Danni3
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部