VLSM CIDR Subnet Calculator by w0n9O30j

VIEWS: 644 PAGES: 25

									                                                                                                                  1

                                    VLSM CIDR Subnet Calculator
เกี่ยวกับโปรแกรม
 Variable Length Subnet Masks - VLSMs
          Variable Length Subnet Masks - VLSMs คือ ความสามารถที่ใช้ ในการกาหนด subnet
mask ที่แตกต่างกันให้ แต่ละ subnet หรื อพูดง่ายๆก็คือ การทา Subnet ภายใน Subnet
เหตุผ ลที่ ต้ อ งท า VLSM          เพื่ อ ต้ อ งการให้ เ น็ ต เวิ ร์ ก มี ข นาดพอดี กับ การใช้ ง านจริ ง ๆ ซึ่ง VLSM
                                                        ้
จะยอมให้ มีการแบ่ง subnet ได้ มากกว่า 1 ครังสาหรับแต่ละ IP Address เพื่อให้ ได้ IP Address
                     ้
ตามที่ต้องการ ทังยังเป็ นการใช้ งาน IP Address ได้ อย่างมีประสิทธิภาพและประหยัด IP Address
นอกจากนี ้ VLSM ยังช่วยให้ Router ทางานได้ เร็ วขึ ้นเนื่องจากขนาดของ Routing Table
เล็กลงอีกด้ วย
                ้
          ในขันตอนการดาเนินการออกแบบ VLSM ในเน็ตเวิร์ก จาเป็ นต้ องมี routing protocol
ที่ส่งข้ อมูล subnet        mask          กับเส้ นทางปรั บปรุ ง (RIPv2,                EIGRP, RIPv1 และ IGRP
จะไม่ทางานในเน็ตเวิร์กแบบ classless และถือว่าเป็ น classful routing protocol)
CIDR
          Classless Inter-Domain Routing (CIDR) เป็ นวิธีกาหนด Subnet Mask อี กวิธีหนึ่ง
ซึ่ง ท าได้ โ ดยการใช้ slash notation (/) แล้ ว นับ จ านวนบิ ต ที่ เ ป็ น 1 ใน Subnet Mask
และเขียนไว้ หลังเครื่ องหมาย / เช่น 192.168.1.0 คือ /24
     การแบ่ง subnet สาหรับ address ในแต่ละ class
          เมื่อเลือก subnet mask ที่จะใช้ งานได้ แล้ ว จะสามารถคานวณค่าต่างๆ ได้ ดงนี ้         ั
      1) จานวน subnet มีเท่าไร? คานวณจาก 2x โดยที่ x คือ จานวนบิตที่เป็ น 1 ใน subnet mask
      2) จานวน host มีเท่าไร? คานวณจาก 2y- 2 โดยที่ y คือ จานวนบิตที่เป็ น 0 ใน subnet mask
      3) หมายเลข subnet ที่ ใช้ งานได้ มีอะไรบ้ าง? คานวณ block จาก 256 – หมายเลข subnet
จะได้ ขนาดของ block ซึ่งนาไปทาการบวกเพิ่มจาก 0 เรื่ อยๆ จนถึงหมายเลข subnet จะได้ หมายเลข
subnet ที่ใช้ ได้
      4) Broadcast Address? คือหมายเลข address ที่ใช้ ได้ ก่อนหมายเลข subnet ถัดไป
      5) Host Address ที่ใช้ ได้ ในแต่ละ subnet? คือหมายเลข address ที่อยู่ระหว่าง Subnet Address
และ Broadcast Address

การทางานของโปรแกรม VLSM CIDR Subnet Calculator ประกอบด้ วย 2 ไฟล์ คือ
                                                                                            2

   1. ไฟล์แรกคือไฟล์ vlsm1.php ทาหน้ าที่แสดงหน้ าการรับค่า major network คือค่า network/mask
   และมีการรับค่า Subnet ที่ต้องการ โดยไฟล์นี ้จะรับค่าและส่งค่าไปยังไฟล์ vlsm2.php
   เพื่อทางานต่อไป
   2.ไฟล์ที่สองคือไฟล์ vlsm2.php ทาหน้ าที่ในการคานวณ จากการรับค่า subnet
     ่
   ซึงมีการคานวณหาขนาด Allocated size IP Address เริ่มต้ น ค่า Mask ค่า Dec Mask
   และขนาดของ Assignable range

   อธิบายฟั งก์ ช่ ันที่สาคัญในการทางานของโปรแกรม VLSM CIDR Subnet Calculator

   ไฟล์ vlsm1.php




หมายเลข 1 เป็ นช่องรับหมายเลข IP และรับค่าของ mask ที่ต้องการ เช่น 192.168.1.0/24
192.168.1.0 คือ IP Address
/24          คือ mask ที่ต้องการ
        ค่าของ mask ที่ต้องการ ต้ องไม่เกิน 32 จากตัวอย่างคือ /24 หมายถึง
