Network Fundamental เครือข่ายวงเดียว
โดเมนการชน กับ โดเมนกระจายข่าว — เส้นแบ่งที่ทุกคนท่องได้แต่ชี้ไม่ถูก
อุปกรณ์แต่ละชนิดหยุดอะไรได้บ้าง สามสิบปีที่เส้นแบ่งหนึ่งหดจนหายไป ส่วนอีกเส้นยังอยู่ที่เดิม
· หมวด 3 · เครือข่ายวงเดียว · 10 นาที
สองคำนี้อยู่ในหนังสือเรียนทุกเล่ม และคนส่วนใหญ่ตอบได้ว่าคืออะไร
แต่คำถามที่ตอบยากกว่าคือ เส้นแบ่งอยู่ตรงไหน และ ทำไมสองเส้นนี้ถึงไม่ได้อยู่ ที่เดียวกัน
คำตอบเป็นเรื่องของประวัติศาสตร์สามสิบปี ที่เส้นหนึ่งค่อย ๆ หดจนหายไป ส่วนอีกเส้น ยังอยู่ที่เดิมจนต้องคิดวิธีใหม่มาแบ่งมัน
ถ้ายังไม่เคยดู เริ่มตรงนี้
เครื่องที่คุณใช้อยู่อาจมีบริดจ์ทำงานอยู่แล้วโดยไม่รู้ตัว
$ ifconfig | grep -A2 bridge
บนเครื่องที่ใช้เขียนบทนี้ ได้ผลว่า
proto stp maxaddr 100 timeout 1200
member: vmenet0 flags=3<LEARNING,DISCOVER>
คำว่า LEARNING ในบรรทัดนั้นคือกลไกทั้งหมดของบทความนี้ และตัวเลขสองตัวข้างบน จะกลับมาอีกครั้งตอนท้าย
โดเมนการชน คือระยะที่การชนยังมีความหมาย
บทความ Ethernet อธิบายไว้แล้วว่าเฟรม ต่ำสุดต้อง 64 ไบต์ เพราะผู้ส่งต้องยังส่งอยู่ตอนที่สัญญาณชนวิ่งกลับมาถึง
โดเมนการชนคือขอบเขตที่การส่งพร้อมกันสองครั้งทำให้เกิดการชน ถ้าอยู่คนละโดเมน ส่งพร้อมกันได้โดยไม่กระทบกัน
ขนาดของมันไม่ได้ตั้งขึ้นตามใจ มันคำนวณมาจาก slot time ซึ่งเป็นตัวเลขเดียวกับที่ กำหนดเฟรมต่ำสุด
rate slot time one way theoretical actual limit
10 Mbps 51.20 us 25.60 us 5,120 m 2,500 m
100 Mbps 5.12 us 2.56 us 512 m 205 m
ตัวเลขจริงสั้นกว่าตัวเลขทฤษฎีเพราะอุปกรณ์ระหว่างทางก็กินเวลาด้วย แต่อัตราส่วน คือสิ่งที่สำคัญ เร็วขึ้นสิบเท่า ระยะหดลงสิบเท่า
เหตุผลคือ slot time นับเป็นจำนวนบิต ไม่ใช่หน่วยเวลา 512 บิตที่ 10 Mbps กินเวลา 51.2 ไมโครวินาที แต่ 512 บิตเดิมที่ 100 Mbps กินเวลาแค่ 5.12
รีพีตเตอร์ — ยืดสายออกไป และยืดปัญหาไปด้วย
อุปกรณ์ตัวแรกที่คนใช้ขยายเครือข่ายคือรีพีตเตอร์ หน้าที่ของมันคือรับสัญญาณที่อ่อนลง แล้วส่งต่อออกไปให้แรงเหมือนเดิม
มันทำงานที่ระดับสัญญาณ ไม่ได้อ่านว่าข้างในเป็นเฟรมของใคร ฮับคือรีพีตเตอร์ หลายพอร์ตนั่นเอง
ผลที่ตามมาคือสิ่งที่คนสมัยนั้นต้องคำนวณกันจริง ๆ
hub ports collision domains simultaneous senders
8 1 1
24 1 1
48 1 1
ต่อฮับกี่ตัวก็ยังเป็นโดเมนเดียว และยิ่งต่อยาว ยิ่งเข้าใกล้เพดานระยะที่ตาราง ข้างบนกำหนดไว้
เลขคณิตที่ฆ่าวิธีนี้ทิ้ง
ลองคำนวณต่อไปที่ 1 Gbps ด้วย slot time เดิม
rate slot time one way theoretical
1 Gbps 0.51 us 0.26 us 51 m
51 เมตร สั้นกว่าสายหนึ่งเส้นที่มาตรฐานอนุญาตให้ยาว 100 เมตร
บทความ ชั้นกายภาพ อธิบายไว้แล้วว่าทำไม สายต้องหยุดที่ร้อยเมตร ตอนนี้เราได้ตัวเลขที่บอกว่า ถ้ายังใช้ slot time เดิม โดเมนการชนจะเล็กกว่าสายเส้นเดียว ซึ่งแปลว่าใช้ไม่ได้เลย
มาตรฐานจึงต้องขยาย slot time สำหรับกิกะบิต แล้วสุดท้ายก็แทบไม่มีใครใช้โหมดที่ ต้องใช้มัน เพราะถึงตอนนั้นทุกคนย้ายไปสวิตช์กันหมดแล้ว
บริดจ์ — อุปกรณ์ตัวแรกที่อ่านว่าข้างในเป็นอะไร
จุดเปลี่ยนคืออุปกรณ์ที่ไม่ได้ส่งต่อสัญญาณดิบ แต่อ่านที่อยู่ปลายทางในเฟรมก่อน แล้วค่อยตัดสินใจ
RFC 1493 ปี 1993 ซึ่งอธิบายวิธีจัดการบริดจ์ นิยามตารางของมันไว้ว่า
"A table that contains information about unicast entries for which the bridge has forwarding and/or filtering information. This information is used by the transparent bridging function in determining how to propagate a received frame."
คำว่า filtering คือสิ่งที่ฮับทำไม่ได้ ฮับส่งต่อทุกอย่าง บริดจ์เลือกได้ว่า จะไม่ส่ง
และรายการในตารางนั้นมีสถานะบอกว่ามันมาจากไหน
learned(3) บริดจ์เรียนรู้เอง จากเฟรมที่วิ่งผ่าน
self(4) ที่อยู่ของตัวบริดจ์เอง
mgmt(5) คนตั้งไว้เอง
invalid(2) เคยเรียนรู้มา แต่หมดอายุแล้ว
บริดจ์ไม่ต้องมีใครมาตั้งค่าให้ มันดูที่อยู่ต้นทางของเฟรมที่วิ่งผ่านพอร์ตไหน แล้วจำว่าที่อยู่นั้นอยู่ทางพอร์ตนั้น นั่นคือคำว่า LEARNING ที่เครื่องผมแสดงไว้ ตั้งแต่ต้นบท
ความจำที่ต้องลืม และตัวเลขที่ไม่ตรงกับมาตรฐาน
ที่อยู่ที่เรียนรู้มาต้องหมดอายุ ไม่งั้นย้ายเครื่องแล้วเฟรมจะวิ่งไปผิดพอร์ตตลอดไป
RFC 1493 กำหนดค่านี้ไว้พร้อมคำแนะนำ
"The timeout period in seconds for aging out dynamically learned forwarding information. 802.1D-1990 recommends a default of 300 seconds."
แต่บริดจ์บนเครื่องที่ผมใช้เขียนบทนี้ตั้งไว้ที่
standard recommends 300 s
this machine ships 1,200 s
ต่างกันสี่เท่า และนี่ไม่ใช่ความผิดพลาด มันคือการตัดสินใจของผู้พัฒนาว่าจะแลก ความเร็วในการตามการย้ายเครื่อง กับจำนวนครั้งที่ต้องกระจายเฟรมออกทุกพอร์ตเพราะ ลืมไปแล้ว
ค่า maxaddr 100 ก็เป็นการแลกแบบเดียวกัน คือจำได้แค่ร้อยที่อยู่ ถ้าเกินกว่านั้น ต้องทิ้งของเก่า
สิ่งที่บริดจ์แบ่งไม่ได้
บริดจ์รู้ว่าที่อยู่ปลายทางไหนอยู่พอร์ตไหน จึงเลือกส่งได้
แต่ถ้าปลายทางคือ "ทุกคน" มันเลือกอะไรไม่ได้เลย เฟรมกระจายข่าวต้องออกทุกพอร์ต เสมอ ไม่มีทางอื่น
frame type bridge behaviour
unicast ส่งออกพอร์ตเดียวที่รู้ว่าปลายทางอยู่
unicast new ยังไม่รู้ว่าอยู่ไหน จึงส่งออกทุกพอร์ต
broadcast ส่งออกทุกพอร์ตเสมอ
บรรทัดที่สองสำคัญกว่าที่คิด เฟรมที่ยังไม่รู้ปลายทางก็ถูกกระจายเหมือนกัน ซึ่งเป็นเหตุผลที่ค่า timeout ข้างบนมีผลกับปริมาณทราฟฟิกจริง
โดเมนกระจายข่าว คือขอบเขตที่คำว่า "ทุกคน" ครอบถึง
โดเมนกระจายข่าวคือกลุ่มเครื่องที่เฟรมกระจายข่าวใบเดียวไปถึงทุกตัว
และเพราะบริดจ์ต้องส่งต่อเฟรมกระจายข่าวเสมอ การใส่บริดจ์เพิ่มไม่ได้ทำให้โดเมน กระจายข่าวเล็กลงเลยแม้แต่นิดเดียว
นี่คือจุดที่สองโดเมนแยกทางกัน
บทความ ARP แสดงไว้แล้วว่าทุกการติดต่อในวง เริ่มด้วยคำถามที่ถามทุกคน ยิ่งโดเมนกระจายข่าวใหญ่ คำถามพวกนั้นยิ่งไปรบกวนเครื่อง ที่ไม่เกี่ยวข้องมากขึ้น
และ RFC 1286 ปี 1991 เตือนเรื่องลูปในบริดจ์ไว้ตรง ๆ ว่า
"unlike transparent bridging this is not catastrophic to the network if there are loops"
คำว่า catastrophic หมายถึงบริดจ์ เฟรมกระจายข่าวที่วนในลูปไม่มีอะไรหยุดมัน เพราะเฟรมไม่มี TTL ซึ่งเป็นเหตุผลที่ STP ต้องมีอยู่
สวิตช์ — บริดจ์ที่มีพอร์ตเยอะและทำงานในฮาร์ดแวร์
สวิตช์ไม่ใช่แนวคิดใหม่ มันคือบริดจ์ที่มีพอร์ตจำนวนมากและตัดสินใจในฮาร์ดแวร์
ผลที่ตามมาคือจำนวนโดเมนการชน
device ports collision domains
hub 24 1
bridge 2 2
switch 24 24
ทุกพอร์ตของสวิตช์คือโดเมนการชนของตัวเอง ซึ่งแปลว่ายี่สิบสี่เครื่องส่งพร้อมกัน ได้ทั้งหมด แทนที่จะได้ทีละเครื่อง
แต่คอลัมน์ที่ไม่ได้อยู่ในตารางนั้นคือโดเมนกระจายข่าว ซึ่งยังเป็น 1 ทั้งสามแถว
ฟูลดูเพล็กซ์ — เมื่อโดเมนการชนหดจนเหลือศูนย์
ขั้นสุดท้ายคือการเลิกใช้สายร่วมโดยสิ้นเชิง เมื่อพอร์ตสวิตช์ต่อกับเครื่องเดียว และมีคู่สายแยกสำหรับแต่ละทิศทาง การชนกันไม่มีทางเกิดขึ้นได้อีก
บนเครื่องที่ใช้เขียนบทนี้
$ ifconfig en1 | grep media
media: autoselect <full-duplex>
เมื่อเป็นฟูลดูเพล็กซ์ CSMA/CD ถูกปิดการทำงาน ไม่ใช่แค่ไม่ได้ใช้ แต่ถูกปิด เพราะไม่มีอะไรให้ตรวจ
โดเมนการชนจึงหดจากสองพันห้าร้อยเมตร เหลือเป็นศูนย์ในทางปฏิบัติ ภายในเวลาประมาณ ยี่สิบปี
เส้นแบ่งอยู่ตรงไหน — ตารางที่ตอบคำถามตั้งต้น
device stops collisions stops broadcast
repeater no no
hub no no
bridge yes no
switch yes no
router yes yes
มีอุปกรณ์ชนิดเดียวที่หยุดเฟรมกระจายข่าวได้ คือเราเตอร์ เพราะมันไม่ส่งต่อเฟรม มันอ่านแพ็กเก็ตข้างในแล้วสร้างเฟรมใหม่ ตามที่บทความ การเลือกเส้นทาง อธิบายไว้
และนั่นคือเหตุผลที่ VLAN ถูกคิดขึ้น — เพื่อให้สวิตช์ตัวเดียวแบ่งโดเมนกระจายข่าวได้ โดยไม่ต้องซื้อเราเตอร์เพิ่ม ซึ่งเป็นเรื่องของบทความ VLAN
เมื่อมันโกหก
"สวิตช์แบ่งโดเมนกระจายข่าว" ไม่แบ่ง สวิตช์ธรรมดาที่ไม่ได้ตั้ง VLAN คือโดเมน กระจายข่าวเดียวทั้งตัว
"ฮับกับสวิตช์ต่างกันแค่ความเร็ว" ต่างกันที่ฮับส่งต่อสัญญาณโดยไม่อ่าน ส่วน สวิตช์อ่านที่อยู่ก่อน ผลคือจำนวนโดเมนการชนต่างกันเท่ากับจำนวนพอร์ต
"เดี๋ยวนี้ไม่มีการชนแล้ว ไม่ต้องรู้เรื่องนี้" จริงสำหรับสายทองแดงแบบสวิตช์ แต่ Wi-Fi ยังใช้ตัวกลางร่วมกันอยู่ และ แนวคิดโดเมนการชนยังใช้อธิบายมันได้ตรง ๆ
"ตารางที่อยู่ของสวิตช์ตั้งค่าเอาเอง" ค่ามาตรฐานคือ learned คือเรียนรู้เองจาก เฟรมที่วิ่งผ่าน ไม่มีใครตั้ง
"โดเมนกระจายข่าวใหญ่แค่ไหนก็ได้ ถ้าสวิตช์แรงพอ" ปัญหาไม่ได้อยู่ที่สวิตช์ แต่อยู่ที่ทุกเครื่องในโดเมนต้องประมวลผลเฟรมกระจายข่าวทุกใบที่ผ่านมา
ตัวอย่างจริงจากงานจริง
กรณีที่ 1 — เครือข่ายช้าลงเมื่อมีเครื่องเพิ่ม
สถานการณ์ เพิ่มเครื่องในวงแล้วทุกคนรู้สึกช้าลง ทั้งที่แบนด์วิดท์ยังเหลือ
อ่านอย่างไร ถามว่าอยู่โดเมนกระจายข่าวเดียวกันกี่เครื่อง เพราะเฟรมกระจายข่าว ทุกใบไปถึงทุกเครื่อง และทุกเครื่องต้องประมวลผลมัน ปริมาณงานจึงโตตามจำนวนเครื่อง แม้ทราฟฟิกจริงจะไม่ได้โตตาม
สิ่งที่ยังไม่ได้พิสูจน์ อาการช้าลงมาจากหลายสาเหตุได้ การนับจำนวนเครื่องบอก ว่ามีความเสี่ยง ไม่ได้บอกว่าเป็นสาเหตุจริง ต้องดูสัดส่วนเฟรมกระจายข่าวจริง
กรณีที่ 2 — ตัดสินใจว่าจะแบ่ง VLAN ตรงไหน
สถานการณ์ วงเดียวเริ่มใหญ่ ต้องเลือกว่าจะแบ่งอย่างไร
อ่านอย่างไร เส้นแบ่งที่มีความหมายคือเส้นของโดเมนกระจายข่าว ไม่ใช่เส้นของสาย คำถามคือกลุ่มไหนที่ไม่จำเป็นต้องได้ยินคำถาม ARP ของกลุ่มอื่น
1 กลุ่มไหนคุยกันเองเป็นหลัก
2 กลุ่มไหนต้องผ่านเราเตอร์อยู่แล้ว
3 กลุ่มไหนมีเครื่องเยอะที่สุด
สิ่งที่ยังไม่ได้พิสูจน์ การแบ่งโดเมนกระจายข่าวลดเสียงรบกวน แต่เพิ่มงานให้ เราเตอร์ ทราฟฟิกที่เคยข้ามกันในสวิตช์จะต้องขึ้นไปที่ชั้นสาม ซึ่งอาจย้ายคอขวด ไม่ใช่กำจัดมัน
กรณีที่ 3 — อ่านค่าตารางที่อยู่ของอุปกรณ์
สถานการณ์ อยากรู้ว่าอุปกรณ์จำที่อยู่ไว้นานแค่ไหน และจำได้กี่รายการ
อ่านอย่างไร ดูสองค่า คือเวลาหมดอายุกับจำนวนสูงสุด
ageing time นานไป ตามการย้ายเครื่องไม่ทัน
สั้นไป ต้องกระจายเฟรมบ่อยขึ้น
max entries เต็มเมื่อไหร่ ต้องทิ้งของเก่า
สิ่งที่ยังไม่ได้พิสูจน์ ค่าที่ผู้ผลิตตั้งมาอาจต่างจากที่มาตรฐานแนะนำมาก อย่างเครื่องที่ผมใช้เขียนตั้งไว้ 1,200 วินาที ขณะที่ 802.1D แนะนำ 300 การเห็น ตัวเลขไม่ได้แปลว่ารู้เหตุผลที่เขาเลือกค่านั้น
สามสิบปีในสามบรรทัด
repeater / hub collision domains 1
bridge / switch collision domains = จำนวนพอร์ต
full duplex collision domains หายไป
ตลอดสามบรรทัดนั้น โดเมนกระจายข่าวไม่ได้ขยับเลย มันยังเป็นหนึ่งเสมอ จนกระทั่ง มีคนคิดวิธีแบ่งมันด้วยแท็กสี่ไบต์ ซึ่งเป็นบทถัดไป
อ้างอิง
เอกสารมาตรฐาน
- RFC 1493 กรกฎาคม 1993 Definitions of Managed Objects for Bridges — นิยามตาราง forwarding สถานะของรายการ และค่าหมดอายุที่อ้างถึงคำแนะนำของ 802.1D-1990
- RFC 1286 ธันวาคม 1991 ฉบับก่อนหน้า และประโยคเรื่องลูปในบริดจ์ที่ยกมาอ้าง
วัดจากเครื่องที่ใช้เขียน
ifconfigของบริดจ์จริงบนเครื่องนี้ — ธง LEARNING บนพอร์ต ค่าmaxaddr 100และtimeout 1200ซึ่งต่างจากคำแนะนำของมาตรฐานสี่เท่าifconfig en1ที่รายงานว่าลิงก์เป็นฟูลดูเพล็กซ์
คำนวณเอง
- ตารางระยะของโดเมนการชน คำนวณจาก slot time 512 บิต และความเร็วสัญญาณในสาย ทองแดงที่ประมาณ 2 x 10^8 เมตรต่อวินาที ตัวเลขระยะจริงของแต่ละมาตรฐานเป็นค่าที่ มาตรฐานกำหนด ไม่ได้มาจากการคำนวณนี้
สิ่งที่ยืนยันจากต้นทางไม่ได้
- IEEE 802.3 และ 802.1D ต้องเสียเงินเข้าถึง ตัวเลข slot time และระยะสูงสุดที่ อ้างในบทนี้จึงมาจากการคำนวณและจากเอกสารที่อ้างถึงมาตรฐานอีกทอด ไม่ได้อ่านจาก ตัวมาตรฐานโดยตรง