နားလည်ထားရမယ့် အချက်
Subnetting ဆိုတာ network တစ်ခုကို ယူပြီး host အပိုင်းကနေ bit တွေ ချေးယူကာ network အပိုင်းကို ပေးလိုက်ခြင်းဖြင့် သေးငယ်တဲ့ network များစွာအဖြစ် ခွဲထုတ်တာ ဖြစ်ပါတယ်။ /24 မှာ host bit ရှစ်လုံး ရှိပါတယ်၊ နှစ်လုံး ချေးယူလိုက်ရင် /26 ရပါတယ် — 256 လုံးပါတဲ့ network တစ်ခုအစား 64 လုံးစီပါတဲ့ network လေးခု ဖြစ်သွားပါတယ်။
ဒါကို လုပ်ရတဲ့ အကြောင်းရင်း သုံးမျိုး သီးခြားစီ ရှိပြီး၊ လူတွေက မကြာခဏ ရောထွေးတတ်ပါတယ်။ ပထမတစ်ခုက broadcast ကို ကန့်သတ်ခြင်းပါ — broadcast တစ်ခုဟာ သူ့ subnet ထဲက host တိုင်းဆီ ရောက်ပြီး တိုင်းက စစ်ဆေးရလို့၊ စက်ထောင်ပေါင်းများစွာပါတဲ့ ပြားချပ်ချပ် network တစ်ခုဟာ ဘယ်သူမှ မလိုချင်တဲ့ traffic အတွက် တကယ့် CPU နဲ့ bandwidth ကို ဖြုန်းပစ်ပါတယ်။ ဒုတိယက ခွဲထုတ်ခြင်းနဲ့ policy ပါ — subnet တွေကြား traffic က router ကို ဖြတ်ရမှာဖြစ်ပြီး၊ အဲဒီနေရာက filtering ထားလို့ ရတဲ့နေရာ အတိအကျ ဖြစ်ပါတယ်၊ ဒါကြောင့် printer, server, guest Wi-Fi ကို သီးခြား subnet တွေ ခွဲထားရင် စည်းမျဉ်း အတည်ပြုစရာ နေရာ ရသွားပါတယ်။ တတိယက address ကို ချွေတာခြင်းပါ — router နှစ်ခုကြား point-to-point link တစ်ခုအတွက် address နှစ်ခုပဲ လိုအပ်ပြီး၊ /24 တစ်ခုလုံး ပေးလိုက်ရင် 254 လုံး အလဟဿ ဖြစ်သွားပါတယ်။
Subnet တစ်ခုစီအတွင်းမှာ address နှစ်ခုကို သီးသန့် ဖယ်ထားပါတယ်။ host bit အားလုံး သုည ဖြစ်တဲ့ address က network address — subnet ကိုယ်တိုင်ရဲ့ အမည် ဖြစ်ပါတယ်၊ host bit အားလုံး တစ် ဖြစ်တဲ့ address ကတော့ directed broadcast address ပါ။ နှစ်ခုစလုံးကို စက်တစ်လုံးအတွက် သတ်မှတ်ပေးလို့ မရပါဘူး — ဒါက 2^n − 2 ဆိုတဲ့ ပုံသေနည်း လာရာ ဖြစ်ပါတယ် — host bit n လုံးက address 2^n လုံး ပေးပြီး၊ အဲဒီနှစ်ခုကို နုတ်လိုက်တာပါ။ ဒီပုံသေနည်းမှာ သိထားသင့်တဲ့ ခြွင်းချက်တွေ ရှိပါတယ် — RFC 3021 က point-to-point link တွေမှာ /31 ရဲ့ address နှစ်ခုစလုံးကို သုံးခွင့်ပေးထားပြီး၊ /32 ကတော့ host route တစ်ခုတည်း ဖြစ်ပါတယ်။ ဒါကြောင့် "/24 မှာ host 254 ရှိတယ်" လို့ အလွတ်ကျက်မထားဘဲ တကယ့် prefix ကနေ တွက်ထုတ်ပါ။
SPLITTING 192.168.1.0/24 INTO FOUR /26 SUBNETS
----------------------------------------------
BEFORE: one /24 -- 256 addresses, 254 usable, ONE broadcast domain
+-------------------------------------------------------------+
| 192.168.1.0/24 |
| .0 = network .1 - .254 usable .255 = bcast |
+-------------------------------------------------------------+
Borrow 2 host bits (8 host bits -> 6), giving 2^2 = 4 subnets:
AFTER:
+--------------+--------------+--------------+--------------+
| .0 - .63 | .64 - .127 | .128 - .191 | .192 - .255 |
| /26 | /26 | /26 | /26 |
+--------------+--------------+--------------+--------------+
network .0 network .64 network .128 network .192
first .1 first .65 first .129 first .193
last .62 last .126 last .190 last .254
bcast .63 bcast .127 bcast .191 bcast .255
usable 62 usable 62 usable 62 usable 62
Each block loses 2 addresses (network id + broadcast), so
4 x 62 = 248 usable -- six fewer than the original 254.လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
ရုံးခန်းငယ်တစ်ခုအတွက် 192.168.1.0/24 ကို ပေးထားပြီး staff စက်တွေ၊ server တွေ၊ guest Wi-Fi ကို ခွဲထားခိုင်းတယ် ဆိုပါစို့။ /26 လေးခုအဖြစ် ခွဲလိုက်ရင် 192.168.1.0/26, .64/26, .128/26, .192/26 ရပြီး တစ်ခုစီမှာ address 64 လုံးစီ ရှိပါတယ်။ ပထမတစ်ခုကို staff, ဒုတိယကို server, တတိယကို guest ပေးပြီး၊ စတုတ္ထကို နောင်တိုးချဲ့ရန် ချန်ထားလိုက်ပါ။
အခု block တစ်ခုကို ဂရုတစိုက် လိုက်ကြည့်ရအောင်၊ ဘာလို့လဲဆိုတော့ ဒီနေရာမှာပဲ အမှားတွေ ဖြစ်တတ်လို့ပါ။ 192.168.1.64/26 မှာ network address က 192.168.1.64 ဖြစ်ပြီး broadcast address က 192.168.1.127 ဖြစ်ပါတယ်။ သုံးလို့ရတဲ့ host တွေက 192.168.1.65 ကနေ 192.168.1.126 အထိ — ၆၂ လုံး ဖြစ်ပါတယ်။ အဖြစ်များတဲ့ bug တစ်ခုက .64 ဒါမှမဟုတ် .127 ကို "အားနေသလို မြင်လို့" စက်တစ်လုံးအတွက် ပေးလိုက်တာပါ — .64 ကို ငြင်းပယ်ခံရမယ် ဒါမှမဟုတ် ထူးဆန်းစွာ ပြုမူပါလိမ့်မယ်၊ .127 ကတော့ subnet ထဲက host တိုင်းကို သူ့ဆီ လာတဲ့ traffic တိုင်းကို စစ်ဆေးခိုင်းပါလိမ့်မယ်။
ဂဏန်းဆိုင်ရာ ကုန်ကျစရိတ်ကိုလည်း သတိထားပါ။ /24 တစ်ခုက သုံးလို့ရတဲ့ address 254 လုံး ပေးခဲ့ပေမယ့်၊ /26 လေးခုက 4 × 62 = 248 လုံးပဲ ပေးပါတယ်။ Subnetting က subnet တစ်ခုစီအတွက် address နှစ်လုံးစီ အမြဲ ဆုံးရှုံးစေတာမို့၊ အလွန်သေးငယ်တဲ့ subnet အများကြီး ခွဲလွန်းရင် address space ကို မြန်မြန် ကုန်စေပါတယ်။ အောက်က code က block လေးခုလုံးရဲ့ range တွေကို တွက်ပြီး၊ prefix တိုးလာတာနဲ့အမျှ သုံးလို့ရတဲ့ အရေအတွက် ဘယ်လို ကျဆင်းလဲ — /31 ခြွင်းချက်အပါအဝင် — ပြသပေးပါတယ်။
အတူတူ စမ်းရေးကြည့်မယ်
import ipaddress
parent = ipaddress.ip_network("192.168.1.0/24")
print("parent %s: %d addresses, %d usable"
% (parent, parent.num_addresses, parent.num_addresses - 2))
print()
print("%-17s%-14s%-15s%s"
% ("subnet", "network", "broadcast", "usable range"))
print("-" * 72)
for sub in parent.subnets(new_prefix=26):
hosts = list(sub.hosts())
print("%-17s%-14s%-15s%s - %s"
% (sub, sub.network_address, sub.broadcast_address,
hosts[0], hosts[-1]))
print()
# Why "2^n - 2": the all-zeros host is the network id and the
# all-ones host is the broadcast address, so neither is assignable.
for prefix in (24, 26, 28, 30, 31, 32):
net = ipaddress.ip_network("10.0.0.0/%d" % prefix)
usable = len(list(net.hosts()))
print("/%-3d %5d addresses -> %5d usable" % (prefix, net.num_addresses,
usable))
parent 192.168.1.0/24: 256 addresses, 254 usable
subnet network broadcast usable range
------------------------------------------------------------------------
192.168.1.0/26 192.168.1.0 192.168.1.63 192.168.1.1 - 192.168.1.62
192.168.1.64/26 192.168.1.64 192.168.1.127 192.168.1.65 - 192.168.1.126
192.168.1.128/26 192.168.1.128 192.168.1.191 192.168.1.129 - 192.168.1.190
192.168.1.192/26 192.168.1.192 192.168.1.255 192.168.1.193 - 192.168.1.254
/24 256 addresses -> 254 usable
/26 64 addresses -> 62 usable
/28 16 addresses -> 14 usable
/30 4 addresses -> 2 usable
/31 2 addresses -> 2 usable
/32 1 addresses -> 1 usable၅ မိနစ် စမ်းကြည့်
new_prefix=26 ကို 28 အဖြစ် ပြောင်းပြီး subnet ဘယ်နှစ်ခု ထွက်လာလဲ၊ တစ်ခုစီမှာ သုံးလို့ရတဲ့ host ဘယ်နှစ်လုံး ရှိလဲ ကြည့်ပါ။ ပြီးရင် /24 တစ်ခုကို /26 ခွဲတာနဲ့ /28 ခွဲတာ ဘယ်ဟာက address ပိုဆုံးရှုံးလဲ တွက်ချက်ပြီး၊ router-to-router link တွေအတွက် /30 နဲ့ /31 ဘယ်လောက် ကွာလဲ နှိုင်းယှဉ်ပါ။
သတိလေးတစ်ချက်
/24 ဆိုတိုင်း host 254 လုံး အမြဲရှိတယ်လို့ တွက်ခြင်း — တကယ့် mask ကို မစစ်ဘဲ ယူဆလိုက်ရင် /26 (62 လုံး) ဒါမှမဟုတ် /30 (2 လုံး) မှာ IP စာရင်း လုံးဝ မှားသွားပါတယ်
Subnet တစ်ခုရဲ့ ပထမဆုံး address (network id) ဒါမှမဟုတ် နောက်ဆုံး address (broadcast) ကို host တစ်ခုအဖြစ် ပေးမိခြင်း — /26 မှာ .64 က network address ဖြစ်ပေမယ့် /24 မှာတော့ သာမန် host address ဖြစ်နေလို့ မှားလွယ်ပါတယ်
RFC 3021 — Using 31-Bit Prefixes on IPv4 Point-to-Point Links — Computer Networking