NetKubeLab EN

Network Fundamental ที่อยู่และตัวตน

คำนวณซับเน็ตด้วยมือ — คำถามหกข้อที่มีคำตอบเดียว

หา Network ID, Subnet Mask, Broadcast, จำนวนโฮสต์, ช่วงโฮสต์ และวงถัดไป ด้วยวิธีคิดเดียว แล้วต่อไปถึงการแบ่งซับเน็ต การรวมเส้นทาง และ VLSM พร้อมโจทย์ห้าข้อที่กดดูเฉลยได้

· หมวด 1 · ที่อยู่และตัวตน · 16 นาที

เวลาถูกถามเรื่องซับเน็ต คำถามมักมาเป็นชุดหกข้อ — Network ID, Subnet Mask, Broadcast, จำนวนโฮสต์, ช่วงที่ใช้ได้ และวงถัดไป

คนส่วนใหญ่จึงท่องหกวิธี ทั้งที่มันเป็นคำถามเดียว

บทนี้สอนวิธีคิดที่ตอบทั้งหกข้อจากการหาอย่างเดียว คือหาว่าเส้นแบ่งอยู่ตรงไหน แล้วอ่านคำตอบออกมา ไม่ต้องท่องตาราง และพอชินแล้วจะตอบได้ในหัว

ถ้ายังไม่รู้จัก IPv4 เลย อ่านตรงนี้ก่อน

ที่อยู่ IPv4 คือ บิต 32 ตัว ที่เขียนให้คนอ่านง่ายเป็นเลขสี่ชุดคั่นจุด แต่ละชุดคือแปดบิต จึงมีค่าได้ 0 ถึง 255

  192 . 168 . 10 . 77
    8     8    8    8      bits
  ---------------------
                     32    bits in total

บิต 32 ตัวนั้นถูกแบ่งเป็นสองส่วน ส่วนหน้าบอกว่าอยู่วงไหน ส่วนหลังบอกว่า เป็นเครื่องไหนในวงนั้น และเลขหลัง / บอกว่าส่วนหน้ายาวกี่บิต

ทุกอย่างในบทนี้คือผลของเส้นแบ่งเส้นเดียวนั้น ถ้าอยากเข้าใจว่าทำไมมันถึงต้อง เป็นเส้นแบ่ง อ่าน Internet Protocol กับ IPv4 Subnet ซึ่งวางเรื่องนั้นไว้แล้ว บทนี้เป็นภาคปฏิบัติของสองบทนั้น

ให้เครื่องตอบให้ดูก่อนหนึ่งครั้ง

บนเครื่องที่ใช้เขียนบทนี้ ไม่ต้องลงอะไรเพิ่ม

$ python3
>>> import ipaddress
>>> n = ipaddress.ip_interface("192.168.10.77/26").network
>>> n
  IPv4Network('192.168.10.64/26')
>>> n.netmask
  IPv4Address('255.255.255.192')
>>> n.broadcast_address
  IPv4Address('192.168.10.127')

เครื่องตอบได้ในหนึ่งวินาที แล้วทำไมต้องคิดเอง

เพราะเวลาที่ต้องใช้จริงคือตอนยืนอยู่หน้าไวท์บอร์ด ตอนอ่านคอนฟิกของคนอื่นแล้ว ต้องรู้ทันทีว่าเลขนี้ผิดตรงไหน และตอนออกแบบว่าจะแบ่งวงยังไง — สามสถานการณ์ที่ ไม่มีใครรอให้เปิดเครื่อง

และเหตุผลที่หนักกว่านั้นคือ เครื่องตอบคำถามที่คุณพิมพ์ ไม่ได้ตอบคำถามที่คุณ ควรถาม ถ้าพิมพ์ prefix ผิดไปหนึ่ง มันก็ตอบผิดให้อย่างมั่นใจ

เลขหกตัว มาจากที่เดียวกันทั้งหมด

เส้นแบ่งเส้นเดียวบนบิต 32 ตัว ให้คำตอบทั้งหกข้อ โดยไม่มีข้อไหนต้องคิดแยก

