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 ผิดไปหนึ่ง มันก็ตอบผิดให้อย่างมั่นใจ
เลขหกตัว มาจากที่เดียวกันทั้งหมด
พอรู้ว่าเส้นแบ่งอยู่ตรงไหน หกข้อนี้ตกลงมาเอง
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 ผิด มันจะตอบผิดให้อย่างมั่นใจ และไม่มีอะไรเตือน
อ้างอิง
เอกสารมาตรฐาน
- RFC 4632 — CIDR: The Internet Address Assignment and Aggregation Plan V. Fuller และ T. Li, สิงหาคม 2006 — ประโยคที่ยกมาทั้งสองประโยคมาจากที่นี่ คือข้อจำกัดว่า mask ต้องเป็นบิตติดกันจากซ้าย และเหตุผลของการรวมเส้นทาง
- RFC 950 — Internet Standard Subnetting Procedure สิงหาคม 1985 — ที่มาของการแบ่งซับเน็ต และของกฎที่กันเลขแรกกับเลขสุดท้ายไว้
- RFC 3021 — Using 31-Bit Prefixes on IPv4 Point-to-Point Links ธันวาคม 2000 — ข้อยกเว้นของกฎลบสอง
คำนวณในบทนี้
- ตารางทุกใบ ตัวอย่างทุกตัว และเฉลยทุกข้อ คำนวณด้วยโมดูล
ipaddressของ Python 3.9.6 บนเครื่องที่ใช้เขียน แล้วเทียบกับวิธีคิดด้วยมือทีละขั้น - ผลของการจัด VLSM ทั้งสองลำดับ คำนวณจากกฎเดียวกัน คือแต่ละวงเริ่มที่เลขที่หาร ด้วยขนาดตัวเองลงตัว ตัวเลขรูที่ทิ้งไว้จึงเป็นผลจากกฎนั้น ไม่ใช่การประมาณ
- เลขที่ใช้เป็นตัวอย่างเป็นเลขสมมติในช่วงส่วนตัวตาม RFC 1918 ไม่ใช่เลขของ เครือข่ายจริงที่ไหน
บทที่เกี่ยวข้องบนเว็บนี้
- IPv4 Subnet อธิบายว่าทำไม mask ถึงต้อง เป็นเส้นแบ่งไม่ใช่ช่วงตัวเลข และกรณี
/31/32โดยละเอียด - การเลือกเส้นทาง อธิบายว่าเราเตอร์ใช้ prefix ที่ยาวที่สุดที่ตรง ซึ่งเป็นเหตุผลที่การรวมเส้นทางไม่ทำให้วงย่อยหาย