ในชีวิตประจำวันของพวกเราคงหนีไม่พ้นเรื่องการเดินทางไปยังสถานที่ต่าง ๆ อาจจะโดยการขับรถยนต์ส่วนตัว นั่งรถเมล์ รถไฟฟ้า ฯลฯ ด้วยเหตุจำเป็นเพื่อไปติดต่องานทำธุระหรือสมัครใจไปเองเพื่อออกไปพักผ่อนหย่อนใจ สิ่งที่ทุกคนมักจะคิดก่อนที่จะออกเดินทางก็คือ รถจะติดหรือเปล่า ถ้าคนที่ไม่อยากออกไปจมจ่อมอยู่กลางท้องถนนเป็นชั่วโมง ๆ ก็มักจะตรวจเช็คข่าวการจราจรจากทางอินเตอร์เน็ต วิทยุ โทรทัศน์ ก่อน ว่า สภาพการจราจรของสถานที่ ที่เรากำลังจะเดินทางไปนั้น ถ้าเช็คข่าวแล้วมีการจราจรติดขัดมาก ถ้าสามารถเลี่ยงได้ก็อาจจะเปลี่ยนใจยกเลิกการเดินทางในวันนั้นแล้วค่อยวางแผนไปใหม่อีกครั้งในวันที่การจราจรปลอดโปร่ง
ในอินเตอร์เน็ตก็มีกลไกเพื่อหลีกเลี่ยงการเดินทางในช่วงการจราจรติดขัดเหมือนกัน protocol TCP นอกจากมีบริการควบคุมปริมาณการรับส่งที่เหมาะสมระหว่างผู้รับและผู้ส่ง (ดู flow control) ยังมีบริการที่ป้องกันการส่งข้อมูลในช่วงที่เครือข่ายมีความหนาแน่นสูง (congested network) เรียกว่าcongestion control สาเหตุก็เพราะว่าการส่งข้อมูลจำนวนมากเข้าไปในเครือข่ายที่มีความหนาแน่นสูงนั้น มีโอกาสสูงที่ข้อมูลเหล่านั้นจะไปไม่ถึงผู้รับ เนื่องจาก packet จะถูกละทิ้ง(drop) โดย router ที่มีขนาดของ buffer ที่จำกัดจึงไม่สามารถรองรับข้อมูลที่ส่งมาในปริมาณมากล้นจนเกินกำลังของ router ที่จะจัดการได้ router จึงจำเป็นต้องละทิ้งข้อมูลส่วนที่ล้นเกินออกไป
TCP ของ host ฝั่งผู้ส่งมีกลไกที่จะทำการจำกัดการส่งข้อมูลให้น้อยลงถ้าตรวจพบว่าในขณะนั้นเครือข่ายมีความหนาแน่นสูงมากและจะเพิ่มปริมาณการส่งเมื่อตรวจพบว่าเครือข่ายมีความเบาบางลง คำถามที่ตามก็คือแล้ว TCP จะทราบได้อย่างไรว่า ณ ขณะนี้การจราจรในเครือข่ายหนาแน่นหรือเบาบาง เราคงทราบแล้วว่า TCP มีตัวแปรที่ใช้บอกว่า ณ ขณะนี้ buufer ของฝั่งผู้รับมีพื้นที่ว่างเหลืออีกเท่าไหร่ที่เรียกว่า receive window:rwnd (ดู flow control) นอกจากนี้ใน header ของ TCP ยังมีตัวแปรอีกตัวหนึ่งที่เรียกว่า congestion window:cwnd ซึ่งจะใช้เก็บข้อมูลที่ใช้แจ้งกับ TCP ของฝั่งผู้ส่งว่า ขณะนี้เครือข่ายมีความหนาแน่นเพียงใดและไม่ควรส่งข้อมูลมาเกินกว่าที่ระบุไว้ใน congestion window
เมื่ออ่านถึงตรงนี้ พวกเราคงมีคำถามต่อไปว่าแล้วข้อมูลตัวเลขใน congestion window:cwnd นั้นมันมาจากไหน และแท้จริงแล้ว congestion control มันมีขั้นตอนการทำงานอย่างไร คำตอบก็คือกระบวนการทำงานที่เรียกว่า TCP congestion-control algorithm ซึ่งแบ่งกระบวนการทำงานออกเป็นสามขั้นตอนดังต่อไปนี้
1. Slow Startเรียกว่าการเริ่มต้นการส่งอย่างช้า ๆ โดยแรกเริ่มของการสร้าง connection นั้น ค่าของ cwnd จะถูกตั้งให้มีค่าที่เล็กที่สุดโดยเริ่มต้นที่ 1 MSS (maximum segment size) และจะเพิ่มขึ้นแบบทวีคูณ ทุก ๆ ครั้ง ที่ TCP ฝั่งผู้ส่งได้รับการตอบรับ (Ack) การได้รับข้อมูลแล้วจากฝั่งผู้รับ เช่นส่งไปหนึ่งเมื่อได้รับการตอบรับแล้วก็จะส่งเพิ่มเป็นสอง เมื่อได้รับทั้งตอบรับทั้งสองแล้วก็จะส่งเพิ่มเป็น สี่ และเพิ่มเป็น แปด สิบหก สามสิบสอง หกสิบสี่…ไปเช่นนี้เรื่อย ๆ ทุก ๆ ครั้ง ตราบใดที่ยังได้รับการตอบรับทุก segment ที่ส่งไปกลับมา แต่มันจะโตแบบนี้ไปจนถึงเมื่อไหร่?
การเติบโตแบบทวีคูณของ MSS ใน cwnd จะยุติลงเมื่อเมื่อ TCP ฝั่งผู้ส่งไม่ได้รับการตอบรับ (Ack) จากฝั่งผู้รับ ซึ่งหมายถึง packet นั้นสูญหาย (packet lost) ซึ่งเกิดจากปัญหาความหนาแน่นของเครือข่ายในขณะนั้น ดังนั้น TCP ฝั่งผู้ส่งจะทำการกำหนดค่าของ cwnd ให้เป็น 1 MSS อีกครั้ง และเริ่มขั้นตอนการส่งอย่างช้า ๆ (slow start) โดยการส่งแบบทวีคูณอีกครั้ง แต่เมื่อ TCP ทราบแล้วว่าปริมาณข้อมูลสูงสุดที่สามารถส่งเข้าไปในเครือข่ายได้เท่าไหร่จึงไม่ทำให้ข้อมูลสูญหายจากปัญหาความหนาแน่นของเครือข่าย ดังนั้น TCP ฝั่งผู้ส่งจะทำการกำหนดจุดเฝ้าระวัง (slow start threshold : ssthresh) โดยการนำค่าของ cwnd ณ จุดที่ทำให้เกิดข้อมูลสูญหายหารด้วยสอง cwnd/2 และใช้ตำแหน่งนี้เป็นจุดเตือนให้รู้ว่าการส่งข้อมูลกำลังเข้าสูภาวะเครือข่ายหนาแน่นแล้ว โดยเมื่อจำนวน MSS ของ cwnd เพิ่มถึงจุดที่เท่ากับจุดที่ ssthresh แล้ว TCP จะหยุดการส่งข้อมูลแบบทวีคูณและเริ่มส่งข้อมุลในอัตราที่เพิ่มอย่างช้า ๆ ระมัดระวัง ซึ่ง ณ จุดนี้ จะเข้าสู่ขั้นตอนที่เรียกว่า congestion avoidance
2. Congestion Avoidanceเมื่อเข้าสู่ขั้นตอนนี้แล้ว TCP จะเพิ่มข้อมูลที่ใช้ในการส่งเพียงครั้งละ 1 MSS ทุก ๆ ครั้งที่ได้รับการตอบรับกลับมา แทนที่จะเพิ่มแบบทวีคูณเหมือนก่อนหน้า เพราะรู้ว่ากำลังเข้าใกล้จุดที่ทำให้เกิดสภาวะเครือข่ายหนาแน่นแล้ว ซึ่งการเพิ่มครั้งละ 1 MSS นี้จะยุติลงเมื่อเกิด time out หรือข้อมูลที่ถูกส่งไปนั้นไม่ได้รับการตอบรับกลับมาในเวลาที่กำหนด ค่าของ cwnd จะถูกกำหนดให้เป็น 1 MSS และค่าของ ssthresh จะถูกกำหนดให้เป็นครึ่งหนึ่งของค่าของ ssthresh ก่อนหน้า (ssthresh/2) (ดูรูปประกอบ) และเริ่มส่งข้อมูลต่อไป แต่ในกรณีที่ TCP ผู้ส่งได้รับ duplicate ACKs หรือรับได้รับ Ack สำหรับ packet เดียวมากกว่าหนึ่ง ซึ่งเป็นสัญญาณผู้รับว่ายังไม่ได้รับ packet นั้น ในกรณีนี้ TCP จะกำหนดค่าของ cwnd เป็นครึ่งหนึ่งของค่าก่อนหน้า (cwnd/2) และบวกเพิ่มอีก 3 MSS และกำหนดค่าของ ssthresh เป็นครึ่งหนึ่งของค่า ssthresh ณ จุดที่ได้รับ duplicate ACKs เมื่อถึงจุดนี้ก็จะเข้าสู่ขั้นตอนที่เรียกว่า fast recovery
3. Fast Recoveryในขั้นตอนนี้ค่าของ cwnd จะเพิ่มขึ้นครั้งละ 1 MSS สำหรับทุก ๆ ครั้งที่ TCP ผู้ส่งได้รับ duplicate ACK กลับมา (ผู้รับแจ้งว่ายังไม่ได้รับข้อมูลนั้น) จนในที่สุดเมื่อผู้รับแจ้งว่าได้ข้อมูลนั้น (โดยการส่ง Acks ของ packet ถัดไป) TCP ก็จะกลับไปสู่ขั้นตอน congestion avoidance อีกครั้ง โดยการกำหนดให้ค่าของ cwnd = 1 MSS แต่ถ้าเกิดเหตุการณ์ time out คือ packet ที่ส่งไปนั้นไม่ได้รับการ Ack กลับมาในเวลาที่กำหนด TCP ก็จะย้อนกลับไปเริ่มต้นที่ขั้นตอน slow start

เหตุที่เราเรียกว่าขั้นตอนนี้ว่า fast recovery ก็เพราะว่าเมื่อทางผู้รับแจ้งว่าไม่ได้รับข้อมูล packet ใด ฝั่งผู้ส่งจึงเพิ่มปริมาณการส่งสำหรับ packet นั้น เพื่อให้ผู้รับได้รับข้อมูลดังกล่าวโดยเร็ว เพื่อที่จะได้ทำการส่งข้อมูล packet ต่อไปได้
จากในรูป TCP แบบ Tahoe จะไม่มีขั้นตอน fast recovery เมื่อได้รับ duplicate Ack แล้ว TCP Tahoe จะย้อนกับไปที่ขั้นตอน slow start ทันที แต่ใน TCP แบบ Reno จะมี fast recover เหมือนในขั้นตอนที่ได้อธิบายมาข้างต้น
ไม่มีความคิดเห็น:
แสดงความคิดเห็น