จานวนบิตที่ใช้ ในการบอกถึงเครื อข่ายหลัก และส่วนที่ใช้ งานได้ คืออีก 8 บิตที่เหลือ
  ่
ซึงจะถูกนาไปคานวณเพื่อหาจานวนเครื่ องที่สามารถมีได้ ในเครื อข่าย

<input style="width:100%;" type="text" name="marjor_net" value="<? echo
$_POST['marjor_net'];?>" tabindex="1">
อธิบายการทางาน
                                                                                                3

                                                                       ั่
         เป็ นการรับค่าจาก กล่องข้ อความ <input style = …. > และฟั งก์ชน $_POST['marjor_net']
                               ่                   ้
จะถูกใช้ ในการรับ-ส่งค่า ที่อยูในกล่องรับข้ อความทังหมด

หมายเลข 2 เป็ นส่วนที่ใช้ กาหนดจานวน subnet หรื อเครื อข่ายย่อยที่ต้องการจาก
เมื่อเปลี่ยนตัวเลขในช่องแล้ วกดปุ่ ม chang
      <td colspan="2">Number of subnets: <input type="text" name="numsubnet"
      value="<?=$nosubnet;?>" maxlength="3" size="3" onKeyPress="submIfEnter(form,event);"
      tabindex="14">
                <input type="submit" name="chan" value="Change" onClick="change()">
อธิบายการทางาน
                                                          ั
          เป็ นส่วนที่ใช้ รับค่าของจานวนเครื อข่ายย่อย มีตวแปร $nosubnet เป็ นตัวรับค่า
                                                      ุ่
กาหนดขนาดสูงสุดไม่เกิน 3 ตัวเลขและเมื่อคลิกที่ปมจะไปทาที่ function change()
  ่       ั่
ซึงฟั งก์ชนนี ้จะทาการเรี ยกไฟล์ vlsm1.php และส่งค่าตัวแปร $nosubnet

         หมายเลข 3 ในส่วนนี ้จะรับค่าจากตัวแปร$nosubnet ที่ได้ จากหมายเลข 2
  ่
ซึงจะเป็ นการสร้ างช่องรับค่าของจานวนเครื อข่ายย่อย
    <?
    $c='A'; //กาหนดชื่อ subnet
    if($_POST['numsubnet']=="")
     $nosubnet=4;
    else $nosubnet=$_POST['numsubnet'];
    for($i=0;$i<$nosubnet;$i++){ //วนลูปรับขนาด subnet
    $val=$_POST["sizesub_$i"];
    echo "<tr>";
    echo "<td> <input type='text' name=subName_$i value=$c></td>";
    echo "<td> <input type='text' name=sizesub_$i value=$val></td>";
    echo "</tr>";
    $c++;
    }
    ?>
                                                                                                            4

อธิบายการทางาน
                                                                                      ้
        ในส่ วนนี้จะเป็ นการทางานในส่ วนของการแสดงการรับค่า subnet ขนาดของ subnet ที่ตองการ
มีการแสดงชื่อเริ่ มต้นของ subnet เป็ นตัวอักษรภาษาอังกฤษเรี ยงตามจานวนของ subnet
มีการกาหนดการแบ่ง subnet เริ่ มต้น 4 ครั้ง ในกรณี ที่มีการเปลี่ยนแปลงการแบ่ง subnet
                               ้
ก็จะมีการวนลูปรับค่าขนาดที่ตองการเพื่อทาการสร้างช่องรับค่า subnet
                                 ้
และมีการแสดงชื่อตามขนาดที่ตองการเริ่ มต้นไว้ให้ ชื่ อสามารถเปลี่ยนแปลงได้
และในส่ วนนี้ก็มีการส่ งค่าของ subnet ในฟังก์ชน $_POST['numsubnet']
                                              ั่

หมายเลข 4 เป็ นส่วนสุดท้ ายในหน้ ารับข้ อมูล ในปุ่ ม summit
                        ้
ปุ่ มนี ้จะทาการส่งค่าทังหมดที่รับมาในหน้ านี ้ เมื่อกดปุ่ มจะไปทาที่ function submit()
  ่         ั่
ซึงฟั งก์ชนนี ้จะทาการเรี ยกไฟล์ vlsm2.php เพื่อทาการคานวณหาเครื อข่ายย่อยต่อไป

    ไฟล์ vlsm2.php
    เมื่อได้ รับค่าจากไฟล์ vlsm1.php ไฟล์ vlsm2.php ก็จะเริ่มทางานโดย
