JavaScript获取IP获取的是IPV6 如何校验


Posted in Javascript onJune 12, 2016

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的形式两种。

Javascript 相关文章推荐
jQuery菜单插件superfish使用指南
Apr 21 Javascript
jquery无限级联下拉菜单简单实例演示
Nov 23 Javascript
js操作数组函数实例小结
Dec 10 Javascript
JavaScript为事件句柄绑定监听函数实例详解
Dec 15 Javascript
浅谈javascript的call()、apply()、bind()的用法
Feb 21 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
May 11 Javascript
Angular 1.x个人使用的经验小结
Jul 19 Javascript
利用ES6的Promise.all实现至少请求多长时间的实例
Aug 28 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 Javascript
webpack打包js的方法
Mar 12 Javascript
vue 过滤器filter实例详解
Mar 14 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
Jun 12 #Javascript
Javascript简写条件语句(推荐)
Jun 12 #Javascript
jQuery 3 中的新增功能汇总介绍
Jun 12 #Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 #Javascript
喜大普奔!jQuery发布 3.0 最终版
Jun 12 #Javascript
浅谈JavaScript变量的自动转换和语句
Jun 12 #Javascript
浅谈jquery点击label触发2次的问题
Jun 12 #Javascript
You might like
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
PHP实现的比较完善的购物车类
2014/12/02 PHP
php实现的简单美国商品税计算函数
2015/07/13 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
JavaScript调用客户端的可执行文件(示例代码)
2013/11/28 Javascript
深入理解JS中的变量及作用域、undefined与null
2014/03/04 Javascript
jquery单行文字向上滚动效果的实现代码
2014/09/05 Javascript
javascript数组详解
2014/10/22 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
javascript基础语法——全面理解变量和标识符
2016/06/02 Javascript
Node.js测试中的Mock文件系统详解
2016/11/21 Javascript
基于jQuery实现瀑布流页面
2017/04/11 jQuery
vue.js中过滤器的使用教程
2017/06/08 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
javascript设计模式 ? 状态模式原理与用法实例分析
2020/04/22 Javascript
python+pyqt实现右下角弹出框
2017/10/26 Python
Python之web模板应用
2017/12/26 Python
Python中反射和描述器总结
2018/09/23 Python
django 中使用DateTime常用的时间查询方式
2019/12/03 Python
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
Expedia法国:全球最大在线旅游公司
2018/09/30 全球购物
环保小标语
2014/06/13 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
企业法人代表证明书
2014/09/27 职场文书
公司员工离职证明书
2014/10/04 职场文书
一个独生女的故事观后感
2015/06/04 职场文书
会议简讯范文
2015/07/20 职场文书
MySQL EXPLAIN输出列的详细解释
2021/05/12 MySQL
如何有效防止sql注入的方法
2021/05/25 SQL Server
Android Studio 计算器开发
2022/05/20 Java/Android