基于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