1. check error เช็คค่ าที่ส่งมา

    <?
           $marjor_net = $_POST['marjor_net'];
           $numsubnet = $_POST['numsubnet'];

    //check error
          if (! ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}\.([0-9]{1,3}))/([0-9]{1,2})",$marjor_net)){
             echo "<div align=center ><font color=red ><b>Invalid Major
    Net</b></font></div><br>";
             echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
             exit;
          }
    //check ขนาดของ major net
          $check_marjor = explode(".",$marjor_net);
          if($check_marjor[0] > 255 || $check_marjor[1] > 255 || $check_marjor[2] > 255 ||
    $check_marjor[3] > 255 ){
                                                                                                    5

            echo "<div align=center ><font color=red ><b>Invalid Major Net out of max
   255</b></font></div><br>";
            echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
            exit;
         }
   // check ขนาดของ major net mask
      $checkSize = explode("/",$marjor_net);
         if($checkSize[1]<=0 || $checkSize[1]>=32){
            echo "<div align=center ><font color=red ><b>Invalid CIDR must be 1 -
   31</b></font></div>";
            echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
            exit ;
         }
   ?>

อธิบายการทางาน
                                                         ่
      ในส่วนนี ้จะเป็ นการเช็คความถูกต้ องของการใส่คาที่รับมาจากไฟล์ vlsm1.php มีการเช็คค่า major
network คือค่า IP address และค่า mask กาหนดให้ มีการรับค่าเป็ นตัวเลข 0-9 จานวน 1-3 ตัว
                            ่
ในแต่ละหลักก่อนจุดซึงให้ มี 4 หลัก และหลัง slash notation (/) ก็ต้องเป็ นตัวเลข 0-9 จานวน 1-2 ตัว
ถ้ าไม่ใช่ในที่นี ้ก็ให้ แสดง Invalid Major และให้ กลับไปแก้ ไขค่าใหม่
        มีการ check ขนาดของ major net โดยค่าแต่ละหลักต้ องน้ อยกว่า 255 ถ้ ามากกว่าก็จะแสดง
Invalid Major Net out of max 255 และให้ กลับไปแก้ ไขค่าใหม่
        มีการ check ขนาดของ major net mask โดยค่าต้ องมากกว่า 0 และน้ อยกว่า 32
ถ้ าไม่ใช่ในที่นี ้ก็ให้ แสดง Invalid CIDR must be 1 – 31 และให้ กลับไปแก้ ไขค่าใหม่

// check ขนาดของ allocate
      $minusCheck = 32 - $checkSize[1];

for($i=0;$i<$numsubnet ;$i++){
       $name[$i]=$_POST["subName_$i"];
       $size[$i]=$_POST["sizesub_$i"];
                                                                                                            6

       $allocateSize[$i] = pow(2,allocated_b($size [$i]));
       $tal=$tal+$allocateSize[$i] ;
       }
if($tal>pow(2,$minusCheck))
       $head="<font color=red >Subnetting failed</font>";
else $head="<font color=blue >Subnetting Successful</font>";




อธิบายการทางาน
                           ้
             ในส่ ว นนี มี ก าร check            ขนาดของ allocated            จาก major         net     mask
                                     ้
โดยการท างานในส่ ว นนี จ ะวนลู ป รั บ ค่ า subnet แล้ วน าค่ า ไปท างานในฟั งก์ ชั่น allocated_b()
เราจะได้ ค่าที่เป็ นจานวนของ bit ของขนาด subnet กลับมา แล้ วขนาดพื ้นที่ที่จะใช้ งานจริ งจะเท่ากับ 2x
โดยที่ x              คื อ จ านวนบิ ต            น าค่ า มาเปรี ยบเที ย บกั บ      major        net     mask
                                       ้
ที่ ใ ช้ ได้ จริ งคื อ จ านวนบิ ต ทั ง หมดลบจากจ านวน                   mask        (32          –      mask)
จะได้ บิต ที่ เ ป็ นพื น ที่ ที่ ส ามารถใช้ ง านได้ น า 2bit ก็ จ ะได้ จ านวนพื น ที่ ทัง หมด ถ้ าขนาด subnet
                         ้                                                        ้ ้
    ้
ทั ง หมดมากกว่ า ขนาดของ                       major      net     mask ให้ แสดง           Subnetting    failed
      ่                                              ้
ที่สวนหัวของหน้ าการแสดงผลการคานวณทังหมด แต่ถ้าน้ อยกว่าให้ แสดง Subnetting Successful

//chack ขนาดของ subnet ต้ องมีค่า
      if ($numsubnet == 0){
         echo "<div align=center ><font color=red ><b>Empty Number of subnets
</b></font></div><br>";
         echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
         exit;
      }

//check การใส่ ค่า size
      for($i=0;$i<$numsubnet;$i++){
        if($size[$i]<=0){
        echo "<div align=center ><font color=red ><b>กรุณาใส่ Size ให้ ครบและขนาดของ Size
                                                                                                             7

ต้ องมากกว่า 0</b></font></div><br>";
        echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
        exit;
        }
        }

