基于JavaScript的CIDR IP地址的辅助分析工具

背景

1、网络ID相同的计算机称之为本地网络,本地网络中的计算机相互通信不需要路由器连接;网络ID不相同的计算机称之为远程网络,远程网络中的计算机要相互通信必须通过路由器连接。

2、IDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类、B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间。它可以将好几个IP网络结合在一起,使用一种无类别的域际路由选择算法,使它们合并成一条路由从而较少路由表中的路由条目减轻Internet路由器的负担。

CIDR 还使用“斜线记法”,它又称为CIDR记法,即在IP地址后面加上一个斜线“/”,然后写上网络前缀所占的比特数(这个数值对应于三级编址中子网掩码中比特1的个数)。        IP地址::={<网络前缀>,<主机号>}

问题

如何分析理解CIDR?

例1:192.168.10.14/28,192.168.10.15/28,192.168.10.16/28哪个不是同一网段?

解决

使用下面的JavaScript分析工具,可以清晰地打印网络地址和主机地址:

<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>ip address test</title>
<style>
    body{
        font-family:Courier New;
    }
</style>
</head>

<body>
<script lang="javascript">
	function println(str){
		document.writeln(str + "<br/>");
	}
 
 
 	/**
 	*格式化IP
 	*/
 	function formatIP(ipaddr){
 		var str = ipaddr.toString(2);
 		var  a = parseInt(str.substr(0,8), 2);
 		var  b = parseInt(str.substr(8,8), 2);
 		var c = parseInt(str.substr(16,8), 2);
 		var d = parseInt(str.substr(24,8), 2);
 		
 		println(a +'.' + b + '.' + c + '.' +d);
 	}
 
 
 	/**
 	* 使用点格式化	IP
 	*/
 	function formatIpByDot(ip){
 		var str = ip.toString(2);
 		var a = str.substr(0,8);
 		var b = str.substr(8,8);
 		var c = str.substr(16,8);
 		var d = str.substr(24,8);
 		println(a + '.' + b + '.' + c + '.' + d);
 	}
 	
 	
 	/**
 	* 使用点格式化	IP
 	*/
 	function formatIpToCIDR(ip, netlength){
 		if(netlength<0 || netlength>32){
 			println('Invalid netlength param.');
 			return;
 		}
 		
 		var str = ip.toString(2);
 		var a = str.substr(0,8);
 		var b = str.substr(8,8);
 		var c = str.substr(16,8);
 		var d = str.substr(24,8);
 
 		if(netlength<=8 ){
 			var l = netlength;
 			a =  a.substr(0,l)   + '|'   +  a.substring(l);
 		} else if( netlength>8 && netlength<=16){
 			var l = netlength-8;
 			b = b.substr(0,l) + '|' + b.substring(l);
 		}else if(netlength>16 && netlength<=24){
 			var l = netlength-8*2;
 			c = c.substr(0,l) + '|' + c.substring(l);
 		}else if(netlength>24 ){
 			var l = netlength-8*3;
 			d = d.substr(0,l) + '|' + d.substring(l);
 		}
 		
 		printTableHead();
 		println(' ' +a + '.' + b + '.' + c + '.' + d);
 	} 	
 	
 	/**
 	*打印表头
 	*/
 	function printTableHead(){
 		println("<br>");
 		println('32-------24-------16-------8--------0');
 		println('|--------|--------|--------|--------|');
 	}

	/**
	*
	*/
	function transIP(str){
		var segments = str.split('.');
/*		
		for(var i=0;i<segments.length;i++){
			println(' segments [' + i + ']:' +  segments[i]);
		} 
*/
		
		var a  = (parseInt(segments[0])<< 24)>>>0;
		var b = ( parseInt(segments[1])<<16) >>>0;
		var c =(parseInt(segments[2])<<8)>>>0;
		var d = (parseInt(segments[3]))>>>0;
/*		
		println(' parseInt(segments[0])<< 24:' +  a.toString(2)  +  ','  + a);
		println(' parseInt(segments[1])<< 16:' +  b.toString(2)  +  ',' + b);
		println(' parseInt(segments[2])<<8:'     +  c.toString(2)  +  ',' + c);	
		println(' parseInt(segments[3]):'           +  d.toString(2)  +  ',' + d);
*/		
		var ipaddr = a + b + c + d;
		return ipaddr;
	}

	
	function test1(){
		var str = '192.168.10.14';
		
		var ip = transIP(str);
		
		//println(ip.toString(2) ); 
		
		//formatIP(ip);
		//formatIpByDot(ip);	
		formatIpToCIDR(ip, 28);		
		formatIpToCIDR(transIP('192.168.10.15'), 28);	
		formatIpToCIDR(transIP('192.168.10.16'), 28);	
	}
	
	
	test1();

</script>
</body>

</html>
输出:

32-------24-------16-------8--------0
|--------|--------|--------|--------|
 11000000.10101000.00001010.0000|1110



32-------24-------16-------8--------0
|--------|--------|--------|--------|
 11000000.10101000.00001010.0000|1111


32-------24-------16-------8--------0
|--------|--------|--------|--------|
 11000000.10101000.00001010.0001|0000

可以清楚的看到,192.168.10.16的网络地址(即IP地址前28位),不与192.168.10.14,192.168.10.15同,故不在同一网段内。


参考:

1、CIDR详解. xinianbuxiu. http://blog.csdn.net/xinianbuxiu/article/details/53560417

2、计算IP地址以及CIDR. 铭记_ . http://blog.csdn.net/lwb102063/article/details/52954419

posted @ 2018-02-05 16:36  hongweigg  阅读(36)  评论(0编辑  收藏  举报