การขนส่งความน่าเชื่อถือของ TCP
เราทุกคนคุ้นเคยกับโปรโตคอล TCP ในฐานะโปรโตคอลการขนส่งที่เชื่อถือได้ แต่จะรับประกันความน่าเชื่อถือของการขนส่งได้อย่างไร
เพื่อให้การส่งข้อมูลมีความน่าเชื่อถือ จำเป็นต้องพิจารณาปัจจัยหลายประการ เช่น ข้อมูลเสียหาย สูญหาย ซ้ำซ้อน และชิ้นส่วนไม่เป็นระเบียบ หากไม่สามารถแก้ไขปัญหาเหล่านี้ได้ การส่งข้อมูลก็จะไม่น่าเชื่อถือ
ดังนั้น TCP จึงใช้กลไกต่างๆ เช่น หมายเลขลำดับ การตอบรับการยืนยัน การควบคุมการส่งซ้ำ การจัดการการเชื่อมต่อ และการควบคุมหน้าต่าง เพื่อให้การส่งข้อมูลมีความน่าเชื่อถือ
ในบทความนี้ เราจะเน้นที่หน้าต่างแบบเลื่อน การควบคุมการไหล และการควบคุมความแออัดของ TCP กลไกการส่งซ้ำจะอธิบายแยกกันในหัวข้อถัดไป
การควบคุมการไหลของเครือข่าย
Network Flow Control หรือที่เรียกอีกอย่างว่า Network Traffic Control เป็นการแสดงให้เห็นถึงความสัมพันธ์อันละเอียดอ่อนระหว่างผู้ผลิตและผู้บริโภค คุณอาจเคยเจอสถานการณ์นี้บ่อยครั้งในการทำงานหรือในการสัมภาษณ์ หากความสามารถในการผลิตของผู้ผลิตเกินความสามารถในการบริโภคของผู้บริโภคมากเกินไป จะทำให้คิวยาวขึ้นอย่างไม่มีกำหนด ในกรณีที่ร้ายแรงกว่านี้ คุณอาจทราบว่าเมื่อข้อความ RabbitMQ สะสมมากเกินไป อาจทำให้ประสิทธิภาพของเซิร์ฟเวอร์ MQ ทั้งหมดลดลง เช่นเดียวกับ TCP หากไม่ได้ตรวจสอบ ข้อความจำนวนมากเกินไปจะถูกใส่ลงในเครือข่าย และผู้บริโภคจะเกินขีดความสามารถของตน ในขณะที่ผู้ผลิตจะยังคงส่งข้อความซ้ำ ซึ่งจะส่งผลกระทบต่อประสิทธิภาพของเครือข่ายอย่างมาก
เพื่อแก้ไขปรากฏการณ์นี้ TCP จึงจัดเตรียมกลไกให้ผู้ส่งควบคุมปริมาณข้อมูลที่ส่งโดยอิงตามความสามารถในการรับข้อมูลจริงของผู้รับ ซึ่งเรียกว่าการควบคุมการไหลข้อมูล ผู้รับจะรักษาหน้าต่างการรับข้อมูล ในขณะที่ผู้ส่งจะรักษาหน้าต่างการส่งข้อมูล โปรดทราบว่าหน้าต่างเหล่านี้มีไว้สำหรับการเชื่อมต่อ TCP เดียวเท่านั้น และไม่ใช่การเชื่อมต่อทั้งหมดที่จะแบ่งปันหน้าต่างเดียวกัน
TCP จัดให้มีการควบคุมการไหลข้อมูลโดยใช้ตัวแปรสำหรับหน้าต่างรับ หน้าต่างรับจะแจ้งผู้ส่งว่ายังมีพื้นที่แคชเหลืออยู่เท่าใด ผู้ส่งจะควบคุมปริมาณข้อมูลที่ส่งตามความสามารถในการรับข้อมูลจริงของผู้รับ
โฮสต์ของผู้รับจะแจ้งให้ผู้ส่งทราบถึงขนาดของข้อมูลที่สามารถรับได้ และผู้ส่งจะส่งจนถึงขีดจำกัดนี้ ขีดจำกัดนี้คือขนาดหน้าต่าง จำส่วนหัวของ TCP ได้ไหม มีฟิลด์หน้าต่างรับซึ่งใช้เพื่อระบุจำนวนไบต์ที่ผู้รับสามารถรับหรือเต็มใจที่จะรับ
โฮสต์ผู้ส่งจะส่งแพ็กเก็ตตรวจสอบหน้าต่างเป็นระยะๆ ซึ่งใช้เพื่อตรวจจับว่าโฮสต์ผู้รับยังสามารถรับข้อมูลได้หรือไม่ เมื่อบัฟเฟอร์ของผู้รับมีความเสี่ยงที่จะล้น ขนาดหน้าต่างจะถูกตั้งค่าเป็นค่าที่เล็กลงเพื่อสั่งให้ผู้ส่งควบคุมปริมาณข้อมูลที่ส่ง
นี่คือไดอะแกรมการควบคุมการไหลของเครือข่าย:
การควบคุมความแออัดของเครือข่าย
ก่อนที่จะนำการควบคุมความแออัดมาใช้ เราจำเป็นต้องเข้าใจว่านอกเหนือจากหน้าต่างรับและหน้าต่างส่งแล้ว ยังมีหน้าต่างความแออัดด้วย ซึ่งส่วนใหญ่ใช้เพื่อแก้ปัญหาว่าผู้ส่งเริ่มส่งข้อมูลไปยังหน้าต่างรับในอัตราใด ดังนั้น หน้าต่างความแออัดจึงได้รับการดูแลโดยผู้ส่ง TCP ด้วย เราจำเป็นต้องมีอัลกอริทึมเพื่อตัดสินใจว่าข้อมูลจำนวนเท่าใดจึงจะเหมาะสมที่จะส่ง เนื่องจากการส่งข้อมูลน้อยเกินไปหรือมากเกินไปนั้นไม่เหมาะสม ดังนั้นจึงมีแนวคิดของหน้าต่างความแออัด
ในการควบคุมการไหลของเครือข่ายก่อนหน้านี้ สิ่งที่เราหลีกเลี่ยงคือผู้ส่งที่เติมข้อมูลลงในแคชของผู้รับ แต่เราไม่ทราบว่าเกิดอะไรขึ้นในเครือข่าย โดยทั่วไป เครือข่ายคอมพิวเตอร์จะอยู่ในสภาพแวดล้อมที่ใช้ร่วมกัน ส่งผลให้อาจเกิดความแออัดของเครือข่ายเนื่องจากการสื่อสารระหว่างโฮสต์อื่น
เมื่อเครือข่ายติดขัด หากมีการส่งแพ็กเก็ตจำนวนมากอย่างต่อเนื่อง อาจทำให้เกิดปัญหาต่างๆ เช่น ความล่าช้าและการสูญหายของแพ็กเก็ต เมื่อถึงจุดนี้ TCP จะส่งข้อมูลซ้ำ แต่การส่งซ้ำจะเพิ่มภาระให้กับเครือข่าย ส่งผลให้เกิดความล่าช้าและการสูญเสียแพ็กเก็ตมากขึ้น ซึ่งอาจกลายเป็นวงจรอุบาทว์และใหญ่ขึ้นเรื่อยๆ
ดังนั้น TCP จึงไม่สามารถละเลยสิ่งที่เกิดขึ้นบนเครือข่ายได้ เมื่อเครือข่ายเกิดความแออัด TCP จะเสียสละตัวเองโดยลดปริมาณข้อมูลที่ส่ง
ดังนั้นจึงมีการเสนอวิธีควบคุมความแออัด ซึ่งมุ่งหวังที่จะหลีกเลี่ยงการเติมข้อมูลของผู้ส่งลงในเครือข่ายทั้งหมด เพื่อควบคุมปริมาณข้อมูลที่ผู้ส่งควรส่ง TCP จึงกำหนดแนวคิดที่เรียกว่าหน้าต่างความแออัด อัลกอริธึมการควบคุมความแออัดจะปรับขนาดของหน้าต่างความแออัดตามระดับความแออัดของเครือข่าย เพื่อควบคุมปริมาณข้อมูลที่ผู้ส่งส่ง
Congestion window คืออะไร เกี่ยวข้องกับหน้าต่างการส่งอย่างไร
Congestion Window คือตัวแปรสถานะที่ผู้ส่งดูแล โดยจะกำหนดปริมาณข้อมูลที่ผู้ส่งสามารถส่งได้ Congestion Window จะเปลี่ยนแปลงแบบไดนามิกตามระดับความแออัดของเครือข่าย
Sending Window คือขนาดหน้าต่างที่ตกลงกันระหว่างผู้ส่งและผู้รับ ซึ่งระบุปริมาณข้อมูลที่ผู้รับสามารถรับได้ หน้าต่างความแออัดและหน้าต่างการส่งมีความเกี่ยวข้องกัน โดยทั่วไปแล้ว หน้าต่างการส่งจะเท่ากับค่าต่ำสุดของหน้าต่างความแออัดและหน้าต่างการรับ นั่นคือ swnd = min(cwnd, rwnd)
หน้าต่างความแออัด cwnd เปลี่ยนแปลงดังนี้:
ถ้าไม่มีการติดขัดในเครือข่าย กล่าวคือ ไม่มีการหมดเวลาการส่งข้อมูลซ้ำ หน้าต่างการติดขัดจะเพิ่มขึ้น
หากเกิดการติดขัดในเครือข่าย หน้าต่างความติดขัดจะลดลง
ผู้ส่งจะพิจารณาว่าเครือข่ายติดขัดหรือไม่โดยสังเกตว่าได้รับแพ็กเก็ตยืนยัน ACK ภายในเวลาที่กำหนดหรือไม่ หากผู้ส่งไม่ได้รับแพ็กเก็ตยืนยัน ACK ภายในเวลาที่กำหนด จะถือว่าเครือข่ายติดขัด
นอกจากหน้าต่างความแออัดแล้ว ก็ได้เวลามาพูดคุยถึงอัลกอริทึมการควบคุมความแออัดของ TCP อัลกอริทึมการควบคุมความแออัดของ TCP ประกอบด้วยสามส่วนหลัก:
การเริ่มต้นช้า:ในช่วงแรก หน้าต่างความแออัดของเครือข่ายจะค่อนข้างเล็ก และผู้ส่งจะเพิ่มหน้าต่างความแออัดขึ้นแบบทวีคูณเพื่อให้ปรับตัวเข้ากับความจุของเครือข่ายได้อย่างรวดเร็ว
การหลีกเลี่ยงความแออัด:หลังจากหน้าต่างความแออัดเกินเกณฑ์บางอย่าง ผู้ส่งจะเพิ่มหน้าต่างความแออัดในลักษณะเชิงเส้นเพื่อลดอัตราการเติบโตของหน้าต่างความแออัดและหลีกเลี่ยงการโอเวอร์โหลดของเครือข่าย
การกู้คืนอย่างรวดเร็ว:หากเกิดความแออัด ผู้ส่งจะแบ่งหน้าต่างความแออัดออกเป็นสองส่วน และเข้าสู่สถานะการกู้คืนอย่างรวดเร็ว เพื่อระบุตำแหน่งของการกู้คืนเครือข่ายผ่านการยืนยันข้อมูลซ้ำซ้อนที่ได้รับ จากนั้นจึงขยายหน้าต่างความแออัดต่อไป
การเริ่มต้นช้า
เมื่อสร้างการเชื่อมต่อ TCP หน้าต่างความแออัด cwnd จะถูกตั้งค่าเป็นค่า MSS ขั้นต่ำ (ขนาดเซกเมนต์สูงสุด) ในตอนแรก วิธีนี้ทำให้อัตราการส่งเริ่มต้นอยู่ที่ประมาณไบต์ MSS/RTT ต่อวินาที แบนด์วิดท์ที่พร้อมใช้งานจริงมักจะมากกว่า MSS/RTT มาก ดังนั้น TCP จึงต้องการค้นหาอัตราการส่งที่เหมาะสม ซึ่งสามารถทำได้โดยใช้การเริ่มต้นแบบช้า
ในกระบวนการเริ่มต้นช้า ค่าของหน้าต่างความแออัด cwnd จะถูกตั้งค่าเริ่มต้นเป็น 1 MSS และทุกครั้งที่มีการยอมรับเซกเมนต์แพ็กเก็ตที่ส่งออก ค่าของ cwnd จะเพิ่มขึ้นหนึ่ง MSS นั่นคือ ค่าของ cwnd จะกลายเป็น 2 MSS หลังจากนั้น ค่าของ cwnd จะเพิ่มเป็นสองเท่าสำหรับการส่งเซกเมนต์แพ็กเก็ตที่ประสบความสำเร็จแต่ละครั้ง และเป็นเช่นนี้ต่อไป กระบวนการเติบโตที่เฉพาะเจาะจงจะแสดงไว้ในรูปต่อไปนี้
อย่างไรก็ตาม อัตราการส่งไม่สามารถเพิ่มขึ้นได้เสมอไป การเติบโตนั้นจะต้องสิ้นสุดลงในสักวันหนึ่ง ดังนั้น การเพิ่มขึ้นของอัตราการส่งจะสิ้นสุดลงเมื่อใด การเริ่มต้นช้ามักจะยุติการเพิ่มขึ้นของอัตราการส่งด้วยวิธีใดวิธีหนึ่งจากหลายวิธีดังต่อไปนี้
วิธีแรกคือกรณีของการสูญเสียแพ็กเก็ตระหว่างกระบวนการส่งที่มีการเริ่มต้นช้า เมื่อเกิดการสูญเสียแพ็กเก็ต TCP จะตั้งค่าหน้าต่างความแออัดของผู้ส่ง cwnd เป็น 1 และเริ่มกระบวนการเริ่มต้นช้าใหม่ ณ จุดนี้ แนวคิดของเกณฑ์การเริ่มต้นช้า ssthresh จะถูกนำเสนอ ซึ่งค่าเริ่มต้นคือครึ่งหนึ่งของค่า cwnd ที่สร้างการสูญเสียแพ็กเก็ต นั่นคือ เมื่อตรวจพบความแออัด ค่าของ ssthresh จะเป็นครึ่งหนึ่งของค่าหน้าต่าง
วิธีที่สองคือการเชื่อมโยงโดยตรงกับค่าเกณฑ์การเริ่มต้นช้า ssthresh เนื่องจากค่าของ ssthresh เท่ากับครึ่งหนึ่งของค่าหน้าต่างเมื่อตรวจพบความแออัด จึงอาจเกิดการสูญเสียแพ็กเก็ตได้ทุกครั้งที่มีการเพิ่มขึ้นเป็นสองเท่าเมื่อ cwnd มีค่ามากกว่า ssthresh ดังนั้น จึงควรตั้งค่า cwnd เป็น ssthresh ซึ่งจะทำให้ TCP สลับไปที่โหมดควบคุมความแออัดและสิ้นสุดการเริ่มต้นช้า
วิธีสุดท้ายที่สามารถยุติการเริ่มต้นช้าได้คือ หากตรวจพบการตอบรับซ้ำซ้อนสามครั้ง TCP จะดำเนินการส่งสัญญาณซ้ำอย่างรวดเร็วและเข้าสู่สถานะการกู้คืน (หากไม่ชัดเจนว่าทำไมจึงมีแพ็กเก็ต ACK สามแพ็กเก็ต เราจะอธิบายแยกกันในกลไกการส่งสัญญาณซ้ำ)
การหลีกเลี่ยงความแออัด
เมื่อ TCP เข้าสู่สถานะควบคุมความแออัด cwnd จะถูกตั้งค่าเป็นครึ่งหนึ่งของเกณฑ์ความแออัด ssthresh ซึ่งหมายความว่าค่าของ cwnd ไม่สามารถเพิ่มเป็นสองเท่าได้ทุกครั้งที่ได้รับเซกเมนต์ของแพ็กเก็ต แทนที่จะเป็นเช่นนั้น จะใช้แนวทางที่ค่อนข้างอนุรักษ์นิยม ซึ่งค่าของ cwnd จะเพิ่มขึ้นเพียงหนึ่ง MSS (ความยาวเซกเมนต์ของแพ็กเก็ตสูงสุด) หลังจากการส่งแต่ละครั้งเสร็จสิ้น ตัวอย่างเช่น แม้ว่าจะมีการยอมรับเซกเมนต์ของแพ็กเก็ต 10 เซกเมนต์ ค่าของ cwnd จะเพิ่มขึ้นเพียงหนึ่ง MSS เท่านั้น นี่คือโมเดลการเติบโตเชิงเส้นและยังมีขอบเขตบนของการเติบโตอีกด้วย เมื่อเกิดการสูญเสียแพ็กเก็ต ค่าของ cwnd จะเปลี่ยนเป็น MSS และค่าของ ssthresh จะถูกตั้งค่าเป็นครึ่งหนึ่งของ cwnd หรือจะหยุดการเติบโตของ MSS เมื่อได้รับการตอบสนอง ACK ซ้ำซ้อน 3 ครั้ง หากยังได้รับการตอบรับซ้ำซ้อนสามครั้งหลังจากลดค่า cwnd ลงครึ่งหนึ่ง ค่าของ ssthresh จะถูกบันทึกเป็นครึ่งหนึ่งของค่า cwnd และเข้าสู่สถานะการกู้คืนอย่างรวดเร็ว
การกู้คืนอย่างรวดเร็ว
ในสถานะการกู้คืนอย่างรวดเร็ว ค่าของหน้าต่างความแออัด cwnd จะเพิ่มขึ้นหนึ่ง MSS สำหรับ ACK ซ้ำซ้อนที่ได้รับแต่ละรายการ นั่นคือ ACK ที่ไม่มาถึงตามลำดับ นี่คือการใช้ประโยชน์จากเซกเมนต์แพ็กเก็ตที่ส่งสำเร็จในเครือข่ายเพื่อปรับปรุงประสิทธิภาพในการส่งข้อมูลให้ได้มากที่สุด
เมื่อได้รับ ACK ของเซกเมนต์แพ็กเก็ตที่สูญหาย TCP จะลดค่าของ cwnd จากนั้นจึงเข้าสู่สถานะหลีกเลี่ยงความแออัด ซึ่งเป็นการควบคุมขนาดของหน้าต่างความแออัดและหลีกเลี่ยงการเพิ่มความแออัดของเครือข่ายเพิ่มเติม
หากเกิดการหมดเวลาหลังจากสถานะควบคุมความแออัด สภาพเครือข่ายจะยิ่งร้ายแรงขึ้น และ TCP จะย้ายจากสถานะหลีกเลี่ยงความแออัดไปเป็นสถานะเริ่มต้นช้า ในกรณีนี้ ค่าของหน้าต่างความแออัด cwnd จะถูกตั้งเป็น 1 MSS ความยาวเซกเมนต์แพ็กเก็ตสูงสุด และค่าของเกณฑ์การเริ่มต้นช้า ssthresh จะถูกตั้งเป็นครึ่งหนึ่งของ cwnd จุดประสงค์ของสิ่งนี้คือเพื่อเพิ่มขนาดหน้าต่างความแออัดอีกครั้งอย่างค่อยเป็นค่อยไปหลังจากที่เครือข่ายฟื้นตัวเพื่อสร้างสมดุลระหว่างอัตราการส่งข้อมูลและระดับความแออัดของเครือข่าย
สรุป
ในฐานะโปรโตคอลการขนส่งที่เชื่อถือได้ TCP ใช้การขนส่งที่เชื่อถือได้โดยใช้หมายเลขลำดับ การรับทราบ การควบคุมการส่งซ้ำ การจัดการการเชื่อมต่อ และการควบคุมหน้าต่าง ในบรรดานั้น กลไกการควบคุมการไหลจะควบคุมปริมาณข้อมูลที่ส่งโดยผู้ส่งตามความจุการรับจริงของผู้รับ ซึ่งหลีกเลี่ยงปัญหาความแออัดของเครือข่ายและการเสื่อมประสิทธิภาพ กลไกการควบคุมความแออัดจะหลีกเลี่ยงการเกิดความแออัดของเครือข่ายโดยการปรับปริมาณข้อมูลที่ส่งโดยผู้ส่ง แนวคิดของหน้าต่างความแออัดและหน้าต่างการส่งมีความเกี่ยวข้องกัน และปริมาณข้อมูลที่ผู้ส่งจะถูกควบคุมโดยการปรับขนาดหน้าต่างความแออัดแบบไดนามิก การเริ่มต้นช้า การหลีกเลี่ยงความแออัด และการกู้คืนอย่างรวดเร็วเป็นสามส่วนหลักของอัลกอริทึมการควบคุมความแออัดของ TCP ซึ่งปรับขนาดหน้าต่างความแออัดผ่านกลยุทธ์ต่างๆ เพื่อปรับให้เข้ากับความจุและระดับความแออัดของเครือข่าย
ในหัวข้อถัดไป เราจะมาศึกษากลไกการส่งข้อมูลซ้ำของ TCP อย่างละเอียด กลไกการส่งข้อมูลซ้ำเป็นส่วนสำคัญของ TCP ที่ช่วยให้การส่งข้อมูลมีความน่าเชื่อถือ กลไกนี้ช่วยให้มั่นใจได้ว่าข้อมูลจะถูกส่งต่อได้อย่างน่าเชื่อถือโดยการส่งข้อมูลที่สูญหาย เสียหาย หรือล่าช้าซ้ำ หลักการและกลยุทธ์การใช้งานของกลไกการส่งข้อมูลซ้ำจะได้รับการแนะนำและวิเคราะห์อย่างละเอียดในหัวข้อถัดไป โปรดติดตาม!
เวลาโพสต์ : 24 ก.พ. 2568