อธิบายการทางาน
                                          ่            ่
          chack ขนาดของ subnet ต้ องมีคา คือต้ องมีคาของ subnet จึงจะเกิดการทางานต่อไป
          ่
ถ้ าไม่มีคาให้ แสดง Empty Number of subnets และให้ กลับไปแก้ ไขค่าใหม่
                          ่
          check การใส่คา size ของ subnet มีการวนลูปเช็คค่าโดยค่าต้ องมากกว่า 0
ถ้ าน้ อยกว่าหรื อเท่ากับ 0 ให้ แสดงกรุณาใส่ Size ให้ ครบและขนาดของ Size ต้ องมากกว่ า 0
และให้ กลับไปแก้ ไขค่าใหม่

2. เริ่มคานวณ

// ----------------------Calculator-------------------------
//ทา ip เริ่มต้ นของเครือข่ าย
            $marjor_net = explode("/",$marjor_net );
            $IP = explode(".",$marjor_net[0]);
                                                                                      ั่
            $temp = prefixToMask($marjor_net[1]); //ส่งค่า mask ไปทาในฟั งก์ชน prefixToMask()
            $temp2 = explode(".",$temp);
            for($i=0;$i<4;$i++){
                       $temp2[$i] = $temp2[$i]& decbin($IP[$i]); //นามา and เพื่อหาค่าIP address
            }
            for($i=0;$i<4;$i++){
                                 $network= $network .bindec($temp2[$i]);
                                 if($i!=3){
                                            $network = $network . '.';// ได้ หมายเลข IP address เริ่ มต้ น
                                 }
            }
อธิบายการทางาน
                     ่
        เริ่ มเข้ าสูการคานวณ แยกค่า IP address /mask นา IP address แต่ละหลักมาเก็บไว้ ใน array ของตัวแปล$IP
                                  ั่                    ่
และนาค่า mask ไปทางานในฟั งก์ชน prefixToMask() จะได้ คาเลขของ mask ที่เป็ นเลขฐานสอง 32 บิต
                                                                                                                 8

         เช่น /12 =11111111.11110000.00000000.00000000 กลับมา
                 ้
         จากนันจะนาค่าที่ได้ มา &(and=เปรี ยบเทียบค่าทางตรรกศาสตร์ ) กับค่า IP address โดยทาให้ IP address
                                  ั่
เป็ นเลขฐานสองก่อนโดยใช้ ฟังก์ชน decbin() เมื่อเปรี ยบเทียบค่าเสร็ จก็นาค่ามาแปลงเป็ นเลขฐานสิบ ได้ หมายเลขของ
IP address เริ่ มต้ นของเครื อข่าย เก็บไว้ ในตัวแปร $network



//รับค่ า mask เป็ นเลขฐานสิบ เพื่อทาเป็ นเลขฐานสอง
function prefixToMask($prefix){
                    $r = '';
                    for($i=1;$i<=32;$i++){
                             if($i<=$prefix) {
                                      $r = $r . "1";
                             }else{
                                      $r = $r . "0";
                             }
                             if($i%8==0) {
                                      $dip[($i/8)-1] = $r;
                                      $r = '';
                             }
                    }
                    for($i=0;$i<4;$i++){

                            $maskbin = $maskbin .$dip[$i];
                            if($i!=3){
                                       $maskbin = $maskbin . '.';
                            }
                   }
                   return $maskbin; //ส่งค่ากลับเป็ นเลขฐานสอง 32 บิต
         }


อธิบายการทางาน
                 ั่
          ฟั งก์ชนนี ้เป็ นการแปลงเลขฐานสิบเป็ นเลขฐานสอง เพื่อนาไปคานวณหา IP address เริ่ มต้ น
                                                                       ่
โดยการทางานจะมีการวนลูป 32 รอบนา 1 มาเท่ากับจานวนของค่า mask ซึงเป็ นเลขฐานสิบที่ได้ รับมา เช่น 12 ก็จะนา 1
                                                              ้                   ่ ่ ่
มา12 ตัวที่เหลือก็จะเป็ น 0 กลายเป็ นเลขฐานสอง 32 บิต จากนันก็จะทาการแยกออกเป็ นสีกลุม กลุมละ 8 ตัว
    ุ               ่          ่
ใส่จดให้ แต่ละกลุมยกเว้ นกลุมสุดท้ าย (12 =11111111.11110000.00000000.00000000)
                                                                                                       9


                                                   ้ ี
// รับค่ าจานวน subnet คานวณหาจานวนบิตของพืนที่ท่ ใช้ งานจริง
           function allocated_b($local){
           $i=0;
           while(1){
                     $allocated=(pow(2,$i) - 2);
                     if($local<=$allocated )break;
                     $i++;
           }
           return $i;
           }