พอรู้ว่าเส้นแบ่งอยู่ตรงไหน หกข้อนี้ตกลงมาเอง

  network id     บิตฝั่งโฮสต์เป็นศูนย์ทั้งหมด
  subnet mask    บิตฝั่งวงเป็นหนึ่ง ฝั่งโฮสต์เป็นศูนย์
  broadcast      บิตฝั่งโฮสต์เป็นหนึ่งทั้งหมด
  hosts          สองยกกำลังจำนวนบิตโฮสต์ ลบสอง
  host range     ตัวถัดจาก network id ถึงตัวก่อน broadcast
  next network   ตัวถัดจาก broadcast

ไม่มีข้อไหนเป็นสูตรแยก ทั้งหกคือการอ่านบิตฝั่งโฮสต์ด้วยค่าต่างกัน คือ ศูนย์ทั้งหมด หนึ่งทั้งหมด และที่อยู่ระหว่างนั้น

ขั้นที่ 1 — prefix บอกว่าเส้นแบ่งอยู่บิตที่เท่าไหร่

เลขหลัง / คือจำนวนบิตฝั่งวง ที่เหลือจาก 32 คือบิตฝั่งโฮสต์

  /26   ->  26 network bits  +   6 host bits  =  32
  /21   ->  21 network bits  +  11 host bits  =  32
  /30   ->  30 network bits  +   2 host bits  =  32

เอา prefix หารแปด จะได้ว่าเส้นแบ่งตกอยู่ในออกเตตที่เท่าไหร่

  26 / 8  =  3 remainder 2    ออกเตต 1-3 เต็ม เส้นตัดกลางออกเตต 4
  21 / 8  =  2 remainder 5    ออกเตต 1-2 เต็ม เส้นตัดกลางออกเตต 3
  24 / 8  =  3 exactly        เส้นตัดพอดีขอบ ไม่มีออกเตตถูกผ่า

ออกเตตที่ถูกเส้นตัดกลาง เรียกว่า ออกเตตที่น่าสนใจ และเป็นออกเตตเดียวที่ต้อง คิด อีกสามตัวลอกมาตรง ๆ

RFC 4632 ระบุข้อจำกัดของ mask ไว้ประโยคเดียว

"The only outstanding constraint is that the mask must be left contiguous."

บิตหนึ่งต้องอยู่ติดกันจากซ้าย ห้ามสลับฟันปลา ซึ่งเป็นเหตุผลที่ mask มีหน้าตา ได้แค่เก้าแบบต่อหนึ่งออกเตต ไม่ใช่ 256 แบบ

ขั้นที่ 2 — ขนาดบล็อกคือระยะห่างของเส้นแบ่ง

นี่คือขั้นที่คนสอนกันว่า "เอา 256 ลบเลข mask" แล้วเรียกมันว่าเลขมหัศจรรย์

มันไม่มหัศจรรย์เลย และเข้าใจแล้วจะไม่ลืมอีก

ยิ่งเส้นแบ่งเลื่อนไปทางขวาหนึ่งบิต บล็อกยิ่งเล็กลงครึ่งหนึ่ง และจุดเริ่มของวงยิ่งถี่ขึ้นเท่าตัว

ในออกเตตที่น่าสนใจ บิตที่เหลือให้โฮสต์ใช้มีอยู่จำนวนหนึ่ง ถ้าเหลือหกบิต ค่าที่นับได้ในออกเตตนั้นคือ 64 ค่า วงหนึ่งจึงกว้าง 64 และวงถัดไปเริ่มห่างไป 64

  host bits   mask octet   block size
          0          255            1
          1          254            2
          2          252            4
          3          248            8
          4          240           16
          5          224           32
          6          192           64
          7          128          128
          8            0          256

สังเกตคอลัมน์กลางกับคอลัมน์ขวา บวกกันได้ 256 ทุกบรรทัด ที่เป็นแบบนั้นเพราะ เลข mask คือ "นับจากศูนย์ไปกี่ค่าถึงจะขึ้นวงใหม่" นับกลับด้าน สูตร 256 - mask จึงเป็นแค่วิธีเขียนความจริงข้อเดียวกันให้สั้นลง

RFC 4632 พูดถึงข้อนี้ในเชิงออกแบบ

