JavaScript獲取IP獲取的是IPV6 如何校驗

字號:


    1、什么是IPV6?
    這個問題可以去百度或Google找一下,應(yīng)該會有很大的收獲,其實主要就是為了解決IPV4地址不夠用的問題,V4地址是32位,即:192.168.1.1,而V6地址則是128位,比V4擴大了太多倍。
    2、IPV6有子網(wǎng)掩碼嗎?
    可以說有,也可以說沒有,說有呢,是因為在IPV6中有前綴的說法,它相當(dāng)于IPV4中的子網(wǎng)掩碼,只是名稱不相同了;說沒有呢,也可以,因為IPV6的地址實在是太大了,號稱可以給地球上每個沙子一個地址,這樣就淡化了子網(wǎng)的概念,不需要了。
    3、IPV6的地址
    IPV6地址寫法在網(wǎng)上也可以查到很多很多,我就不詳細列了,一般如下:1205::fff0:ffd1:1021/120,后面的120就是代表了前綴,相當(dāng)于IPV4中的子網(wǎng)掩碼。
    4、IP地址的計算方式
    IPV6和IPV4的網(wǎng)段計算方式一樣,對于IPV4而言,如192.168.1.1/255.255.255.0,那么它的網(wǎng)段是從192.168.1.0~192.168.1.255,這個是怎么計算出來的呢?根據(jù)ISP的規(guī)定,它的起始地址為:此IP地址和子網(wǎng)掩碼按位與運算求得;它的終止地址為:此IP地址和子網(wǎng)掩碼的取反(不包含符號位)按位或運算求得。
    IPV6也和IPV4在原理上是一樣的,因為IPV6前綴太長了,所以根本無法用255.255.255.0的形式表達出來,因此通常直接寫數(shù)字,如120或128等。120代表此前綴的前120位都是1,后面的則是0,這個前綴就相當(dāng)于IPV4中的子網(wǎng)掩碼,計算IPV6地址和IPV4一樣。
    上面已經(jīng)將IPV6的簡要知識說明了一下,下面來處理下IPV6網(wǎng)址。
    IPV6的網(wǎng)址寫法上需要兼容零壓縮法,因此需要對IPV6的網(wǎng)址進行轉(zhuǎn)換,下面是JS的轉(zhuǎn)換代碼:
    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] += ":";
     }
     }
     ////上述補齊完成,將內(nèi)容放置于ipaddrs中,但不標(biāo)準(zhǔn)
     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的轉(zhuǎn)換:
    IPV4到IPV6網(wǎng)址的轉(zhuǎn)換很簡單,只需將IPV4地址轉(zhuǎn)為十六進制格式,以兩段為一組,然后再前面添加::ffff即可
    JS代碼如下:
    function four2six(fouraddr,fourmask)//IPV4轉(zhuǎn)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("子網(wǎng)掩碼不正確!");
     return;
     }
     }
     else
     {
     var mask = parseInt(fourmask, 10);
     if(mask<0 || mask > 32)
     {
     alert("子網(wǎng)掩碼不正確!");
     return;
     }
     }
     /***
     IPV4轉(zhuǎn)IPV6的方法很簡單
     1、先將其每段轉(zhuǎn)為16進制
     2、不足兩位的前面添加0
     3、V4一共會產(chǎn)生4個16進制數(shù)字,比前兩個和后兩個分別組合
     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 += ":";
     }
     }
     //以上產(chǎn)生V6地址段正確
     sixtemp = "0000:0000:0000:0000:0000:ffff:" + sixtemp;
     /***
     下面處理子網(wǎng)掩碼,子網(wǎng)掩碼可以有兩種寫法,數(shù)字或者255.255.255.0寫法
     1、第一種處理比較簡單,只需此數(shù)值加96(128-32)即可
     2、第二種需要分為四段,每段轉(zhuǎn)為2進制,看哪一位最開始變?yōu)?
     **/
     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轉(zhuǎn)IPV6,只轉(zhuǎn)地址
    {
     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 += ":";
     }
     }
     //以上產(chǎn)生V6地址段正確
     sixtemp = "0000:0000:0000:0000:0000:ffff:" + sixtemp;
     return sixtemp;
    }
    當(dāng)然在上面的方法中包含了,對IPV4地址和掩碼的正則判斷,支持掩碼以255.255.255.0的形式以及/32的形式兩種。