อธิบายการทางาน

              ั่
       ฟั งก์ชนนี ้เป็ นการหาจานวนบิตของ subnet เพื่อนาไปคานวณหาพื ้นที่ที่ใช้ จริง (Allocated Size)
โดยการทางานจะเปรี ยบเทียบค่าของ subnet ที่ต้องการกับค่าของ 2i -2 วนเพิ่มค่า i จนกว่าค่าของ
                                                                      ่
subnet จะน้ อยกว่าหรื อเท่ากับ ค่าของ i ก็จะเป็ นจานวนบิตของ subnet นันเอง

// Assignable Range

function Addr($Nlast,$Nnew){

                $temp = explode(".",$Nlast);

                $temp2[3] = ($temp[3]+$Nnew)%256;

                $tod = ($temp[3]+$Nnew)/256;

                for($i=2;$i>=0;$i--){

                         $temp2[$i] = ($temp[$i]+$tod)%256;

                                  $tod = ($temp[$i]+$tod)/256;

                }

                $Addr_range = $temp2[0].".".+$temp2[1].".".+$temp2[2].".".$temp2[3];

                return $Addr_range;

        }
                                                                                                10

อธิบายการทางาน

                  ั่
           ฟั งก์ชนนี ้เป็ นการหาค่า Assignable Range คือ IP address เริ่มต้ นและ IP
addressสุดท้ ายที่ใช้ งานได้ จริงจากการทา subnet โดยการทางานจะนาค่า IP address
เริ่มต้ นแยกเป็ นสี่หลัก นาหลักสุดท้ ายมาคิดก่อน โดยนามาบวกกับค่าที่รับมาจากตัวแปล $Nnew (ถ้ าเป็ น
IP address เริ่มต้ น $Nnew =1 แต่ถ้าเป็ น IP addresss สุดท้ าย $Nnew = ขนาดของ Allocated Size
                     ่
ของ subnet นัน) แล้ วนามา mod(หารเอาเศษ)ด้ วย 256 ได้ IP address หลักสุดท้ าย ในแต่ละหลักของ
IP address ค่าต้ องไม่เกิน 256 ถ้ าค่าเกินจะทดไปยังหลักก่อนหน้ า โดยการทางานจะนา IP address
แต่ละหลักมาบวกกับค่าที่รับมาจากตัวแปล $Nnew และหารด้ วย 256
         ่
จะได้ คาที่จะนาไปทดในหลักก่อนหน้ า ค่าของ IP address หลักที่ 1-3 จะคิดโดย
นาค่าของหลักบวกด้ วยค่าทดและ modด้ วย 256 จะได้ คาของหลัก่
แล้ วจะต้ องนาค่าของหลักที่หาได้ ไปหาค่าที่จะนาไปทดในหลักต่อไปด้ วย

3. code เรี ยกใช้ ฟังก์ ชันคานวณ

          <?
// start calculator
          $temp=$network; //รับ ip address เริ่ มต้ น
          for($i=0;$i<$numsubnet ;$i++){
                                                                            ั่
                    $local=pow(2,allocated_b($size [$i]))-2; //เรี ยกฟั งก์ชน allocated_b()
                                                                       ั่
                    $mask = 32-allocated_b($size [$i]); //เรี ยกฟั งก์ชน allocated_b()
                                                                   ั่
                    $dec = prefixToMask2($mask); //เรี ยกฟั งก์ชน prefixToMask2()
                                                                                    ั่
                    $range = Addr($temp,1)."-".Addr($temp,$local); //เรี ยกฟั งก์ชน Addr()

                  echo "<tr>//แสดงผล
                  <td><center>$name[$i]</center></td>
                  <td><center>$size[$i]</center></td>
                  <td><center>$local</center></td>
                  <td><center>$temp</center></td>
                  <td><center>/$mask</center></td>
                  <td><center>$dec</center></td>
                  <td><center>$range</center></td>
                  </tr>";
                                                                                                   11

//set IP ตัวถัดไป
                    $temp = Addr($temp,$local+2);//การบวกค่า Subnet Address และ Broadcast Address

         }
?>


อธิบายการทางาน
                                         ั่                                  ้
        ในส่วนนี ้จะทาการเรี ยกใช้ ฟังก์ชนเพื่อคานวณและแสดงผลการทางานทังหมดของโปรแกรม
โดยการทางานจะวนลูปทางานจากจานวนเครื อข่ายย่อยที่ต้องการ มีการเรี ยกใช้ ฟังก์ชนดังนี ้  ั่
               ั่
        ฟั งก์ชน allocated_b() จะส่งจานวนของบิตของพื ้นที่ที่ใช้ จริงของการแบ่ง subnet กลับมา เมื่อนา
