JavaScript获取IP获取的是IPV6 如何校验
来源: 阅读:1607 次 日期:2016-06-20 14:10:07
温馨提示: 小编为您整理了“JavaScript获取IP获取的是IPV6 如何校验”,方便广大网友查阅!

1、什么是IPV6?

这个问题可以去百度或Google找一下,应该会有很大的收获,其实主要就是为了解决IPV4地址不够用的问题,V4地址是32位,即:192.168.1.1,而V6地址则是128位,比V4扩大了太多倍。

2、IPV6有子网掩码吗?

可以说有,也可以说没有,说有呢,是因为在IPV6中有前缀的说法,它相当于IPV4中的子网掩码,只是名称不相同了;说没有呢,也可以,因为IPV6的地址实在是太大了,号称可以给地球上每个沙子一个地址,这样就淡化了子网的概念,不需要了。

3、IPV6的地址

IPV6地址写法在网上也可以查到很多很多,我就不详细列了,一般如下:1205::fff0:ffd1:1021/120,后面的120就是代表了前缀,相当于IPV4中的子网掩码。

4、IP地址的计算方式

IPV6和IPV4的网段计算方式一样,对于IPV4而言,如192.168.1.1/255.255.255.0,那么它的网段是从192.168.1.0~192.168.1.255,这个是怎么计算出来的呢?根据ISP的规定,它的起始地址为:此IP地址和子网掩码按位与运算求得;它的终止地址为:此IP地址和子网掩码的取反(不包含符号位)按位或运算求得。

IPV6也和IPV4在原理上是一样的,因为IPV6前缀太长了,所以根本无法用255.255.255.0的形式表达出来,因此通常直接写数字,如120或128等。120代表此前缀的前120位都是1,后面的则是0,这个前缀就相当于IPV4中的子网掩码,计算IPV6地址和IPV4一样。

上面已经将IPV6的简要知识说明了一下,下面来处理下IPV6网址。

IPV6的网址写法上需要兼容零压缩法,因此需要对IPV6的网址进行转换,下面是JS的转换代码:

function transitIp(ipaddr)//将IPV6地址补全

{

 var ipaddress = ipaddr.split("/");

 var ipaddrs = ipaddress[0].split(":");

 if(ipaddrs.length<8)

 {

 var count = 0;

 for(var i=0;i<ipaddrs.length;i++)

 {

 if(ipaddrs[i]=="")

 {

 if(count==1)

 {

  ipaddrs[i] = addZero(4);

  continue;

 }

 ipaddrs[i] = addZero((9-ipaddrs.length)*4);

 count++;

 }

 else

 {

 ipaddrs[i] += ":";

 }

 }

 }

 else if(ipaddrs.length==8)

 {

 for(var i=0;i<8;i++)

 {

 ipaddrs[i] += ":";

 }

 }

 ////上述补齐完成,将内容放置于ipaddrs中,但不标准

 return initaddr(ipaddrs);//获得了ip地址的完整字符串

}

function addZero(num)

{

 var zerostr = "";

 for(var i=1;i<num+1;i++)

 {

 zerostr+="0";

 if(i%4==0)

 {

 zerostr+=":";

 }

 }

 return zerostr;

}

function initaddr(ipaddrs)

{

 var iparray ="";

 for(var i=0;i<ipaddrs.length;i++)

 {

 iparray+=ipaddrs[i];

 }

 if(iparray.charAt(iparray.length-1)==':')

 {

 iparray = iparray.substr(0,iparray.length-1);

 }

 //var iparrays = iparray.split(":");

 //return iparrays;

 return iparray;

}

IPV6地址判断的正则表达式为:

function isIPv6(str)//IPV6地址判断 

 return /:/.test(str) 

 &&str.match(/:/g).length<8

 &&/::/.test(str)

 ?(str.match(/::/g).length==1

 &&/^::$|^(::)?([\da-f]{1,4}(:|::))*[\da-f]{1,4}(:|::)?$/i.test(str))

 :/^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(str);

}

接着我们说明下IPV4到IPV6的转换:

IPV4到IPV6网址的转换很简单,只需将IPV4地址转为十六进制格式,以两段为一组,然后再前面添加::ffff即可

JS代码如下:

function four2six(fouraddr,fourmask)//IPV4转IPV6,包括地址和掩码

{

 var reg = fouraddr.match(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/);

 if(reg==null)

 {

 alert("IP地址不正确!");

 return;

 }

 if(fourmask.indexOf(".")!=-1)

 {

 reg = fourmask.match(/^(254|252|248|240|224|192|128|0)\.0\.0\.0$|^(255\.(254|252|248|240|224|192|128|0)\.0\.0)$|^(255\.255\.(254|252|248|240|224|192|128|0)\.0)$|^(255\.255\.255\.(255|254|252|248|240|224|192|128|0))$/);

 if(reg==null)

 {

 alert("子网掩码不正确!");

 return;

 }

 }

 else

 {

 var mask = parseInt(fourmask, 10);

 if(mask<0 || mask > 32)

 {

 alert("子网掩码不正确!");

 return;

 }

 }

 /***

 IPV4转IPV6的方法很简单

 1、先将其每段转为16进制

 2、不足两位的前面添加0

 3、V4一共会产生4个16进制数字,比前两个和后两个分别组合

 4、地址前面加上"0000:0000:0000:0000:0000:ffff:"即可

 **/

 var sixtemp = "";

 var fouraddrs = fouraddr.split(".");

 for (var i=0; i<fouraddrs.length; i++)

 {

 var addr4ip = parseInt(fouraddrs[i], 10);

 var addrtemp = addr4ip.toString(16);

 if(addrtemp.length==1)

 {

 addrtemp = "0" + addrtemp;

 }

 sixtemp += addrtemp;

 if(i==1)

 {

 sixtemp += ":";

 }

 }

 //以上产生V6地址段正确

 sixtemp = "0000:0000:0000:0000:0000:ffff:" + sixtemp;

 /***

 下面处理子网掩码,子网掩码可以有两种写法,数字或者255.255.255.0写法

 1、第一种处理比较简单,只需此数值加96(128-32)即可

 2、第二种需要分为四段,每段转为2进制,看哪一位最开始变为0

 **/

 var masktemp = 96;

 if(fourmask.indexOf(".")==-1)

 {

 masktemp += parseInt(fourmask);

 }

 else

 {

 var masks = fourmask.split(".");

 for ( var i=0; i<masks.length; i++)

 {

 var mask4ip = parseInt(masks[i], 10);

 var mask4temp = mask4ip.toString(2);

 if(mask4temp.length!=8)

 {

 for(var j=0;j<8-mask4temp;j++)

 {

  mask4temp = "0"+mask4temp;

 }

 }

 //下面判断位置

 var flagtemp = false;

 for(var j=0;j<8;j++)

 {

 if(mask4temp.charAt(j)=='0')

 {

  flagtemp = true;

  masktemp += i*8 + j;

  break;

 }

 if(j==7&&i==3)

 {

  flagtemp = true;

  masktemp = 128;

  break;

 }

 }

 if(flagtemp)

 {

 break;

 }

 }

 }

 return sixtemp + "/" + masktemp;

}

function four2sixip(fouraddr)//IPV4转IPV6,只转地址

{

 var reg = fouraddr.match(/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/);

 if(reg==null)

 {

 alert("IP地址不正确!");

 return;

 }

 var sixtemp = "";

 var fouraddrs = fouraddr.split(".");

 for (var i=0; i<fouraddrs.length; i++)

 {

 var addr4ip = parseInt(fouraddrs[i], 10);

 var addrtemp = addr4ip.toString(16);

 if(addrtemp.length==1)

 {

 addrtemp = "0" + addrtemp;

 }

 sixtemp += addrtemp;

 if(i==1)

 {

 sixtemp += ":";

 }

 }

 //以上产生V6地址段正确

 sixtemp = "0000:0000:0000:0000:0000:ffff:" + sixtemp;

 return sixtemp;

}

当然在上面的方法中包含了,对IPV4地址和掩码的正则判断,支持掩码以255.255.255.0的形式以及/32的形式两种。

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map