您的位置:首页 > Web前端 > JavaScript

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

2018-02-05 16:36 411 查看

背景

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IP CIDR