"prefixes may be defined to describe any power of two-sized block of between one and 2^32 end system addresses"

ทุกวงมีขนาดเป็นกำลังสองเสมอ ไม่มีวงขนาด 100 ไม่มีวงขนาด 50 ซึ่งเป็นข้อที่ ทำให้ทุกอย่างในบทนี้คำนวณได้

ตารางที่ใช้บ่อยที่สุดคือช่วง /24 ถึง /30

  prefix   subnet mask         block   usable hosts
  /24      255.255.255.0         256            254
  /25      255.255.255.128       128            126
  /26      255.255.255.192        64             62
  /27      255.255.255.224        32             30
  /28      255.255.255.240        16             14
  /29      255.255.255.248         8              6
  /30      255.255.255.252         4              2

ขั้นที่ 3 — อ่านคำตอบทั้งหกออกมา

ทำตามสามขั้นกับ 192.168.10.77/26

  step 1   26 = 24 + 2         เส้นตัดออกเตต 4 เหลือบิตโฮสต์ 6
  step 2   mask octet = 192    บล็อกกว้าง 256 - 192 = 64
  step 3   0   64   128   192  จุดเริ่มของแต่ละวงในออกเตต 4

77 อยู่ระหว่าง 64 กับ 128 จึงอยู่ในวงที่เริ่มที่ 64 และวงนั้นกว้าง 64 คือครอบตั้งแต่ 64 ถึง 127

อ่านหกข้อออกมาได้เลย

  network id     192.168.10.64
  subnet mask    255.255.255.192   (/26)
  broadcast      192.168.10.127
  hosts          2^6 - 2 = 62
  host range     192.168.10.65 - 192.168.10.126
  next network   192.168.10.128

ตรงกับที่เครื่องตอบไว้ตอนต้นบททุกตัว

จุดที่พลาดกันบ่อยที่สุดคือขั้นที่ 3 คนมักหารเลขในหัวแล้วตอบ ทั้งที่วิธีที่ พลาดยากกว่าคือไล่ทีละบล็อกจากศูนย์ 0 64 128 192 แล้วดูว่าเลขของเราตกช่องไหน สี่ครั้งก็ถึงแล้ว และไม่ต้องหารเลย

เมื่อเส้นแบ่งไม่ได้อยู่ออกเตตสุดท้าย

/21 ตัดกลางออกเตตที่สาม วิธีคิดไม่เปลี่ยนเลย เปลี่ยนแค่ว่าไปคิดที่ออกเตตไหน

  10.5.180.200/21

  step 1   21 = 16 + 5         เส้นตัดออกเตต 3 เหลือบิตโฮสต์ 11
  step 2   mask octet = 248    บล็อกกว้าง 256 - 248 = 8
  step 3   ... 168  176  184   จุดเริ่มของแต่ละวงในออกเตต 3

180 อยู่ระหว่าง 176 กับ 184 วงจึงเริ่มที่ 10.5.176.0

  network id     10.5.176.0
  subnet mask    255.255.248.0     (/21)
  broadcast      10.5.183.255
  hosts          2^11 - 2 = 2046
  host range     10.5.176.1 - 10.5.183.254
  next network   10.5.184.0

ออกเตตที่อยู่ขวาของออกเตตที่น่าสนใจ เป็นศูนย์ทั้งหมดใน network id และเป็น 255 ทั้งหมดใน broadcast เพราะบิตของมันอยู่ฝั่งโฮสต์ทั้งออกเตต

จำนวนโฮสต์คิดจากบิตโฮสต์ทั้งหมด 11 บิต ไม่ใช่แค่บิตในออกเตตที่น่าสนใจ

ทำไมต้องลบสอง และสองกรณีที่ไม่ต้องลบ

ที่ลบสองเพราะสองเลขนั้นถูกกันไว้ ไม่ใช่เพราะใช้ไม่ได้ในทางเทคนิค

  first address   เป็นชื่อของวง จึงตั้งให้เครื่องไม่ได้
  last address    เป็น broadcast ของวง จึงตั้งให้เครื่องไม่ได้

แต่มีสองกรณีที่กฎนี้ใช้ไม่ได้

