อาวุธลับของ TCP: การควบคุมการไหลของเครือข่ายและการควบคุมความแออัดของเครือข่าย

การขนส่งที่เชื่อถือได้ของ TCP
เราทุกคนคุ้นเคยกับโปรโตคอล TCP ในฐานะโปรโตคอลการขนส่งที่เชื่อถือได้ แต่โปรโตคอลนี้รับประกันความน่าเชื่อถือของการขนส่งได้อย่างไร?

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

ดังนั้น TCP จึงใช้กลไกต่างๆ เช่น หมายเลขลำดับ การตอบกลับยืนยัน การควบคุมการส่งซ้ำ การจัดการการเชื่อมต่อ และการควบคุมหน้าต่าง เพื่อให้การส่งข้อมูลมีความน่าเชื่อถือ

ในบทความนี้ เราจะเน้นไปที่กลไกหน้าต่างเลื่อน (sliding window) การควบคุมการไหล (flow control) และการควบคุมความแออัด (congestion control) ของ TCP ส่วนกลไกการส่งซ้ำจะกล่าวถึงแยกต่างหากในหัวข้อถัดไป

การควบคุมการไหลของเครือข่าย
การควบคุมการไหลของเครือข่าย หรือที่รู้จักกันในชื่อ การควบคุมปริมาณการรับส่งข้อมูลในเครือข่าย (Network Traffic Control) นั้น แท้จริงแล้วคือการแสดงออกถึงความสัมพันธ์ที่ซับซ้อนระหว่างผู้ผลิตและผู้บริโภค คุณอาจเคยเจอสถานการณ์นี้บ่อยๆ ในที่ทำงานหรือในการสัมภาษณ์ หากความสามารถในการผลิตของผู้ผลิตมีมากกว่าความสามารถในการบริโภคของผู้บริโภคอย่างมาก จะทำให้คิวเพิ่มขึ้นอย่างไม่มีที่สิ้นสุด ในกรณีที่ร้ายแรงกว่านั้น คุณอาจทราบว่าเมื่อข้อความ RabbitMQ สะสมมากเกินไป อาจทำให้ประสิทธิภาพของเซิร์ฟเวอร์ MQ ทั้งหมดลดลงได้ เช่นเดียวกับ TCP หากปล่อยไว้โดยไม่ควบคุม ข้อความจำนวนมากเกินไปจะถูกส่งไปยังเครือข่าย และผู้บริโภคจะเกินขีดความสามารถของตน ในขณะที่ผู้ผลิตจะยังคงส่งข้อความซ้ำ ซึ่งจะส่งผลกระทบอย่างมากต่อประสิทธิภาพของเครือข่าย

เพื่อแก้ไขปัญหานี้ TCP จึงมีกลไกให้ผู้ส่งควบคุมปริมาณข้อมูลที่ส่งโดยอิงจากความสามารถในการรับข้อมูลจริงของผู้รับ ซึ่งเรียกว่าการควบคุมการไหล (flow control) ผู้รับจะมีหน้าต่างรับข้อมูล (receive window) ในขณะที่ผู้ส่งจะมีหน้าต่างส่งข้อมูล (send window) ควรสังเกตว่าหน้าต่างเหล่านี้ใช้สำหรับเพียงการเชื่อมต่อ TCP เดียวเท่านั้น และไม่ใช่ทุกการเชื่อมต่อที่จะใช้หน้าต่างร่วมกัน

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

โฮสต์ผู้รับจะแจ้งให้ผู้ส่งทราบถึงขนาดของข้อมูลที่สามารถรับได้ และผู้ส่งจะส่งข้อมูลไม่เกินขีดจำกัดนี้ ขีดจำกัดนี้เรียกว่าขนาดหน้าต่าง (window size) จำส่วนหัวของ TCP ได้ไหม? มีฟิลด์หน้าต่างรับ (receive window field) ซึ่งใช้ระบุจำนวนไบต์ที่ผู้รับสามารถหรือเต็มใจที่จะรับ

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

