ฉันกำลังแก้ไขกรณีของแพ็กเก็ต UDP ที่หายไปในสวิตช์กิกะบิตแบบ store-and-forward และฉันต้องการเห็นภาพว่าเกิดอะไรขึ้นภายในสวิตช์เพื่อทำความเข้าใจสาระสำคัญของปัญหาให้ดียิ่งขึ้น
สถานการณ์จำลองนั้นเรียบง่าย - กระแสข้อมูลแบบต่อเนื่อง 2 กระแสเข้ามาทาง 2 พอร์ตภายในสวิตช์ และทั้งคู่ต้องการปล่อยผ่านพอร์ตที่สาม (เหมือนกันทั้งคู่) ดังนั้นสวิตช์จึงจำเป็นต้องเก็บข้อมูลบางอย่างไว้ในแพ็กเก็ตบัฟเฟอร์ชั่วขณะหนึ่ง
ปัญหาคือ: จากการคำนวณง่ายๆ ของฉัน บัฟเฟอร์ควรมีขนาดใหญ่พอที่จะรองรับกรณีที่ฉันกำลังตรวจสอบ สตรีมข้อมูลหนึ่งส่งชุดข้อมูลขนาด 25 kB (แบ่งเป็น 1514 B แพ็กเก็ต) ทุก ๆ 1.56 มิลลิวินาที ส่วนอีกชุดหนึ่งส่งชุดข้อมูลขนาด 60 kB ทุก ๆ 1 มิลลิวินาที ตอนนี้แม้แต่สวิตช์โซโหอย่าง Netgear GS105E ก็มีบัฟเฟอร์ขนาด 128 kB ดังนั้น คณิตศาสตร์อย่างง่าย (25+60 < 128) จึงบอกว่าควรใช้งานได้แม้ว่าสตรีมจะเข้ามาพร้อมกัน (เนื่องจากไม่มีการรับส่งข้อมูลอื่นที่สำคัญ)
การทดสอบจริงแสดงให้เห็นว่าแพ็กเก็ตจำนวนมากจากสตรีมทั้งสองหายไปในสวิตช์บางตัว (ดูเหมือนว่าจะถูกผูกไว้กับขนาดบัฟเฟอร์ แต่ไม่ใช่เฉพาะกับมัน) ในการจำลองของฉัน ฉันไม่สามารถทำให้บัฟเฟอร์เติมเกินเมื่อตั้งค่าเป็น 128 kB
ฉันบันทึกภาพเคลื่อนไหวนี้สำหรับบัฟเฟอร์ขนาด 24 kB ซึ่งมีการเติมข้อมูลมากเกินไป อย่างไรก็ตาม คุณจะเห็นได้ง่ายๆ ว่าการเพิ่มบัฟเฟอร์เพียงไม่กี่ไบต์จะช่วยแก้ปัญหาได้ และแพ็กเก็ตทั้งหมดจะผ่านไป
ฉันได้ทำให้ง่ายขึ้นเล็กน้อยในการจำลองนี้ แพ็กเก็ตทั้งหมดมี QoS เหมือนกัน (ซึ่งเป็นกรณีจริงด้วย) ดังนั้นฉันจึงละทิ้งคิว QoS จากการจำลองและถือว่าการรับส่งข้อมูลทั้งหมดมีความสำคัญเท่าเทียมกัน ต่อไป ฉันละทิ้งการจัดการหน่วยความจำของบัฟเฟอร์ ฉันสามารถจินตนาการได้ว่ามันเป็นส่วนสำคัญของปัญหา แต่ฉันจะแปลกใจถ้าการลดความซับซ้อนด้วยการจัดสรรที่สมบูรณ์แบบของฉันจะผิดมากกว่า 10% จากกรณีจริง ฉันยังแสร้งทำเป็นว่าสวิตช์รู้ความยาวของเฟรมเมื่อได้รับไบต์แรก เพื่อที่จะสำรองหน่วยความจำที่จำเป็นทั้งหมดในตอนเริ่มต้น เนื่องจากฉันไม่พบเอกสารใดๆ เกี่ยวกับขนาดของคิวขาเข้า/ขาออกของพอร์ต ฉันถือว่าพวกเขาทั้งหมดถูกวางไว้ในบัฟเฟอร์แพ็กเก็ตที่ใช้ร่วมกัน และพวกเขาสามารถใช้ส่วนใหญ่ของบัฟเฟอร์ได้ตามต้องการ (แม้ว่าฉันคิดว่าผู้ร้ายอาจเป็น ที่ไหนสักแห่งที่นี่)ฉันได้ตั้งค่าความล่าช้าในการประมวลผลของแต่ละแพ็กเก็ตเป็น 512 ns (ความล่าช้าในการแพร่กระจายของแพ็กเก็ต 64 B)
ฉันไม่แน่ใจว่ามันมีบทบาทหรือไม่ แต่สตรีมประกอบด้วยแพ็กเก็ต UDP ที่แยกส่วน (เช่น 25 kB ระเบิดเป็นแพ็กเก็ต UDP เดียวที่แยกส่วนเป็น 17 IP แฟรกเมนต์) สตรีมที่สองสร้างการระเบิดเป็นแพ็กเก็ต UDP ขนาด 20 kB 2 หรือ 3 แพ็กเก็ต โดยแต่ละแพ็กเก็ตแบ่งเป็น 14 IP แฟรกเมนต์
คำสั่ง Iperf 3.7 ในการทำซ้ำสตรีมให้คล้ายกับของจริงคือ:
iperf3 -c sink -u -b 128M -t 600 -l 25256 --pacing-timer 1560
iperf3 -c sink -u -b 400M -t 600 -l 20k --pacing-timer 1,000
คุณมีความคิดอื่นใดที่ฉันลืมคำนึงถึงซึ่งอาจทำให้การจำลองห่างไกลจากความเป็นจริงหรือไม่? ขอบคุณสำหรับความช่วยเหลือ!
ซอร์สโค้ดสำหรับแอนิเมชันอยู่ที่ https://gist.github.com/peci1/a0346538acc6c289b2c6d596b184ad21 .
นี่คือตารางผลลัพธ์ของฉันจากการทดลองจริง สตรีมข้อมูลคงที่ - 128 Mbps ในแพ็กเก็ต UDP 25 kB ทุกๆ 1.56 ms ฉันกำลังเปลี่ยนพารามิเตอร์ของสตรีมที่สองโดยพยายามค้นหาขีดจำกัดที่แพ็กเก็ตของสตรีมแรกจะเริ่มสูญหายโดยสวิตช์ ฉันกำลังเปลี่ยน -l
(ความยาว) พารามิเตอร์ที่ระบุขนาดของแพ็กเก็ต UDP และ -ข
พารามิเตอร์ (แบนด์วิธ) ระบุแบนด์วิธที่ควรสร้างแพ็กเก็ตเหล่านี้ --pacing-จับเวลา
ถูกตั้งค่าเป็น 1,000 เสมอสำหรับสตรีมที่สอง คุณจะเห็นว่า D-Link และ Netgear GS105 ไม่สามารถรับมือกับการระเบิดขนาด 60 kB ได้เลย GS108 ทำได้ดีกว่า GS105 มาก ในขณะที่มีชิปสวิตช์เกือบเหมือนกัน ("ตระกูลเดียวกัน" ต่างกันแค่จำนวนพอร์ตและบัฟเฟอร์ที่ใหญ่กว่าเล็กน้อย)
สวิตช์ |
ขนาดบัฟเฟอร์ [kB] |
ปริมาณการใช้งานสูงสุด 1.5kB ระเบิด |
ปริมาณการใช้งานสูงสุด 20kB ระเบิด |
ปริมาณการใช้งานสูงสุด 60kB ระเบิด |
Gigablox ทนทาน (VSC7512) |
220 |
825 Mbps |
825 Mbps |
825 Mbps |
Gigablox (RTL8367N-VB-CG) |
250 |
730 Mbps |
750 Mbps |
790 Mbps |
ดีลิงค์ DIS-100G-5W (QCA8337N-AL3C) |
128 |
110 Mbps |
1 เมกะบิตต่อวินาที |
ทุกการระเบิดจะสูญเสียแพ็กเก็ต |
ไซเซล XGS 1210-12 (RTL9302B) |
1500 |
800 Mbps |
830 Mbps |
830 Mbps |
เน็ตเกียร์ GS310-TP (RTL8380M) |
520 |
830 Mbps |
830 Mbps |
835 Mbps |
เน็ตเกียร์ GS308T (RTL8380M) |
520 |
830 Mbps |
835 Mbps |
835 Mbps |
เน็ตเกียร์ GS108 v3 (BCM53118) |
192 |
630 Mbps |
660 Mbps |
710 Mbps |
เน็ตเกียร์ GS105E (BCM53114) |
128 |
120 Mbps |
1 เมกะบิตต่อวินาที |
ทุกการระเบิดจะสูญเสียแพ็กเก็ต |
Renkforce RF-4270245 |
? |
740 Mbps |
760 Mbps |
800 Mbps |
ไมโครติ๊ก RB260GS (AR8327) |
128 |
835 Mbps |
835 Mbps |
835 Mbps |
จูนิเปอร์ EX2300 |
4 กิกะไบต์? |
800 Mbps |
830 Mbps |
830 Mbps |
(คำถามนี้ถูกย้ายจาก https://networkengineering.stackexchange.com/questions/78529/how-to-simulate-what-happens-inside-the-packet-buffer-of-a-simple-switch ซึ่งถูกทำเครื่องหมายว่านอกเรื่อง)