/31 มีที่อยู่แค่สองตัว ถ้าลบสองจะเหลือศูนย์ RFC 3021 จึงประกาศให้ใช้ทั้งสองตัว บนลิงก์ที่มีอุปกรณ์แค่สองฝั่ง — ได้ 2 ไม่ใช่ 0

/32 มีที่อยู่ตัวเดียว ใช้เป็นเลขของตัวเอง ไม่ใช่วง จึงไม่มีอะไรให้ลบ

รายละเอียดสองกรณีนี้อยู่ในบท IPv4 Subnet แล้ว บทนี้แค่เตือนว่าอย่าเอาสูตรลบสองไปใช้กับมัน

การแบ่งซับเน็ต — ยืมบิตจากฝั่งโฮสต์

การแบ่งวงหนึ่งเป็นหลายวง คือ เลื่อนเส้นแบ่งไปทางขวา บิตที่เคยเป็นของโฮสต์ กลายเป็นของวง

เลื่อนเส้นแบ่งไปขวาหนึ่งบิต ได้วงเพิ่มเป็นสองเท่า และโฮสต์ต่อวงลดลงครึ่งหนึ่ง

โจทย์มาได้สองแบบ และทั้งสองแบบตอบด้วยกำลังสองเหมือนกัน

แบบที่หนึ่ง อยากได้กี่วง ยืม n บิต ได้ 2^n วง

  borrow 1 bit    ->    2 subnets
  borrow 2 bits   ->    4 subnets
  borrow 3 bits   ->    8 subnets
  borrow 4 bits   ->   16 subnets

แบบที่สอง อยากได้กี่โฮสต์ต่อวง เหลือ h บิต ได้ 2^h - 2 โฮสต์

  hosts needed   host bits   prefix   actually get
             2           2      /30              2
             6           3      /29              6
            12           4      /28             14
            25           5      /27             30
            50           6      /26             62
           100           7      /25            126
           200           8      /24            254

สังเกตว่าต้องปัดขึ้นเสมอ ต้องการ 25 ได้ 30 ต้องการ 100 ได้ 126 เพราะไม่มีวง ขนาดกลาง ๆ ให้เลือก

ลองแบ่ง 192.168.20.0/24 ออกเป็นสี่วง

  need 4 subnets   ->   borrow 2 bits   ->   /24 + 2 = /26
  block size       ->   256 - 192 = 64

จุดเริ่มของแต่ละวงคือ 0 64 128 192 เขียนเต็มได้ดังนี้

  192.168.20.0/26      .1     - .62      bcast .63
  192.168.20.64/26     .65    - .126     bcast .127
  192.168.20.128/26    .129   - .190     bcast .191
  192.168.20.192/26    .193   - .254     bcast .255

วงละ 62 โฮสต์ รวมสี่วงได้ 248 ที่ใช้ได้ จากเดิมวงเดียว 254

การแบ่งวงมีต้นทุน แบ่งเป็นสี่วงเสียที่อยู่ไปหกตัวให้เลขวงกับ broadcast ที่เพิ่มขึ้น ยิ่งแบ่งย่อยยิ่งเสียมาก ซึ่งเป็นเหตุผลว่าทำไมถึงไม่ควรแบ่งเผื่อไว้ เกินจำเป็น

การรวมเส้นทาง — เดินย้อนทางเดิม

Summarization หรือ route aggregation คือทำกลับกัน — เลื่อนเส้นแบ่งไปทางซ้าย เพื่อให้หลายวงกลายเป็นบรรทัดเดียวในตารางเส้นทาง

RFC 4632 บอกเหตุผลไว้ตรง ๆ

"The only commonly understood method for reducing routing state on a packet-switched network is through aggregation of information."

สี่วงที่บิตต้นเหมือนกันหมด รวมเป็นบรรทัดเดียวได้ โดยตัดที่บิตสุดท้ายที่ยังเหมือนกัน

วิธีคิดมีขั้นเดียว คือ เขียนออกเตตที่ต่างกันเป็นบิต แล้วดูว่าเหมือนกันกี่บิต จากซ้าย

ลองกับสี่วงนี้

  172.16.8.0/24     octet 3 =   8 = 00001000
  172.16.9.0/24     octet 3 =   9 = 00001001
  172.16.10.0/24    octet 3 =  10 = 00001010
  172.16.11.0/24    octet 3 =  11 = 00001011
                                    ^^^^^^
                                    same 6 bits

หกบิตแรกของออกเตตที่สามเหมือนกัน บวกกับสองออกเตตแรกที่เหมือนกันอยู่แล้ว 16 บิต รวมเป็น 22

  172.16.8.0/22    covers 172.16.8.0 - 172.16.11.255

สี่บรรทัดเหลือบรรทัดเดียว และเราเตอร์ตัวถัดไปจำน้อยลงสี่เท่า

กับดักที่ต้องระวัง

ลองเปลี่ยนเป็น 9 10 11 12 ซึ่งดูเหมือนสี่วงติดกันเหมือนเดิม

    9 = 00001001
   10 = 00001010
   11 = 00001011
   12 = 00001100
        ^^^^^
        same 5 bits only

เหลือ /21 ซึ่งคือ 172.16.8.0/21 ครอบตั้งแต่ 172.16.8.0 ถึง 172.16.15.255

  ours          9  10  11  12
  announced     8   9  10  11  12  13  14  15
  not ours      8  13  14  15

ประกาศเกินไปสี่วงที่ไม่ใช่ของเรา ถ้ามีคนอื่นถือเลขพวกนั้นอยู่จริง ทราฟฟิก ของเขาจะวิ่งมาหาเรา แล้วตายที่นี่ ซึ่งเป็นเหตุการณ์ที่บทความ BGP เล่าไว้ว่าเกิดขึ้นกับทั้งอินเทอร์เน็ต มาแล้ว

การรวมได้สนิทต้องครบสองข้อ คือ จำนวนวงต้องเป็นกำลังสอง และ วงแรกต้องเริ่ม ตรงจุดที่หารด้วยจำนวนนั้นลงตัว ชุด 8 9 10 11 ผ่านทั้งสองข้อ ชุด 9 10 11 12 ตกข้อสอง

VLSM — ให้แต่ละวงได้ขนาดที่มันต้องการ

ถ้าแบ่ง /24 เป็นสี่วงเท่า ๆ กัน แล้วมีวงหนึ่งมีเครื่องอยู่ 60 ตัว และอีกวงเป็น ลิงก์ระหว่างเราเตอร์ที่มีแค่สองตัว วงหลังเสียที่อยู่ไป 60 ตัวเปล่า ๆ

VLSM คือการเลิกบังคับให้ทุกวงเท่ากัน แต่ละวงได้ prefix ของตัวเอง

จัดวงใหญ่ก่อนเล็ก ที่ว่างที่เหลือจึงอยู่ติดกันเป็นผืนเดียว ต่างจากการจัดเล็กก่อนใหญ่ที่ทิ้งรูเล็ก ๆ ไว้ระหว่างทาง

โจทย์ตัวอย่าง มี 192.168.50.0/24 หนึ่งวง ต้องแบ่งให้

  Sales          60 hosts
  Engineering    28 hosts
  Ops            12 hosts
  WAN-1           2 hosts
  WAN-2           2 hosts

ขั้นแรก แปลงจำนวนเครื่องเป็น prefix ด้วยตารางเดิม แล้ว เรียงจากใหญ่ไปเล็ก

  Sales          60   ->   /26   (62)
  Engineering    28   ->   /27   (30)
  Ops            12   ->   /28   (14)
  WAN-1           2   ->   /30    (2)
  WAN-2           2   ->   /30    (2)

ขั้นที่สอง วางลงไปตามลำดับ โดยแต่ละวงต้องเริ่มที่เลขที่หารด้วยขนาดตัวเอง ลงตัว

  Sales          192.168.50.0/26      .1     - .62     bcast .63
  Engineering    192.168.50.64/27     .65    - .94     bcast .95
  Ops            192.168.50.96/28     .97    - .110    bcast .111
  WAN-1          192.168.50.112/30    .113   - .114    bcast .115
  WAN-2          192.168.50.116/30    .117   - .118    bcast .119

