วันจันทร์ที่ 30 ธันวาคม พ.ศ. 2556

TCP Flow Control

บางครั้งการก้มหน้าก้มตาผลิตพืชผลทางการเกษตรโดยไม่เคยไปสนใจตรวจสอบข้อมูลข่าวสารของโลกภายนอกเลยว่า ณ ปัจจุบันนี้ความต้องการพืชผลดังกล่าวของตลาดโลกนั้น จริง ๆ แล้วมันมีอยู่เท่าไหร่ก็อาจสร้างปัญหาใหญ่โตขึ้นมาได้  ตัวอย่างที่เห็นได้ชัดก็คือ ข้าว ยางพารา ที่ปัจจุบันราคาตกต่ำมากจนต้องเรียกร้องให้รัฐบาลเข้ามาช่วยรับซื้อโดยการประกันราคา สาเหตุก็เพราะว่าผลิตโดยไม่เคยตรวจสอบเลยว่าปลายทางของประเทศที่รับซื้อผลผลิตนั้น ปัจจุบันเค้ายังต้องการสินค้ามากแค่ไหน พอสินค้ามันผลิตออกมามากจนล้นเกิน มันก็กลายเป็นส่วนล้นเกินของความต้องการที่ทำให้ราคาผลผลิตตกต่ำลง ตามกลไกของเศรษฐศาสตร์
จากตัวอย่างข้างบนนั้นถ้าเราไม่ต้องการให้ผลผลิตล้นเกิน เราก็ต้องคอยตรวจสอบปริมาณความต้องการของตลาดอยู่เสมอ ถ้าตลาดมีความต้องการมากเราก็ผลิตให้มากขึ้นถ้าตลาดมีความต้องการน้อยก็ผลิตให้น้อยลงเพื่อไม่ให้เกิดปัญหาของของเหลือ  ซึ่งหลักการธรรมดา ๆ ดังกล่าวก็ถูกนำมาประยุกต์ใช้กับบริการ flow control  ของ protocol TCP (ดู TCP UDP) ซึ่งมีหน้าที่ควบคุมปริมาณการส่งข้อมูลของเครื่องคอมพิวเตอร์ต้นทางไม่ให้ส่งข้อมูลมากจนท่วม buffer ของเครื่องปลายทาง
เราคงทราบกันแล้วว่า ก่อนที่ protocol TCP จะสามารถส่งข้อมูลถึงกันได้นั้น จะต้องทำการสร้าง connection เพื่อการสื่อสารรับส่งข้อมูลขึ้นมาก่อน  ซึ่งในการสร้าง connection นั้น  ทั้งฝั่งผู้ส่งและผู้รับจะทำการสำรองหน่วยความจำไว้ส่วนหนึ่งสำหรับ connection ซึ่งเรียกว่า buffer เพื่อใช้รองรับข้อมูลที่ส่งไปมาระหว่างกันก่อนที่ application layer จะมาดึงข้อมูลจาก buffer ไปใช้งานซึ่งจะทำให้เนื้อที่ตรงส่วนที่ข้อมูลถูกดึงไปแล้วนั้นว่างลง ดังนั้น protocol TCP จะต้องคอยทำการตรวจสอบพื้นที่ว่างบน buffer ของฝั่งผู้รับว่ายังมีเนื้อที่ว่างเหลือเพียงพอที่จะข้อมูลได้อีกหรือไม่ ถ้าทราบว่า buffer ของผู้รับเต็มแล้ว TCP ฝั่งผู้ส่งก็ต้องหยุดส่งข้อมูลชั่วคราว และรอจนกว่า buffer ฝั่งผู้รับจะมีเนื้อที่ว่างอีกครั้ง  การทำงานของ flow control สามารถอธิบายได้ตามตัวอย่างข้างล่าง
สมมติว่า host A กำลังส่ง file ขนาดใหญ่ไปที่ host B ผ่าน TCP connection  host B จัดเตรียม receive buffer สำหรับ connection นี้  โดย application จะเข้ามาอ่านข้อมูลในReceive buffer เป็นระยะ ๆ  ดังนั้น byte สุดท้ายที่รับเข้ามาแล้ว – byte สุดท้ายที่ถูกอ่าน = ข้อมูลที่ยังค้างอยู่ใน bufferดังนั้น พื้นที่ว่างที่เหลือ(rwnd) = ขนาดของ buffer – ข้อมูลที่ยังค้างอยู่ใน buffer
ตัวอย่างเช่น host A ส่ง file ขนาด 80 bytes  มาที่ host B ซึ่งมี buffer ขนาด 100 bytes host B ได้รับข้อมูลเข้ามาไว้ที่ buffer แล้ว 50 bytes  และ application layer ของ host B ก็ได้เข้ามาอ่านข้อมูลจาก buffer ไปแล้ว 30 bytes
ข้อมูลที่ยังค้างอยู่ใน buffer เท่ากับ        20  bytes  (รับเข้ามา 50 – ถูกอ่านไป 30)
ข้อมูลของพื้นที่ว่างบน buffer เท่ากับ     80  bytes  (พื้นที่ 100 – ข้อมูลที่ยังค้าง 20)
(ดูรูปประกอบ)
tcp buffer
Host B จะบอกกับ  Host A ว่า ณ ปัจจุบันเหลือพื้นที่ว่างใน Buffer ของตนอีกเท่าไหร่ โดยการนำค่าที่คำนวณได้ตามตัวอย่างข้างบนซึ่งเราเรียกว่า receive window(rwnd) มาใส่ไว้ใน field เฉพาะบน header ของ protocol TCP ที่เรียกว่า receive window field ในทุก ๆ segment ที่ส่งไปให้ Host A ซึ่ง Host A ก็จะใช้ข้อมูลดังกล่าวพื่อตรวจสอบว่าจะสามารถส่งข้อมูลไปให้ Host B ได้อีกเท่าไหร่จึงจะไม่เกิด overflow  เช่นถ้าข้อมูลที่ส่งมาแจ้งว่า Host B เหลือพื้นที่ของ buffer อีก 3 bytes และ host A ได้ส่ง packet ขนาด 1 bytes ไปแล้ว 2 packet โดยยังไม่ได้รับการตอบรับ (Ack) กลับมา Host จึงทราบว่าสามารถที่จะส่งข้อมูลได้อีกเพียง 1 byte

ในกรณีที่ Host A ได้รับแจ้งข้อมูลจาก Host B ว่าพื้นที่ buffer เท่ากับ  0 แล้วนั้น Host A จำเป็นต้องส่งข้อมูลต่อไปอีก 1 bytes  จุดประสงค์ก็เพื่อให้ Host B  ส่งข้อมูลกลับมาว่า ณ ขณะนี้ buffer ของ host B มีเนื้อที่ว่างให้ส่งข้อมูลต่อไปแล้วหรือยัง มิฉะนั้น Host A จะไม่มีวันทราบได้ว่า ณ ขณะนี้ buffer ของ Host B เริ่มมีเนื้อที่ว่างหรือยัง

ไม่มีความคิดเห็น:

แสดงความคิดเห็น