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技巧来提高你的代码(个人觉得那个jquery的手册很不错)
Feb 10 Javascript
Javascript处理DOM元素事件实现代码
May 23 Javascript
中文字符串截取的js函数代码
Apr 17 Javascript
让复选框只能选择一项的方法
Oct 08 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
jquery 仿锚点跳转到页面指定位置的实例
Feb 14 Javascript
实现一个完整的Node.js RESTful API的示例
Sep 29 Javascript
Angular6 正则表达式允许输入部分中文字符
Sep 10 Javascript
如何制作一个Node命令行图像识别工具
Dec 12 Javascript
3分钟了解vue数据劫持的原理实现
May 01 Javascript
Vue.js递归组件实现组织架构树和选人功能
Jul 04 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
Oct 16 Javascript
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打印输出棋盘的实现方法
2014/12/23 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
Javascript - HTML的request类
2007/01/09 Javascript
JavaScript效率调优经验
2009/06/04 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
jquery限定文本框只能输入数字(整数和小数)
2016/01/08 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
js获取浏览器地址(获取第1个斜杠后的内容)
2019/09/03 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
WxPython建立批量录入框窗口
2019/02/27 Python
提升Python程序性能的7个习惯
2019/04/14 Python
python实现接口并发测试脚本
2019/06/25 Python
深入了解Python iter() 方法的用法
2019/07/11 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
python爬取代理IP并进行有效的IP测试实现
2020/10/09 Python
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
澳大利亚和新西兰最大的在线旅行社之一:Aunt Betty
2019/08/07 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
TCP/IP的分层模型
2013/10/27 面试题
信息管理专业推荐信
2013/10/29 职场文书
工商管理系学生的自我评价分享
2013/11/29 职场文书
优秀演讲稿范文
2013/12/29 职场文书
《美丽的黄昏》教学反思
2014/02/28 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
2015年服务员工作总结
2015/04/08 职场文书
工作证明书
2015/06/15 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
python实现层次聚类的方法
2021/11/01 Python
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js