เหลือว่างตั้งแต่ .120 ถึง .255 เป็นผืนเดียวกัน 136 ที่อยู่

ทำไมต้องใหญ่ไปเล็ก และเหตุผลที่มักถูกอธิบายผิด

คำอธิบายที่ได้ยินบ่อยคือ "ถ้าจัดเล็กก่อนจะไม่พอ" ผมลองจัดกลับด้านดูแล้ว มันพอ

  WAN-1          192.168.50.0/30
  WAN-2          192.168.50.4/30
  Ops            192.168.50.16/28
  Engineering    192.168.50.32/27
  Sales          192.168.50.64/26

ทุกวงลงได้ครบ แต่ดูช่วง .8 ถึง .15 ให้ดี

แปดที่อยู่ตรงนั้นไม่มีใครใช้ และใช้ไม่ได้ด้วย เพราะ Ops เป็น /28 ต้องเริ่ม ที่เลขที่หารด้วย 16 ลงตัว จึงข้ามจาก .8 ไปเริ่มที่ .16 ทิ้งรูไว้ที่เล็กเกิน กว่าจะเอาไปทำอะไร

  largest first    holes left behind   none
  smallest first   holes left behind   .8 - .15   (8 addresses)

เหตุผลจริงจึงไม่ใช่ว่าจัดเล็กก่อนแล้วไม่พอ แต่คือมันทิ้งเศษ และเศษพวกนั้น รวมกันไม่ได้ เพราะกฎการเริ่มที่จุดหารลงตัวไม่ยอมให้รวม

พอทำจริงกับหลายสิบวง เศษที่ทิ้งไว้จะกินที่ว่างจนวันหนึ่งเพิ่มวงใหม่ไม่ได้ ทั้งที่ ตัวเลขรวมยังเหลือ

โจทย์

ห้าข้อนี้ไล่จากง่ายไปยาก ลองทำเองก่อนแล้วค่อยกดดูเฉลย เฉลยแสดงวิธีคิดทีละขั้น ไม่ใช่แค่คำตอบ

โจทย์ที่ 1 — อ่านเลขหกตัว

  192.168.100.150/27

หา network id, subnet mask, broadcast, จำนวนโฮสต์ที่ใช้ได้, ช่วงโฮสต์ และ network id ของวงถัดไป

เฉลยข้อ 1

  step 1   27 = 24 + 3         เส้นตัดออกเตต 4 เหลือบิตโฮสต์ 5
  step 2   mask octet = 224    บล็อกกว้าง 256 - 224 = 32
  step 3   0  32  64  96  128  160  192  224

150 อยู่ระหว่าง 128 กับ 160 วงจึงเริ่มที่ 128 และกว้าง 32 คือถึง 159

  network id     192.168.100.128
  subnet mask    255.255.255.224   (/27)
  broadcast      192.168.100.159
  hosts          2^5 - 2 = 30
  host range     192.168.100.129 - 192.168.100.158
  next network   192.168.100.160

โจทย์ที่ 2 — เส้นแบ่งไม่ได้อยู่ออกเตตสุดท้าย

  10.10.130.45/19

หาเลขหกตัวเดิม

เฉลยข้อ 2

  step 1   19 = 16 + 3         เส้นตัดออกเตต 3 เหลือบิตโฮสต์ 13
  step 2   mask octet = 224    บล็อกกว้าง 256 - 224 = 32
  step 3   0  32  64  96  128  160  192  224

130 อยู่ระหว่าง 128 กับ 160 วงจึงเริ่มที่ 10.10.128.0

ออกเตตที่สี่อยู่ฝั่งโฮสต์ทั้งออกเตต จึงเป็น 0 ใน network id และ 255 ใน broadcast

  network id     10.10.128.0
  subnet mask    255.255.224.0     (/19)
  broadcast      10.10.159.255
  hosts          2^13 - 2 = 8190
  host range     10.10.128.1 - 10.10.159.254
  next network   10.10.160.0

จุดที่พลาดง่ายคือจำนวนโฮสต์ บิตโฮสต์คือ 13 ไม่ใช่ 5 ต้องนับบิตที่เหลือ ทั้งหมดจาก 32 ไม่ใช่แค่ในออกเตตที่น่าสนใจ