2มาเป็ นตัวยกกาลังบิตที่ได้ มาและลบออก 2 คือลบค่าของ Subnet Address และ Broadcast Address
                                                  ้
จะได้ Allocated Size ของการแบ่งเครื อข่ายนัน โดยเก็บในตัวแปร $local เช่น
ถ้ าจานวนเครื อข่ายที่ต้องการคือ 5 จานวนบิตที่ได้ มาจากฟั งก์ชนก็จะเป็ น 3 จะได้ วา 23-2 = 6 คือค่าของ
                                                                     ั่              ่
Allocated Size
                       ั่
         และในฟั งก์ชน allocated_b() ก็ทาการนาจานวนบิตที่ได้ มาเป็ นตัวลบของ 32 คือ 32 –
                            ่                                 ้
จานวนบิตที่ได้ มา จะได้ คาของ mask ของการแบ่งเครื อข่ายนันโดยเก็บค่าไว้ ในตัวแปร$mask เช่น เช่น
                                                                  ั่               ่
ถ้ าจานวนเครื อข่ายที่ต้องการคือ 5 จานวนบิตที่ได้ มาจากฟั งก์ชนก็จะเป็ น 3 จะได้ วา 32-3 = 29 ค่าของ
mask ก็จะเป็ น /29
                  ั่                                            ่
        ฟั งก์ชน prefixToMask2() จะรับค่าจากตัวแปร$mask ซึงเป็ นเลขฐานสิบ
           ั่
ในฟั งก์ชนนี ้จะทาเป็ นเป็ นเลขฐานสองจานวน 32
                     ้                          ่
บิตก่อนจากนันก็จะทากลับเป็ นเลขฐานสองซึงก็จะเป็ นหมาขเลขของ Dec Mask เช่น $mask เก็บค่า 24
                                11111111.11111111.11111111.00000000
      ้
จากนันก็จะทาเป็ นเลขฐานสอบ คือ 255.255.255.0
     ฟั งก์ชน Addr() จะส่งค่าของ IP address เริ่มต้ นในการแบ่งเครื อข่ายไปและทาการรับค่าของ IP
             ั่
address เริ่มต้ นที่ใช้ งานได้ จริงและค่า IP address สุดท้ ายที่ใช้ ได้ ในการแบ่งเครื อข่ายย่อย
                                 ้
     ในการแบ่ง subnet ครังต่อไปค่าของIP address เริ่มต้ นที่ใช้ งานได้ จริง จะทาการบวกค่า Subnet
Address และ Broadcast Address เข้ าไปก่อน
                 $temp = Addr($temp,$local+2);
                                                                                            12




                รู ป ผลการทางานของโปรแกรม VLSM CIDR Subnet Calculator
     4. code โปรแกรม
ไฟล์ vlsm1.php
<html>
<head>
<script language="javascript">

function Submit(){
        document.form1.action="vlsm2.php";
      }

function change(){
       document.form1.action="vlsm1.php";
}
</script>

<title>VLSM CIDR Subnet Calculator</title></head>
<body>
<center>
<div align="center" style="color:deeppink"><h2>VLSM (CIDR) Subnet Calculator</h2>

Variable Length Subnet Masking is a technique that allows network administrators to divide an
                                                                                           13

IP address space to subnets of different sizes, unlike simple same-size subnetting. <br>
<a href="http://en.wikipedia.org/wiki/VLSM" target="_blank">Learn more about VLSM</a><br>



VLSM Subnet Calculator is intend for automate and simplify VLSM calculation process.
<br><br>
<p style="font-size:10pt"><b>How to use:</b> Enter major network address and mask in slash-
format, like 192.168.1.0/24<br>
      Enter sizes (number of assignable ip addresses) of subnets to divide major network. You
can specify subnetwork names instead of default.<br>
      You can change number of subnets at any time.
      <br>

      <span style="color:darkblue;font-weight:bold">*New:</span> References
      </p>



</div>
      <p align="center">
</center>
<form id="form1" name="form1" action="" method="POST" >
      <table width="500" align="center" border="1" bgcolor="pink" style="border:solid">

      <tr>
      <td>Major network</td>
      <td>

    <input style="width:100%;" type="text" name="marjor_net" value="<? echo
$_POST['marjor_net'];?>" tabindex="1">
    </td>
    </tr>
                                                                                       14



     <tr>
     <td>Subnets</td>
     <td>

     <table>

     <tr>
     <td>Name</td>
     <td>Size</td>
     </tr>
<?
$c='A';
if($_POST['numsubnet']=="")
 $nosubnet=4;
else $nosubnet=$_POST['numsubnet'];
for($i=0;$i<$nosubnet;$i++){
$val=$_POST["sizesub_$i"];
echo "<tr>";
echo "<td> <input type='text' name=subName_$i value=$c></td>";
echo "<td> <input type='text' name=sizesub_$i value=$val></td>";
echo "</tr>";
$c++;
}
?>

      <tr>
      <td colspan="2">Number of subnets: <input type="text" name="numsubnet"