นี่คือแผนภาพการควบคุมการไหลของเครือข่าย (Network Flow Control):

การควบคุมการจราจร

การควบคุมความแออัดของเครือข่าย
ก่อนที่จะกล่าวถึงการควบคุมความแออัด เราต้องเข้าใจก่อนว่า นอกเหนือจากหน้าต่างรับข้อมูล (Receive Window) และหน้าต่างส่งข้อมูล (Send Window) แล้ว ยังมีหน้าต่างความแออัด (Congestion Window) ซึ่งส่วนใหญ่ใช้เพื่อแก้ปัญหาว่าผู้ส่งเริ่มส่งข้อมูลไปยังหน้าต่างรับข้อมูลในอัตราเท่าใด ดังนั้น หน้าต่างความแออัดจึงถูกดูแลโดยผู้ส่ง TCP ด้วยเช่นกัน เราจำเป็นต้องมีอัลกอริทึมเพื่อตัดสินใจว่าควรส่งข้อมูลมากน้อยเพียงใด เนื่องจาก1การส่งข้อมูลน้อยเกินไปหรือมากเกินไปนั้นไม่เหมาะสม จึงเป็นที่มาของแนวคิดเรื่องหน้าต่างความแออัด

ในการควบคุมการไหลของข้อมูลในเครือข่ายแบบเดิม สิ่งที่เราหลีกเลี่ยงคือการที่ผู้ส่งเติมข้อมูลลงในแคชของผู้รับจนเต็ม แต่เราไม่ทราบว่าเกิดอะไรขึ้นในเครือข่าย โดยทั่วไปแล้ว เครือข่ายคอมพิวเตอร์จะอยู่ในสภาพแวดล้อมแบบใช้ร่วมกัน ดังนั้นจึงอาจเกิดความแออัดของเครือข่ายเนื่องจากการสื่อสารระหว่างโฮสต์อื่นๆ

เมื่อเครือข่ายเกิดความแออัด หากมีการส่งแพ็กเก็ตจำนวนมากอย่างต่อเนื่อง อาจทำให้เกิดปัญหา เช่น ความล่าช้าและการสูญหายของแพ็กเก็ต ในกรณีนี้ TCP จะส่งข้อมูลซ้ำ แต่การส่งซ้ำจะเพิ่มภาระให้กับเครือข่าย ส่งผลให้เกิดความล่าช้าและการสูญหายของแพ็กเก็ตมากขึ้น ซึ่งอาจกลายเป็นวงจรที่เลวร้ายและทวีความรุนแรงขึ้นเรื่อยๆ

ดังนั้น TCP จึงไม่สามารถเพิกเฉยต่อสิ่งที่เกิดขึ้นบนเครือข่ายได้ เมื่อเครือข่ายเกิดความแออัด TCP จะเสียสละตัวเองโดยการลดปริมาณข้อมูลที่ส่งออกไป

ดังนั้น จึงมีการเสนอการควบคุมความแออัด ซึ่งมีเป้าหมายเพื่อหลีกเลี่ยงไม่ให้เครือข่ายทั้งหมดเต็มไปด้วยข้อมูลจากผู้ส่ง เพื่อควบคุมปริมาณข้อมูลที่ผู้ส่งควรส่ง TCP จึงกำหนดแนวคิดที่เรียกว่าหน้าต่างความแออัด (congestion window) อัลกอริทึมควบคุมความแออัดจะปรับขนาดของหน้าต่างความแออัดตามระดับความแออัดของเครือข่าย เพื่อควบคุมปริมาณข้อมูลที่ผู้ส่งส่ง

หน้าต่างควบคุมความแออัดคืออะไร? และเกี่ยวข้องกันอย่างไรกับหน้าต่างส่งข้อมูล?

หน้าต่างควบคุมปริมาณการรับส่งข้อมูล (Congestion Window) เป็นตัวแปรสถานะที่ผู้ส่งใช้กำหนดปริมาณข้อมูลที่ผู้ส่งสามารถส่งได้ หน้าต่างควบคุมปริมาณการรับส่งข้อมูลจะเปลี่ยนแปลงแบบไดนามิกตามระดับความหนาแน่นของเครือข่าย