โจทย์ที่ 3 — แบ่งหนึ่งวงเป็นแปด

แบ่ง 172.20.16.0/24 ออกเป็นแปดวงเท่า ๆ กัน บอก prefix ใหม่ จำนวนโฮสต์ต่อวง และ network id ของสามวงแรก

เฉลยข้อ 3

  need 8 subnets   ->   2^3 = 8   ->   borrow 3 bits
  new prefix       ->   24 + 3 = /27
  host bits left   ->   32 - 27 = 5   ->   2^5 - 2 = 30 hosts
  block size       ->   256 - 224 = 32

จุดเริ่มของแต่ละวงคือ 0 32 64 96 128 160 192 224 สามวงแรก

  172.20.16.0/27      .1     - .30     bcast .31
  172.20.16.32/27     .33    - .62     bcast .63
  172.20.16.64/27     .65    - .94     bcast .95

ตรวจง่าย ๆ ว่าถูก คือ 8 วง คูณ 32 ที่อยู่ ได้ 256 พอดีกับ /24 หนึ่งวง

โจทย์ที่ 4 — รวมสี่วงให้เหลือบรรทัดเดียว

  10.4.16.0/24
  10.4.17.0/24
  10.4.18.0/24
  10.4.19.0/24

รวมเป็น prefix เดียวได้ไหม ถ้าได้คืออะไร และถ้าเพิ่ม 10.4.20.0/24 เข้าไปอีกวง ยังรวมได้เหมือนเดิมหรือไม่

เฉลยข้อ 4

เขียนออกเตตที่สามเป็นบิต

  16 = 00010000
  17 = 00010001
  18 = 00010010
  19 = 00010011
       ^^^^^^
       same 6 bits

16 บิตของสองออกเตตแรก บวกหกบิตนี้ ได้ 22

  10.4.16.0/22   covers 10.4.16.0 - 10.4.19.255   exactly 4 networks

ตรวจสองข้อ คือสี่วงเป็นกำลังสอง และวงแรกคือ 16 ซึ่งหารด้วยสี่ลงตัว ผ่านทั้งคู่

พอเพิ่ม 10.4.20.0/24 เข้าไป รวมไม่ได้แล้ว

  20 = 00010100
       ^^^^^
       same 5 bits only

prefix เดียวที่ครอบทั้งห้าวงได้คือ /21 คือ 10.4.16.0/21 ซึ่งครอบถึง 10.4.23.255 เกินไปสามวงที่ไม่ใช่ของเรา คือ 21, 22 และ 23

ทางที่ถูกคือประกาศสองบรรทัด 10.4.16.0/22 กับ 10.4.20.0/24 ยอมมีสองบรรทัด ดีกว่าอ้างสิทธิ์ในเลขที่ไม่ได้เป็นของเรา

โจทย์ที่ 5 — ออกแบบ VLSM

มี 192.168.70.0/24 หนึ่งวง ต้องรองรับ

  dept A    100 hosts
  dept B     50 hosts
  dept C     25 hosts
  link 1      2 hosts
  link 2      2 hosts

จัดให้ครบ แล้วบอกว่าเหลือที่ว่างเท่าไหร่

เฉลยข้อ 5

แปลงเป็น prefix แล้วเรียงจากใหญ่ไปเล็ก

  dept A    100   ->   /25   (126)
  dept B     50   ->   /26    (62)
  dept C     25   ->   /27    (30)
  link 1      2   ->   /30     (2)
  link 2      2   ->   /30     (2)

วางไล่ลงไป แต่ละวงเริ่มที่เลขที่หารด้วยขนาดตัวเองลงตัว

  dept A    192.168.70.0/25      .1     - .126    bcast .127
  dept B    192.168.70.128/26    .129   - .190    bcast .191
  dept C    192.168.70.192/27    .193   - .222    bcast .223
  link 1    192.168.70.224/30    .225   - .226    bcast .227
  link 2    192.168.70.228/30    .229   - .230    bcast .231