value="<?=$nosubnet;?>" maxlength="3" size="3" onKeyPress="submIfEnter(form,event);"
tabindex="14">
      <input type="submit" name="chan" value="Change" onClick="change()">
                                                                                         15



     </td>
     </tr>

     <tr>
     <td colspan="2">
      Sort results by:
      <select name="sort" tabindex="16">
              <option value="no">Do not sort</option>
              <option value="name">name</option>
              <option selected value="size">size</option>
      </select>
     </td>
     </tr>
     </table>

     </td>
     </tr>

      <tr>
      <td colspan="2" align="center">
      <input type="submit" name="subm" value="Submit" style="font-weight:bold;width:120px"
onClick="Submit()"></td>
      </tr>

     </table>
     </form>
</body>
</html>

ไฟล์ vlsm2.php
                                                                                                        16

<!DOCTYPE        html     PUBLIC       "-//W3C//DTD        XHTML    1.0     Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-874" />
<title>VLSM CIDR Subnet Calculator</title>

<?
      $marjor_net = $_POST['marjor_net'];
      $numsubnet = $_POST['numsubnet'];

//check error
      if (! ereg("([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}\.([0-9]{1,3}))/([0-9]{1,2})",$marjor_net)){
         echo        "<div       align=center        ><font        color=red        ><b>Invalid       Major
Net</b></font></div><br>";
         echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
         exit;
      }
//check ขนาดของ major net
      $check_marjor = explode(".",$marjor_net);
      if($check_marjor[0] > 255 || $check_marjor[1] > 255 || $check_marjor[2] > 255 ||
$check_marjor[3] > 255 ){
         echo "<div align=center ><font color=red ><b>Invalid Major Net out of max
255</b></font></div><br>";
         echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
         exit;
      }
// check ขนาดของ major net mask
   $checkSize = explode("/",$marjor_net);
      if($checkSize[1]<=0 || $checkSize[1]>=32){
         echo "<div align=center ><font color=red ><b>Invalid CIDR must be 1 -
                                                                                       17

31</b></font></div>";
       echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
       exit ;
     }

// check ขนาดของ allocate
      $minusCheck = 32 - $checkSize[1];

for($i=0;$i<$numsubnet ;$i++){
       $name[$i]=$_POST["subName_$i"];
       $size[$i]=$_POST["sizesub_$i"];
       $allocateSize[$i] = pow(2,allocated_b($size [$i]));
       $tal=$tal+$allocateSize[$i] ;
       }
if($tal>pow(2,$minusCheck))
       $head="<font color=red >Subnetting failed</font>";
else $head="<font color=blue >Subnetting Successful</font>";

//chack ขนาดของ subnet ต้ องมีคา่
      if ($numsubnet == 0){
         echo "<div align=center ><font color=red ><b>Empty Number of subnets
</b></font></div><br>";
         echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
         exit;
      }

                  ่
//check การใส่คา size
       for($i=0;$i<$numsubnet;$i++){
         if($size[$i]<=0){
         echo "<div align=center ><font color=red ><b>กรุณาใส่ Size ให้ ครบและขนาดของ Size
ต้ องมากกว่า 0</b></font></div><br>";
                                                                                   18

           echo "<center><a href = javascript:history.go(-1)>Back</a></center>";
           exit;
           }
         }
// ----------------------Calculator-------------------------

       function prefixToMask($prefix){
         $r = '';
         for($i=1;$i<=32;$i++){
                  if($i<=$prefix) {
                          $r = $r . "1";
                  }else{
                          $r = $r . "0";
                  }
                  if($i%8==0) {
                          $dip[($i/8)-1] = $r;
                          $r = '';
                  }
         }
         for($i=0;$i<4;$i++){

                   $maskbin = $maskbin .$dip[$i];
                   if($i!=3){
                            $maskbin = $maskbin . '.';
                   }
           }
           return $maskbin;
       }



       function prefixToMask2($prefix){
                                                           19

          $r = '';
          for($i=1;$i<=32;$i++){
                   if($i<=$prefix) {
                           $r = $r . "1";
                   }else{
                           $r = $r . "0";
                   }
                   if($i%8==0) {
                           $dip[($i/8)-1] = $r;
                           $r = '';
                   }
          }
          for($i=0;$i<4;$i++){

                  $maskbin = $maskbin .bindec($dip[$i]);
                  if($i!=3){
                           $maskbin = $maskbin . '.';
                  }
          }
          return $maskbin;
      }

