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 相关文章推荐
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
Tips 带三角可关闭的文字提示
Oct 06 Javascript
jQuery中data()方法用法实例
Dec 27 Javascript
jQuery如何防止这种冒泡事件发生
Feb 27 Javascript
jQuery实现表格颜色交替显示的方法
Mar 09 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
Jul 26 Javascript
在html中引入外部js文件,并调用带参函数的方法
Oct 31 Javascript
ReactNative Image组件使用详解
Aug 07 Javascript
webpack写jquery插件的环境配置
Dec 21 jQuery
vue中的mvvm模式讲解
Jan 31 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 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基于swoole多进程操作示例
2019/08/12 PHP
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
Bootstrap网格系统详解
2016/04/26 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
基于Vue2.0的分页组件
2017/03/16 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
浅谈react受控组件与非受控组件(小结)
2018/02/09 Javascript
详解IOS微信上Vue单页面应用JSSDK签名失败解决方案
2018/11/14 Javascript
详解ES6数组方法find()、findIndex()的总结
2020/05/12 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python字符串处理之count()方法的使用
2015/05/18 Python
举例讲解Python中metaclass元类的创建与使用
2016/06/30 Python
python构建自定义回调函数详解
2017/06/20 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
2018/01/15 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
2018/08/07 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
基于多进程中APScheduler重复运行的解决方法
2019/07/22 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
python seaborn heatmap可视化相关性矩阵实例
2020/06/03 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
家长对老师的感言
2014/03/11 职场文书
公司担保书格式范文
2014/05/12 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL