อุปกรณ์ลามิเนต TCP

ลามินาคืออะไร

Laminar เป็นเฟรมเวิร์กใหม่สำหรับการควบคุมความคับคั่งของ TCP ที่แยกการกำหนดเวลาการส่ง ซึ่งกำหนดข้อมูลเมื่อมีการส่งข้อมูลได้อย่างแม่นยำ จากการควบคุมความคับคั่งที่แท้จริง ซึ่งกำหนดจำนวนรวมของข้อมูลที่ส่งระหว่าง RTT แต่ละรายการ

อัลกอริทึมเริ่มต้นสำหรับการตั้งเวลาการส่งคือการใช้งานอย่างเข้มงวดของหลักการอนุรักษ์แพ็กเก็ตของ Van Jacobson [Jacobson88] ข้อมูลที่มาถึงเครื่องรับจะทำให้ระบบ ACK ซึ่งทำให้ผู้ส่งส่งข้อมูลในปริมาณเท่ากันกลับไปยังเครือข่าย ตัวแปรสถานะหลักมีความเป็นนัยโดยนัยในปริมาณของข้อมูลและ ACK ที่หมุนเวียนอยู่ในเครือข่าย สถานะนี้จะสังเกตได้จากเครื่องมือประมาณ tcp_packets_in_flight() (หรือ total_pipe) ที่ปรับปรุงให้ดีขึ้น Total_pipe นั้นอิงตาม "pipe" ตามที่อธิบายไว้ใน RFC 3517 แต่ก็ยังรวมจำนวนข้อมูลที่รายงานโดย ACK ปัจจุบันและ การส่งข้อมูลที่รอดำเนินการ ซึ่งผ่านการควบคุมความคับคั่งแล้ว แต่กำลังรอเหตุการณ์อื่นๆ เช่น TSO

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

เมื่อใดก็ตามที่ total_pipe แตกต่างจาก CCwin อัลกอริทึมการตั้งเวลาการส่งจะปรับจำนวนกลุ่มที่ส่งให้สอดคล้องกับ ACK แต่ละชุดเล็กน้อย การเริ่มช้าและการลดอัตราสัดส่วน [PRR] (แทนการลดการครึ่งราคา) ฝังอยู่ในอัลกอริทึมการตั้งเวลาการส่ง

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

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

เฟรมเวิร์กลามินาร์และแรงจูงใจอธิบายไว้อย่างละเอียดมากกว่าในฉบับร่างอินเทอร์เน็ต draft-mathis-tcpm-tcp-laminar

โปรดส่งความคิดเห็นและคำแนะนำมาที่ mattmathis@google.com

โปรเจ็กต์นี้เป็นส่วนหนึ่งของความพยายามของ Google ในการทําให้เว็บเร็วขึ้นผ่านการปรับปรุงโปรโตคอล

หมายเหตุการใช้งาน

ลามินาร์มีการใช้งานเป็นหลักใน 3 ฟังก์ชัน (tcp_input.c) ดังนี้

Tcp_cong_avoid() และ tcp_mult_decr() ดำเนินการควบคุมความคับคั่งของ AIMD โดยใช้ตัวแปรสถานะ CCwin ฟังก์ชัน 2 อย่างนี้เป็นเพียงที่เดียวที่ทำการเปลี่ยนแปลง CCwin ยกเว้นการเลิกทำ (ทั้ง 2 ฟังก์ชันจะเรียกใช้เครื่องจัดการเฉพาะโมดูลความคับคั่ง)

Tcp_laminar_schedule() กำหนดปริมาณข้อมูลที่จะส่งตอบสนองต่อ ACK แต่ละรายการ ใช้เทคโนโลยีการอนุรักษ์แพ็คเก็ตของ Van Jacobson โดยปรับ ขึ้นหรือลงเล็กน้อยเพื่อทำให้ tcp_packets_in_flight() มาบรรจบกันเป็น CCwin

มีการเปลี่ยนแปลงที่สำคัญในเครื่องมือประมาณ tcp_packets_in_flight() เพื่อทำให้ค่าคงที่ไม่เปลี่ยนแปลงในเหตุการณ์ของโปรโตคอลส่วนใหญ่ แอปพลิเคชันหยุดทำงาน การปรับเปลี่ยนใน tcp_laminar_schedule() และการสูญเสียแพ็กเก็ตที่เกิดขึ้นจริงจะเปลี่ยนแปลง tcp_packets_in_flight() ตามความจำเป็น ยังไม่มีการประมวลผล ACK, TSO และเหตุการณ์อื่นๆ ส่วนใหญ่ โปรดทราบว่าเมื่อเกิดการสูญเสีย จำนวนแพ็กเก็ตจริงในเที่ยวบินจะเปลี่ยนแปลงทันที แต่จะไม่แสดงในตัวประมาณ tcp_packets_in_flight() จนกว่าเครื่องจักรการส่งจะระบุข้อมูลว่าสูญหายและเพิ่มขึ้น lost_out

รับแพตช์

แพตช์นี้ขัดแย้งกับเน็ตถัดไปของ Dave Miller และนำไปใช้กับ 3.5-rc2 อย่างชัดเจน
NB: โมดูลควบคุมความคับคั่งอื่นๆ ที่ Reno และ CUBIC ยังไม่ได้รับการอัปเดตและจะไม่คอมไพล์ หากการกำหนดค่าสร้างโมดูลควบคุมความคับคั่งอื่นๆ เช่น เวกัส รองรับการปรับขนาด ความเร็วสูง ฯลฯ คุณต้องปิดใช้โมดูลก่อน