หน้าต่างการส่ง (Sending Window) คือขนาดหน้าต่างที่ตกลงกันระหว่างผู้ส่งและผู้รับ ซึ่งระบุปริมาณข้อมูลที่ผู้รับสามารถรับได้ หน้าต่างการแออัด (Congestion Window) และหน้าต่างการส่งมีความสัมพันธ์กัน โดยปกติแล้วหน้าต่างการส่งจะมีขนาดเท่ากับค่าต่ำสุดของหน้าต่างการแออัดและหน้าต่างการรับ นั่นคือ swnd = min(cwnd, rwnd)

ค่าหน้าต่างความแออัด cwnd จะเปลี่ยนแปลงดังนี้:

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

หากเกิดความแออัดในเครือข่าย ค่าหน้าต่างความแออัดจะลดลง

ผู้ส่งจะตรวจสอบว่าเครือข่ายเกิดความแออัดหรือไม่ โดยสังเกตว่าได้รับแพ็กเก็ตยืนยันการรับ (ACK) ภายในเวลาที่กำหนดหรือไม่ หากผู้ส่งไม่ได้รับแพ็กเก็ตยืนยันการรับ (ACK) ภายในเวลาที่กำหนด จะถือว่าเครือข่ายเกิดความแออัด

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

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

เริ่มต้นช้า
เมื่อมีการสร้างการเชื่อมต่อ TCP หน้าต่างควบคุมความแออัด (cwnd) จะถูกตั้งค่าเริ่มต้นเป็นค่า MSS (ขนาดส่วนสูงสุด) ขั้นต่ำ ด้วยวิธีนี้ อัตราการส่งข้อมูลเริ่มต้นจะอยู่ที่ประมาณ MSS/RTT ไบต์ต่อวินาที แบนด์วิดท์ที่ใช้งานได้จริงมักจะมากกว่า MSS/RTT มาก ดังนั้น TCP จึงต้องการค้นหาอัตราการส่งข้อมูลที่เหมาะสมที่สุด ซึ่งสามารถทำได้โดยใช้การเริ่มต้นแบบช้า (slow-start)

ในกระบวนการเริ่มต้นช้า (slow-start) ค่าของหน้าต่างความแออัด (congestion window) cwnd จะถูกกำหนดค่าเริ่มต้นเป็น 1 MSS และทุกครั้งที่ส่วนของแพ็กเก็ตที่ส่งไปได้รับการยืนยัน ค่าของ cwnd จะเพิ่มขึ้นทีละ 1 MSS นั่นคือ ค่าของ cwnd จะกลายเป็น 2 MSS หลังจากนั้น ค่าของ cwnd จะเพิ่มขึ้นเป็นสองเท่าทุกครั้งที่มีการส่งส่วนของแพ็กเก็ตสำเร็จ และเป็นเช่นนี้เรื่อยไป กระบวนการเติบโตโดยละเอียดแสดงอยู่ในรูปต่อไปนี้

 การควบคุมความแออัดของเครือข่าย

อย่างไรก็ตาม อัตราการส่งไม่สามารถเพิ่มขึ้นได้ตลอดเวลา การเติบโตต้องสิ้นสุดลงในที่สุด ดังนั้น การเพิ่มขึ้นของอัตราการส่งจะสิ้นสุดลงเมื่อใด? โดยทั่วไปแล้ว การเริ่มต้นอย่างช้าๆ จะทำให้การเพิ่มขึ้นของอัตราการส่งสิ้นสุดลงด้วยวิธีใดวิธีหนึ่งดังต่อไปนี้:

วิธีแรกคือกรณีแพ็กเก็ตสูญหายระหว่างกระบวนการส่งข้อมูลแบบ Slow Start เมื่อแพ็กเก็ตสูญหาย TCP จะตั้งค่าหน้าต่างความแออัด (congestion window) cwnd ของผู้ส่งเป็น 1 และเริ่มกระบวนการ Slow Start ใหม่ ในจุดนี้ จะมีการนำแนวคิดของค่าเกณฑ์ Slow Start (ssthresh) มาใช้ โดยค่าเริ่มต้นของ ssthresh จะเป็นครึ่งหนึ่งของค่า cwnd ที่ทำให้เกิดการสูญหายของแพ็กเก็ต กล่าวคือ เมื่อตรวจพบความแออัด ค่าของ ssthresh จะเป็นครึ่งหนึ่งของค่าหน้าต่าง

วิธีที่สองคือการเชื่อมโยงโดยตรงกับค่าเกณฑ์การเริ่มต้นช้า (ssthresh) เนื่องจากค่าของ ssthresh คือครึ่งหนึ่งของค่าหน้าต่างเมื่อตรวจพบความแออัด การสูญหายของแพ็กเก็ตอาจเกิดขึ้นทุกครั้งที่ค่า cwnd เพิ่มขึ้นเป็นสองเท่าเมื่อ cwnd มีค่ามากกว่า ssthresh ดังนั้นจึงควรตั้งค่า cwnd ให้เท่ากับ ssthresh ซึ่งจะทำให้ TCP เปลี่ยนไปใช้โหมดควบคุมความแออัดและยุติการเริ่มต้นช้า

วิธีสุดท้ายที่การเริ่มต้นช้า (slow start) จะสิ้นสุดลงได้คือ หากตรวจพบ ACK ที่ซ้ำซ้อนสามรายการ TCP จะทำการส่งซ้ำอย่างรวดเร็วและเข้าสู่สถานะการกู้คืน (หากไม่เข้าใจว่าทำไมจึงมีแพ็กเก็ต ACK สามรายการ จะมีการอธิบายเพิ่มเติมในส่วนกลไกการส่งซ้ำ)

การหลีกเลี่ยงความแออัด
เมื่อ TCP เข้าสู่สถานะควบคุมความแออัด (congestion control state) ค่า cwnd จะถูกตั้งเป็นครึ่งหนึ่งของค่าเกณฑ์ความแออัด ssthresh หมายความว่าค่า cwnd จะไม่เพิ่มขึ้นเป็นสองเท่าทุกครั้งที่ได้รับส่วนของแพ็กเก็ต แต่จะใช้วิธีการที่ค่อนข้างระมัดระวัง โดยค่า cwnd จะเพิ่มขึ้นเพียงหนึ่ง MSS (ความยาวส่วนของแพ็กเก็ตสูงสุด) หลังจากส่งข้อมูลเสร็จสิ้นแต่ละครั้ง ตัวอย่างเช่น แม้ว่าจะมีการยืนยันส่วนของแพ็กเก็ต 10 ส่วน ค่า cwnd ก็จะเพิ่มขึ้นเพียงหนึ่ง MSS เท่านั้น นี่คือแบบจำลองการเติบโตเชิงเส้นและมีขีดจำกัดสูงสุดของการเติบโตด้วย เมื่อเกิดการสูญหายของแพ็กเก็ต ค่า cwnd จะเปลี่ยนเป็นค่า MSS และค่า ssthresh จะถูกตั้งเป็นครึ่งหนึ่งของ cwnd หรือจะหยุดการเติบโตของ MSS เมื่อได้รับคำตอบ ACK ที่ซ้ำซ้อน 3 ครั้ง หากยังคงได้รับ ACK ที่ซ้ำซ้อนสามครั้งหลังจากลดค่า cwnd ลงครึ่งหนึ่ง ค่า ssthresh จะถูกบันทึกเป็นครึ่งหนึ่งของค่า cwnd และเข้าสู่สถานะการกู้คืนอย่างรวดเร็ว