เหลือว่าง .232 ถึง .255 คือ 24 ที่อยู่ ซึ่งพอสำหรับ /28 อีกหนึ่งวง หรือ /30 อีกหลายวง

ข้อสังเกต แผนก A ขอ 100 แต่ได้วงที่จุได้ 126 ส่วนเกิน 26 ที่อยู่ไม่ได้ หายไปไหน มันอยู่ในวงของ A และ A จะโตไปใช้ได้ แต่ถ้า A โตเกิน 126 ต้องย้ายทั้ง วง ไม่ใช่ขยาย เพราะ .128 ถูก B ยึดไปแล้ว

ความเชื่อที่ผิด

"ต้องท่องตาราง mask ให้ได้ก่อน" ไม่ต้อง ตารางทั้งใบสร้างจากข้อเดียวคือ 256 - mask เท่ากับขนาดบล็อก และบล็อกเป็นกำลังสองเสมอ จำสองอย่างนี้แล้วเขียน ตารางเองได้ทุกครั้ง

"เอา 256 ลบ mask เป็นเลขมหัศจรรย์" ไม่ใช่เลขมหัศจรรย์ มันคือขนาดของวงใน ออกเตตนั้น ซึ่งเท่ากับสองยกกำลังจำนวนบิตที่เหลือให้โฮสต์

"จำนวนโฮสต์ดูจากออกเตตสุดท้าย" ดูจากบิตโฮสต์ทั้งหมด /19 มีบิตโฮสต์ 13 บิต ไม่ใช่ 5 การดูออกเตตเดียวถูกเฉพาะตอนที่ prefix อยู่ระหว่าง 25 ถึง 30

"วงติดกันสี่วงรวมเป็นบรรทัดเดียวได้เสมอ" ต้องเป็นกำลังสอง และวงแรกต้องเริ่ม ตรงจุดที่หารลงตัว ชุด 9 10 11 12 ติดกันครบสี่วงแต่รวมไม่ได้

"VLSM ต้องจัดใหญ่ก่อนเล็ก ไม่งั้นจะไม่พอ" จัดกลับด้านก็มักพอ สิ่งที่เสียคือ ที่ว่างกลายเป็นเศษเล็ก ๆ ที่ใช้ต่อไม่ได้ ไม่ใช่ความจุรวม

"เครื่องคำนวณให้แล้ว ไม่ต้องคิดเอง" เครื่องตอบคำถามที่พิมพ์เข้าไป ถ้าพิมพ์ prefix ผิด มันจะตอบผิดให้อย่างมั่นใจ และไม่มีอะไรเตือน

อ้างอิง

เอกสารมาตรฐาน

คำนวณในบทนี้

  • ตารางทุกใบ ตัวอย่างทุกตัว และเฉลยทุกข้อ คำนวณด้วยโมดูล ipaddress ของ Python 3.9.6 บนเครื่องที่ใช้เขียน แล้วเทียบกับวิธีคิดด้วยมือทีละขั้น
  • ผลของการจัด VLSM ทั้งสองลำดับ คำนวณจากกฎเดียวกัน คือแต่ละวงเริ่มที่เลขที่หาร ด้วยขนาดตัวเองลงตัว ตัวเลขรูที่ทิ้งไว้จึงเป็นผลจากกฎนั้น ไม่ใช่การประมาณ
  • เลขที่ใช้เป็นตัวอย่างเป็นเลขสมมติในช่วงส่วนตัวตาม RFC 1918 ไม่ใช่เลขของ เครือข่ายจริงที่ไหน

บทที่เกี่ยวข้องบนเว็บนี้

  • IPv4 Subnet อธิบายว่าทำไม mask ถึงต้อง เป็นเส้นแบ่งไม่ใช่ช่วงตัวเลข และกรณี /31 /32 โดยละเอียด
  • การเลือกเส้นทาง อธิบายว่าเราเตอร์ใช้ prefix ที่ยาวที่สุดที่ตรง ซึ่งเป็นเหตุผลที่การรวมเส้นทางไม่ทำให้วงย่อยหาย

คำนวณเองวัดจากเครื่องจริง

อ่านหน้านี้เป็นภาษาอังกฤษ