// Allocated Bit Size
       function allocated_b($local){
       $i=0;
       while(1){
         $allocated=(pow(2,$i) - 2);
         if($local<=$allocated )break;
         $i++;
       }
       return $i;
                                                                              20

      }
      function Addr($Nlast,$Nnew){
        $temp = explode(".",$Nlast);
        $temp2[3] = ($temp[3]+$Nnew)%256;
        $tod = ($temp[3]+$Nnew)/256;

       for($i=2;$i>=0;$i--){
               $temp2[$i] = ($temp[$i]+$tod)%256;

                       $tod = ($temp[$i]+$tod)/256;

       }
       $Addr_range = $temp2[0].".".+$temp2[1].".".+$temp2[2].".".$temp2[3];
       return $Addr_range;
       }
//ทา ip เริ่มต้ นของเครื อข่าย
       $marjor_net = explode("/",$marjor_net );
       $IP = explode(".",$marjor_net[0]);

//sort size and name
       array_multisort($size,SORT_DESC,$name);

      $temp = prefixToMask($marjor_net[1]);
      $temp2 = explode(".",$temp);
      for($i=0;$i<4;$i++){
        $temp2[$i] = $temp2[$i]& decbin($IP[$i]);
      }
      for($i=0;$i<4;$i++){

               $network= $network .bindec($temp2[$i]);
               if($i!=3){
                                                                                                21

                       $network = $network . '.';
               }
      }
?>

</head>
<body><h1></h1>
<div align="center" style="color:deeppink"><h2><?=$head;?></h2>
       <p align="center">
    Major      Network:        <span       style="color:blue;font-weight:bold"><?=$network;echo
"/".$checkSize[1];?></span><br>
       Number       of     IP      addresses      needed:        <span      style="color:blue;font-
weight:bold"><?=array_sum($size);?></span><br>
       Available IP addresses in major network: <span style="color:blue;font-
weight:bold"><?=pow(2,$minusCheck)-2;?></span><br>
       Available IP addresses in subnetted network: <span style="color:blue;font-
weight:bold"><?=array_sum($allocateSize);?></span><br>
       About                            <span                               style="color:blue;font-
weight:bold"><?=round(array_sum($size)/(pow(2,$minusCheck)-2)*100);?>%</span>                    of
available major network address space is used<br>

      About                            <span                          style="color:blue;font-
weight:bold"><?=round(array_sum($size)/array_sum($allocateSize)*100);?>%</span>            of
subnetted network address space is used<br>
 </div>
<table width="1048" border="1" bgcolor="lightcyan" align="center" style="border:solid"
cellpadding="1" cellspacing="1">
 <tr bgcolor="pink">
   <td width="120" align="center"><b>Subnet Name</b></td>
   <td width="120" align="center"><b>Needed Size</b></td>
   <td width="120" align="center"><b>Allocated Size</b></td>
                                                                22

  <td width="150" align="center"><b>Address</b></td>
  <td width="50" align="center"><b>Mask</b></td>
  <td width="150" align="center"><b>Dec Mask</b></td>
  <td width="300" align="center"><b>Assignable Range</b></td>
 </tr>

        <?
// start calculator
        $temp=$network;
        for($i=0;$i<$numsubnet ;$i++){
          $local=pow(2,allocated_b($size [$i]))-2;
          $mask = 32-allocated_b($size [$i]);
          $dec = prefixToMask2($mask);
          $range = Addr($temp,1)."-".Addr($temp,$local);

          echo "<tr>
          <td><center>$name[$i]</center></td>
          <td><center>$size[$i]</center></td>
          <td><center>$local</center></td>
          <td><center>$temp</center></td>
          <td><center>/$mask</center></td>
          <td><center>$dec</center></td>
          <td><center>$range</center></td>
          </tr>";

//set IP ตัวถัดไป
         $temp = Addr($temp,$local+2);

      }
?>
                                                                                      23

</table>
<br />
<center>
 <a href="javascript:history.go(-1)">back       to   form</a>   <a   href="vlsm1.php">New
calculation</a>
</center>
</body>
</html>



5. การทดลองใช้ งานโปรแกรม
สามารถเข้ าทดลองการทางานของโปรแกรมจริงได้ ที่
www.angsila.cs.buu.ac.th/~50036153/VLSM
                                                                                                  24




                                             บรรณานุกรม


Novgorod State University (2009) [online]. Available: http://www.vlsm-calc.net/
(Access date : 11/08/2009)
Mr.Jodoi (2009) [online]. Available: http://www.jodoi.com/
(Access date : 11/08/2009)
The PHP Group (2009) [online]. Available: http://www.php.net/
(Access date : 11/08/2009)
wikipredia (2009) [online]. Available: http://th.wikipedia.org/wiki/Network_address_translation
(Access date : 11/08/2009)
calvyn (2008) [online]. Available: http://www.icalvyn.com/th/calculate-subnet-mask-and-vlsm/
(Access date : 11/08/2009)
25

								
To top