ฟื้นตัวเร็ว
ในสถานะการกู้คืนอย่างรวดเร็ว (Fast Recovery) ค่าของหน้าต่างความแออัด (congestion window) cwnd จะเพิ่มขึ้นหนึ่ง MSS สำหรับแต่ละ ACK ที่ได้รับซ้ำซ้อน กล่าวคือ ACK ที่ไม่ได้มาถึงตามลำดับ ทั้งนี้เพื่อใช้ประโยชน์จากส่วนของแพ็กเก็ตที่ส่งผ่านเครือข่ายสำเร็จแล้ว เพื่อเพิ่มประสิทธิภาพการส่งข้อมูลให้มากที่สุด

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

หากเกิดการหมดเวลาหลังจากสถานะควบคุมความแออัด เครือข่ายจะมีสภาพที่รุนแรงขึ้น และ TCP จะเปลี่ยนจากสถานะหลีกเลี่ยงความแออัดไปเป็นสถานะเริ่มต้นช้า ในกรณีนี้ ค่าของหน้าต่างความแออัด cwnd จะถูกตั้งค่าเป็น 1 MSS ซึ่งเป็นความยาวส่วนแพ็กเก็ตสูงสุด และค่าของเกณฑ์เริ่มต้นช้า ssthresh จะถูกตั้งค่าเป็นครึ่งหนึ่งของ cwnd จุดประสงค์ของการทำเช่นนี้คือเพื่อค่อยๆ เพิ่มขนาดของหน้าต่างความแออัดอีกครั้งหลังจากที่เครือข่ายฟื้นตัว เพื่อรักษาสมดุลระหว่างอัตราการส่งข้อมูลและระดับความแออัดของเครือข่าย

สรุป
TCP เป็นโปรโตคอลการขนส่งที่เชื่อถือได้ โดยใช้กลไกต่างๆ เช่น หมายเลขลำดับ การยืนยัน การควบคุมการส่งซ้ำ การจัดการการเชื่อมต่อ และการควบคุมหน้าต่าง ในบรรดากลไกเหล่านี้ กลไกการควบคุมการไหลจะควบคุมปริมาณข้อมูลที่ผู้ส่งส่งตามความสามารถในการรับข้อมูลจริงของผู้รับ ซึ่งจะช่วยหลีกเลี่ยงปัญหาความแออัดของเครือข่ายและประสิทธิภาพการทำงานที่ลดลง ส่วนกลไกการควบคุมความแออัดจะช่วยป้องกันการเกิดความแออัดของเครือข่ายโดยการปรับปริมาณข้อมูลที่ผู้ส่งส่ง แนวคิดของหน้าต่างความแออัดและหน้าต่างการส่งมีความสัมพันธ์กัน และปริมาณข้อมูลที่ผู้ส่งจะถูกควบคุมโดยการปรับขนาดของหน้าต่างความแออัดแบบไดนามิก การเริ่มต้นช้า การหลีกเลี่ยงความแออัด และการกู้คืนอย่างรวดเร็ว เป็นสามส่วนหลักของอัลกอริทึมการควบคุมความแออัดของ TCP ซึ่งจะปรับขนาดของหน้าต่างความแออัดผ่านกลยุทธ์ต่างๆ เพื่อให้เข้ากับความจุและระดับความแออัดของเครือข่าย

ในส่วนถัดไป เราจะมาพิจารณากลไกการส่งซ้ำของ TCP อย่างละเอียด กลไกการส่งซ้ำเป็นส่วนสำคัญของ TCP เพื่อให้การส่งข้อมูลมีความน่าเชื่อถือ โดยจะช่วยให้มั่นใจได้ว่าข้อมูลจะถูกส่งอย่างน่าเชื่อถือด้วยการส่งข้อมูลที่สูญหาย เสียหาย หรือล่าช้าซ้ำอีกครั้ง หลักการและกลยุทธ์การทำงานของกลไกการส่งซ้ำจะถูกนำเสนอและวิเคราะห์อย่างละเอียดในส่วนถัดไป โปรดติดตาม!


วันที่เผยแพร่: 24 กุมภาพันธ์ 2568